You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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默认欢迎页

问题

  1. 是否必须为每个映射到应用的域名创建单独的server block?
  2. 能否通过一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:50:37