如何实现不同子域名分别指向服务器不同端口服务
实现方案
DNS协议本身确实不支持直接指定端口映射,要实现不同域名分流到同一IP的不同端口,最通用稳定的方案是在VM实例上部署反向代理做基于域名的请求转发,以下是具体操作步骤,以最常用的Nginx为例:
1. 配置DNS解析
先将两个域名都解析到你的VM公网IP:
- 为
abc.com添加A记录,解析值填10.20.30.40 - 为
api.abc.com添加A记录,解析值填10.20.30.40
DNS生效后两个域名默认都会请求到VM的80端口,后续由反向代理按域名规则分发请求。
2. 安装Nginx
根据VM的操作系统选择对应安装命令:
- Debian/Ubuntu 系列:
sudo apt update && sudo apt install nginx -y - CentOS/RHEL 系列:
sudo dnf install nginx -y
安装完成后执行命令启动Nginx并设置开机自启:sudo systemctl enable --now nginx
3. 调整原有服务端口避免冲突
因为Nginx需要占用公网80端口接收所有请求,你需要先调整原有服务的监听配置:
- 将原本运行在80端口的Python HTTP Server改为监听本地127.0.0.1的其他空闲端口,比如8080,不要直接暴露公网
- 保持FastAPI应用监听本地127.0.0.1:8000即可,同样不要直接暴露公网
4. 配置反向代理规则
新建Nginx配置文件,路径为/etc/nginx/conf.d/proxy_rule.conf,写入以下内容:
# 转发abc.com请求到本地8080端口的Python文件服务 server { listen 80; server_name abc.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; } } # 转发api.abc.com请求到本地8000端口的FastAPI服务 server { listen 80; server_name api.abc.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 适配FastAPI文档页的WebSocket连接 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
保存文件后执行sudo nginx -t检查配置语法,如果返回syntax is ok和test is successful的提示,就执行sudo systemctl reload nginx重载配置生效。
配置完成后直接访问http://abc.com就会打开Python HTTP Server的文件服务,访问http://api.abc.com会直接打开FastAPI应用,不需要在地址后加端口号。
其他非推荐替代方案
如果不想部署反向代理,也可以选择以下方案,但存在明显缺陷:
- 域名URL转发:部分DNS服务商提供显性URL转发功能,可以将
api.abc.com跳转到http://abc.com:8000,但访问时浏览器地址栏会显示带端口的真实地址,部分免费转发服务会植入广告,稳定性差。 - CDN/边缘网关回源规则配置:将域名托管到CDN服务商,在控制台配置不同域名的回源端口,这种方案需要额外付费,配置复杂度高于自建Nginx,适合已有CDN使用需求的场景。
内容的提问来源于stack exchange,提问作者Partha Maity
相关产品推荐
相关产品推荐

