win7客户端请求web服务,win7 ;
nginx作为反向代理服务器:192.168.88.130:8080 test.field.com ;
nginx作为后端web服务器:192.168.88.131:8080 www.field.com ;
httpd作为后端web服务器:192.168.88.131:80 www.field.com ;
1、Nginx反向代理时传递客户端真实IP
ngx_http_proxy_module模块:实现反向代理的功能
http://nginx.org/en/docs/http/ngx_http_proxy_module.html
其中proxy_set_header指令就是该模块需要读取的配置文件。
Syntax: proxy_set_header field value;
Default:
proxy_set_headerHost $proxy_host;
proxy_set_headerConnection close;
Context: http, server, location
参数说明:
proxy_set_header指令中,所有设置的值的含义和http请求中的含义完全相同, 常用有Host参数和X-Forward-For参数。
Host字段表示请求的主机名,当nginx作为反向代理服务器使用,如果后端服务器设置有防盗链或者根据http请求头中的host字段来进行路由或功能判断时,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】。
X_Forward_For字段表示该条http请求是由谁发起的,如果反向代理服务器不重写该请求头,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端配置有防攻击策略,会导致机器就被封掉。因此,在nginx配置用作反向代理服务器时一般会增加两条配置,修改http的请求头:
proxy_set_header Host $http_host;
proxy_set_header X-Forward-For $remote_addr;
其中$http_host和$remote_addr都是nginx的导出变量,可以在配置文件中直接使用。如果Host请求头部没有出现在请求头中,则$http_host值为空,而$host值为主域名。因此,经常会用$host代替$http_host变量,从而避免http请求中丢失Host头部的情况下Host不被重写的失误。
proxy_set_header X-Forward-For $remote_addr;
将$remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip
反向代理服务器IP传递过程见下图:
案例1、反向代理,不记录真实IP地址。
编辑配置文件:不记录真实IP地址。
[root@testconf.d]# vi default.conf
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/html;
# proxy_pass http://192.168.88.130/;
index index.html index.htm;
}
location /field/ {
proxy_pass http://192.168.88.131:8080/;
}
location ~* \.(mp3|avi|jpg|png|gif)$ {
proxy_pass http://192.168.88.131;
}
}
[root@testconf.d]# service nginx restart
停止 nginx:[确定]
正在启动 nginx:[确定]
win7访问:http://192.168.88.130:8080/field/
Nginx代理服务器访问记录
[root@testconf.d]# tail -f /var/log/nginx/access.log
192.168.88.1 - -[19/Apr/2018:19:00:26 +0800] "GET /field/ HTTP/1.1"192.168.88.130:8080 304 0 "-" "Mozilla/5.0 (Windows NT 6.1;Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181Safari/537.36" "-"
192.168.88.1 - -[19/Apr/2018:19:01:06 +0800] "GET /field/ HTTP/1.1"192.168.88.130:8080 304 0 "-" "Mozilla/5.0 (Windows NT 6.1;Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181Safari/537.36" "-"
192.168.88.1 - -[19/Apr/2018:19:03:30 +0800] "GET /field/ HTTP/1.1"192.168.88.130:8080 304 0 "-" "Mozilla/5.0 (Windows NT 6.1;Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181Safari/537.36" "-"
Nginx后端服务器访问记录
由访问记录,未记录客户端真实IP,只记录反向代理服务器IP地址(192.168.88.130)
[root@www html]#tail -f /var/log/nginx/access.log
192.168.88.130 - -[19/Apr/2018:19:00:26 +0800] "GET / HTTP/1.0" 304 0 "-""Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/65.0.3325.181 Safari/537.36""-"
192.168.88.130 -- [19/Apr/2018:19:01:06 +0800] "GET / HTTP/1.0" 304 0 "-""Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/65.0.3325.181 Safari/537.36""-"
192.168.88.130 -- [19/Apr/2018:19:03:30 +0800] "GET / HTTP/1.0" 304 0 "-""Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/65.0.3325.181 Safari/537.36" "-"
案例2、反向代理,配置记录客户端真实IP地址。
编辑配置文件:记录真实IP地址
[root@testconf.d]# vi default.conf
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/html;
# proxy_pass http://192.168.88.130/;
index index.html index.htm;
}
location /field/ {
proxy_pass http://192.168.88.131:8080/;
proxy_set_headerHost $host;
proxy_set_headerX-Real-IP $remote_addr;
#remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样