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处,即可部署上线:
-
server_name:替换为自身业务域名(如www.xxx.com、api.xxx.com);
-
ssl_certificate / ssl_certificate_key:修改为SSL证书的绝对路径;
-
upstream集群:将IP:端口改为后端真实服务地址;
-
root路径:改为前端静态文件、文件服务的实际目录;
-
跨域配置:将Access-Control-Allow-Origin改为前端真实域名;
-
IP白名单:将allow规则改为自身办公/内网IP段。
说明:本文档可直接复制保存为.txt或.md文件,离线查阅,所有配置均为生产成熟可用,修改对应参数即可一键部署。
(注:文档部分内容可能由 AI 生成)