Nginx反向代理时传递客户端真实IP&Nginx配置使用缓存机制&压力测试

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 ;

 

1Nginx反向代理时传递客户端真实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服务器(NginxApache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值