编译安装 NGINX

相对于预构建软件包,从源代码编译 NGINX 的开源版本提供了更多的灵活性,你可以从 NGINX 或者第三方添加特定模块,并应用最新的安全补丁。

安装 NGINX 依赖

在最终编译之前,你可能需要安装多个依赖:

  • PCRE - 提供正则表达式支持,NGINX Core 以及 Rewrite 模块所需。
1
2
3
4
5
6
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
tar -zxf pcre-8.43.tar.gz
cd pcre-8.43
./configure
make
make install
  • zlib - 提供报头压缩支持,NGINX Gzip 模块所需。
1
2
3
4
5
6
wget https://www.zlib.net/zlib-1.2.11.tar.gz
tar -zxf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make
make install
  • OpenSSL - 提供 HTTPS 协议支持,NGINX SSL 模块所需。
1
2
3
4
5
6
wget http://www.openssl.org/source/openssl-1.1.1d.tar.gz
tar -zxf openssl-1.1.1d.tar.gz
cd openssl-1.1.1d
./configure darwin64-x86_64-cc --prefix=/usr
make
make install

下载源码

nginx.org 下载稳定版本或主线版本的源码。

下载并解压最新主线版本的源码,请运行:

1
2
3
wget https://nginx.org/download/nginx-1.17.3.tar.gz
tar zxf nginx-1.17.3.tar.gz
cd nginx-1.17.3

下载并解压最新稳定版本的源码,请运行:

1
2
3
wget https://nginx.org/download/nginx-1.16.1.tar.gz
tar zxf nginx-1.16.1.tar.gz
cd nginx-1.16.1

配置构建选项

配置选项由 ./configure 脚本设置各种 NGINX 参数来声明,包括源码路径、连接处理方法以及模块列表。脚本运行完毕后将会创建编译 NGINX 所需的 Makefile 文件。

配置脚本使用示例(使用 \ 实现换行):

1
2
3
4
5
6
7
8
9
10
11
./configure \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-pcre=../pcre-8.42 \
--with-zlib=../zlib-1.2.11 \
--with-http_ssl_module \
--with-stream \
--with-mail=dynamic \
--add-module=/usr/build/nginx-rtmp-module \
--add-dynamic-module=/usr/build/3party_module

配置 NGINX 路径

配置脚本允许设置 NGINX 二进制文件、配置文件的路径,也支持设置依赖库(如 PCRE 或 SSL)的路径,以便将它们静态链接到 NGINX 二进制文件。

参数 描述
–prefix=<PATH> NGINX 的安装目录,配置脚本(不包括库的路径)设置中的 NGINX 缺省路径相对于此目录。默认值:/usr/local/nginx。
–sbin-path=<PATH> NGINX 可执行文件路径,仅在安装期间使用。默认值:<prefix>/sbin/nginx。
–conf-path=<PATH> NGINX 配置文件路径。你可以通过 nginx 命令行使用 -c <FILENAME> 指定其他文件来覆盖此设置。默认值:<prefix>/conf/nginx.conf。
–pid-path=<PATH> nginx.pid 文件路径,用于存储 nginx 主进程的进程ID 。安装后可以使用 NGINX 配置文件中的 pid 指令更改。默认值:<prefix>/logs/nginx.pid。
–error-log-path=<PATH> 错误,警告和诊断数据的主日志文件路径。安装后可以使用 NGINX 配置文件中的 error_log 指令更改。默认值:<prefix>/logs/error.log。
–http-log-path=<PATH> 记录 HTTP 请求的主日志文件路径,也就是访问日志。安装后同样可以使用 NGINX 配置文件中的 access_log 指令进行修改。默认值:<prefix>/logs/access.log。
–user=<NAME> NGINX 工作进程使用其凭据的非特权用户的名称。安装后可以使用 NGINX 配置文件中的 user 指令更改。默认:nobody。
–group=<NAME> NGINX工作进程使用其凭据的组的名称。安装后可以使用 NGINX 配置文件中的 user 指令更改。默认值:–user 选项设定的值。
–with-pcre=<PATH> PCRE 库源代码的路径,location 指令和 Rewrite 模块正则表达式支持所需。
–with-pcre-jit 启用即时编译支持(pcre_jit 指令)构建 PCRE 库。
–with-zlib=<PATH> zlib 库的源代码路径,Gzip 模块需要该路径。

配置 NGINX GCC 选项

使用配置脚本,你还可以指定与编译器相关的选项。

参数 描述
–with-cc-opt=“<PARAMETERS>” 额外添加到 CFLAGS 变量的参数。FreeBSD 下使用系统的 PCRE 库编译时强制值为 --with-cc-opt=“-I /usr/local/include”。如果想增加 select() 所支持的文件数量也可以在此声明,比如 --with-cc-opt=“-D FD_SETSIZE=2048”。
–with-ld-opt=“<PARAMETERS>” 链接所需的额外参数。FreeBSD 下使用系统的 PCRE 库编译时强制值为 --with-ld-opt= “-L /usr/local/lib”。

指定 NGINX 连接处理方法

使用配置脚本,你可以重新定义基于事件的轮询的方法。参阅 NGINX 文档中的 Connection processing methods 获取更多信息。

模块名 描述
–with-select_module, --without-select_module 启用或禁用实现 select() 支持的模块,如果系统不支持更合适的方法(如 kqueue,epoll 或 /dev/poll)则会自动构建此模块。
–with-poll_module, --without-poll_module 启用或禁用实现 poll() 支持的模块,如果系统不支持更合适的方法(如 kqueue,epoll 或 /dev/poll)则会自动构建此模块。

选择要构建的 NGINX 模块

NGINX 由具有特定功能的模块组成,这些模块可以通过配置脚本包含选项来指定构建。

默认情况下 NGINX 会构建若干模块 - 不必使用配置脚本指定它们。你也可以使用 --without-<MODULE-NAME> 选项明确排除特定的模块。

默认情况下未包含的模块以及第三方模块必须在配置脚本中与其他构建选项一起显式指定。这些模块可以静态链接(每次 NGINX 启动时加载它们)或者动态链接(只有在 NGINX 配置文件中包含相关指令时才加载它们)到 NGINX 二进制文件。

默认构建的模块

如果你不需要某个默认构建的模块,你可以通过配置脚本使用 --without-<MODULE-NAME> 选项进行排除,以下示例禁用了 Empty GIF 模块:

1
2
3
4
5
6
7
8
9
./configure \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-stream \
--with-pcre=../pcre-8.43 \
--with-zlib=../zlib-1.2.11 \
--without-http_empty_gif_module
模块名 描述
http_access_module 接受或拒绝来自指定客户端地址的请求。
http_auth_basic_module 通过使用 HTTP 基本身份验证协议验证用户名和密码来限制对资源的访问。
http_autoindex_module 处理以正斜杠字符 / 结尾的请求,并生成目录列表。
http_browser_module 创建其值取决于 User-Agent 请求标头值的变量。
http_charset_module 将指定的字符集添加到 Content-Type 响应标头。可以将数据从一个字符集转换为另一个字符集。
http_empty_gif_module 发出单像素透明 GIF。
http_fastcgi_module 将请求传递给 FastCGI 服务器。
http_geo_module 使用取决于客户端 IP 地址的值创建变量。
http_gzip_module 使用 gzip 压缩响应,将传输数据量减少一半或更多。
http_limit_conn_module 限制每个定义密钥的连接数,特别是来自单个 IP 地址的连接数。
http_limit_req_module 限制每个定义密钥的请求处理速率,特别是来自单个 IP 地址的请求的处理速率。
http_map_module 创建其值取决于其他变量值的变量。
http_memcached_module 将请求传递给 memcached 服务器。
http_proxy_module 将 HTTP 请求传递给另一台服务器。
http_referer_module 在 Referer 标头中阻止具有无效值的请求。
http_rewrite_module 使用正则表达式更改请求 URI 并返回重定向; 有条件地选择配置。需要 PCRE 库。
http_scgi_module 将请求传递给 SCGI 服务器。
http_ssi_module 在通过它的响应中处理 SSI(服务器端包含)命令。
http_split_clients_module 创建适合 A/B 测试的变量,也称为拆分测试。
http_upstream_hash_module 启用通用哈希负载平衡方法。
http_upstream_ip_hash_module 启用 IP 哈希负载平衡方法。
http_upstream_keepalive_module 启用 keepalive 连接.
http_upstream_least_conn_module 启用最少连接负载平衡方法。
http_upstream_zone_module 启用共享内存区域。
http_userid_module 设置适合客户端识别的 cookie。
http_uwsgi_module 将请求传递给 uwsgi 服务器。

包含非默认构建的模块

许多 NGINX 模块默认不进行构建,必须在 configure 命令中额外列出。

mail, stream, geoip, image_filter, perl 以及 xslt 等模块可以动态编译。浏览 Dynamic Modules 查看细节。

configure 命令包含非默认构建模块的示例:

1
2
3
4
5
6
7
8
9
./configure \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-pcre=../pcre-8.42 \
--with-zlib=../zlib-1.2.11 \
--with-http_ssl_module \
--with-stream \
--with-mail
模块名 描述
–with-cpp_test_module 测试头文件的 C++ 兼容性。
–with-debug 启用 Debug 日志
–with-file-aio 启用异步 I/O。
–with-google_perftools_module 允许使用 Google Performance tools 库。
–with-http_addition_module 在响应前后添加文本。
–with-http_auth_request_module 根据子请求的结果实现客户端授权。
–with-http_dav_module 使用 WebDAV 协议启用文件管理自动化。
–with-http_degradation_module 允许在内存大小超过定义值时返回错误。
–with-http_flv_module 为 FLV 文件提供伪视频流服务端支持。
–with-http_geoip_module 允许创建取决于客户端 IP 地址的变量。该模块使用 MaxMind GeoIP 数据库。要编译为单独的动态模块请将选项更改为 --with-http_geoip_module=dynamic。
–with-http_gunzip_module 对于不支持 zip encoding 的客户端使用 Content-Encoding: gzip 解压响应。
–with-http_gzip_static_module 允许使用 .gz 文件扩展名而不是常规文件发送预压缩内容。
–with-http_image_filter_module 以 JPEG,GIF和PNG格式转换图像。该模块需要 LibGD 库。要编译为单独的动态模块请将选项更改为 --with-http_image_filter_module=dynamic。
–with-http_mp4_module 为 MP4 文件提供伪视频流服务端支持。
–with-http_perl_module 用于在 Perl 中实现位置和变量处理,并将 Perl 调用插入 SSI。需要 PERL 库。要编译为单独的动态模块,请将选项更改为 --with-http_perl_module=dynamic。
–with-http_random_index_module 处理以斜杠字符 / 结尾的请求,并在此目录中选择一个随机文件作为索引文件。
–with-http_realip_module 将客户端地址更改为在指定的标头字段中发送的地址。
–with-http_secure_link_module 用于检查请求链接的真实性,保护资源免受未经授权的访问,并限制链接的生命周期。
–with-http_slice_module 允许将请求拆分为子请求,每个子请求返回一定范围的响应。提供更有效的大文件缓存。
–with-http_ssl_module 启用 HTTPS 支持。需要一个 SSL 库,如 OpenSSL
–with-http_stub_status_module 提供对 NGINX 基本状态信息的访问。请注意,NGINX Plus 用户不需要此模块,因为它们已经提供了扩展状态指标和交互式的仪表板。
–with-http_sub_module 替换指定字符串来修改响应。
–with-http_xslt_module 使用一个或多个 XSLT 样式表转换 XML 响应。该模块需要 Libxml2XSLT 库。要编译为单独的动态模块请将选项更改为 --with-http_xslt_module=dynamic。
–with-http_v2_module 启用 HTTP/2 支持。访问 The HTTP/2 Module in NGINX 获取细节。
–with-mail 启用邮件代理功能。要编译为单独的动态模块请将选项更改为 --with-mail=dynamic。
–with-mail_ssl_module 为邮件代理服务器提供 SSL/TLS 协议支持。需要一个 SSL 库,如 OpenSSL
–with-stream 启用 TCP 和 UDP 代理功能。要编译为单独的动态模块,请将选项更改为 --with-stream=dynamic。
–with-stream_ssl_module 为流代理服务器提供 SSL/TLS 协议支持。需要一个 SSL 库,如 OpenSSL
–with-threads 启用线程池。访问 Thread Pools in NGINX Boost Performance 9x! 获取细节。

包含第三方模块

你可以通过使用自己的模块或第三方模块编译 NGINX 来扩展 NGINX 的功能。NGINX Wiki 中列出了一些第三方模块。使用第三方模块需要自担风险,因为无法保证其稳定性。

静态链接模块

NGINX 开源版本中的大多数模块在编译时都是静态链接化的,只有重新编译才可以禁用它们。

通过 configure 命令包含 --add-module=<PATH> 选项 可以编译这类模块,其中 是模块的源码路径(示例中为 RTMP 模块):

1
./configure ... --add-module=/usr/build/nginx-rtmp-module

动态链接模块

NGINX 模块也可以编译为共享对象(* .so 文件),然后在运行时动态加载到 NGINX 中。这提供了更大的灵活性,因为在 NGINX 配置文件中可以随时添加或删除相关的 load_module 指令并重新加载配置来随时加载或卸载模块。请注意,模块本身必须支持动态链接。

要使用动态加载的第三方模块编译 NGINX,请在 configure 命令中包含 --add-dynamic-module=<PATH> 选项,其中 是模块源码的路径:

1
./configure ... --add-dynamic-module=&lt;PATH&gt;

加载一个动态模块,请在 NGINX 安装完成后在配置文件中添加 load_module 指令:

1
load_module modules/ngx_mail_module.so;

有关更多信息,请参阅 NGINX 博客上的 Compiling Third‑Party Dynamic Modules for NGINX and NGINX Plus 以及 NGINX Wiki 中的 Extending NGINX 这两篇文章。

完成编译安装

  • 编译安装
1
2
make
make install
  • 安装完成后,验证并启动 NGINX。
1
2
nginx -V
nginx