Nginx添加模块(非覆盖安装)并实现多级Nginx传递客户端IP

  • A+

原已经安装好的nginx,现在需要添加一个未被编译安装的模块:
nginx -V 可以查看原来编译时都带了哪些参数
原来的参数:

 --prefix=/app/nginx

添加的参数:

 --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module


步骤如下:
1. 使用参数重新配置:

 ./configure --prefix=/app/nginx -user=nobody -group=nobody --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=../nginx_upstream_hash-0.3.1/ --add-module=../gnosek-nginx-upstream-fair-2131c73/

2. 编译:
make
#不要make install,否则就是覆盖安装
3. 替换nginx二进制文件:

 cp /app/nginx/sbin/nginx /app/nginx/sbin/nginx.bak cp ./objs/nginx /app/nginx/sbin/

下边配置多级 Nginx 反向代理,但是后端的程序获取到的客户端 IP都是前端 Nginx 的IP,问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。
同样适用于前端是 Squid 或者其他反向代理的情况。
首先前端的 Nginx 要做转发客户端 IP 的配置:

 location / { proxy_pass https://sunlovely.com.cn:8000;  # Forward the user's IP address to Rails proxy_set_header X-Real-IP $remote_addr; # needed for HTTPS # proxy_set_header X_FORWARDED_PROTO https; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; }

后端的 Nginx 需要安装一个 Module: NginxHttpRealIpModule,编译的时候默认不包含此 Module,需要重新编译安装 Nginx,configure 的时候加上 –with-http_realip_module,Nginx 升级或者添加/删除 Module 时支持热切换,可以避免中断服务。
升级后配置 NginxHttpRealIpModule,set_real_ip_from 就是指前端 Nginx 或者 Squid 的 IP:

 location / { proxy_pass https://sunlovely.com.cn:8000; # Forward the user's IP address to Rails proxy_set_header X-Real-IP $remote_addr; # needed for HTTPS # proxy_set_header X_FORWARDED_PROTO https; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; # NginxHttpRealIpModule set_real_ip_from 192.168.1.0/24; set_real_ip_from 192.168.2.1; real_ip_header X-Real-IP; }

最后记得 reload Nginx config

下载服务恢复

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: