一、Server块基础配置解析
Server块是Nginx配置的核心单元,负责定义虚拟主机行为。其基础配置包含三个关键指令:
1.1 监听端口配置
listen指令定义服务监听的协议与端口,支持多种灵活配置:
listen 80; # 监听所有IP的80端口listen 192.168.1.100:443 ssl; # 指定IP的443端口并启用SSLlisten 8080 default_server; # 设置为默认服务器
- 协议支持:通过
ssl参数可同时支持HTTP/HTTPS - 默认行为:未指定IP时监听所有网络接口
- 优先级规则:当多个Server块监听同一端口时,Nginx按
server_name匹配度选择处理请求的块
1.2 域名匹配配置
server_name指令通过Host头匹配请求,支持三种匹配模式:
server_name example.com; # 精确匹配server_name *.example.com; # 通配符匹配server_name ~^(www\.)?example\.com$; # 正则匹配
- 匹配顺序:精确匹配 > 通配符前缀匹配 > 通配符后缀匹配 > 正则匹配
- 默认处理:未匹配时使用同端口第一个Server块
- 性能优化:高频域名建议使用精确匹配提升处理效率
1.3 根目录配置
root指令定义静态文件服务根目录,常用于网站内容托管:
server {listen 80;server_name static.example.com;root /var/www/static;location / {try_files $uri $uri/ =404;}}
- 路径解析:当请求
/images/logo.png时,实际查找/var/www/static/images/logo.png - 安全建议:建议配合
autoindex off禁用目录列表功能
二、反向代理核心参数详解
反向代理是Server块的核心功能,通过location块实现请求转发与头部控制:
2.1 基础转发配置
location /api/ {proxy_pass http://backend_pool;proxy_http_version 1.1;proxy_set_header Connection "";}
- 后端定义:
backend_pool需通过upstream模块预先定义 - 协议升级:
proxy_http_version可强制使用HTTP/1.1保持长连接 - 连接复用:空
Connection头避免重复握手
2.2 请求头控制
关键头部参数配置示例:
location / {proxy_set_header Host $host; # 传递原始域名proxy_set_header X-Real-IP $remote_addr; # 客户端真实IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理链IPproxy_set_header X-Forwarded-Proto $scheme; # 原始协议类型}
- 安全风险:错误配置
Host头可能导致SSRF攻击 - 日志价值:
X-Forwarded-For是访问控制的重要依据 - 协议识别:后端服务可通过
X-Forwarded-Proto生成正确URL
2.3 超时与缓冲设置
location /upload/ {proxy_connect_timeout 60s; # 连接超时proxy_read_timeout 300s; # 读取超时proxy_send_timeout 300s; # 发送超时client_max_body_size 500m; # 客户端请求体大小限制proxy_buffering on; # 启用响应缓冲proxy_buffers 8 16k; # 缓冲数量与大小}
- 大文件处理:上传场景需调整
client_max_body_size - 缓冲策略:
proxy_buffering影响内存占用与响应速度 - 超时选择:根据业务类型设置合理超时值(如API服务通常<30s)
三、路径匹配与请求分发
通过location指令实现精细化的请求路由控制:
3.1 匹配类型与优先级
| 匹配类型 | 语法示例 | 优先级 |
|---|---|---|
| 精确匹配 | location = /login |
1 |
| 前缀匹配 | location /static/ |
2 |
| 正则匹配 | location ~ \.php$ |
3 |
| 普通匹配 | location / |
4 |
3.2 典型应用场景
静态资源服务
location ~* \.(jpg|png|css|js)$ {root /data/assets;expires 1y; # 浏览器缓存1年add_header Cache-Control "public";access_log off; # 关闭日志记录}
API网关路由
upstream order_service {server 10.0.0.11:8080 weight=5;server 10.0.0.12:8080;}location /api/order/ {proxy_pass http://order_service;rewrite ^/api/order/(.*) /$1 break; # 路径重写}
维护页面重定向
location / {if (-f /var/www/maintenance.html) {return 503;}error_page 503 @maintenance;location @maintenance {rewrite ^(.*)$ /maintenance.html break;}}
四、HTTPS安全加固方案
生产环境必须启用HTTPS,关键配置要素如下:
4.1 证书配置
server {listen 443 ssl;server_name secure.example.com;ssl_certificate /etc/nginx/certs/fullchain.pem;ssl_certificate_key /etc/nginx/certs/privkey.pem;ssl_trusted_certificate /etc/nginx/certs/chain.pem; # OCSP stapling需要}
- 证书格式:PEM格式(Base64编码)
- 权限控制:私钥文件权限应设为600
- 证书链:包含中间证书确保客户端信任
4.2 协议与加密套件
ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...';ssl_prefer_server_ciphers on;ssl_ecdh_curve secp384r1;
- 安全建议:禁用SSLv3、TLSv1.0/1.1
- 性能平衡:选择支持PFS(前向保密)的加密套件
- 兼容性:主流浏览器均支持推荐的加密套件
4.3 HSTS与安全头
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;add_header X-Content-Type-Options nosniff;add_header X-Frame-Options DENY;add_header X-XSS-Protection "1; mode=block";
- HSTS作用:强制浏览器始终使用HTTPS访问
- 防御机制:防止MIME类型嗅探、点击劫持、XSS攻击
- 生效条件:
always参数确保所有响应(包括错误页)都添加头部
五、性能优化最佳实践
5.1 连接复用优化
upstream backend {server 10.0.0.10:8080;keepalive 32; # 每个worker保持的空闲连接数}server {location /api/ {proxy_http_version 1.1;proxy_set_header Connection "";proxy_pass http://backend;}}
5.2 压缩配置
gzip on;gzip_types text/plain text/css application/json application/javascript text/xml;gzip_min_length 1k;gzip_comp_level 6;gzip_vary on;
5.3 缓存策略
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api_cache:10m inactive=60m;server {location /api/data/ {proxy_cache api_cache;proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;add_header X-Cache-Status $upstream_cache_status;}}
六、常见问题排查
- 502 Bad Gateway:检查后端服务是否运行,防火墙是否放行端口
- 499 Client Closed Request:客户端提前断开连接,检查网络稳定性
- 证书验证失败:确认证书链完整且未过期
- 性能瓶颈:使用
stap -l分析连接状态,调整worker进程数
通过系统掌握Server块配置原理与实践技巧,开发者可构建出高可用、高性能的Web服务架构。建议结合具体业务场景进行参数调优,并定期进行安全审计与性能基准测试。