Nginx通过多个server块配合server_name指令实现多域名反向代理,依据HTTP请求的Host头将不同域名路由至对应后端服务。需确保DNS已解析到服务器IP,各server块监听相同端口、配置独立proxy_pass及SSL证书,避免server_name重复或语法错误。

Nginx 通过反向代理实现多域名指向同一台物理服务器,核心在于利用 server 块的 server_name 指令区分不同域名,再各自配置对应的后端服务(可以是本机不同端口、不同应用,或转发到其他服务器)。这不是“把多个域名绑到一个 IP”,而是让 Nginx 根据 HTTP 请求头中的 Host 字段,决定将请求交给哪个后端处理。
1. 基础前提:域名已解析到服务器 IP
确保 yoursite.com、api.yoursite.com、admin.yoursite.com 等域名都已通过 DNS A 记录指向该服务器的公网 IP。Nginx 本身不处理 DNS 解析,只依赖客户端发来的 Host 头做路由判断。
2. 配置多个独立的 server 块(关键)
每个域名对应一个 server 块,监听相同端口(通常是 80 或 443),靠 server_name 匹配 Host。示例:
# 域名 A:前端网站
server {
listen 80;
server_name www.yoursite.com yoursite.com;
location / {
proxy_pass http://127.0.0.1:3000; # Node.js 应用
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
<h1>域名 B:API 服务</h1><p>server {
listen 80;
server_name api.yoursite.com;
location / {
proxy_pass <a href="https://www.php.cn/link/1ce5e897cda6aeb211dffe8d514f4365">https://www.php.cn/link/1ce5e897cda6aeb211dffe8d514f4365</a>; # Java Spring Boot
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}</p><h1>域名 C:管理后台</h1><p>server {
listen 80;
server_name admin.yoursite.com;
location / {
proxy_pass <a href="https://www.php.cn/link/7cf91b300ff3ecef82c59dd47b89253a">https://www.php.cn/link/7cf91b300ff3ecef82c59dd47b89253a</a>; # Python Flask
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}</p>3. 注意 HTTPS 和 SSL 证书处理
若启用 HTTPS,每个域名需有对应证书(推荐用 Let’s Encrypt 的泛域或多个单域名证书):
- 使用
certbot --nginx -d yoursite.com -d www.yoursite.com可自动配置并生成证书 - 不同域名可共用通配符证书(如
*.yoursite.com),但yoursite.com和api.yoursite.com属于同一级子域,通常可用;而other.com必须单独申请 - 每个
server块中添加ssl_certificate和ssl_certificate_key指向对应证书文件
4. 避免常见错误
- 不要在同一个 server 块里写多个 proxy_pass:Nginx 不支持根据路径前缀动态切换后端(除非用 map 或 if,但不推荐);应按域名拆分 server 块
-
server_name 末尾不加斜杠:写成
server_name example.com/;是无效语法 - 检查 listen 指令是否冲突:多个 server 块监听同一端口 + 同一 IP 是允许的,只要 server_name 不重叠;若出现 “conflicting server name” 错误,说明有重复的 server_name 定义
-
测试配置再重载:修改后运行
nginx -t验证语法,再systemctl reload nginx










