Node.js服务器如何实现动态子域名配置
无端口暴露+动态泛子域名配置方案
核心逻辑
全程靠两个组件实现,不需要额外采购服务:
- 反向代理:接管HTTP/HTTPS默认的80、443端口,按照请求的域名转发到本地8080端口的后端服务,对外直接关闭8080的公网访问权限,从根源上隐藏端口,用户访问的时候不需要手动输入端口号。
- 泛域名解析:把所有
*.mydomain.com格式的子域名全解析到VPS公网IP,不需要每次新增子域名都修改DNS记录,反向代理把请求的子域名信息透传给后端,后端自己处理动态子域名的路由逻辑。
注意:你之前把客户端IP 220.123.111.233绑定到mydomain.com的配置是错误的,域名A记录必须指向部署服务的VPS公网IP,否则请求会打到客户端设备,永远访问不到VPS上的服务。
操作步骤
1. 调整DNS解析记录
登录你的域名解析控制台,配置两条记录:
- 根域名记录:类型选A,主机记录填
@,记录值填VPS的公网IP,TTL用默认值即可。 - 泛域名记录:类型选A,主机记录填
*,记录值填VPS的公网IP,TTL设10分钟就行。 - 校验方式:解析生效后,随便拼一个随机子域名比如
abc123.mydomain.com,ping这个域名如果返回的是VPS公网IP,就说明泛解析配置正常。
2. 配置Nginx反向代理
用通用的Nginx做反向代理即可,先安装程序:
- Debian/Ubuntu系执行:
apt update && apt install -y nginx - CentOS/RHEL系执行:
yum install -y nginx
装完先调整防火墙规则:放开80、443端口的公网访问,删掉8080端口的公网放行规则,只允许127.0.0.1本地访问8080,避免被人扫端口直接绕开代理访问服务。
先修改Nginx主配置,让它支持提取子域名:打开/etc/nginx/nginx.conf,在http块的最开头加下面这段映射规则:
map $host $subdomain { ~^(?P<sub>[a-z0-9-]+)\.mydomain\.com$ $sub; default ""; }
然后新建站点配置文件/etc/nginx/conf.d/mydomain.conf,写入转发规则:
# 根域名转发规则,访问mydomain.com直接走主服务 server { listen 80; server_name mydomain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } # 泛子域名转发规则,所有xxx.mydomain.com的请求都转后端,同时透传子域名信息 server { listen 80; server_name *.mydomain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Subdomain $subdomain; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
写完执行nginx -t,如果返回test is successful就说明配置没有语法错误,执行systemctl reload nginx重载配置就生效了。
3. (强烈建议配置)HTTPS设置
现在浏览器默认会拦截HTTP站点,直接安装certbot工具申请免费SSL证书即可,工具会自动帮你完成证书续期、443端口监听配置、HTTP请求自动跳转HTTPS的规则,配完之后访问https://mydomain.com连443端口都不需要显式输入。
4. 后端服务适配
你跑在8080端口的后端服务只需要做两处小调整:
- 读取请求头里的
X-Subdomain字段,就能拿到当前请求的子域名(比如请求是12n2.mydomain.com,拿到的值就是12n2),直接走你自己的动态子域名业务逻辑就行,比如给用户分配专属子域名、返回对应资源。 - 业务代码里生成跳转链接的时候,直接拼接
[子域名前缀].mydomain.com即可,不需要加端口号。
效果校验
- 直接访问
mydomain.com,能正常打开你之前跑在8080端口的服务,地址栏不需要带:8080,说明根域名配置成功。 - 访问随便编的子域名比如
test-001.mydomain.com,后端能正常拿到X-Subdomain值为test-001,说明泛域名转发正常,后续业务生成动态子域名的时候不需要再改DNS或者Nginx配置,直接在业务层生成对应规则即可。
内容的提问来源于stack exchange,提问作者khanh phan
相关产品推荐
相关产品推荐

