NGINX反向代理实现多子域名CNAME映射问题咨询
NGINX多子域名共享Express应用配置方案
背景与需求
我习惯使用Apache,刚接触NGINX,无法实现预期配置。了解到NGINX的Server Blocks大致等同于Apache的VirtualHosts。
核心需求:让api.domain1.com和api.domain2.com均指向并运行同一个Express应用。
现有环境
Ubuntu 20.04系统,已部署Express应用与NGINX:
api.domain1.com的A记录指向服务器IP,应用可正常访问api.domain2.com的CNAME记录指向api.domain1.com,但当前访问显示NGINX默认欢迎页
问题
- 是否必须为每个映射到应用的域名创建单独的server block?
- 能否通过一个server block文件处理多个子域名,还是每个子域名都需要单独的server block?
当前配置文件(路径:~/etc/nginx/sites-available/my_api)
server { root /var/www/my_api/html; index index.html index.htm index.nginx-debian.html; server_name api.domain1.com www.api.domain1.com; location / { # try_files $uri $uri/ =404; proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/api.domain1.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/api.domain1.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = www.api.domain1.com) { return 301 https://$host$request_uri; } # managed by Certbot if ($host = api.domain1.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; listen [::]:80; server_name api.domain1.com www.api.domain1.com; return 404; # managed by Certbot }
问题解答
1. 是否需要单独创建server block?
不需要。NGINX允许在单个server block中通过server_name指令指定多个域名,实现多域名共享同一套代理配置。
2. 能否用一个server block处理多子域名?
完全可以,只需按以下步骤修改配置:
步骤1:更新HTTPS server block的server_name
将原配置中HTTPS区块的server_name字段修改为包含两个子域名的所有变体:
server_name api.domain1.com www.api.domain1.com api.domain2.com www.api.domain2.com;
步骤2:更新HTTP跳转区块的server_name
同样,在处理HTTP转HTTPS的server block中,同步更新server_name:
server_name api.domain1.com www.api.domain1.com api.domain2.com www.api.domain2.com;
步骤3:生成包含多域名的SSL证书
由于api.domain2.com需要使用HTTPS,需用Certbot重新生成覆盖所有目标域名的证书:
sudo certbot --nginx -d api.domain1.com -d www.api.domain1.com -d api.domain2.com -d www.api.domain2.com
此命令会自动更新NGINX配置中的证书路径,确保所有域名都能正常启用HTTPS。
步骤4:验证配置并重启NGINX
先检查配置语法是否正确:
sudo nginx -t
若输出test is successful,则重启NGINX使配置生效:
sudo systemctl restart nginx
补充说明
- 完成配置后,访问
api.domain2.com时,NGINX会匹配到对应的server block,将请求代理到Express应用,逻辑与api.domain1.com完全一致。 - 后续若需添加更多子域名,只需在
server_name中追加域名,再通过Certbot更新证书即可,无需新建server block。
内容的提问来源于stack exchange,提问作者Ryan Dorn
相关产品推荐
相关产品推荐

