如何在 Linux 上安装 NGINX
查看「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