(接理论篇)
查看lb01的配置文件如下: cat /usr/local/nginx/conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream www_server_pools { #默认调度算法wrr,即权重轮询算法 #虽然定义的www服务器池但是这个服务器池也可以作为BBS等业务的服务器池。因为nginx负载均衡转发不转发http头部的url.无法做location匹配,只能默认访问第一个 server 192.168.50.163:80 weight=1; server 192.168.50.164:80 weight=1; } server { listen 80; server_name www.wk.com; location / { proxy_pass http://www_server_pools; #通过proxy_pass功能把用过户的请求交给上面反向代理upstream定义的www_server_pools服务器池处理。 } } }
#这种反向代理因为无法转发url所以无法代理多虚拟主机节点服务器
反向代理多虚拟主机节点服务器
反向代理向下面节点重新发起请求时,默认并没有在请求头里告诉节点服务器要找哪台虚拟主机,所以,Web节点服务器接收到请求后发现没有主机头信息,因此,就把节点服务器的第一个虚拟主机发给了反向代理了(节点上第一个虚拟主机放置的是故意这样放置的bbs)。解决这个问题的方法,就是当反向代理向后重新发起请求时,要携带主机头信息,以明确告诉节点服务器要找哪个虚拟主机。具体的配置在Nginx代理www服务虚拟主机配置里增加如下一行配置:
proxy_set_header host $host;
在代理向后端服务器发送的http请求头中加入host字段信息后,若后端服务器配置有多个虚拟主机,它就可以识别代理的是哪个虚拟主机。这是节点服务器多虚拟主机时的关键配置。整个Nginx代理配置为:
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream www_server_pools { server 192.168.50.163:80 weight=1; server 192.168.50.164:80 weight=1; } server { listen 80; server_name www.wk.com; location / { proxy_pass http://www_server_pools; proxy_set_header host $host; #在代理向后端服务器发送的http请求头中加入host字段信息,用于当后端服务器配置有多个虚拟主机时,可以识别代理的是哪个虚拟主机。这是节点服务器多虚拟主机时的关键配置。 } } }
此时,再重新加载Nginx服务就可已根据域名匹配到不同的虚拟主机
经过反向代理后的节点服务器记录用户IP
节点服务器对应的WWW虚拟主机的访问日志的第一个字段记录的并不是客户端的IP,而是反向代理服务器的IP,最后一个字段也是“-”!
由上图可见 access.log日志记录的客户端IP为nginx反向代理的IP
解决虚拟主机的访问日志的第一个字段记录的不是客户端的IP增加如下一行参数:
proxy_set_header X-Forwarded-For $remote_addr; #这是反向代理时,节点服务器获取用户真实IP的必要功能配置
在反向代理请求后端节点服务器的请求头中增加获取的客户端IP的字段信息,然后节点后端可以通过程序或者相关的配置接收X-Forwarded-For传过来的用户真实IP的信息。
解决上述问题的整个Nginx代理配置为:
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream www_server_pools { server 192.168.50.163:80 weight=1; server 192.168.50.164:80 weight=1; } server { listen 80; server_name www.wk.com; location / { proxy_pass http://www_server_pools; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; #在代理向后端服务器发送的http请求头中加入X-Forwarded-For字段信息,用于后端服务器程序,日志等接收记录真实用户的IP,而不是代理服务器的IP } } }
重新加载Nginx反向代理服务:
/usr/local/nginx/sbin/nginx -s reload
节点服务器需要的访问日志如果要记录用户的真实IP,还必须进行日志格式配置,这样才能把代理传过来的X-Forwarded-For头信息记录下来,具体配置为:
#注意:这里是客户端Web01的配置
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; log_format main ‘$remote_addr-$remote_user[$time_local]"$request"‘ ‘$status $body_bytes_sent "$http_referer"‘ ‘"$http_user_agent""$http_x_forwarded_for"‘; #就是这里的“$http_x_forwarded_for”参数,如果希望在第一行显示,可以替换掉第一行的$remote_addr变量。 server { listen 80; server_name bbs.wk.com; location / { root html/bbs; index index.html index.htm; } access_log logs/access_bbs.log main; } server { listen 80; server_name www.wk.com; location / { root html/www; index index.html index.htm; } access_log logs/access_www.log main; } }
头部为代理IP 尾部为客户IP 一般直接把 头部参数模块换掉
Nginx反向代理重要参数 | 解释说明 |
proxy_ pass http://server_ pools; | 通过proxy_pass功能把用户的请求转向到反向代理定义的upstream服务器池 |
proxy_ set_ header Host $host; | 在代理向后端服务器发送的http请求头中加人host字段信息,用于当 后端服务器配置有多个虚拟主机时,可以识别代理的是哪个虚拟主机。这是节点服务器多虚拟主机时的关键配置 |
proxy_ set_ header X-Forwarded-For Sremote_ addr ; | 在代理向后端服务器发送的http请求头中加人X-Forwarded-For字段信息,用于后端服务器程序、日志等接收记录真实用户的IP,而不是代理 服务器的IP。这是反向代理时,节点服务器获取用户真实IP的必要功能配置 |
与反向代理配置相关的更多参数说明
除了具有多虚拟主机代理以及节点服务器记录真实用户IP的功能外,Nginx软件还提供了相当多的作为反向代理和后端节点服务器对话的相关控制参数,具体见前面proxy模块时提供的图表。
由于参数众多,最好把这些参数放到一个配置文件里,然后用include方式包含到虚拟主机配置里,效果如下:
vim /usr/local/nginx/conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream www_server_pools { server 192.168.50.163:80 weight=1; server 192.168.50.164:80 weight=1; } server { listen 80; server_name www.wk.com; location / { proxy_pass http://www_server_pools; include proxy.conf; #这就是包含的配置,具体配置内容见下文 } } } cat proxy.conf proxy_set_header host $host; proxy_set_header x-forwarded-for $remote_addr; proxy_connect_timeout 60; proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k;
更多Nginx反向代理参数说明:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html
原文地址:https://www.cnblogs.com/ywrj/p/9503030.html