网站首页 » Nginx » 命令行与热部署操作

命令行与热部署操作

February 22, 2022 Nginx

使用版本 - CentOS Linux release 7.5.1804 (Core) - nginx/1.12.2版本 - curl 7.61.0 (x86_64-pc-linux-gnu) libcurl/7.61.0 OpenSSL/1.0.2k zlib/1.2.7
目录
启动
停止 nginx -s stop
优雅停止 nginx -s quit
平滑重启 nginx -s reload
指定配置文件操作 nginx -c /tmp/nginx.conf
重新开始记录日志 nginx -s reopen
检测语法错误 nginx -t
查看版本信息和编译配置 nginx -v
热部署
默认编译后,nginx的可执行二进制文件在/usr/local/nginx/sbin目录下,可执行文件为nginx 我们需要执行
cp /usr/local/nginx/sbin/nginx /usr/bin
这样才可以在全局中直接找到nginx的二进制文件
启动
直接执行nginx 如果服务器已经有nginx在执行,再次执行nginx会报错
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
停止
nginx -s stop
优雅停止
nginx -s quit
优雅停止与停止的区别就是: -停止会直接停掉正在连接着的tcp请求,nginx会发送一个RST包,强行断开连接 -优雅停止会让正在连接的tcp请求处理完,然后再进行停止
平滑重启
nginx -s reload
指定配置文件操作
nginx默认使用的配置文件在conf/nginx.conf中,如果我们需要使用其他路径的配置文件,进行指定配置文件操作
nginx -c /tmp/nginx.conf
重新开始记录日志
nginx -s reopen
其实这个命令就是
kill -USR1 nginx.pid # nginx.pid为nginx的master进程ID
有时需求为将nginx的access和error日志按小时切割 如果access和error日志位置在/tmp目录下

  1. mv /tmp/nginx_access.log mv /tmp/nginx_access.log.2018.11.07.11

    1. mv /tmp/nginx_error.log mv /tmp/nginx_error.log.2018.11.07.11
      3.nginx -s reopen

执行后,将会在/tmp目录下面再次创建/tmp/nginx_access.log和/tmp/nginx_error.log日志文件
检测语法错误
nginx -t
nginx -T
这两个命令都可以检测配置文件是否有语法错误 一般为先检测语法错误,然后在启动或者重启nginx t与T的区别就是,T会显示详细的错误信息
查看版本信息和编译配置
nginx -v
nginx -V
-v可以显示nginx的版本信息 -V不光可以显示版本信息,还可以显示编译时候的配置、使用的编译gcc版本、OpenSSL信息
[[email protected] conf]# nginx -V
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --with-http_ssl_module --with-select_module --with-debug
热部署
如果需要升级nginx或者更改编译配置,不需要kill掉nginx的master进程,这样会断开正在连接中的tcp请求,造成短时间内服务器不可用 热部署就是在nginx运行期间升级nginx或者更改编译配置,使请求平滑过渡到新的nginx上 1.首先我们编译一个nginx,并且运行这个nginx
cd nginx-1.12.2
./configure --prefix=/usr/local/nginx && make && make install
/usr/local/nginx/sbin/nginx
2.为了模拟热部署操作,我们更改编译配置,再编译一个新的nginx,注意编译后的predix目录为/usr/local/new_nginx
cd nginx-1.12.2
./configure --prefix=/usr/local/new_nginx --with-debug && make && make install
3.先查看nginx的进程状态,这个运行的nginx是我们第一次编译的nginx,master进程运行PID为28587
[[email protected] sbin]# ps -ef | grep nginx
root 28587 1 0 14:45 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 28588 28587 0 14:45 ? 00:00:00 nginx: worker process
4.进行可执行nginx文件(/usr/local/nginx/sbin/nginx)操作
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp /usr/local/new_nginx/sbin/nginx /usr/local/nginx/sbin
5.给正在运行的nginx发送USR2信号
kill -USR2 28587
6.查看nginx的进程状态,可见有两个master进程了,28587是老的nginx的master进程PID,30186是新的nginx的master进程PID,这时新的连接会进入到新的nginx
[[email protected] sbin]# ps aux | grep nginx
root 28587 0.0 0.0 20536 796 ? Ss 14:45 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 28588 0.0 0.1 20980 1056 ? S 14:45 0:00 nginx: worker process
root 30186 0.0 0.1 20592 1580 ? S 14:58 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 30187 0.0 0.1 21036 1072 ? S 14:58 0:00 nginx: worker process
7.给老的nginx发送WINCH信号
kill -WINCH 28587
8.查看nginx进程信息,老nginx的worker进程已经不存在,老nginx的master还存在的目的是为了热部署回滚用
[[email protected] sbin]# ps aux | grep nginx
root 28587 0.0 0.0 20536 796 ? Ss 14:45 0:00 nginx: master process /usr/local/nginx/sbin/nginx
root 30186 0.0 0.1 20728 1708 ? S 14:58 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 30196 0.0 0.1 21152 1700 ? S 15:00 0:00 nginx: worker process
注意 注意 注意 热部署有几个需要非常注意的几点: -在进程kill -USR2 操作后,所有的请求都会被新的nginx处理,即使将新的nginx的可执行文件移动到老版本的sbin目录下,但是新的nginx的各种配置还是使用新nginx的目录的nginx.conf,如以上的热部署操作,新请求使用的nginx.conf为/usr/local/new_nginx/conf/nginx.conf;所以在kill -USR2操作前,需要使用老版本的nginx.conf覆盖掉新版本的nginx.conf,如果nginx.conf里面还有include操作,也要复制include的文件到新版本中 -操作kill -USR2需要找到可执行文件的位置,在查看nginx进程信息的时候会发现"nginx: master process /usr/local/nginx/sbin/nginx",也就是说需要在"/usr/local/nginx/sbin"进行可执行文件的剪切和复制操作,如果启动的时候将nginx可执行文件放到/usr/bin目录下,并且直接使用/usr/bin/nginx来启动,则需要执行
mv /usr/bin/nginx /usr/bin/nginx.old
cp /usr/local/new_nginx/sbin/nginx /usr/bin/nginx
出处https://github.com/Zhucola/advanced-nginx