Nginx二级域名配置全攻略:从原理到实践

一、二级域名配置的背景与意义

在互联网应用中,二级域名(如sub.example.com)常用于区分不同业务模块或服务,例如将api.example.com作为API接口的独立域名,blog.example.com作为博客系统的入口。这种结构不仅提升了URL的可读性,还便于后续的负载均衡、权限控制和安全隔离。Nginx作为高性能的Web服务器,支持通过配置文件灵活管理多个二级域名,是实现这一目标的核心工具。

二、配置前的准备工作

1. DNS解析配置

在配置Nginx之前,需确保二级域名已正确解析到服务器IP。以阿里云DNS为例:

  • 登录DNS管理控制台,添加sub.example.com的A记录,指向服务器公网IP。
  • 等待DNS生效(通常5-10分钟),通过ping sub.example.com验证解析是否成功。

2. 服务器环境准备

  • 安装Nginx:sudo apt install nginx(Ubuntu)或yum install nginx(CentOS)。
  • 确认Nginx版本:nginx -v,建议使用1.18.0及以上版本以支持最新特性。

3. 证书准备(HTTPS场景)

若需启用HTTPS,需为二级域名申请SSL证书:

  • 使用Let’s Encrypt免费证书:sudo certbot --nginx -d sub.example.com
  • 或购买商业证书(如DigiCert),下载证书文件(.crt.key)并上传至服务器。

三、Nginx配置文件编写

Nginx通过server块管理不同域名的配置,二级域名的配置通常位于/etc/nginx/conf.d//etc/nginx/sites-available/目录下。

1. 基础HTTP配置示例

  1. server {
  2. listen 80;
  3. server_name sub.example.com; # 指定二级域名
  4. location / {
  5. root /var/www/sub.example.com; # 根目录
  6. index index.html;
  7. try_files $uri $uri/ =404;
  8. }
  9. # 日志配置
  10. access_log /var/log/nginx/sub.example.com.access.log;
  11. error_log /var/log/nginx/sub.example.com.error.log;
  12. }

关键点

  • server_name必须与DNS解析的二级域名完全一致。
  • root指定静态文件的存放路径,需确保Nginx用户(如www-data)有读取权限。

2. HTTPS配置示例

  1. server {
  2. listen 443 ssl;
  3. server_name sub.example.com;
  4. ssl_certificate /etc/letsencrypt/live/sub.example.com/fullchain.pem;
  5. ssl_certificate_key /etc/letsencrypt/live/sub.example.com/privkey.pem;
  6. ssl_protocols TLSv1.2 TLSv1.3;
  7. ssl_ciphers HIGH:!aNULL:!MD5;
  8. location / {
  9. proxy_pass http://localhost:3000; # 转发至后端服务
  10. proxy_set_header Host $host;
  11. proxy_set_header X-Real-IP $remote_addr;
  12. }
  13. }
  14. # HTTP自动跳转HTTPS
  15. server {
  16. listen 80;
  17. server_name sub.example.com;
  18. return 301 https://$host$request_uri;
  19. }

关键点

  • ssl_certificatessl_certificate_key需指向正确的证书文件。
  • proxy_pass用于将请求转发至后端应用(如Node.js、Python等)。
  • 强制HTTPS可提升安全性,避免中间人攻击。

3. 多二级域名共存配置

若需管理多个二级域名,可在同一配置文件中添加多个server块:

  1. server {
  2. listen 80;
  3. server_name api.example.com;
  4. # API服务配置...
  5. }
  6. server {
  7. listen 80;
  8. server_name blog.example.com;
  9. # 博客服务配置...
  10. }

优化建议

  • 使用include指令拆分配置,例如include /etc/nginx/conf.d/*.conf;
  • 通过upstream模块实现负载均衡(如多台API服务器)。

四、常见问题与解决方案

1. 配置未生效

  • 现象:访问二级域名返回默认页面或404。
  • 排查步骤
    1. 检查Nginx配置语法:sudo nginx -t
    2. 确认server_name与DNS解析一致。
    3. 查看错误日志:tail -f /var/log/nginx/error.log
    4. 重启Nginx:sudo systemctl restart nginx

2. HTTPS证书错误

  • 现象:浏览器提示“证书不受信任”或“域名不匹配”。
  • 解决方案
    • 确保证书包含二级域名(如sub.example.com而非*.example.com)。
    • 使用certbot renew更新过期证书。
    • 检查证书链是否完整(需包含中间证书)。

3. 性能优化建议

  • 静态资源缓存
    1. location ~* \.(jpg|jpeg|png|css|js)$ {
    2. expires 30d;
    3. add_header Cache-Control "public";
    4. }
  • Gzip压缩
    1. gzip on;
    2. gzip_types text/plain text/css application/json application/javascript;
  • 连接复用
    1. keepalive_timeout 75s;
    2. keepalive_requests 100;

五、进阶配置技巧

1. 基于路径的路由

若需通过路径区分服务(如example.com/apiexample.com/blog),可使用location指令:

  1. server {
  2. listen 80;
  3. server_name example.com;
  4. location /api {
  5. proxy_pass http://localhost:3000;
  6. }
  7. location /blog {
  8. root /var/www/blog;
  9. try_files $uri $uri/ =404;
  10. }
  11. }

2. 动态域名解析

结合resolver指令实现动态DNS解析(适用于容器化环境):

  1. resolver 8.8.8.8 valid=30s;
  2. set $backend "api.example.com";
  3. server {
  4. listen 80;
  5. server_name sub.example.com;
  6. location / {
  7. proxy_pass http://$backend;
  8. }
  9. }

六、总结与最佳实践

  1. 模块化配置:将不同二级域名的配置拆分为独立文件,便于维护。
  2. 自动化工具:使用Ansible或Terraform批量管理Nginx配置。
  3. 监控告警:通过Prometheus+Grafana监控Nginx的请求量、错误率等指标。
  4. 安全加固
    • 禁用危险方法(如TRACE):if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 405; }
    • 限制请求速率:limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

通过以上步骤,开发者可以高效完成Nginx二级域名的配置,并根据实际需求灵活扩展功能。