Nginx终极配置指南:负载均衡、限流、反向代理、IP白名单、SSL、云原生、DNS解析、缓存加速一网打尽
Nginx终极配置指南:负载均衡、限流、反向代理、IP白名单、SSL、云原生、DNS解析、缓存加速一网打尽
大家好,我是你们的后端技术老司机。今天我们来聊聊Nginx配置这个让无数程序员又爱又恨的话题。
你是否也遇到过这些场景:
- 配置负载均衡时502、504错误频发?
- 限流配置不当导致正常用户被误杀?
- 反向代理配置后静态资源加载缓慢?
- 想做IP白名单却发现动态IP无从下手?
- SSL证书配置总是各种坑?
- 云原生环境下DNS解析不及时?
- 缓存配置不当反而影响用户体验?
别慌!今天我就把这套Nginx终极配置指南全掏出来,手把手教你用最实用的配置技巧,让你的Web服务稳如老狗,性能飞起来!
一、反向代理:连接前后端的桥梁
反向代理是Nginx最基本也是最重要的功能,它就像一个中间人,把用户请求转发给后端服务器。
# 后端服务器组
upstream backend_api {
server 127.0.0.1:8080 weight=3; # 权重3
server 127.0.0.1:8081 weight=2; # 权重2
server 127.0.0.1:8082 weight=1 backup; # 备用服务器
# 健康检查
keepalive 32;
keepalive_requests 100;
keepalive_timeout 60s;
}
server {
listen 80;
server_name api.example.com;
# API请求代理
location /api/ {
proxy_pass http://backend_api;
# 传递真实客户端信息
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 10s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 缓冲配置
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 8k;
# 错误处理
proxy_next_upstream error timeout http_500 http_502 http_503;
}
# WebSocket代理
location /ws/ {
proxy_pass http://backend_api;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400; # 24小时
}
}
配置要点:
- upstream配置:定义后端服务器组,支持权重、备份等策略
- proxy_pass:指定转发目标,注意末尾斜杠的差异
- 头信息传递:确保后端能获取真实客户端信息
- 超时配置:合理设置避免连接堆积
二、负载均衡:流量分发的艺术
不同的负载均衡策略适用于不同场景,选对策略性能提升立竿见影:
# 轮询(默认)
upstream round_robin {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
# 权重轮询
upstream weighted_round_robin {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=1;
}
# IP哈希(同一IP总是转发到同一台服务器)
upstream ip_hash {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
# 最少连接数
upstream least_conn {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
# 健康检查配置
upstream backend_with_health_check {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s backup;
}
server {
listen 80;
server_name lb.example.com;
location / {
proxy_pass http://backend_with_health_check;
# 负载均衡相关头信息
add_header X-Upstream-Server $upstream_addr;
add_header X-Upstream-Status $upstream_status;
add_header X-Upstream-Response-Time $upstream_response_time;
}
}
策略选择建议:
- 轮询:服务器配置相近的场景
- 权重轮询:服务器配置不同的场景
- IP哈希:需要会话保持的场景
- 最少连接:长连接较多的场景
三、限流防护:抵御恶意攻击
在高并发场景下,限流是必不可少的安全屏障:
# 定义限流规则
http {
# 限制每个IP的请求频率
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
# 限制每个IP的连接数
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
# 限制总连接数
limit_conn_zone $server_name zone=server_conn_limit:10m;
}
server {
listen 80;
server_name api.example.com;
# 应用限流规则
location /api/ {
# 限制请求频率(允许突发20个请求)
limit_req zone=api_limit burst=20 nodelay;
# 限制连接数
limit_conn conn_limit 10; # 每个IP最多10个连接
limit_conn server_conn_limit 100; # 服务器总共100个连接
# 限制请求体大小
client_max_body_size 10m;
proxy_pass http://backend_api;
}
# 特殊路径更严格限流
location /api/login {
limit_req zone=api_limit burst=5 nodelay;
limit_conn conn_limit 1; # 登录接口每个IP只允许1个连接
proxy_pass http://backend_api;
}
# 静态资源相对宽松
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
limit_req zone=api_limit burst=50 nodelay;
# ... 静态资源配置
}
}
限流配置要点:
- zone定义:合理分配内存大小
- burst参数:允许突发请求,避免误杀正常用户
- nodelay:立即处理突发请求
- 分路径配置:不同接口不同限流策略
四、IP白名单:精准控制访问权限
IP白名单是网络安全的重要一环,特别是对于管理后台等敏感接口:
server {
listen 80;
server_name admin.example.com;
# 固定IP白名单
location /admin/ {
allow 192.168.1.100; # 运维办公室IP
allow 192.168.1.101; # 开发办公室IP
deny all;
proxy_pass http://backend_admin;
}
# 动态DNS IP白名单(适用于动态IP场景)
location /wp-login.php {
include /etc/nginx/conf.d/dynamicips;
deny all;
# WordPress登录配置
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
动态IP白名单脚本示例:
#!/bin/bash
# 自动更新动态DNS IP白名单
DDNS[0]="admin1.example.com"
DDNS[1]="admin2.example.com"
# 清空旧文件
> /etc/nginx/conf.d/dynamicips
# 解析DNS并写入新IP
for DNS in "${DDNS[@]}"
do
echo "allow $(dig +short $DNS);" >> /etc/nginx/conf.d/dynamicips
done
# 重载Nginx配置
nginx -s reload
五、SSL配置:安全传输的保障
现在HTTPS已经是标配,安全配置不容马虎:
server {
listen 443 ssl http2;
server_name secure.example.com;
# SSL证书配置
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# SSL安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# SSL优化
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# HSTS(强制HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 其他安全头
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
location / {
proxy_pass http://backend_api;
# ... 其他代理配置
}
}
# HTTP重定向到HTTPS
server {
listen 80;
server_name secure.example.com;
return 301 https://$server_name$request_uri;
}
SSL配置要点:
- 证书文件:确保证书链完整
- 协议版本:禁用不安全的旧版本
- 加密套件:选择安全且性能好的算法
- 会话复用:提升HTTPS性能
- 安全头:防范常见攻击
六、云原生与DNS解析:动态环境下的配置
在云原生环境下,服务IP经常变化,需要动态DNS解析:
http {
# DNS解析器配置(使用系统默认DNS)
resolver 8.8.8.8 114.114.114.114 valid=300s;
resolver_timeout 10s;
# 动态上游服务器
upstream backend {
server backend1.example.com resolve;
server backend2.example.com resolve;
server backend3.example.com resolve;
}
server {
listen 80;
server_name cloud.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
云原生配置要点:
- resolver配置:指定DNS服务器和缓存时间
- resolve参数:启用动态DNS解析
- 超时设置:避免DNS解析阻塞
- 健康检查:自动剔除故障节点
七、缓存优化:性能提升的利器
合理的缓存配置能大幅提升性能:
# 缓存路径配置
http {
proxy_cache_path /var/cache/nginx/proxy
levels=1:2
keys_zone=proxy_cache:10m
max_size=1g
inactive=60m
use_temp_path=off;
# 缓存key定义
proxy_cache_key "$scheme$request_method$host$request_uri";
}
server {
listen 80;
server_name cache.example.com;
# API缓存
location /api/data/ {
proxy_cache proxy_cache;
proxy_cache_valid 200 10m; # 200状态码缓存10分钟
proxy_cache_valid 404 1m; # 404状态码缓存1分钟
proxy_cache_valid any 5m; # 其他状态码缓存5分钟
# 缓存控制
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_background_update on;
proxy_cache_lock on;
# 缓存头信息
add_header X-Cache-Status $upstream_cache_status;
# 忽略某些请求头
proxy_ignore_headers Cache-Control Expires;
proxy_pass http://backend_api;
}
# 绕过缓存的接口
location /api/user/ {
proxy_cache off;
proxy_no_cache 1;
proxy_cache_bypass 1;
proxy_pass http://backend_api;
}
# 缓存清理接口
location /cache/purge {
allow 127.0.0.1;
deny all;
proxy_cache_purge proxy_cache "$scheme$request_method$host$request_uri";
}
}
缓存配置要点:
- 缓存路径:合理设置大小和清理策略
- 缓存有效期:根据数据变化频率设置
- 缓存穿透:对特定接口绕过缓存
- 缓存更新:支持后台更新避免用户等待
八、安全加固:系统稳定的屏障
安全配置是系统稳定运行的基础:
server {
listen 80;
server_name secure.example.com;
# 隐藏Nginx版本信息
server_tokens off;
# 限制请求方法
location / {
limit_except GET POST HEAD {
deny all;
}
}
# 防止SQL注入和XSS攻击
location /api/ {
# 检查URL中的危险字符
if ($args ~* "(\<|%3C).*script.*(\>|%3E)") {
return 403;
}
if ($args ~* "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") {
return 403;
}
if ($args ~* "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") {
return 403;
}
proxy_pass http://backend_api;
}
# 防止目录遍历
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
安全配置要点:
- 隐藏版本:避免暴露服务器信息
- 请求方法限制:只允许必要的HTTP方法
- 输入校验:防范常见Web攻击
- 敏感文件保护:防止配置文件泄露
结语
掌握Nginx配置,核心不是记住所有参数,而是理解每个配置的作用和适用场景:
- 反向代理:连接前后端的桥梁
- 负载均衡:流量分发的艺术
- 限流防护:系统稳定的屏障
- IP白名单:精准控制访问权限
- SSL配置:安全传输的保障
- 云原生适配:动态环境下的配置
- DNS解析:服务发现的关键
- 缓存优化:性能提升的利器
- 安全加固:系统安全的基石
记住:好的Nginx配置不是一次到位的,而是在实践中不断优化的。从满足基本需求开始,根据实际情况逐步调优,最终你也能配出高性能、高可用的Nginx服务!
安装只是第一步,后续我们还会分享更多Nginx的配置优化、安全加固、故障排查等实战技巧,记得关注我们的公众号"服务端技术精选"!
觉得这篇文章对你有帮助吗?欢迎点赞、在看、转发三连,你的支持是我们持续创作的最大动力!
服务端技术精选 | 专注分享实用的后端技术干货
标题:Nginx终极配置指南:负载均衡、限流、反向代理、IP白名单、SSL、云原生、DNS解析、缓存加速一网打尽
作者:jiangyi
地址:http://jiangyi.space/articles/2025/12/21/1766304276426.html
0 评论