Ubuntu 24.04 生产环境 Nginx 1.30.3 源码编译安装指南
·
| 项目 | 说明 |
|---|---|
| 适用系统 | Ubuntu 24.04 LTS (Noble) |
| Nginx 版本 | 1.30.3(稳定版) |
| 安装方式 | 源码编译安装 |
| 安装路径 | /usr/local/nginx |
| 运行用户 | nginx |
| 服务管理 | systemd |
| 日志目录 | /data/logs/nginx |
| 站点根目录 | /data/www/ |
一、系统环境准备
1.1 更新系统并安装编译依赖
sudo apt update
sudo apt install -y build-essential libpcre3-dev zlib1g-dev libssl-dev
| 依赖包 | 用途 |
|---|---|
build-essential |
提供 gcc、make 等编译工具 |
libpcre3-dev |
PCRE 正则表达式库(rewrite 模块依赖) |
zlib1g-dev |
zlib 压缩库(gzip 模块依赖) |
libssl-dev |
OpenSSL 库(HTTPS/SSL 支持) |
1.2 创建专用运行用户
为保障生产环境安全,Nginx 应使用专属系统用户运行,避免使用 root 或与其他服务共用账户。
sudo adduser --system --group --no-create-home nginx
参数说明:
--system:创建系统用户(UID < 1000)--group:同时创建同名用户组--no-create-home:不创建家目录(最小权限原则)
验证用户创建:
id nginx
# 输出示例:uid=999(nginx) gid=999(nginx) groups=999(nginx)
二、下载与解压源码
2.1 获取 Nginx 源码
进入源码存放目录并下载官方稳定版源码包:
cd /usr/local/src
sudo wget https://nginx.org/download/nginx-1.30.3.tar.gz
2.2 解压并进入源码目录
sudo tar -zxvf nginx-1.30.3.tar.gz
cd nginx-1.30.3
三、配置编译选项
3.1 执行 configure 配置
sudo ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-stream \
--with-stream_ssl_module \
--with-cc-opt='-O2 -fstack-protector-strong -D_FORTIFY_SOURCE=2'
3.2 编译参数说明
| 参数 | 说明 |
|---|---|
--prefix=/usr/local/nginx |
指定安装根目录 |
--user=nginx --group=nginx |
指定运行用户和组 |
--with-http_ssl_module |
启用 HTTPS(SSL/TLS)支持 |
--with-http_v2_module |
启用 HTTP/2 协议支持 |
--with-http_realip_module |
获取客户端真实 IP(用于代理场景) |
--with-http_stub_status_module |
启用状态监控页面 |
--with-http_gzip_static_module |
支持发送预压缩的静态文件(.gz) |
--with-stream |
启用 TCP/UDP 四层代理功能 |
--with-stream_ssl_module |
启用四层代理的 SSL/TLS 加密 |
--with-cc-opt |
安全编译选项:栈保护 + FORTIFY_SOURCE |
3.3 验证配置
执行后检查输出末尾是否有以下摘要信息:
Configuration summary
+ using system PCRE library
+ using system zlib library
+ using system OpenSSL library
+ using system threads
...
若出现 not found 错误,请检查对应依赖是否已安装。
四、编译与安装
4.1 执行编译
使用所有 CPU 核心并行编译,大幅缩短编译时间:
sudo make -j$(nproc)
4.2 执行安装
sudo make install
4.3 验证安装
/usr/local/nginx/sbin/nginx -v
# 预期输出:nginx version: nginx/1.30.3
五、配置 systemd 服务
5.1 创建服务单元文件
sudo vim /etc/systemd/system/nginx.service
粘贴以下内容:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
Restart=on-failure
RestartSec=3s
[Install]
WantedBy=multi-user.target
关键配置项说明:
| 配置项 | 说明 |
|---|---|
Type=forking |
Nginx 以守护进程方式运行 |
PIDFile |
指定 PID 文件路径 |
ExecStartPre |
启动前测试配置文件语法 |
PrivateTmp=true |
使用独立临时目录,提升安全性 |
Restart=on-failure |
异常退出时自动重启 |
5.2 重载并启动服务
sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx
5.3 服务管理命令速查
| 操作 | 命令 |
|---|---|
| 启动 | sudo systemctl start nginx |
| 停止 | sudo systemctl stop nginx |
| 重启 | sudo systemctl restart nginx |
| 重载配置 | sudo systemctl reload nginx |
| 查看状态 | sudo systemctl status nginx |
| 开机自启 | sudo systemctl enable nginx |
六、防火墙配置
6.1 放行 Web 服务端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
6.2 重载并检查规则
sudo ufw reload
sudo ufw status
七、创建目录结构并设置权限
7.1 创建工作目录
# 日志目录
sudo mkdir -p /data/logs/nginx
# 站点根目录(示例)
sudo mkdir -p /data/www/default
7.2 设置目录所有权和权限
# 日志目录:所有权归 nginx,仅所有者可读写
sudo chown -R nginx:nginx /data/logs/nginx
sudo chmod -R 700 /data/logs/nginx
# 站点目录:所有权归 nginx,所有者可读写执行,其他人可读执行
sudo chown -R nginx:nginx /data/www/default
sudo chmod -R 755 /data/www/default
八、生产环境配置
8.1 主配置文件 nginx.conf
编辑主配置文件:
sudo vim /usr/local/nginx/conf/nginx.conf
完整配置如下:
# ============================================
# 全局配置
# ============================================
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;
# ============================================
# 事件模块
# ============================================
events {
worker_connections 9216;
use epoll;
multi_accept on;
}
# ============================================
# HTTP 模块
# ============================================
http {
# ---------- 基础配置 ----------
include mime.types;
default_type application/octet-stream;
# ---------- 日志配置(JSON 格式) ----------
log_format json_log escape=json '{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request":"$request",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"request_time":$request_time,'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"http_x_forwarded_for":"$http_x_forwarded_for"'
'}';
access_log /data/logs/nginx/access.log json_log;
error_log /data/logs/nginx/error.log warn;
# ---------- 安全:隐藏版本号 ----------
server_tokens off;
# ---------- 安全:请求体大小限制 ----------
client_max_body_size 10M;
# ---------- 安全:超时防护(防慢速攻击) ----------
client_header_timeout 8s;
client_body_timeout 8s;
send_timeout 10s;
keepalive_timeout 65;
# ---------- DNS 解析器(反向代理场景) ----------
resolver 8.8.8.8 114.114.114.114 valid=300s;
resolver_timeout 5s;
# ============================================
# 限流配置(保护后端 PHP/Java 服务)
# ============================================
# 策略1:常规 API 限流
# - key: $binary_remote_addr(基于客户端 IP)
# - zone: 20MB 共享内存,存储 IP 计数状态
# - rate: 每秒 12 个请求(可根据后端处理能力调整)
limit_req_zone $binary_remote_addr zone=api_limit:20m rate=12r/s;
# 策略2:登录接口限流(更严格,防暴力破解)
# - rate: 每分钟 2 个请求(r/m = requests per minute)
# - 独立 zone,避免消耗 API 限流额度
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=2r/m;
# 策略3:健康检查接口限流(宽松,不影响监控)
# - rate: 每秒 30 个请求
# - 确保监控系统能正常探测
limit_req_zone $binary_remote_addr zone=health_limit:5m rate=30r/s;
# ---------- 安全:全局安全响应头 ----------
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# ---------- SSL/TLS 安全配置 ----------
ssl_protocols TLSv1.2 TLSv1.3;
# 以下指令仅对 TLS 1.2 及以下版本生效,TLS 1.3 自动协商
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# ---------- Gzip 压缩 ----------
gzip on;
gzip_vary on;
gzip_min_length 1k;
gzip_comp_level 4;
gzip_disable "msie6";
gzip_types text/plain text/css text/xml text/javascript
application/json application/javascript
application/xml+rss application/rss+xml
image/svg+xml;
# ---------- 加载站点配置 ----------
include /usr/local/nginx/conf/conf.d/*.conf;
}
8.2 创建站点配置目录
sudo mkdir -p /usr/local/nginx/conf/conf.d
8.3 默认站点配置 default.conf
sudo vim /usr/local/nginx/conf/conf.d/default.conf
server {
listen 80;
server_name 您的域名;
root /data/www/default;
index index.html index.htm;
# ============================================
# 限流执行说明(重要)
# ============================================
# 限流分为两步:
# 1. 在 nginx.conf 的 http 块中用 limit_req_zone 定义规则
# 2. 在 server/location 块中用 limit_req 执行规则
#
# 关于 burst 参数:
# - 允许瞬间超过 rate 的请求数量上限
# - 相当于一个"缓冲池",超出 rate 的请求先放入池中
#
# 关于 nodelay 参数:
# - 不加 nodelay(默认):缓冲池中的请求排队等待,匀速转发
# → 适合后端 API,保护 PHP/Java 不被冲垮
# - 加 nodelay:缓冲池中的请求立即转发,不等待
# → 适合静态资源,提升用户体验
#
# 生产环境推荐:
# - 常规 API:不加 nodelay(保护后端)
# - 登录接口:不加 nodelay(更严格防刷,且用 r/m 单位)
# - 健康检查:加 nodelay(不影响监控)
# - 静态资源:不加限流或用宽松限流
# ============================================
# ---------- 常规 API(保护后端,排队模式) ----------
# rate=12r/s, burst=24, 无 nodelay
# 效果:超速请求排队等待(约 83ms 放行一个),后端压力恒定
location /api/ {
limit_req zone=api_limit burst=24;
# 如果有后端服务,取消注释并配置
# proxy_pass http://127.0.0.1:8080;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
return 200 "API response\n";
}
# ---------- 登录接口(更严格防暴力破解) ----------
# rate=2r/m, burst=5, 无 nodelay
# 效果:每分钟超过 2 个请求会排队,最多排队 5 个
# 适用场景:登录、注册、密码重置等敏感接口
location /api/login/ {
limit_req zone=login_limit burst=5;
# proxy_pass http://127.0.0.1:8080;
return 200 "Login OK\n";
}
# ---------- 健康检查接口(宽松,允许突发) ----------
# rate=30r/s, burst=50, 加 nodelay
# 效果:允许瞬间突发大量请求,立即返回
# 适用场景:K8s 探针、负载均衡健康检查、监控系统
location /api/health/ {
limit_req zone=health_limit burst=50 nodelay;
access_log off;
# proxy_pass http://127.0.0.1:8080;
return 200 "Healthy\n";
}
# ---------- 静态资源(不限流,提升体验) ----------
location /static/ {
alias /data/www/static/;
expires 30d;
access_log off;
add_header Cache-Control "public, immutable";
}
# ---------- 禁止访问敏感文件 ----------
location ~* \.(env|git|bak|sql|swp|log|tar|gz|zip|rar|pem|key)$ {
deny all;
}
# ---------- 禁止访问隐藏文件 ----------
location ~ /\. {
deny all;
}
# ---------- 默认请求处理 ----------
location / {
try_files $uri $uri/ /index.html;
}
# ---------- 状态监控(仅内网可访问) ----------
location /nginx_status {
stub_status;
allow 127.0.0.1;
allow 192.168.0.0/16; # 根据实际内网网段修改
deny all;
}
# ---------- 访问日志 ----------
access_log /data/logs/nginx/default_access.log json_log;
error_log /data/logs/nginx/default_error.log warn;
}
8.4 限流配置速查表
| 场景 | zone | rate | burst | nodelay | 适用说明 |
|---|---|---|---|---|---|
| 常规 API | api_limit |
12r/s | 24 | ❌ 不加 | 保护 PHP/Java 后端,匀速处理 |
| 登录接口 | login_limit |
2r/m | 5 | ❌ 不加 | 防暴力破解,极严格 |
| 健康检查 | health_limit |
30r/s | 50 | ✅ 加 | 保证监控可用,允许突发 |
| 静态资源 | 不限流 | — | — | — | 直接放行,优化缓存 |
8.5 测试配置并重载
# 检查配置文件语法
sudo /usr/local/nginx/sbin/nginx -t
# 重载配置
sudo systemctl reload nginx
九、日志轮转配置
为防止日志文件无限增长导致磁盘空间耗尽,需配置 logrotate 进行日志轮转。
9.1 创建 logrotate 配置文件
sudo vim /etc/logrotate.d/nginx
内容如下:
/data/logs/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 nginx nginx
postrotate
[ -f /usr/local/nginx/logs/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
endscript
}
配置说明:
| 参数 | 说明 |
|---|---|
daily |
每天轮转一次 |
rotate 30 |
保留最近 30 个日志文件 |
compress |
轮转后压缩(gzip) |
delaycompress |
延迟到下次轮转时压缩 |
create 644 nginx nginx |
新建日志文件权限和属主 |
postrotate |
轮转后通知 Nginx 重新打开日志文件 |
9.2 验证 logrotate 配置
sudo logrotate -d /etc/logrotate.d/nginx
十、验证部署
10.1 检查服务状态
sudo systemctl status nginx
10.2 检查进程
ps aux | grep nginx
预期看到:
root用户运行的 master 进程nginx用户运行的多个 worker 进程
10.3 测试限流效果
测试常规 API 限流:
# 快速发送 30 个请求,观察限流效果
for i in {1..30}; do curl -s -o /dev/null -w "%{http_code}\n" http://localhost/api/; done | sort | uniq -c
预期输出示例:
12 200 # 前 12 个请求正常通过
13 503 # 超出 rate+burst 的请求被拒绝(12r/s + burst=24,超过36个才会503,但这里循环太快,实际可能是部分排队+部分503)
测试登录接口限流:
# 模拟暴力破解尝试(快速发送 10 个请求)
for i in {1..10}; do curl -s -o /dev/null -w "%{http_code}\n" http://localhost/api/login/; done | sort | uniq -c
预期大量请求返回 503,登录接口被严格保护。
10.4 测试 HTTP 响应头
curl -I http://localhost
检查响应中是否包含安全响应头(X-Frame-Options、Strict-Transport-Security 等),以及 Server 头不显示具体版本号。
10.5 查看限流日志
# 查看被限流的请求(返回 503)
sudo grep " 503 " /data/logs/nginx/access.log
# 查看 error.log 中的限流日志
sudo grep "limiting" /data/logs/nginx/error.log
# 输出示例:limiting requests, excess: 5.123 by zone "api_limit"
10.6 浏览器访问
在浏览器中访问服务器 IP 地址,应看到 Nginx 欢迎页面或您配置的站点首页。
十一、安装信息汇总
| 项目 | 路径/值 |
|---|---|
| Nginx 版本 | 1.30.3 |
| 安装根目录 | /usr/local/nginx |
| 可执行文件 | /usr/local/nginx/sbin/nginx |
| 主配置文件 | /usr/local/nginx/conf/nginx.conf |
| 站点配置目录 | /usr/local/nginx/conf/conf.d/ |
| 日志目录 | /data/logs/nginx |
| 站点根目录 | /data/www/default |
| 运行用户 | nginx |
| PID 文件 | /usr/local/nginx/logs/nginx.pid |
| systemd 服务 | /etc/systemd/system/nginx.service |
| logrotate 配置 | /etc/logrotate.d/nginx |
十二、常用运维命令
服务管理
sudo systemctl start nginx # 启动
sudo systemctl stop nginx # 停止
sudo systemctl restart nginx # 重启
sudo systemctl reload nginx # 重载配置
sudo systemctl status nginx # 查看状态
配置管理
# 测试配置文件语法
sudo /usr/local/nginx/sbin/nginx -t
# 查看当前配置
sudo /usr/local/nginx/sbin/nginx -T
# 查看加载的限流配置
sudo /usr/local/nginx/sbin/nginx -T | grep limit_req
日志查看
# 查看访问日志(实时滚动)
sudo tail -f /data/logs/nginx/access.log
# 查看错误日志(实时滚动)
sudo tail -f /data/logs/nginx/error.log
# 查看限流统计(被拒绝的请求)
sudo grep " 503 " /data/logs/nginx/access.log | wc -l
限流参数调优
# 如需调整限流参数,编辑站点配置
sudo vim /usr/local/nginx/conf/conf.d/default.conf
# 修改 burst 值或添加/删除 nodelay
# 测试并重载
sudo /usr/local/nginx/sbin/nginx -t
sudo systemctl reload nginx
十三、版本升级流程
当需要升级到新版本时,可按以下步骤操作:
# 1. 备份当前配置
sudo cp -r /usr/local/nginx/conf /usr/local/nginx/conf.bak
# 2. 下载新版本源码
cd /usr/local/src
sudo wget https://nginx.org/download/nginx-x.y.z.tar.gz
sudo tar -zxvf nginx-x.y.z.tar.gz
cd nginx-x.y.z
# 3. 使用相同参数配置并编译
sudo ./configure [与之前完全相同的参数]
sudo make -j$(nproc)
# 4. 热升级(不中断服务)
sudo make upgrade
附录 A:限流配置速查卡
A.1 限流指令说明
| 指令 | 位置 | 语法 | 说明 |
|---|---|---|---|
limit_req_zone |
http |
limit_req_zone key zone=name:size rate=rate; |
定义限流规则(存储空间和速率) |
limit_req |
server/location |
limit_req zone=name [burst=number] [nodelay]; |
执行限流(引用规则并配置突发策略) |
A.2 速率单位
| 单位 | 含义 | 示例 |
|---|---|---|
r/s |
每秒请求数(requests per second) | rate=10r/s |
r/m |
每分钟请求数(requests per minute) | rate=2r/m |
A.3 参数决策指南
| 参数 | 作用 | 加/不加 | 适用场景 |
|---|---|---|---|
burst |
突发缓冲池大小 | ✅ 建议加 | 所有限流场景,避免瞬间小尖峰被误杀 |
nodelay |
突发请求立即处理 | ❌ 不加 | API 接口(保护后端数据库连接池) |
nodelay |
突发请求立即处理 | ✅ 加 | 静态资源、健康检查(用户体验优先) |
A.4 生产环境推荐值
| 场景 | rate | burst | nodelay | 说明 |
|---|---|---|---|---|
| 普通 API | 10~20r/s | rate×2 | ❌ | 根据后端压测结果调整 |
| 登录接口 | 2~5r/m | 5~10 | ❌ | 严格防暴力破解 |
| 健康检查 | 30~50r/s | 50~100 | ✅ | 不影响监控探测 |
| 静态资源 | — | — | — | 不限流,直接放行 |
A.5 常见问题排查
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 所有请求返回 503 | rate 或 burst 设置过小 |
增大 rate 或 burst 值 |
| 限流效果不明显 | rate 设置过大,未触发限流 |
降低 rate 值 |
| 后端服务仍被冲垮 | 使用了 nodelay,后端压力瞬间过大 |
去掉 nodelay,让请求排队 |
| 健康检查被限流 | 健康检查超时后重试,触发限流 | 单独为健康检查配置宽松限流或单独 zone |
附录 B:编译参数速查表
| 参数 | 用途 | 生产环境推荐 |
|---|---|---|
--prefix |
安装路径 | ✅ 必选 |
--user/--group |
运行用户/组 | ✅ 必选 |
--with-http_ssl_module |
HTTPS 支持 | ✅ 必选 |
--with-http_v2_module |
HTTP/2 支持 | ✅ 推荐 |
--with-http_realip_module |
真实 IP 获取 | ✅ 推荐 |
--with-http_stub_status_module |
状态监控 | ✅ 推荐 |
--with-http_gzip_static_module |
预压缩静态文件 | ○ 可选 |
--with-stream |
TCP/UDP 代理 | ○ 按需 |
--with-stream_ssl_module |
流代理 SSL | ○ 按需 |
--with-http_v3_module |
HTTP/3 支持 | ○ 按需 |
附录 C:故障排查指南
问题 1:启动失败,端口被占用
sudo netstat -tlnp | grep :80
sudo netstat -tlnp | grep :443
找到占用进程并停止,或修改 Nginx 监听端口。
问题 2:限流配置不生效
# 检查是否正确加载
sudo /usr/local/nginx/sbin/nginx -T | grep -A 5 "limit_req"
# 检查配置语法
sudo /usr/local/nginx/sbin/nginx -t
问题 3:日志无法写入
ls -la /data/logs/nginx
确保目录所有者为 nginx:nginx,权限为 700。
问题 4:配置文件语法错误
sudo /usr/local/nginx/sbin/nginx -t
错误信息会明确指出问题所在的行号和内容。
文档版本:2.0
适用 Nginx 版本:1.30.3
最后更新:2026-07-12
更多推荐


所有评论(0)