Nginx企业级高频场景配置大全

Nginx企业级高频场景配置大全

说明:整合Nginx企业生产15个高频场景,每个场景包含业务需求、问题痛点、完整可复制配置及关键参数注释,适配Nginx 1.18~1.24主流版本,修改对应参数即可直接部署上线,同时附加日志切割脚本、排错速查表和常用运维命令,方便日常运维查阅。

第一部分:基础通用配置(全局优化,一劳永逸)

将以下配置放入nginx.conf的http{}块内,全局生效,覆盖安全、压缩、上传限制等基础优化。

nginx 复制代码
http {
    # 基础安全配置
    server_tokens off;                     # 隐藏Nginx版本号,防嗅探
    charset utf-8;                         # 全局编码,避免中文乱码
    add_header X-Frame-Options SAMEORIGIN always;       # 防iframe嵌套钓鱼
    add_header X-XSS-Protection "1; mode=block" always; # XSS防护,等保必备
    add_header X-Content-Type-Options nosniff always;   # 防止MIME类型嗅探

    # 文件上传/请求限制
    client_max_body_size 500M;     # 全局最大上传文件限制,可按需调整
    client_body_buffer_size 10M;
    client_header_timeout 15s;
    client_body_timeout 60s;
    send_timeout 60s;

    # Gzip压缩 性能优化(减少带宽占用,提升加载速度)
    gzip on;
    gzip_min_length 1k;        # 小于1k的文件不压缩,避免损耗
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 6;         # 压缩等级1-9,6为兼顾性能和压缩比
    gzip_types text/plain text/css text/javascript application/json 
               application/javascript application/xml image/svg+xml;
    gzip_vary on;

    # 限流防刷 全局规则(按需启用)
    limit_req_zone $binary_remote_addr zone=api_limit:20m rate=20r/s; # 单IP每秒20请求
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

    # 长连接/缓存基础配置
    keepalive_timeout 65;
    keepalive_requests 100;

    # 日志格式(便于排查问题)
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /usr/local/nginx/logs/access.log main;
}

第二部分:15个企业高频场景配置(全场景覆盖)

场景1:基础反向代理(最常用,适配所有后端服务)

业务需求:Nginx作为前端代理,将请求转发至后端服务(Java/Go/Python等),透传客户端真实IP,实现请求分发。

问题痛点:后端服务直接暴露在外,无防护;客户端IP被Nginx遮挡,后端无法获取真实请求来源。

完整可复制配置

nginx 复制代码
server {
    listen 80;
    server_name api.xxx.com; # 替换为自身接口域名

    location / {
        # 转发至后端服务地址
        proxy_pass http://127.0.0.1:8080;
        
        # 透传客户端真实信息(核心,后端可获取真实IP)
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 超时优化,避免请求提前断开
        proxy_connect_timeout 30s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

场景2:CORS跨域配置(解决前端跨域报错)

业务需求:前端域名与后端接口域名不一致,需配置跨域,支持Token、Cookie携带,处理OPTIONS预检请求。

问题痛点:前端报错"No 'Access-Control-Allow-Origin' header",预检请求失败,带Cookie时跨域失效。

完整可复制配置

nginx 复制代码
server {
    listen 80;
    server_name api.xxx.com;

    location / {
        # 企业级CORS跨域核心配置(支持Token+Cookie)
        add_header Access-Control-Allow-Origin https://admin.xxx.com always; # 前端真实域名,不可用*
        add_header Access-Control-Allow-Credentials true always; # 允许携带Cookie/Token
        add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS always; # 允许的请求方法
        add_header Access-Control-Allow-Headers Content-Type,Authorization,X-Requested-With always; # 允许的请求头
        add_header Access-Control-Max-Age 86400 always; # 预检请求缓存1天,减少重复请求

        # 拦截OPTIONS预检请求,直接204放行(无需转发至后端)
        if ($request_method = OPTIONS) {
            add_header Content-Length 0;
            add_header Content-Type text/plain;
            return 204;
        }

        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

场景3:多节点负载均衡(集群高可用)

业务需求:后端多台业务服务器集群部署,分担请求压力,自动剔除宕机节点,实现服务高可用,支持加权轮询、备用节点。

问题痛点:单节点挂掉导致服务整体不可用;流量分配不均,部分机器负载过高;无健康检查,故障节点持续接收请求。

完整可复制配置

nginx 复制代码
# 1. 上游集群配置(写在http{}块内)
http {
    upstream backend_server {
        # 加权轮询:weight权重越大,接收流量越多
        server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s; # 主节点1,权重5
        server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s; # 主节点2,权重3
        server 192.168.1.12:8080 backup;  # 备用节点,主节点全部挂掉才启用
    }

    # 2. 代理服务配置
    server {
        listen 80;
        server_name api.xxx.com;

        location / {
            proxy_pass http://backend_server; # 转发至集群
            # 透传IP、超时配置(同基础反向代理)
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_connect_timeout 30s;
            proxy_read_timeout 60s;
        }
    }
}

场景4:全站HTTPS+SSL证书配置(企业强制加密)

业务需求:全站HTTPS加密,符合等保、合规要求;HTTP 80端口强制跳转HTTPS;配置SSL优化,兼容移动端,避免浏览器不安全警告。

问题痛点:证书配置错误导致浏览器警告;SSL协议老旧存在漏洞;混合内容(HTTP资源)导致页面报错。

完整可复制配置

nginx 复制代码
# 1. HTTP 80端口强制跳转HTTPS
server {
    listen 80;
    server_name www.xxx.com xxx.com;
    return 301 https://$host$request_uri; # 永久跳转,有利于SEO
}

# 2. 443 HTTPS主服务
server {
    listen 443 ssl;
    server_name www.xxx.com xxx.com;

    # SSL证书配置(替换为自身证书路径)
    ssl_certificate /usr/local/nginx/ssl/xxx.pem; # 公钥证书
    ssl_certificate_key /usr/local/nginx/ssl/xxx.key; # 私钥证书

    # SSL安全优化(企业标准,避免漏洞)
    ssl_protocols TLSv1.2 TLSv1.3; # 禁用老旧协议,提升安全性
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m; # 会话缓存,提升性能
    ssl_session_timeout 10m;

    # 开启HSTS,强制浏览器长期使用HTTPS(避免降级攻击)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    location / {
        proxy_pass http://backend_server; # 转发至后端集群/服务
    }
}

场景5:动静分离(高性能网站标配)

业务需求:静态资源(js/css/img/字体/视频)由Nginx直接处理,动态接口请求转发至后端服务;静态资源配置长期缓存,减少后端压力,提升页面加载速度。

问题痛点:后端处理静态文件性能差、并发低;静态资源无缓存,页面加载慢,浪费带宽。

完整可复制配置

nginx 复制代码
server {
    listen 80;
    server_name www.xxx.com;
    root /data/www/xxx; # 前端静态文件根目录

    # 静态资源:Nginx直接返回 + 长期缓存(核心)
    location ~* \.(jpg|png|gif|jpeg|ico|svg|js|css|woff|ttf|mp4)$ {
        expires 30d;          # 缓存30天,可按需调整
        add_header Cache-Control "public,max-age=2592000";
        access_log off;       # 关闭静态资源日志,减少IO压力
        add_header Accept-Ranges bytes always; # 支持断点续传(视频/大文件)
    }

    # 动态接口:转发至后端服务
    location /api/ {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 前端Vue/React History路由模式(解决刷新404)
    location / {
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}

场景6:接口限流 & 防CC攻击(生产防护)

业务需求:限制单IP访问频率,防止恶意刷接口、爬虫、CC攻击;保护核心接口,避免服务器被高并发请求打垮。

问题痛点:突发恶意请求导致CPU、内存爆满;无限流机制,业务易被攻击瘫痪。

完整可复制配置

nginx 复制代码
# 1. 全局定义限流规则(写在http{}块内)
http {
    # 限制单IP 每秒10请求,burst=5表示允许突发5个请求排队
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
}

# 2. 接口服务配置
server {
    listen 80;
    server_name api.xxx.com;

    location / {
        # 绑定限流规则,nodelay表示突发请求不排队,直接返回503
        limit_req zone=api_limit burst=5 nodelay;
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
    }
}

场景7:IP黑白名单(内部系统/后台防护)

业务需求:后台管理系统、内部接口仅允许公司办公IP、内网IP访问;封禁恶意攻击IP、爬虫IP。

问题痛点:后台系统暴露在外,存在安全风险;恶意IP持续攻击内部接口。

完整可复制配置

nginx 复制代码
server {
    listen 80;
    server_name admin.xxx.com;

    # 后台管理接口,仅允许白名单IP访问
    location /admin/ {
        # 白名单:内网IP段 + 办公出口IP
        allow 192.168.1.0/24; # 内网IP段
        allow 110.xx.xx.xx;   # 办公出口IP
        deny all;              # 拒绝其他所有IP

        proxy_pass http://127.0.0.1:8080;
    }

    # 全局封禁指定恶意IP(写在server{}内或http{}内)
    deny 123.xx.xx.xx; # 恶意IP1
    deny 45.xx.xx.xx;  # 恶意IP2
}

场景8:Gzip压缩(优化带宽、页面加速)

业务需求:压缩文本类资源(js/css/html/json),减少传输体积,提升页面加载速度;只压缩大文件,避免小文件压缩损耗。

问题痛点:文本资源体积大,带宽占用高;页面加载慢,影响用户体验。

完整可复制配置(http全局):

nginx 复制代码
http {
    gzip on;                          # 开启Gzip压缩
    gzip_min_length 1k;               # 小于1k的文件不压缩
    gzip_buffers 4 16k;               # 压缩缓冲区大小
    gzip_http_version 1.1;            # 适配HTTP 1.1协议
    gzip_comp_level 6;                # 压缩等级(1-9,6最优)
    # 需压缩的资源类型(覆盖常用文本、json资源)
    gzip_types text/plain text/css text/javascript application/json application/javascript;
    gzip_vary on;                     # 告诉浏览器当前资源已压缩
}

场景9:URL重写、目录跳转、伪静态

业务需求:旧路由永久重定向至新路由(SEO友好);隐藏后端真实接口地址;网站伪静态,提升SEO排名。

问题痛点:旧地址失效导致404;后端接口地址暴露,存在安全风险;动态路由不利于SEO。

完整可复制配置

nginx 复制代码
server {
    listen 80;
    server_name www.xxx.com;

    # 1. 旧地址301永久跳转至新地址(SEO友好,不丢失权重)
    rewrite ^/old$ /new permanent;

    # 2. 隐藏接口后缀(伪静态,如将/index.php?s=xxx转为/xxx)
    location / {
        rewrite ^/(.*)$ /index.php?s=$1 last;
    }

    # 3. 目录跳转(如访问/abc,跳转至/def)
    rewrite ^/abc/(.*)$ /def/$1 redirect;
}

场景10:企业安全加固(等保必备)

业务需求:隐藏Nginx版本号、删除危险响应头、防止iframe嵌套钓鱼、XSS攻击、MIME嗅探,符合等保要求。

问题痛点:版本号暴露易被针对性攻击;危险响应头存在安全漏洞;易被iframe嵌套钓鱼。

完整可复制配置(http全局):

nginx 复制代码
http {
    server_tokens off;  # 隐藏Nginx版本号(核心)
    # 防iframe嵌套钓鱼
    add_header X-Frame-Options SAMEORIGIN always;
    # XSS防护,禁止页面加载恶意脚本
    add_header X-XSS-Protection "1; mode=block" always;
    # 防止MIME类型嗅探,避免恶意文件执行
    add_header X-Content-Type-Options nosniff always;
}

场景11:WebSocket 反向代理(IM/实时推送)

业务需求:前端WebSocket长连接对接后端实时服务(IM聊天、实时日志、大屏推送);维持长连接,避免断连,支持ws/wss协议。

问题痛点:未配置协议升级头,握手失败;超时时间过短,定时断连;反向代理默认短连接,无法维持长连接。

完整可复制配置

nginx 复制代码
server {
    listen 80;
    server_name ws.xxx.com;

    location /ws/ {
        proxy_pass http://127.0.0.1:8088; # 后端WebSocket服务地址
        
        # 开启长连接,适配WebSocket
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        # WebSocket协议升级核心配置(必加)
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        # 拉长超时时间,避免断连(按需调整,如300s)
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;

        # 透传真实IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

说明:HTTPS下WSS配置,只需将server块改为listen 443 ssl,添加SSL证书配置即可,其余配置不变。

场景12:Nginx 日志分割(企业运维必备)

业务需求:按天自动切割access/error日志;自动压缩历史日志、定时清理过期日志;不重启Nginx,平滑切换日志写入。

问题痛点:单日志文件过大(几十G),排查卡顿、磁盘爆满;手动删除日志导致Nginx日志写入异常。

完整解决方案(Shell脚本+定时任务):

1. 新建日志切割脚本(nginx_log_cut.sh)

bash 复制代码
#!/bin/bash
# 日志目录(与nginx.conf中日志路径一致)
LOG_DIR="/usr/local/nginx/logs"
# 日期后缀(取前一天日期,格式:年-月-日)
DATE=$(date -d yesterday +%Y-%m-%d)

# 1. 重命名日志文件(切割)
mv ${LOG_DIR}/access.log ${LOG_DIR}/access_${DATE}.log
mv ${LOG_DIR}/error.log ${LOG_DIR}/error_${DATE}.log

# 2. 平滑重读Nginx配置,生成新的空日志(不中断业务)
/usr/local/nginx/sbin/nginx -s reopen

# 3. 压缩7天前日志,清理30天前日志(节省磁盘空间)
find ${LOG_DIR} -name "access_*.log" -mtime +7 -exec gzip {} \;
find ${LOG_DIR} -name "error_*.log" -mtime +7 -exec gzip {} \;
find ${LOG_DIR} -name "*.log*" -mtime +30 -delete

2. 配置定时任务(每日自动执行)

bash 复制代码
# 1. 给脚本授权(可执行权限)
chmod +x nginx_log_cut.sh

# 2. 编辑定时任务
crontab -e

# 3. 添加以下内容(每日凌晨0点1分执行,避免业务高峰)
1 0 * * * /bin/bash /usr/local/nginx/sbin/nginx_log_cut.sh

场景13:企业内部文件下载服务

业务需求:搭建简易文件服务器,浏览器直接访问目录、下载文件;设置编码、禁止执行脚本、限制访问速度;仅限内网访问,保障安全。

问题痛点:目录遍历乱码、中文文件名异常;目录开启后被恶意上传、执行脚本;不限速导致带宽打满。

完整可复制配置

nginx 复制代码
server {
    listen 8090; # 自定义端口,避免与其他服务冲突
    server_name localhost;
    charset utf-8; # 解决中文乱码
    root /data/file; # 文件存储根目录

    # 开启目录浏览(允许浏览器查看目录结构)
    autoindex on;
    autoindex_exact_size off; # 显示文件大小(友好格式)
    autoindex_localtime on;   # 显示文件本地时间

    # 限速:单IP 500KB/s,避免带宽被占满
    limit_rate 500k;
    limit_rate_after 10M; # 下载超过10M后开始限速

    # 安全限制:禁止执行脚本文件(防止恶意执行)
    location ~* \.(php|jsp|asp|sh|py|exe)$ {
        deny all;
    }

    # 内网白名单:仅允许内网IP访问
    allow 192.168.0.0/16;
    allow 127.0.0.1;
    deny all;
}

场景14:大文件上传/断点续传

业务需求:支持100M+大文件上传(附件、视频、压缩包);解决默认上传限制、请求超时导致的上传失败;配合前端分片/断点续传场景使用。

问题痛点:client_max_body_size过小,直接报错413;读写超时太短,大文件传输中断。

完整可复制配置

nginx 复制代码
# 1. 全局配置(http{}块内)
http {
    client_max_body_size 500M;    # 全局最大上传限制
    client_body_buffer_size 10M;  # 上传缓冲区大小
}

# 2. 上传接口配置
server {
    listen 80;
    server_name file.xxx.com;

    location /upload/ {
        client_max_body_size 500M; # 单接口上传限制(优先级高于全局)
        # 上传超时配置,避免传输中断
        client_body_timeout 120s;
        send_timeout 120s;

        # 断点续传核心头(配合前端实现断点续传)
        add_header Accept-Ranges bytes always;

        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
    }
}

场景15:资源防盗链(防止流量被盗用)

业务需求:防止第三方网站直接引用我方图片、视频、静态资源,偷耗带宽;允许本站、指定合作域名访问;非法盗链返回403或兜底图。

问题痛点:静态资源无防盗链,流量成本暴涨;单纯限制IP无法防代理盗链。

完整可复制配置

nginx 复制代码
server {
    listen 80;
    server_name www.xxx.com;

    # 对图片、视频、静态资源做防盗链(匹配常用格式)
    location ~* \.(jpg|png|gif|mp4|avi|css|js|ico)$ {
        # 白名单域名:允许访问的域名(本站+合作域名)
        valid_referers none blocked www.xxx.com xxx.com *.xxx.com;
        
        # 非法来源:返回403禁止访问(也可跳转兜底图)
        if ($invalid_referer) {
            return 403;
            # 可选:跳转兜底图(替换为自身兜底图路径)
            # rewrite ^ https://www.xxx.com/403.png break;
        }

        # 静态资源缓存,减少重复请求
        expires 7d;
        add_header Cache-Control public;
    }
}

第三部分:Nginx生产排错速查表

覆盖生产中最常见的报错,对照报错信息,直接查找根因和解决方案,秒级修复。

一、HTTP状态码类错误

1. 403 Forbidden(禁止访问)

根因:目录/文件权限不足、IP黑白名单拦截、防盗链拦截、root路径错误、autoindex权限不足。

解决方案

bash 复制代码
# 修复文件/目录权限(最常用)
chown -R nginx:nginx /data/www
chmod -R 755 /data/www

# 检查IP白名单、防盗链规则,临时注释测试
# 修正root路径,确保目录存在

2. 404 Not Found(页面/接口不存在)

根因:root/alias路径错误、前端History模式缺少try_files、proxy_pass地址错误、静态资源缺失。

解决方案

nginx 复制代码
# 前端History模式必加(解决刷新404)
location / {
    try_files $uri $uri/ /index.html;
}

# 检查proxy_pass路径、静态资源路径是否正确

3. 413 Request Entity Too Large(请求体过大)

根因:上传文件/请求体超过Nginx默认限制。

解决方案

nginx 复制代码
http {
    client_max_body_size 500M;
}
location /upload {
    client_max_body_size 500M;
}

4. 502 Bad Gateway(网关错误)

根因:后端服务宕机、proxy_pass地址错误、后端端口被防火墙拦截、后端进程卡死。

解决方案

bash 复制代码
# 测试后端服务是否可达
curl http://127.0.0.1:8080/api

# 查看后端端口是否监听
ss -lntp | grep 8080

# 放行防火墙端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload

# 重启后端服务

5. 504 Gateway Timeout(网关超时)

根因:后端处理慢,Nginx代理超时时间过短。

解决方案

nginx 复制代码
location /api {
    proxy_connect_timeout 30s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
    proxy_pass http://backend_server;
}

二、其他高频报错

1. 跨域报错(No 'Access-Control-Allow-Origin' header)

解决方案:参考场景2的CORS跨域配置,确保添加always参数,不使用*通配符。

2. WebSocket握手失败

解决方案:参考场景11的WebSocket配置,确保添加协议升级头和长连接超时配置。

3. SSL证书报错(浏览器不安全)

解决方案:更换有效证书、修正证书路径、补充中间证书,开启TLSv1.2+协议。

第四部分:常用运维命令(离线备查)

bash 复制代码
# 1. 检查配置语法(部署前必做)
nginx -t

# 2. 平滑重启(不中断业务,修改配置后生效)
nginx -s reload

# 3. 强制停止Nginx(谨慎使用)
nginx -s stop

# 4. 查看错误日志(排错核心)
tail -f /usr/local/nginx/logs/error.log

# 5. 查看访问日志
tail -f /usr/local/nginx/logs/access.log

# 6. 查看Nginx进程
ps -ef | grep nginx

# 7. 测试接口是否正常
curl -I https://api.xxx.com
curl -X POST https://api.xxx.com/test -d "param=1"

# 8. 手动执行日志切割脚本
bash /usr/local/nginx/sbin/nginx_log_cut.sh

# 9. 查看Nginx监听端口
ss -lntp | grep nginx

第五部分:上线修改指南(快速部署)

无需修改全部配置,仅修改以下6处,即可部署上线:

  1. server_name:替换为自身业务域名(如www.xxx.comapi.xxx.com);

  2. ssl_certificate / ssl_certificate_key:修改为SSL证书的绝对路径;

  3. upstream集群:将IP:端口改为后端真实服务地址;

  4. root路径:改为前端静态文件、文件服务的实际目录;

  5. 跨域配置:将Access-Control-Allow-Origin改为前端真实域名;

  6. IP白名单:将allow规则改为自身办公/内网IP段。

说明:本文档可直接复制保存为.txt或.md文件,离线查阅,所有配置均为生产成熟可用,修改对应参数即可一键部署。

(注:文档部分内容可能由 AI 生成)

相关推荐
zhangfeng11332 小时前
宝塔服务器完全可以安装 Git,进行版本管理,而且非常简单
运维·服务器·人工智能·git·编程
科研前沿3 小时前
SpaceOS™空间计算底座与五大自研引擎,实现多项关键技术突破
大数据·运维·人工智能·算法·重构
德迅云安全-小潘4 小时前
APP运营服务器配置全攻略:从选型到网络安全,你需要知道的一切
运维·服务器·web安全
Yupureki5 小时前
《Linux网络编程》9.数据链路层原理
linux·运维·服务器·网络
切糕师学AI5 小时前
Remmina:Linux 平台的全能远程桌面客户端详解
linux·运维·远程控制·远程桌面·remmina
dualven_in_csdn5 小时前
【assist】 需要用到的方法
linux·运维·服务器
diangedan5 小时前
focuswindow
linux·运维·服务器
私人珍藏库6 小时前
[吾爱大神原创工具] 网卡切换小工具
运维·服务器
bitbrowser6 小时前
Gemini Advanced 订阅共享排坑方案,车队共享稳定策略
运维·服务器·网络·ai