Author: haoransun
Wechat: SHR—97
学习来源:极客时间-Nginx核心知识100讲,本人购买课程后依据视频讲解汇总成个人见解。
1 检查80端口是否被占用
yum install net-tools
netstat -ano | grep 80
2 Nginx命令行
3 重载配置文件
此时在 nginx的安装目录下执行了
1 | ./nginx -c /home/geek/nginx/conf/nginx.conf |
注意:
启动nginx时,服务无法启动,出现./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory的错误,解决方法如下:
ln -s /usr/local/lib/libpcre.so.1 /lib64/
1 | 再次修改了 Nginx配置文件中的一些值 |
mac:当修改完成后,保存退出后,可以直接执行 ./nginx -s reload 指令。这样是在Nginx在不停止对客户服务的情况下,使用了 tcp_nopush这个新的配置项,
**CentOS:
cd sbin
[root@haoransun sbin]# ./nginx -s reload即可ps -ef | grep nginx 可以看到正在运行的Nginx
4 热部署
即对Nginx在不停机的情况下做版本升级。
对现有的Nginx的运行目录中的二进制可执行文件做一次备份:因为我们更换的只是二进制文件,并不会对其他文件做更换。
1 | cp nginx nginx.old |
先下载一个最新版本的Nginx
1 | wget http://nginx.org/download/nginx-1.16.0.tar.gz |
将我们编译好的最新版本的二进制文件拷贝到旧版本的二进制那个可执行文件目录中,替换掉当前Nginx进程正在使用的旧版本二进制文件。
复制成功后,看到新版本的Nginx二进制可执行文件的size与旧版本是不一样的。
现在,需要给正在运行的Nginx的Master进程发送一个信号,告诉它,我们要进行热部署了,做一次版本升级
1 | kill -USR2 6655 ## master进程号 |
接下来会看到,Nginx Master进程会新起一个Nginx Master进程,新的Nginx Master进程使用了刚刚复制过来的最新的Nginx二级制文件,老的Worker也在运行,新的Master会生成新的Worker,它们会平滑的将所有的请求过渡到新的二进制文件所起的Nginx进程中,由此实现了平滑过度-热部署,如下所示:
我们看到,新老都存在,且新的Master进程父ID 为老的Master进程ID,由此看出新的是由老的新起的。
但是老的Master进程已经不再监听80或者443这样的Web端口,所以,新的连接,都会进入新的Nginx进程中。
这是,我们需要向老的Nginx进程发生一个信号,告诉它,优雅的关闭所有的 Worker进程.
1 | kill -WINCH 6655 ## 老的Master 进程号 |
老的Worker进程已经优雅的退出了,但是老的Master进程 6655 还存在,但是它手下已经没有Worker进程了,这说明了一件事情:所有的请求已经去全部切换到我们新升级好的Nginx中了。
./nginx -v :已经是最新的版本了
如果升级过程完成后,没有任何问题,需要关闭老的master进程的话,使用以下命令:
1 | kill -QUIT old_master_pid |
但是 想要版本回退呢?只需要向老的Master进程 6655发送 reload 命令,让它重新拉起Worker进程,再把新的Master进程关掉。 因此:老的Master进程是不会退出的,保留以允许我们做版本回退。
1 | ./nginx -v # 此时这里是新的nginx版本号 |
5 切割日志文件
可以看到,haoransun_access.log日志文件已经有接近16M了,假设它此时已经很大了,想要将当前日志备份到另外一个文件中,而当前Nginx仍然正常运行,该如何做呢?
1 | ./nginx -s reopen即可 |
./nginx -s reopen 命令即可做到,但是太麻烦了
具体的便捷做法参考000-Nginx访问日志配置及信息详解.。。。。
5.1 日志切割 bash脚本demo
往往会每一天或者每一周执行一次日志切割。
可以先写成一个bash脚本,在此脚本中,先将 haoransun.log复制一下,在执行 -s reopen命令。
最后将此脚本放在crontab中,比如:
在logs目录下新建 history文件夹:用于存放历史日志文件。
在logs目录下新建rotate.sh脚本
1 | #!/bin/bash |
查看当前周期任务
1 | crontab -l |