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

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

在Web服务架构中,二级域名作为一级域名的子分类,常用于区分不同业务模块或服务(如api.example.comblog.example.com)。Nginx作为高性能反向代理服务器,其二级域名配置涉及DNS解析、虚拟主机设置、SSL证书管理等多个环节。本文将从基础原理出发,逐步拆解配置流程,并提供实战案例与问题排查指南。

一、二级域名配置的核心原理

1.1 DNS解析:域名到IP的映射

二级域名的生效依赖于DNS记录的配置。以sub.example.com为例,需在域名注册商或DNS服务商处添加一条CNAME记录(指向主域名)或A记录(直接指向服务器IP)。例如:

  1. 类型: CNAME
  2. 主机: sub
  3. 值: example.com
  4. TTL: 3600

关键点

  • CNAME记录允许二级域名继承主域名的DNS设置,适合动态IP场景;
  • A记录直接绑定IP,适合静态IP且需独立管理的场景;
  • TTL(生存时间)决定DNS缓存时间,调试时可设为较短值(如300秒)。

1.2 Nginx虚拟主机:多域名分离的核心

Nginx通过server块实现基于域名的虚拟主机,每个二级域名需配置独立的server块。配置文件通常位于/etc/nginx/conf.d//etc/nginx/sites-available/,示例如下:

  1. server {
  2. listen 80;
  3. server_name sub.example.com;
  4. root /var/www/sub;
  5. index index.html;
  6. location / {
  7. try_files $uri $uri/ =404;
  8. }
  9. }

关键参数

  • listen 80:监听HTTP端口;
  • server_name:匹配请求的域名,支持通配符(如*.example.com)和正则表达式;
  • root:指定网站根目录,需确保Nginx用户(如www-data)有读取权限。

二、Nginx二级域名配置实战

2.1 基础HTTP配置

步骤1:创建网站目录并上传文件

  1. sudo mkdir -p /var/www/sub
  2. sudo chown -R www-data:www-data /var/www/sub
  3. echo "<h1>Subdomain Test</h1>" > /var/www/sub/index.html

步骤2:编写Nginx配置

  1. server {
  2. listen 80;
  3. server_name sub.example.com;
  4. root /var/www/sub;
  5. index index.html;
  6. # 防止目录列表显示
  7. autoindex off;
  8. # 日志配置(可选)
  9. access_log /var/log/nginx/sub.access.log;
  10. error_log /var/log/nginx/sub.error.log;
  11. }

步骤3:测试并重启Nginx

  1. sudo nginx -t # 检查语法
  2. sudo systemctl restart nginx

2.2 HTTPS配置(Let’s Encrypt证书)

步骤1:安装Certbot工具

  1. sudo apt install certbot python3-certbot-nginx

步骤2:自动获取证书并配置

  1. sudo certbot --nginx -d sub.example.com

Certbot会自动修改Nginx配置,添加SSL证书和强制HTTPS重定向。生成的配置类似:

  1. server {
  2. listen 443 ssl;
  3. server_name sub.example.com;
  4. root /var/www/sub;
  5. index index.html;
  6. ssl_certificate /etc/letsencrypt/live/sub.example.com/fullchain.pem;
  7. ssl_certificate_key /etc/letsencrypt/live/sub.example.com/privkey.pem;
  8. include /etc/letsencrypt/options-ssl-nginx.conf;
  9. ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
  10. }
  11. server {
  12. listen 80;
  13. server_name sub.example.com;
  14. return 301 https://$host$request_uri;
  15. }

2.3 动态子域名配置(通配符证书)

若需支持*.example.com,需获取通配符SSL证书:

  1. sudo certbot --nginx -d example.com -d *.example.com

Nginx配置需调整server_name为通配符:

  1. server {
  2. listen 443 ssl;
  3. server_name ~^(?<subdomain>.+)\.example\.com$;
  4. root /var/www/$subdomain;
  5. # ...其他配置
  6. }

注意:通配符证书仅保护一级子域名(如a.example.com),不保护多级子域名(如a.b.example.com)。

三、常见问题与解决方案

3.1 域名不生效

  • 现象:访问二级域名返回默认页面或404。
  • 排查步骤
    1. 检查DNS记录是否生效:dig sub.example.comnslookup sub.example.com
    2. 确认Nginx配置中server_name与DNS记录一致;
    3. 检查防火墙是否放行80/443端口:sudo ufw status

3.2 SSL证书错误

  • 现象:浏览器提示“证书不受信任”或“域名不匹配”。
  • 解决方案
    • 确保证书包含所有需要的域名(使用certbot certificates查看);
    • 避免手动编辑证书文件,始终通过Certbot等工具管理;
    • 检查系统时间是否正确(证书有效期依赖系统时钟)。

3.3 性能优化建议

  • 静态资源缓存:为CSS/JS文件添加缓存头:
    1. location ~* \.(css|js|png)$ {
    2. expires 1y;
    3. add_header Cache-Control "public";
    4. }
  • Gzip压缩:启用文本压缩:
    1. gzip on;
    2. gzip_types text/plain text/css application/json application/javascript text/xml;

四、进阶配置技巧

4.1 基于域名的负载均衡

若二级域名需指向多个后端服务器,可在server块内配置upstream

  1. upstream sub_backend {
  2. server 10.0.0.1:8080;
  3. server 10.0.0.2:8080;
  4. }
  5. server {
  6. listen 80;
  7. server_name sub.example.com;
  8. location / {
  9. proxy_pass http://sub_backend;
  10. proxy_set_header Host $host;
  11. }
  12. }

4.2 限制访问来源

通过allow/deny指令限制二级域名的访问IP:

  1. server {
  2. listen 80;
  3. server_name api.example.com;
  4. allow 192.168.1.0/24;
  5. deny all;
  6. # ...其他配置
  7. }

五、总结与最佳实践

  1. DNS与Nginx配置同步:修改DNS后需等待TTL过期,或临时降低TTL值加速生效;
  2. 证书自动化管理:使用Certbot的--deploy-hook实现证书续期后自动重启Nginx;
  3. 配置版本控制:将Nginx配置纳入Git管理,便于回滚与协作;
  4. 监控与告警:通过Prometheus+Grafana监控各二级域名的访问量与错误率。

通过以上步骤,开发者可系统掌握Nginx二级域名的配置方法,从基础部署到高级优化均能高效完成。实际场景中,建议结合CI/CD流水线实现配置的自动化测试与部署,进一步提升运维效率。