完整的记录一下Nginx的更新流程
在看后续内容之前,我要提醒一下,为了方便,我在文章中使用的都是root用户,但这是很危险的行为,实际上你可能只需要在make install和关闭/启动nginx的时候需要root权限。
1 确定正在运行的nginx使用的配置文件和可执行文件
1.1 旧版本的配置文件的路径
通过nginx进程的pid去定位正在运行的nginx可执行文件路径和它使用的配置文件,
使用ps aux | grep nginx
命令找到正在运行的nginx进程:
[root@cgp6g196 ~]# ps aux | grep nginx
root 17895 0.0 0.0 46004 1152 ? Ss 11:03 0:00 nginx: master process ./nginx -c /usr/local/nginx/conf/nginx.conf
nginx 17896 0.0 0.0 46476 2404 ? S 11:03 0:00 nginx: worker process
nginx 17897 0.0 0.0 46476 2432 ? S 11:03 0:00 nginx: worker process
nginx 17898 0.0 0.0 46476 2400 ? S 11:03 0:00 nginx: worker process
nginx 17899 0.0 0.0 46476 2404 ? S 11:03 0:00 nginx: worker process
root 30561 0.0 0.0 112812 968 pts/3 S+ 14:03 0:00 grep --color=auto nginx
注意看输出结果中的第一行结尾部分,nginx: master process
表示这个是nginx的主进程,也就是我们要找的进程,
后面的./nginx -c /usr/local/nginx/conf/nginx.conf
就是上次启动nginx使用的命令,上次启动时使用的参数一定要保存好,之后还要使用。
1.2 旧版本的可执行程序路径
上面的输出结果的第二列表示进程的pid,比如我上面的nginx的主进程的pid就是第一行的17895
。
执行cd /proc/<nginx主进程pid>
,进入保存进程信息的文件夹,用ls -l
命令就可以查看到可执行文件的路径:、
[root@cgp6g196 ~]# cd /proc/17896
[root@cgp6g196 17896]# ls -l
total 0
dr-xr-xr-x 2 nginx nginx 0 Aug 17 14:20 attr
-rw-r--r-- 1 nginx nginx 0 Aug 17 14:20 autogroup
-r-------- 1 nginx nginx 0 Aug 17 14:20 auxv
-r--r--r-- 1 nginx nginx 0 Aug 17 14:20 cgroup
--w------- 1 nginx nginx 0 Aug 17 14:20 clear_refs
-r--r--r-- 1 nginx nginx 0 Aug 17 13:59 cmdline
-rw-r--r-- 1 nginx nginx 0 Aug 17 14:20 comm
-rw-r--r-- 1 nginx nginx 0 Aug 17 14:20 coredump_filter
-r--r--r-- 1 nginx nginx 0 Aug 17 14:20 cpuset
lrwxrwxrwx 1 nginx nginx 0 Aug 17 14:20 cwd -> /usr/local/nginx/sbin
-r-------- 1 nginx nginx 0 Aug 17 14:20 environ
lrwxrwxrwx 1 nginx nginx 0 Aug 17 14:20 exe -> /usr/local/nginx/sbin/nginx # 这里‘->’后面的就是可执行文件
dr-x------ 2 nginx nginx 0 Aug 17 14:20 fd
dr-x------ 2 nginx nginx 0 Aug 17 14:20 fdinfo
-rw-r--r-- 1 nginx nginx 0 Aug 17 14:20 gid_map
-r-------- 1 nginx nginx 0 Aug 17 14:20 io
-r--r--r-- 1 nginx nginx 0 Aug 17 14:20 limits
-rw-r--r-- 1 nginx nginx 0 Aug 17 14:20 loginuid
dr-x------ 2 nginx nginx 0 Aug 17 14:20 map_files
# ...
# 文件夹里内容还有很多,就不一一列出了
进入文件夹后,应该可以看到一个名为exe的软连接,它指向的就是该进程使用的可执行文件路径,也就是我们要找的nginx。
2 编译新版本的nginx
直接在这里下载想要的nginx版本即可:nginx下载
下载后解压备用,在正式编译之前,我们还需要知道之前的nginx编译的时候使用了那些配置参数。
上一步我们得到了正在运行的nginx可执行文件路径,使用<nginx可执行文件> -V
命令:
[root@cgp6g196 ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.24.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
# 下面这一行表示执行配置时添加的参数
configure arguments: --prefix=/vol-th/home/xxx/xxx/nginx-1.24.0/install --with-http_stub_status_module --with-http_ssl_module
上面的最后一行就列出我在上次编译使用的参数,分别是:
-
–prefix=/vol-th/home/xxx/xxx/nginx-1.24.0/install
-
–with-http_stub_status_module
-
–with-http_ssl_module
不同情况下使用的参数可能不同,后面两个--with-<模块名>_module
之类的都是表示编译时添加的模块。
继续正题进入到之前解压好nginx文件夹下,依次执行./configure <配置参数>
、make
、make install
:
[root@cgp6g196 nginx-1.24.0]# ./configure --prefix=/vol-th/home/xxx/xxx/nginx-1.24.0/install --with-http_stub_status_module --with-http_ssl_module
# ...一堆输出,没有报错就行
[root@cgp6g196 nginx-1.24.0]# make
# ...同样一堆输出,没有报错就行
[root@cgp6g196 nginx-1.24.0]# make install
# ...同样一堆输出,没有报错就行
执行完上面的之后,如果没有报错,新版本的nginx就应该已经安装在默认的/usr/local/nginx/
或者你指定的--prefix
路径下了。
3 关闭旧版本并启动的nginx
nginx关闭启动还有别的方法,这里我只介绍我常用的一种。
我们在第一步中已经得到了正在运行的<nginx主进程的pid>和当时启动时使用的参数(包含指定配置文件路径)。接下来依次执行kill -INT <nginx主进程pid>
, <nginx可执行文件路径> <上次启动使用的参数>
,拿我这里的举例就是:
[root@cgp6g196 nginx-1.24.0]# kill -INT 17895
[root@cgp6g196 nginx-1.24.0]# /vol-th/home/xxx/xxx/nginx-1.24.0/install/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
如果执行没有报错,那么恭喜你,你更新成功了。