Nginx配置二级域名全攻略:从基础到进阶开发技巧

Nginx配置二级域名全攻略:从基础到进阶开发技巧

一、二级域名配置的核心价值

在Web开发中,二级域名(如api.example.comm.example.com)是构建模块化服务架构的重要手段。通过Nginx配置二级域名,开发者可以实现:

  1. 服务隔离:将API服务、移动端适配、管理后台等业务拆分到不同子域名
  2. 负载均衡:为不同子域名配置独立的负载均衡策略
  3. 证书管理:为HTTPS服务提供更灵活的SSL证书配置
  4. 路径优化:简化URL结构,提升SEO效果

典型应用场景包括:

  • 微服务架构中的服务发现
  • 前后端分离项目的接口管理
  • 多终端适配(PC/Mobile/H5)
  • 灰度发布环境的流量控制

二、配置前的准备工作

1. DNS解析设置

首先需要在域名注册商处添加CNAME记录:

  1. 子域名 类型 记录值 TTL
  2. api CNAME server.example.com 3600

技巧:建议将TTL设置为300-600秒,便于快速调整

2. 服务器环境检查

确认已安装Nginx并验证版本:

  1. nginx -v
  2. # 推荐使用1.18.0+版本,支持更完善的HTTP/2特性

3. 证书准备(HTTPS场景)

使用Let’s Encrypt免费证书:

  1. sudo apt install certbot python3-certbot-nginx
  2. sudo certbot --nginx -d api.example.com

或手动准备证书文件:

  1. /etc/nginx/certs/
  2. ├── api.example.com.crt
  3. └── api.example.com.key

三、Nginx核心配置详解

1. 基础配置模板

  1. server {
  2. listen 80;
  3. server_name api.example.com;
  4. location / {
  5. proxy_pass http://localhost:3000;
  6. proxy_set_header Host $host;
  7. proxy_set_header X-Real-IP $remote_addr;
  8. }
  9. }

关键参数说明:

  • listen:监听端口(80/443)
  • server_name:精确匹配二级域名
  • proxy_pass:后端服务地址

2. HTTPS增强配置

  1. server {
  2. listen 443 ssl;
  3. server_name api.example.com;
  4. ssl_certificate /etc/nginx/certs/api.example.com.crt;
  5. ssl_certificate_key /etc/nginx/certs/api.example.com.key;
  6. ssl_protocols TLSv1.2 TLSv1.3;
  7. ssl_ciphers HIGH:!aNULL:!MD5;
  8. location / {
  9. # 配置同上...
  10. }
  11. }

安全建议:禁用SSLv3和TLSv1.0,推荐使用Mozilla SSL配置生成器

3. 高级路由配置

路径重写示例

  1. location /v1/ {
  2. rewrite ^/v1/(.*) /$1 break;
  3. proxy_pass http://api-service;
  4. }

多后端负载均衡

  1. upstream api-cluster {
  2. server 10.0.0.1:3000 weight=3;
  3. server 10.0.0.2:3000;
  4. server 10.0.0.3:3000 backup;
  5. }
  6. server {
  7. # ...
  8. location / {
  9. proxy_pass http://api-cluster;
  10. }
  11. }

四、常见问题解决方案

1. 域名不生效问题排查

  1. 检查DNS解析是否生效:
    1. dig api.example.com
  2. 验证Nginx配置语法:
    1. nginx -t
  3. 检查防火墙设置:
    1. sudo ufw status

2. HTTPS证书错误处理

  • NET::ERR_CERT_COMMON_NAME_INVALID
    确认证书的CN或SAN字段包含二级域名
  • SSL_ERROR_BAD_CERT_DOMAIN
    重新生成证书时添加-d api.example.com参数

3. 502 Bad Gateway错误

  1. 检查后端服务是否运行:
    1. curl http://localhost:3000
  2. 调整Nginx超时设置:
    1. proxy_connect_timeout 60s;
    2. proxy_read_timeout 300s;

五、进阶优化技巧

1. HTTP/2配置

  1. server {
  2. listen 443 ssl http2;
  3. # ...其他配置...
  4. }

性能提升:HTTP/2可减少TCP连接数,提升多资源加载速度

2. 动态证书加载

使用ssl_certificate_by_lua_block实现多域名证书自动选择(需OpenResty)

3. 监控与日志

  1. server {
  2. access_log /var/log/nginx/api.access.log;
  3. error_log /var/log/nginx/api.error.log warn;
  4. location / {
  5. # 添加健康检查端点
  6. if ($request_method = HEAD) {
  7. return 200;
  8. }
  9. }
  10. }

六、最佳实践建议

  1. 配置管理

    • 使用Git管理Nginx配置
    • 按环境区分配置文件(dev/stage/prod)
  2. 性能优化

    1. # 启用gzip压缩
    2. gzip on;
    3. gzip_types text/plain application/json;
    4. # 启用静态资源缓存
    5. location ~* \.(jpg|png|css|js)$ {
    6. expires 30d;
    7. add_header Cache-Control "public";
    8. }
  3. 安全加固

    1. # 禁止非法HTTP方法
    2. if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    3. return 405;
    4. }
    5. # 防止点击劫持
    6. add_header X-Frame-Options "SAMEORIGIN";

七、完整配置示例

  1. # 主配置文件 /etc/nginx/conf.d/api.conf
  2. server {
  3. listen 80;
  4. server_name api.example.com;
  5. return 301 https://$host$request_uri;
  6. }
  7. server {
  8. listen 443 ssl http2;
  9. server_name api.example.com;
  10. ssl_certificate /etc/nginx/certs/api.example.com.crt;
  11. ssl_certificate_key /etc/nginx/certs/api.example.com.key;
  12. ssl_session_timeout 1d;
  13. ssl_session_cache shared:SSL:50m;
  14. ssl_session_tickets off;
  15. access_log /var/log/nginx/api.access.log main;
  16. error_log /var/log/nginx/api.error.log warn;
  17. location / {
  18. proxy_pass http://api-backend;
  19. proxy_http_version 1.1;
  20. proxy_set_header Connection "";
  21. proxy_set_header Host $host;
  22. proxy_set_header X-Real-IP $remote_addr;
  23. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  24. client_max_body_size 10m;
  25. proxy_read_timeout 300s;
  26. }
  27. # 健康检查端点
  28. location = /health {
  29. return 200 "OK";
  30. access_log off;
  31. }
  32. }
  33. upstream api-backend {
  34. server 10.0.0.1:3000 max_fails=3 fail_timeout=30s;
  35. server 10.0.0.2:3000 backup;
  36. keepalive 32;
  37. }

通过系统化的配置管理,Nginx可以高效地支撑复杂的二级域名架构。建议开发者定期审查配置,结合监控工具(如Prometheus+Grafana)持续优化服务性能。对于大型项目,可考虑使用Ansible等自动化工具实现配置的版本化部署。