项目 说明
适用系统 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-OptionsStrict-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 rateburst 设置过小 增大 rateburst
限流效果不明显 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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐