今天我们来聊聊Nginx配置这个让无数程序员又爱又恨的话题。
你是否也遇到过这些场景:
别慌!今天我就把这套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;
}
}
策略选择建议:
三、限流防护:抵御恶意攻击
在高并发场景下,限流是必不可少的安全屏障:
# 定义限流规则
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;
# ... 静态资源配置
}
}
限流配置要点:
四、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配置要点:
六、云原生与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;
}
}
}
云原生配置要点:
七、缓存优化:性能提升的利器
合理的缓存配置能大幅提升性能:
# 缓存路径配置
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;
}
}
安全配置要点:
结语
掌握Nginx配置,核心不是记住所有参数,而是理解每个配置的作用和适用场景:
记住:好的Nginx配置不是一次到位的,而是在实践中不断优化的。从满足基本需求开始,根据实际情况逐步调优,最终你也能配出高性能、高可用的Nginx服务!
阅读原文:原文链接
该文章在 2025/12/10 18:44:10 编辑过