学习nginx 100 讲笔记

nginx热部署

我们把nginx版本从1.14升级到1.15,保证服务不停止.其实只需要替换nginx二进制文件就可以了

老版本nginx进程情况

master pid是9666,一个worker pid:9668

root      9666  0.0  0.0  25172   408 ?        Ss   13:53   0:00 nginx: master process ./nginx
nobody    9668  0.0  0.5  30000  2948 ?        S    13:53   0:00 nginx: worker process

下载新的tar包,并编译但不安装

wget https://nginx.org/download/nginx-1.15.9.tar.gz
tar -zxvf nginx-1.15.9.tar.gz
cd nginx-1.15.9
./configure --prefix=/home/server/nginx
make
# 替换nginx二进制文件
cd ~/nginx/sbin
sudo mv nginx nginx.old
sudo cp /tmp/nginx-1.15.9/objs/nginx ~/nginx/sbin

给老版本的nginx master 发送一个USR2信号

这时候nignx master 进程会用新的nginx起一个新的进程

sudo kill -USR2 9666

进程

15496: 新起的master 15498:新起的worker

root      9666  0.0  0.0  25172   408 ?        Ss   13:53   0:00 nginx: master process ./nginx
nobody    9668  0.0  0.5  30000  2948 ?        S    13:53   0:00 nginx: worker process
root     15496  0.0  0.6  25188  3244 ?        S    14:07   0:00 nginx: master process ./nginx
nobody   15498  0.0  0.5  30020  2884 ?        S    14:07   0:00 nginx: worker process

给老版本nginx master发送WINCH 优雅关闭worker进程

sudo kill -WINCH 9666

进程情况

这时候老的nginx的worker就已经关闭了,但是master并不会关闭,我们可以留着 当发现新的nginx有问题的时候,可以用老的nginx 进程 reload 命令做版本回滚

root      9666  0.0  0.3  25172  1820 ?        Ss   13:53   0:00 nginx: master process ./nginx
root     15496  0.0  0.6  25188  3244 ?        S    14:07   0:00 nginx: master process ./nginx
nobody   15498  0.0  0.5  30020  2884 ?        S    14:07   0:00 nginx: worker process

nginx location中alias和root的区别

  • root 会把localtion 后面的值带到最终的url 上
  • alias 只是一个别名, 他不会把location后面的值带到url上

goaccess

启动goaccess监听

如果有变动.. goaccess 追加到统计文件中.. 同时 使用websocket 服务实时更新数据

sudo goaccess back.access.log -o ../html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --log-format=COMBINED

使用nginx解析静态资源文件

只需要解析 ../html/report.html 文件就可以了

二级反代的remote_addr和http_x_forwarded_for值

file

nginx反代配置

server{
    listen 192.168.56.101:8001;
    access_log  logs/px1.access.log  main;
    error_log  logs/px1.error.log;

    location / {
       proxy_set_header   Host             $host;
       proxy_set_header   X-Real-IP        $remote_addr;
       proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

       proxy_pass http://192.168.56.151:8000;
    }

}

结论

  • 也就是说 最终的客户端ip一定是 http_x_forwarded_for 值的最右端