01 × 安装、升级、回滚与卸载
专栏 ➡️ 跟我一起学 Nginx juejin.cn/column/7307...
简单安装
In Linux
bash
yum -y install nginx # CentOS 使用 yum 安装 nginx
apt install nginx # Ubuntu 使用 apt 安装 nginx
In Macos
bash
brew install nginx
源码安装
💡 因为 Nginx 是采用 C 语言编写,所以便可以遵循一般 C 程序的安装过程: 预编译(configure) → 编译(make) → 安装(make install)。
-
使用
Weget
命令下载源码包bashcd ~ wget https://nginx.org/download/nginx-1.24.0.tar.gz # for nginx.org/download
-
解压下载的 nginx 源码包
bashmkdir ~/nginx tar -xzf nginx-1.24.0.tar.gz mv nginx-1.24.0.tar.gz ./nginx
-
通过
yum
安装 nginx 相关的依赖包bash[sudo] yum -y install gcc; [sudo] yum -y install openssl openssl-devel zlib zlib-devel pcre pcre-devel
-
执行
./configure
命令,预编译出objs
目录与Makefile
文件。bash./configure
-
编译 Nginx 程序,在
objs
目录生成可执行二进制文件。bash[sudo] make
-
安装 Nginx 程序。
bash[sudo] make install
默认情况下 nginx
程序会被安装到 /usr/local/nginx
目录中。现在进入 /usr/local/nginx/sbin
目录下执行 ./nginx
命令来启动 Nginx 服务。
下面列举一些源码安装时常用的配置参数,可在执行 configure
命令时作为参数传入:
参数 | 说明 |
---|---|
--prefix | 指定 Nginx 的安装目录的路径。 |
--sbin-path | 指定 Nginx 可执行二进制文件的路径。 |
--conf-path | 指定 Nginx 配置文件所在的路径。 |
--error-log-path | 指定 Nginx 错误日志文件的路径 |
--pid-path | 指定 Nginx 启动后 Pid 存放的- 路径。 |
--http-log-path | 指定 Nginx 访问 access.log 日志文件所在的路径。 |
-with-http_flv_module | 开启 Nginx 的一个内置模块,该模块用来处理 flv 视频流。 |
--add-module | 添加一个第三方模块。如果需要添加多个第三方模块,只需要配置多次该参数即可。 |
--modules-path | 指定 Nginx 动态模块目录的路径。 |
通过
nginx -V
命令可查看当前 Nginx 服务的配置参数。
bash
./configure
**--prefix=**/usr/local/nginx
**--sbin-path=**/usr/local/nginx/sbin/nginx
**--modules-path=**/usr/local/nginx/modules
**--conf-path=**/usr/local/nginx/conf/nginx.conf
**--error-log-path=**/usr/local/nginx/logs/error.log
**--http-log-path=**/usr/local/nginx/logs/access.log
**--pid-path=**/usr/local/nginx/logs/nginx.pid
**--lock-path=**/usr/local/nginx/logs/nginx.lock
如果需要查看更多的 Nginx 配置参数,可以使用 ./configure --help
命令,例如下面查看Nginx 目前支持配置的动态模块。
bash
./configure --help | grep dynamic
#---
--with-http_xslt_module=dynamic enable dynamic ngx_http_xslt_module
--with-http_image_filter_module=dynamic
enable dynamic ngx_http_image_filter_module
--with-http_geoip_module=dynamic enable dynamic ngx_http_geoip_module
--with-http_perl_module=dynamic enable dynamic ngx_http_perl_module
--with-mail=dynamic enable dynamic POP3/IMAP4/SMTP proxy module
--with-stream=dynamic enable dynamic TCP/UDP proxy module
--with-stream_geoip_module=dynamic enable dynamic ngx_stream_geoip_module
--add-dynamic-module=PATH enable dynamic external module
--with-compat dynamic modules compatibility
平滑升级
💡 平滑升级的主要内容:
- 备份旧版本可执行文件并编译出新版本的可执行文件存放在同一目录下。
- 使用
kill -USR2
命令,通知旧版本进程调用新版本可执行程序创建新的进程。- 使用
kill -QUIET
命令,优雅关闭旧进程,完成平滑升级。
-
备份旧版本 Nginx 可执行程序。
bashcd /usr/local/nginx/sbin; mv ./nginx ./nginx-old;
-
编译新版本可执行文件,并拷贝到与旧版执行程序同一目录。
bashwget https://nginx.org/download/nginx-1.24.0.tar.gz tar -xzf nginx-1.24.0.tar.gz cd nginx-1.24.0.tar.gz ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --modules-path=/usr/local/nginx/modules --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --pid-path=/usr/local/nginx/logs/nginx.pid --lock-path=/usr/local/nginx/logs/nginx.lock make cd objs cp -a ./nginx /usr/local/nginx/sbin
-
使用
kill -USR2
命令通知旧版本进程调用新版本程序创建一个新的 master 进程。bashps -ef | grep nginx root 7018 1 0 4月20 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 7025 7018 0 4月20 ? 00:00:00 nginx: worker process root 10660 8317 0 00:12 pts/0 00:00:00 grep --color=auto nginx
可以看到当前旧版本进程 pid 号为
7018
,父进程号为1
,现在开始执行kill -USR2
命令来创建一个新版本进程。bashkill -USR2 7018 # 或者直接读取 nginx.pid 文件中保存的当前进程号 # kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
此时,我们便可以看到旧版本进程基于拷贝的新版本 Nginx 可执行文件,又启动了一个新版本程序的进程,此时新版本进程 Pid 为
10693
父进程 Pid 为7018
,即新版本进程的父进程为旧版本进程。bashkill -USR2 7018 root 7018 1 0 4月20 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 7025 **7018** 0 4月20 ? 00:00:00 nginx: worker process root 10693 7018 0 00:14 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 10697 10693 0 00:14 ? 00:00:00 nginx: worker process root 10699 8317 0 00:14 pts/0 00:00:00 grep --color=auto nginx
并且旧版本进程的 pid 文件也被更名为了
nginx.pid.oldbin
bashls -lla /usr/local/nginx/logs/ -rw-r--r--. 1 root root 430 4月 20 23:45 access.log -rw-r--r--. 1 root root 264 4月 21 00:14 error.log -rw-r--r--. 1 root root 6 4月 21 00:14 nginx.pid -rw-r--r--. 1 root root 5 4月 20 23:44 nginx.pid.oldbin
-
使用
kill -QUIET
命令优雅退出旧版进程,保留新版本进程,完成平滑升级。bashkill -QUIET 7018;
新版本进程完全继承自旧版本进程的属性和配置,但是两个 master 进程完全是平等独立的,所以关闭旧版本进程并不会影响新版本进程。
💡 简单安装具有简单方便的特点,对应的缺点便是不如源码安装的灵活性,比如添加第三方模块等。具体采用何种方式要看使用的场景,如果只是小规模的服务器集合,则推荐使用简单安装的方式,如果对于中大型服务器集群,基于配置、模块、环境统一的需要,那么源码安装更加适合,能更好的控制 nginx 以及模块的版本和配置。
失败回滚
为防止新版本存在未知的 BUG 以及严重的兼容性问题,通常我们会保留旧版本进程一段时间,为可能的回滚做准备。
-
使用
kill -HUP
命令拉起旧版本进程(此时旧版本进程会创建新的 work 进程)。bashkill -HUP `cat /usr/local/nginx/logs/nginx.pid.oldbin`
-
使用
kill -QUIT
命令优雅退出新版本进程(请求会自动由旧版本进程接收处理)。bashkill -QUIT `cat /usr/loca/nginx/logs/nginx.pid`;
卸载程序
-
停止当前的 nginx 服务并删除文件
bashcd /usr/local/nginx/sbin [sudo] ./nginx -s stop [sudo] rm -rf /usr/local/nginx/
-
清理源码与编译结果(如果采用源码安装)
bashcd ~/nginx/nginx-1.24.0 make clean # 等价 rm -rf objs Makefile