编译安装 NGINX
相对于预构建软件包,从源代码编译 NGINX 的开源版本提供了更多的灵活性,你可以从 NGINX 或者第三方添加特定模块,并应用最新的安全补丁。
安装 NGINX 依赖
在最终编译之前,你可能需要安装多个依赖:
1 | wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz |
1 | wget https://www.zlib.net/zlib-1.2.11.tar.gz |
1 | wget http://www.openssl.org/source/openssl-1.1.1d.tar.gz |
下载源码
从 nginx.org 下载稳定版本或主线版本的源码。
下载并解压最新主线版本的源码,请运行:
1 | wget https://nginx.org/download/nginx-1.17.3.tar.gz |
下载并解压最新稳定版本的源码,请运行:
1 | wget https://nginx.org/download/nginx-1.16.1.tar.gz |
配置构建选项
配置选项由 ./configure 脚本设置各种 NGINX 参数来声明,包括源码路径、连接处理方法以及模块列表。脚本运行完毕后将会创建编译 NGINX 所需的 Makefile 文件。
配置脚本使用示例(使用 \ 实现换行):
1 | ./configure \ |
配置 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 | ./configure \ |
模块名 | 描述 |
---|---|
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 | ./configure \ |
模块名 | 描述 |
---|---|
–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 响应。该模块需要 Libxml2 和 XSLT 库。要编译为单独的动态模块请将选项更改为 --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>
选项 可以编译这类模块,其中
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=<PATH> |
加载一个动态模块,请在 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 | make |
- 安装完成后,验证并启动 NGINX。
1 | nginx -V |