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
相关推荐
黄尚圈圈21 分钟前
Vue 中引入 ECharts 的详细步骤与示例
前端·vue.js·echarts
浮华似水1 小时前
简洁之道 - React Hook Form
前端
2401_857622663 小时前
SpringBoot框架下校园资料库的构建与优化
spring boot·后端·php
正小安3 小时前
如何在微信小程序中实现分包加载和预下载
前端·微信小程序·小程序
2402_857589363 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
哎呦没5 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch5 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光5 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   5 小时前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发
长路 ㅤ   5 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d