一、基础监听配置:端口与协议的精准控制
Server块的核心功能之一是定义服务监听的端口与协议类型,通过listen指令实现多协议支持与网络接口绑定。
1.1 基础端口配置
server {listen 80; # 监听HTTP默认端口listen 443 ssl; # 监听HTTPS端口并启用SSLserver_name example.com; # 域名匹配规则}
listen指令详解:支持指定IP+端口(如listen 192.168.1.100:80;),若省略IP则默认绑定所有网络接口。协议类型可通过ssl参数标识HTTPS,或通过http2启用HTTP/2协议。- 默认Server选择机制:当请求的
Host头未匹配任何server_name时,Nginx会选择第一个监听相同端口的Server块作为默认配置。可通过default_server参数显式指定默认Server:listen 80 default_server;
1.2 域名匹配策略
server_name支持三种匹配模式:
- 精确匹配:
server_name example.com; - 通配符匹配:
server_name *.example.com;(匹配所有子域名) - 正则匹配:
server_name ~^(www\.)?example\.com$;(需以~开头)
优先级规则:精确匹配 > 前缀通配符匹配 > 后缀通配符匹配 > 正则匹配。建议将高频访问域名配置为精确匹配以提升性能。
二、反向代理核心配置:请求转发与头信息控制
通过location块与proxy_pass指令实现请求到后端服务的转发,同时需合理设置请求头以确保业务逻辑正确执行。
2.1 基础代理配置
location / {proxy_pass http://backend_server; # 转发目标地址proxy_set_header Host $host; # 传递原始域名proxy_set_header X-Real-IP $remote_addr; # 客户端真实IP}
proxy_pass路径处理:当目标地址以/结尾时(如http://backend_server/),Nginx会移除location匹配部分后转发请求;若目标地址不含/(如http://backend_server),则完整保留请求路径。- 负载均衡集成:可结合
upstream模块实现权重轮询、IP哈希等策略:upstream backend_group {server 192.168.1.101:8080 weight=3;server 192.168.1.102:8080 backup;}
2.2 关键请求头设置
| 请求头 | 作用 |
|---|---|
X-Forwarded-For |
记录代理链中的客户端IP,格式为client, proxy1, proxy2 |
X-Forwarded-Proto |
标识原始请求协议(HTTP/HTTPS),用于后端生成绝对URL |
X-Forwarded-Host |
传递原始Host头,避免后端服务依赖IP:Port处理请求 |
安全建议:通过proxy_hide_header隐藏敏感头信息(如Server、X-Powered-By),降低信息泄露风险。
三、路径匹配与分发:精细化流量控制
通过location的多种匹配模式实现请求的差异化处理,适用于API路由、静态资源分离等场景。
3.1 匹配模式与优先级
| 模式 | 语法示例 | 优先级 | |
|---|---|---|---|
| 精确匹配 | location = /login |
1 | |
| 前缀匹配 | location /api/ |
3 | |
| 正则匹配 | `location ~* .(jpg | png)$` | 4 |
| 普通匹配 | location / |
5 |
示例:静态资源缓存配置
location ~* \.(css|js|jpg|png)$ {root /data/static;expires 30d; # 客户端缓存30天add_header Cache-Control "public";}
3.2 嵌套Location处理
可通过if指令或重写模块实现更复杂的逻辑,但需注意性能影响。推荐使用多个location块拆分逻辑:
location /api/ {if ($http_user_agent ~* "Mobile") {proxy_pass http://mobile_backend;}proxy_pass http://default_backend;}
替代方案:使用map指令预先定义变量,避免在location中使用if。
四、HTTPS与安全加固:构建可信传输通道
通过SSL证书配置与协议优化,确保数据传输的机密性与完整性。
4.1 SSL证书配置
server {listen 443 ssl;server_name secure.example.com;ssl_certificate /path/to/fullchain.pem; # 证书链文件ssl_certificate_key /path/to/privkey.pem; # 私钥文件ssl_protocols TLSv1.2 TLSv1.3; # 禁用TLS 1.0/1.1ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256'; # 强密码套件}
- 证书格式要求:PEM格式,包含证书链与私钥。可通过某开源工具将PFX格式转换为PEM。
- HSTS配置:强制客户端使用HTTPS访问:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
4.2 安全头增强
add_header X-Content-Type-Options "nosniff"; # 禁止MIME类型嗅探add_header X-Frame-Options "SAMEORIGIN"; # 防止点击劫持add_header Content-Security-Policy "default-src 'self'"; # 内容安全策略
五、性能优化与故障排查
5.1 连接池配置
通过proxy_http_version 1.1与proxy_set_header Connection ""启用HTTP长连接,减少TCP握手开销:
location / {proxy_http_version 1.1;proxy_set_header Connection "";proxy_pass http://backend;}
5.2 常见错误处理
- 502 Bad Gateway:检查后端服务是否存活,通过
proxy_next_upstream实现故障转移:proxy_next_upstream error timeout invalid_header;
- 499 Client Closed Request:客户端提前断开连接,可通过调整
proxy_ignore_client_abort忽略此类错误。
六、总结与最佳实践
- 配置分层:将通用配置(如SSL参数)提取至
http块,减少重复代码。 - 日志监控:结合日志服务记录
$upstream_addr与$request_time,分析代理性能。 - 灰度发布:通过
split_clients模块实现基于权重的流量分流,支持A/B测试。
通过系统化配置Server块,可构建高可用、安全的Web服务架构,满足企业级应用需求。建议定期审计配置,及时更新SSL证书与密码套件,以应对新兴安全威胁。