官方文档: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。