服务器使用 Nginx 并且上游嵌套了 CDN,难免会遇到一个问题:“请求日志中记录的都是 CDN IP 而非实际请求 IP” 。
众所周知,这样不利于网站管理,或者说难以规避一些恶意的风险。

解决这个问题不复杂,只需要在 Nginx 的 Http 段添加如下配置即可:

vi nginx.conf
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

说明:
1、set_real_ip_from 是指上游代理转发服务器的 IP 地址或者说 IP 段。可以理解为,这些 IP 过来的请求全部做真实 IP 获取处理,类似一个白名单,此教程中设置的 0.0.0.0/0 是指全部请求 IP。
2、real_ip_header 这个不难理解,就是说从那个请求头里面获取真实的 IP,大多数情况下上游 CDN 都会发送 HTTP_X_FORWARDED_FOR 请求头,这个头里面包含的是来路的 IP 串,如 “127.0.0.1,127.0.0.2,127.0.0.3” 一般来说获取第一个不为空的 IP 就是真实的。
3、real_ip_recursive 开启递归查找,确保获取到所有经过CDN的IP地址
4、Nginx 自带了 ngx_http_realip_module 这个支持获取真实 IP 的模块,如果是默认编译安装的 Nginx 可能不存在,需要自行进行安装并开启,才可配置生效,安装此模块的方法如下。

Nginx对进程的控制能力非常强大,可以通过信号指令控制进程。常用的信号有:
-QUIT,表处理完当前请求后,关闭进程。
-HUP,表示重新加载配置,也就是关闭原有的进程,并开启新的工作进程。此操作不会中断用户的访问请求,因此可以通过此信号平滑的重启Nginx。
-USR2,用于平滑升级可执行程序。
-WINCH,从容关闭工作进程。

wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar xf nginx-1.24.0.tar.gz && cd nginx-1.24.0
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-stream --with-http_realip_module
make #千万不要 make install
mv /usr/local/nginx/sbin/nginx{,.ori}
cp objs/nginx /usr/local/nginx/sbin/
/usr/local/nginx/sbin/nginx -t
建议直接重启 systemctl restart nginxd

平滑迁移
kill -USR2 cat /usr/local/nginx/logs/nginx.pid
ll /usr/local/nginx/logs/
查看nginx pid,会出现一个nginx.pid.oldbin
从容关闭旧的Nginx进程
kill -WINCH cat /usr/local/nginx/logs/nginx.pid.oldbin
关闭旧的主进程【建议不要用,可能nginx进程都关闭】
kill -QUIT cat /opt/nginx/logs/nginx.pid.oldbin
检查
/usr/local/nginx/sbin/nginx -V