• Post author:
  • Post category:nginx
  • Post comments:0评论

官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html

一、常用指令

1、proxy_pass

用于设置代理服务器的协议和地址以及位置应映射到的可选 URI。

Syntax:     proxy_pass URL;
Default:    —
Context:    location, if in location, limit_except

  如果 proxy_pass 未指定 uri,则 nginx 会把匹配的路径部分加入代理 uri 中如下,即将原始请求 uri 发送到代理服务器,如下:

# 配置
location /test/ {
    proxy_pass http://10.0.0.1;
}
原始请求:http://localhost/test/1.txt
代理请求:http://10.0.0.1/test/1.txt

  如果 proxy_pass 指定 uri,则 nginx 不会把 location 中匹配的路径部分加入代理 uri 中,而是将和 location 匹配请求 uri 的部分和指令中指定的 uri 替换,如下:

(1)location 有 / 结尾
# 配置
location /test/ {
    proxy_pass http://10.0.0.1/;
}

原始请求:http://localhost/test/1.txt
此时,/test/ 被 / 替换
代理请求:http://10.0.0.1/1.txt

(2)location 无 / 结尾
# 配置
location /test {
    proxy_pass http://10.0.0.1/a/;
}

原始请求:http://localhost/test/1.txt
此时,/test 会被 /a/ 替换
代理请求:http://10.0.0.1/a//1.txt

  如果想要在 proxy_pass 指定 uri 的情况下,传递完整原始请求 uri 到代理服务器,可以使用 request_uri 变量,如下:

# 配置
location /test/ {
    proxy_pass http://10.0.0.1/a$request_uri;
}

原始请求:http://localhost/test/1.txt
此时,/test/1.txt 会被完整传递过去
代理请求:http://10.0.0.1/a/test/1.txt

2、proxy_set_header

用于重新定义或附加字段到传递给代理服务器的请求标头。

Syntax:  proxy_set_header field value;      # 将 value 的值赋值给 field 字段
Default: proxy_set_header Host $proxy_host;
         proxy_set_header Connection close;
Context: http, server, location

示例配置:

# 传递域名给后端服务器,不设置此项,默认传递ip给后端。
proxy_set_header Host $http_host;

# 最后一层代理的IP地址。多层代理会覆盖,只显示最后一层代理IP地址。
proxy_set_header X-Real-IP $remote_addr;

# 透传真实客户端地址。客户端通过代理访问后端服务器,访问日志定义的$http_x_forwarded_for字段会显示客户端的真实ip。多层代理会追加。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

3、timeout

# 代理服务器与后端服务器连接超时时间
Syntax:  proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location

# 代理服务器等待后端服务器响应的超时时间
Syntax:  proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location

# 后端服务器数据回传给代理服务器超时时间
Syntax:  proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location

示例配置:

proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;

4、buffer

可能有误,没有弄明白

# 开启内容缓冲,nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端。
Syntax:  proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location

# 设置代理服务器保存响应头信息的缓冲区大小。这个参数并不受proxy_buffering开启或关闭的影响,它始终都是生效的。
Syntax:  proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location

# 响应缓冲区的个数和大小,响应内容先写入缓冲区,写满或者写完,立即发送给客户端。这里设置的缓冲区大小是针对每个请求连接而言的。
Syntax:  proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location

示例配置:

proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 96k;

二、示例

反向代理示例:

[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_wordpress.conf 
upstream wordpress {
    server 172.16.1.7:80;
    server 172.16.1.8:80;
}

server {
    listen 80;
    server_name wordpress.cp.com;

    location / {
        proxy_pass http://wordpress;
        include proxy_params;
    }
}
[root@lb01 ~]# cat /etc/nginx/proxy_params      //注意根据网站实际情况配置
proxy_http_version 1.1;

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;

proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 96k;

注:proxy_http_version 1.1:设置HTTP代理协议版本。默认情况下,使用的是 1.0 版本,官方推荐使用 1.1。

发表评论

验证码: 3 + 5 =