后端

命令行与热部署操作

使用版本
- 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的可执行二进制文件在/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
  2. 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

xiaoziwuzui
我还没有学会写个人说明!
查看“xiaoziwuzui”的所有文章 →

相关推荐