从源代码构建

从源代码构建 Nginx 可以让您自定义编译选项,启用或禁用特定模块,以满足您的具体需求。

系统要求

Linux

# 安装编译工具
sudo apt install build-essential

# 安装依赖库
sudo apt install libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

macOS

# 安装 Xcode 命令行工具
xcode-select --install

# 使用 Homebrew 安装依赖
brew install pcre openssl

下载源代码

# 创建源代码目录
mkdir -p /usr/local/src
cd /usr/local/src

# 下载最新稳定版
curl -O http://nginx.org/download/nginx-1.24.0.tar.gz

# 或下载主线版
curl -O http://nginx.org/download/nginx-1.25.0.tar.gz

# 解压
tar -xzvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

配置编译选项

使用 ./configure 脚本配置编译选项:

# 基本配置
./configure \
  --prefix=/usr/local/nginx \
  --sbin-path=/usr/local/nginx/sbin/nginx \
  --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 \
  --with-http_ssl_module \
  --with-http_v2_module \
  --with-http_realip_module \
  --with-http_gzip_static_module \
  --with-file-aio \
  --with-http_secure_link_module

常用编译选项

路径选项

选项说明默认值
--prefix=指定安装目录/usr/local/nginx
--sbin-path=Nginx 可执行文件路径<prefix>/sbin/nginx
--conf-path=配置文件路径<prefix>/conf/nginx.conf
--error-log-path=错误日志路径<prefix>/logs/error.log
--http-log-path=访问日志路径<prefix>/logs/access.log
--pid-path=PID 文件路径<prefix>/logs/nginx.pid
--lock-path=锁文件路径<prefix>/logs/nginx.lock

模块选项

# HTTP 核心模块
--with-http_ssl_module              # 启用 SSL/TLS 支持
--with-http_v2_module               # 启用 HTTP/2 支持
--with-http_v3_module               # 启用 HTTP/3 支持
--with-http_realip_module           # 启用真实 IP 模块
--with-http_gzip_static_module      # 启用静态 gzip 压缩
--with-http_gunzip_module           # 启用 gzip 解压缩
--with-http_stub_status_module      # 启用状态页面
--with-http_sub_module              # 启用字符串替换
--with-http_addition_module         # 启用添加文本
--with-http_flv_module              # 启用 FLV 流媒体
--with-http_mp4_module              # 启用 MP4 流媒体
--with-http_gunzip_module           # 启用解压缩
--with-http_random_index_module     # 启用随机首页
--with-http_secure_link_module      # 启用安全链接
--with-http_degradation_module      # 启用降级
--with-http_slice_module            # 启用切片
--with-http_perl_module             # 启用 Perl 支持

# 邮件代理模块
--with-mail                         # 启用邮件代理
--with-mail_ssl_module              # 启用邮件 SSL

# TCP/UDP 代理模块
--with-stream                       # 启用 TCP/UDP 代理
--with-stream_ssl_module            # 启用 TCP/UDP SSL
--with-stream_realip_module         # 启用真实 IP
--with-stream_geoip_module          # 启用 GeoIP

# 其他模块
--with-file-aio                     # 启用文件异步 I/O
--with-threads                      # 启用线程池
--with-pcre                         # 使用 PCRE 库
--with-pcre-jit                     # 启用 PCRE JIT
--with-zlib                         # 使用 zlib 库
--with-openssl                      # 使用 OpenSSL 库
--with-debug                        # 启用调试日志

禁用模块

--without-http_charset_module       # 禁用字符集模块
--without-http_gzip_module          # 禁用 gzip 模块
--without-http_ssi_module           # 禁用 SSI 模块
--without-http_userid_module        # 禁用 userid 模块
--without-http_access_module        # 禁用访问控制模块
--without-http_auth_basic_module    # 禁用基本认证模块
--without-http_autoindex_module     # 禁用自动索引模块
--without-http_geo_module           # 禁用 GeoIP 模块
--without-http_map_module           # 禁用 map 模块
--without-http_split_clients_module # 禁用 split_clients 模块
--without-http_referer_module       # 禁用 referer 模块
--without-http_rewrite_module       # 禁用 rewrite 模块
--without-http_proxy_module         # 禁用 proxy 模块
--without-http_fastcgi_module       # 禁用 FastCGI 模块
--without-http_uwsgi_module         # 禁用 uWSGI 模块
--without-http_scgi_module          # 禁用 SCGI 模块
--without-http_memcached_module     # 禁用 Memcached 模块
--without-http_limit_conn_module    # 禁用连接限制模块
--without-http_limit_req_module     # 禁用请求限制模块
--without-http_empty_gif_module     # 禁用空 GIF 模块
--without-http_browser_module       # 禁用浏览器模块
--without-http_upstream_hash_module # 禁用 upstream hash 模块
--without-http_upstream_ip_hash_module # 禁用 upstream ip_hash 模块
--without-http_upstream_least_conn_module # 禁用 upstream least_conn 模块
--without-http_upstream_keepalive_module # 禁用 upstream keepalive 模块
--without-http_upstream_zone_module # 禁用 upstream zone 模块

性能优化选项

--with-cc-opt=OPTIONS               # 设置额外的 C 编译器选项
--with-ld-opt=OPTIONS               # 设置额外的链接器选项
--with-cpu-opt=CPU                  # 为特定 CPU 优化

CPU 选项:

  • pentium, pentiumpro, pentium3, pentium4
  • athlon, opteron, athlon64, athlon-fx
  • sparc32, sparc64, ppc64
# 示例:为 CPU 优化
./configure --with-cpu-opt=pentium4

# 示例:设置编译器选项
./configure --with-cc-opt="-I /usr/local/include" \
            --with-ld-opt="-L /usr/local/lib"

编译和安装

# 编译
make

# 安装
sudo make install

创建符号链接

# 创建 nginx 命令的符号链接
sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

# 创建配置目录的符号链接(可选)
sudo ln -s /usr/local/nginx/conf /usr/local/etc/nginx

创建 systemd 服务

创建服务文件 /etc/systemd/system/nginx.service

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target
# 重新加载 systemd
sudo systemctl daemon-reload

# 启动 Nginx
sudo systemctl start nginx

# 设置开机自启
sudo systemctl enable nginx

# 查看状态
sudo systemctl status nginx

验证安装

# 检查版本
nginx -v

# 测试配置
nginx -t

# 查看编译参数
nginx -V

常见问题

1. OpenSSL 路径错误

# 指定 OpenSSL 路径
./configure --with-openssl=/usr/local/opt/openssl

2. PCRE 路径错误

# 指定 PCRE 路径
./configure --with-pcre=/usr/local/opt/pcre

3. 编译错误

# 清理编译文件
make clean

# 重新配置和编译
./configure ...
make

4. 权限问题

# 使用 sudo 安装
sudo make install

# 修改权限
sudo chown -R $USER:$USER /usr/local/nginx

升级 Nginx

# 下载新版本
cd /usr/local/src
curl -O http://nginx.org/download/nginx-1.24.1.tar.gz
tar -xzvf nginx-1.24.1.tar.gz
cd nginx-1.24.1

# 配置(使用与之前相同的选项)
./configure ...  # 使用之前的配置选项

# 编译
make

# 备份旧版本
sudo cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

# 替换新版本
sudo cp objs/nginx /usr/local/nginx/sbin/nginx

# 测试新版本
sudo /usr/local/nginx/sbin/nginx -t

# 升级(平滑升级)
sudo make upgrade

查看可用模块

# 查看所有可用模块
./configure --help

# 查看特定模块信息
./configure --help | grep ssl