内容纲要

🗂 | 查看 NGINX 专题可浏览更多内容


版本选择

在 NGINX 专题 开头有提到,NGINX 的版本有两个分支:「Stable」及「Mainline」,前者只有错误修复,而后者不仅有错误修复还包含最新功能,到底使用哪条分支的 NGINX 官方的说法也很矛盾,所以如果你担心新功能可能产生的影响,例如与第三方模块的不兼容或新功能中无意引入的错误,就使用「Stable」分支,反之使用「Mainline」分支吧。

安装方式

应该选择预先构建的包还是源代码编译来安装 NGINX?

预先构建的包:开箱即用。
使用如 APT 一类的高级包管理系统有很多好处,包的兼容性测试、安装所需要的依赖、安装后的如权限等配置、日后的升级维护都一条龙的解决了。

源代码编译:提供更多的灵活性。
而从源代码编译 NGINX 可以添加特定的模块(来自 NGINX 或第三方) ,并应用最新的安全补丁。

添加特定的模块是使用编译安装 NGINX 的主要原因,大多数构建在 NGINX 中的模块是静态链接的:它们在编译时构建在 NGINX 中并静态链接到 NGINX 二进制文件。这些模块需要通过编译 NGINX 来启用或禁用。
NGINX 模块也可以编译为共享对象 (*.so 文件) 。然后在运行时动态加载到 NGINX。这提供了更多的灵活性,因为通过在 NGINX 配置文件中添加或删除相关的 load_module 指令并重新加载配置,可以在任何时候加载或卸载模块。但注意,这需要模块本身必须支持动态链接。

使用包管理器安装预构建包

APT & Debian / Ubuntu

Debian 谱系的 Linux 发行版可使用此方法…

首先安装一些必要工具及保存 NGINX 签名密钥:

apt update
sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

安装 Stable 分支的 NGINX:

⚠️ 注意以下为一条命令(全部复制粘贴执行)

OS=$(lsb_release -is | tr '[:upper:]' '[:lower:]')
RELEASE=$(lsb_release -cs)
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/${OS} ${RELEASE} nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

安装 Mainline 分支的 NGINX:

⚠️ 注意以下为一条命令(全部复制粘贴执行)

OS=$(lsb_release -is | tr '[:upper:]' '[:lower:]')
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/${OS} ${RELEASE} nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

刷新源及安装 NGINX:

sudo apt update
sudo apt install nginx

DNF & Red Hat / CentOS

sudo vim /etc/yum.repos.d/nginx.repo

内容如下:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/OS/OSRELEASE/$basearch/
gpgcheck=0
enabled=1

⚠️ 修改选项:

  • 根据所使用的发行版,修改上述示例中的 OS 为 rhel (表示 Red Hat)或 centos (表示 CentOS);
  • 根据所使用的发行版版本号,修改上述示例中的 OSRELEASE 为例如 8;
  • 若想安装 Stable 分支的 NGINX 则删除上述示例中的 mainline,如 http://nginx.org/packages/rhel/8/$basearch/

然后使用命令安装:

sudo dnf install nginx

通过源代码进行编译及安装

准备

在开始之前需要先安装一些工具,如用于编译源代码的编译器 gcc、g++、用于构建的 make 等等,不然在编译安装软件时就可能会遇到这样的提示:./configure: error: C compiler cc is not found

# APT(Debian 谱系的发行版)
sudo apt install build-essential

# DNF(Red Hat 谱系的发行版)
sudo dnf group install "Development Tools"

在安装好构建套件工具后,还需要解决 NGINX 所需要的三个基本依赖:

  • PCRE – 支持正则表达式。 NGINX Core 和 Rewrite 模块需要。
  • zlib – 支持头压缩。 NGINX Gzip 模块需要。
  • OpenSSL – 支持 HTTPS 协议。由 NGINX SSL 模块和其他需要。

优先选择使用包管理器 APT 或 DNF 安装它们:

# APT(Debian 谱系的发行版)
sudo apt install libpcre3-dev zlib1g-dev libssl-dev

# DNF(Red Hat 谱系的发行版)
sudo dnf install pcre-devel openssl-devel

如果你的项目管理要求非要连这些依赖也要通过源码编译安装,可使用下列方法。

但注意不要照搬所给出的示例,而是按照注释中的官方网站获取最新版本的下载链接:

# 进入
cd /usr/local/src

# PCRE https://pcre.org/
sudo wget https://versaweb.dl.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz
sudo tar -xaf pcre-8.45.tar.gz
cd pcre-8.45/
sudo ./configure
sudo make
sudo make install
cd ..

# zlib https://zlib.net/
sudo wget https://zlib.net/zlib-1.2.12.tar.gz
sudo tar -xaf zlib-1.2.12.tar.gz
cd zlib-1.2.12/
sudo ./configure
sudo make
sudo make install
cd ..

# OpenSSL https://www.openssl.org/source/
sudo wget https://www.openssl.org/source/openssl-1.1.1q.tar.gz
sudo tar -xaf openssl-1.1.1q.tar.gz
cd openssl-1.1.1q/
sudo ./config
sudo make
sudo make install
cd ..

为 NGINX 的工作进程新建一个非特权用户,如 www:

sudo useradd -s /sbin/nologin www

下载

下载 NGINX Open Source

cd /usr/local/src

sudo wget http://nginx.org/download/nginx-1.22.0.tar.gz

sudo tar -xaf nginx-1.22.0.tar.gz

cd nginx-1.22.0/

可以了解下 NGINX 源码目录的结构:

/usr/local/src/nginx-1.22.0/
├── auto        # 用于编译所需的各类脚本合集
├── CHANGES     # 版本历史更新日志
├── CHANGES.ru  # 俄语版版本历史更新日志
├── conf        # 配置示例文件,会拷贝到安装目录
├── configure   # 编译 NGINX 的自动化配置脚本,用于生成中间文件,执行编译前必备动作
├── contrib     # 必要的功能脚本如提供两个 Perl 脚本 geo2nginx.pl、unicode2nginx 和可导入配置如 vim 高亮配置
├── html        # 提供标准 HTML 文件 (50x 错误和 index)
├── LICENSE     # 许可协议
├── man         # 帮助文件
├── README      # 说明
└── src         # 源码文件

💡 如果使用 VIM 编辑器可以使用 contrib 目录下的配置文件,以在打开 NGINX 配置文件时显示语法高亮:cp -r contrib/vim/* ~/.vim/

配置

在开始操作前可以先查看支持选项:

./configure --help | more

  --help                             print this message

  --prefix=PATH                      set installation prefix
  --sbin-path=PATH                   set nginx binary pathname
  --modules-path=PATH                set modules path
  --conf-path=PATH                   set nginx.conf pathname
  --error-log-path=PATH              set error log pathname
  --pid-path=PATH                    set nginx.pid pathname
  --lock-path=PATH                   set nginx.lock pathname

  --user=USER                        set non-privileged user for
                                     worker processes
  --group=GROUP                      set non-privileged group for
                                     worker processes

  --build=NAME                       set build name
  --builddir=DIR                     set build directory

  --with-select_module               enable select module
  --without-select_module            disable select module
  --with-poll_module                 enable poll module
  --without-poll_module              disable poll module

--More--

可选设置包括 NGINX 的安装、模块、配置文件等路径、用于工作进程的非特权用户等等,再一个就是用于设置编译进或排除掉的模块选项,带有 --with 的模块默认编译进 NGINX(--without 相反),示例:

  • 启用 SSL 模块:--with-http_ssl_module;
  • 启用四层 TCP 或 UDP 代理模块:--with-stream;
  • 禁用 gzip 压缩模块:--without-http_gzip_module;

因为前面已经安装了 NGINX 所需的 PCRE、zlib 和 OpenSSL 三个依赖,以及建立了一个 NGINX 工作进程所用的非特权用户 www,所以 sudo ./configure 配置如下:

sudo ./configure \
    --prefix=/usr/local/nginx \
    --user=www \
    --group=www \
    --with-http_ssl_module

如果是通过编译安装的 PCRE、zlib 和 OpenSSL,则使用该命令:

sudo ./configure \
    --prefix=/usr/local/nginx \
    --user=www \
    --group=www \
    --with-pcre=/usr/local/src/pcre-8.45 \
    --with-zlib=/usr/local/src/zlib-1.2.12 \
    --with-http_ssl_module

在结果可以看到 3 个 library 的配置摘要:

Configuration summary
  + using PCRE library: /usr/local/src/pcre-8.45
  + using system OpenSSL library
  + using zlib library: /usr/local/src/zlib-1.2.12

此时 nginx-1.22.0 目录里会新建一个名为 objs 的目录,里面存放着一些中间文件

/usr/local/src/nginx-1.22.0/objs/
├── autoconf.err
├── Makefile
├── ngx_auto_config.h
├── ngx_auto_headers.h
├── ngx_modules.c
└── src

其中最重要的是 ngx_modules.c,它决定了稍后编译安装时有哪些模块会被编译进 NGINX。

编译

sudo make

在成功编译后会生成更多的中间文件:

/usr/local/src/nginx-1.22.0/objs/
├── autoconf.err
├── Makefile
├── nginx
├── nginx.8
├── ngx_auto_config.h
├── ngx_auto_headers.h
├── ngx_modules.c
├── ngx_modules.o
└── src

其中 nginx 就是 NGINX 的二进制文件,如果有动态模块也会生成在 objs 目录中,而 gcc 编译的文件会在 src 目录中。

安装

首次安装使用

sudo make install

如果在配置时没有使用 --prefix 指定目录一般会默认安装到 /usr/local/nginx/,而 NGINX binary 会在该目录下的 sbin 目录中(/usr/local/nginx/sbin)

为什么强调首次安装时使用 make install,因为日后进行 NGINX 升级时不能使用该命令,而是在编译后替换二进制文件,也就是将 /usr/local/src/nginx-1.22.0/objs/ 下的 nginx 拷贝替换到安装目录。

最后,查看 NGINX 版本号以确认是否成功安装:

/usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.22.0