一、多站点配置基础架构
在生产环境中,Nginx常需同时处理多个域名的请求路由。典型的配置架构包含三大核心组件:
- 配置文件组织:采用
conf.d/目录下的独立文件管理每个站点(如test1.conf、test2.conf) - 站点资源隔离:通过不同目录结构实现静态资源隔离(如/code/test1/、/code/test2/)
- DNS解析映射:本地hosts文件或DNS服务器完成域名到IP的解析
1.1 配置文件规范示例
# test1.conf 配置示例server {listen 80;server_name test1.com www.test1.com;location / {root /code/test1;index index.html;try_files $uri $uri/ =404;}error_page 404 /404.html;location = /404.html {root /code/test1/errors;internal;}}
该配置包含三个关键改进:
- 添加www子域名支持
- 增加try_files指令实现优雅降级
- 配置自定义404页面
1.2 目录结构规划
建议采用标准化目录布局:
/code/├── test1/│ ├── assets/│ ├── css/│ ├── js/│ └── index.html├── test2/│ └── ...└── test3/└── ...
这种结构便于:
- 权限管理(chown -R nginx:nginx /code)
- 备份策略实施
- 监控资源变化
二、请求路由核心机制
Nginx处理HTTP请求时,通过以下流程确定最终响应的server块:
2.1 匹配优先级详解
| 匹配类型 | 示例 | 匹配顺序 | 注意事项 |
|---|---|---|---|
| 精确匹配 | server_name test.com; |
1 | 区分大小写 |
| 前导通配符 | server_name *.test.com; |
2 | 适用于子域名场景 |
| 后缀通配符 | server_name www.test.*; |
3 | 较少使用,可能产生意外匹配 |
| 正则表达式 | server_name ~^(.*)\.test\.com$; |
4 | 需以~开头,性能开销较大 |
| 默认服务器 | listen 80 default_server; |
5 | 未匹配时生效 |
2.2 优先级验证实验
通过以下步骤验证匹配逻辑:
- 创建三个测试配置文件:
```nginx
exact.conf
server {
listen 80;
server_name exact.test.com;
return 200 “Exact Match\n”;
}
wildcard-prefix.conf
server {
listen 80;
server_name *.wildcard.com;
return 200 “Wildcard Prefix\n”;
}
regex.conf
server {
listen 80;
server_name ~^regex.test..*$;
return 200 “Regex Match\n”;
}
2. 修改hosts文件:
127.0.0.1 exact.test.com regex.test.org wildcard.com
3. 测试不同请求:```bashcurl exact.test.com # 返回 Exact Matchcurl sub.wildcard.com # 返回 Wildcard Prefixcurl regex.test.org # 返回 Regex Matchcurl unknown.com # 连接失败(无默认服务器配置)
三、常见问题解决方案
3.1 IP直连访问处理
当用户直接通过IP访问时,Nginx会选择:
- 带有
default_server标记的server块 - 否则选择监听该端口的第一个server块
推荐配置:
server {listen 80 default_server;server_name _;return 444; # 关闭连接# 或重定向到主站点# return 301 https://main-domain.com$request_uri;}
3.2 HTTPS重定向配置
现代Web服务推荐强制HTTPS访问:
server {listen 80;server_name test.com www.test.com;return 301 https://$host$request_uri;}server {listen 443 ssl;server_name test.com www.test.com;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;# 其他配置...}
3.3 动态路由处理
对于需要后端处理的请求,可使用location块实现精细控制:
server {listen 80;server_name api.test.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}location /static/ {alias /code/api-static/;expires 30d;}}
四、性能优化建议
-
启用HTTP/2:
server {listen 443 ssl http2;# ...其他配置}
-
配置Gzip压缩:
gzip on;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
-
启用缓存:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {expires 1y;add_header Cache-Control "public";}
-
连接超时设置:
keepalive_timeout 65;keepalive_requests 1000;client_header_timeout 10;client_body_timeout 10;
五、监控与调试技巧
- 日志配置:
```nginx
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 /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
2. **调试工具**:- `nginx -t`:测试配置语法- `nginx -T`:输出完整配置(包括include的文件)- `strace -p $(cat /var/run/nginx.pid)`:跟踪进程活动3. **实时监控**:```bash# 查看当前连接数watch -n 1 'ss -antp | grep nginx | wc -l'# 查看请求分布awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
通过系统化的配置管理和对路由机制的深入理解,运维人员可以构建出高效、可靠的多站点Nginx服务架构。建议定期审查配置,结合监控数据持续优化性能参数,确保服务始终处于最佳运行状态。