01 × 安装、升级、回滚与卸载

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)。

  1. 使用 Weget 命令下载源码包

    bash 复制代码
    cd ~
    wget https://nginx.org/download/nginx-1.24.0.tar.gz # for nginx.org/download
  2. 解压下载的 nginx 源码包

    bash 复制代码
    mkdir ~/nginx
    tar -xzf nginx-1.24.0.tar.gz
    mv nginx-1.24.0.tar.gz ./nginx
  3. 通过 yum 安装 nginx 相关的依赖包

    bash 复制代码
    [sudo] yum -y install gcc;
    [sudo] yum -y install openssl openssl-devel zlib zlib-devel pcre pcre-devel
  4. 执行 ./configure 命令,预编译出 objs 目录与 Makefile 文件。

    bash 复制代码
    ./configure 
  5. 编译 Nginx 程序,在 objs 目录生成可执行二进制文件。

    bash 复制代码
    [sudo] make 
  6. 安装 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

平滑升级

💡 平滑升级的主要内容:

  1. 备份旧版本可执行文件并编译出新版本的可执行文件存放在同一目录下。
  2. 使用 kill -USR2 命令,通知旧版本进程调用新版本可执行程序创建新的进程。
  3. 使用 kill -QUIET 命令,优雅关闭旧进程,完成平滑升级。
  1. 备份旧版本 Nginx 可执行程序。

    bash 复制代码
    cd /usr/local/nginx/sbin;
    mv ./nginx ./nginx-old;
  2. 编译新版本可执行文件,并拷贝到与旧版执行程序同一目录。

    bash 复制代码
    wget 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
  3. 使用 kill -USR2 命令通知旧版本进程调用新版本程序创建一个新的 master 进程。

    bash 复制代码
    ps -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 命令来创建一个新版本进程。

    bash 复制代码
    kill -USR2 7018
    # 或者直接读取 nginx.pid 文件中保存的当前进程号
    # kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`

    此时,我们便可以看到旧版本进程基于拷贝的新版本 Nginx 可执行文件,又启动了一个新版本程序的进程,此时新版本进程 Pid 为 10693 父进程 Pid 为 7018 ,即新版本进程的父进程为旧版本进程。

    bash 复制代码
    kill -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

    bash 复制代码
    ls -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
  4. 使用 kill -QUIET 命令优雅退出旧版进程,保留新版本进程,完成平滑升级。

    bash 复制代码
    kill -QUIET 7018;

    新版本进程完全继承自旧版本进程的属性和配置,但是两个 master 进程完全是平等独立的,所以关闭旧版本进程并不会影响新版本进程。

💡 简单安装具有简单方便的特点,对应的缺点便是不如源码安装的灵活性,比如添加第三方模块等。具体采用何种方式要看使用的场景,如果只是小规模的服务器集合,则推荐使用简单安装的方式,如果对于中大型服务器集群,基于配置、模块、环境统一的需要,那么源码安装更加适合,能更好的控制 nginx 以及模块的版本和配置。

失败回滚

为防止新版本存在未知的 BUG 以及严重的兼容性问题,通常我们会保留旧版本进程一段时间,为可能的回滚做准备。

  1. 使用 kill -HUP 命令拉起旧版本进程(此时旧版本进程会创建新的 work 进程)。

    bash 复制代码
    kill -HUP `cat /usr/local/nginx/logs/nginx.pid.oldbin`
  2. 使用 kill -QUIT 命令优雅退出新版本进程(请求会自动由旧版本进程接收处理)。

    bash 复制代码
    kill -QUIT `cat /usr/loca/nginx/logs/nginx.pid`;

卸载程序

  1. 停止当前的 nginx 服务并删除文件

    bash 复制代码
    cd /usr/local/nginx/sbin
    [sudo] ./nginx -s stop
    [sudo] rm -rf /usr/local/nginx/
  2. 清理源码与编译结果(如果采用源码安装)

    bash 复制代码
    cd ~/nginx/nginx-1.24.0
    make clean # 等价 rm -rf objs Makefile
相关推荐
吕彬-前端32 分钟前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱35 分钟前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
许野平42 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
guai_guai_guai44 分钟前
uniapp
前端·javascript·vue.js·uni-app
bysking2 小时前
【前端-组件】定义行分组的表格表单实现-bysking
前端·react.js
王哲晓2 小时前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
fg_4112 小时前
无网络安装ionic和运行
前端·npm
理想不理想v2 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云2 小时前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js
微信:137971205872 小时前
web端手机录音
前端