如何用Nginx实现同一服务器上不同域名应用的反向代理(同IP同端口)
如何用Nginx实现同一服务器上不同域名应用的反向代理(同IP同端口)
嘿,这个问题我太熟了!其实你完全误解了Nginx的server块规则——它根本不需要每个server块用唯一的listen端口,和Apache的VirtualHost逻辑是一模一样的,核心都是靠域名匹配来区分不同请求的。
Nginx是通过请求头里的Host字段,对应server块里的server_name参数来路由请求的,只要每个server块的server_name对应不同的域名,即使它们用相同的listen端口(比如都是80或443),Nginx也能精准把请求转发到对应的应用上。
给你一个具体的配置示例,一看就懂:
# 第一个域名对应的应用配置
server {
listen 80; # 多个server块可以共用同一个端口
server_name app1.com www.app1.com; # 这里填你的第一个域名,包括带www的子域名
location / {
proxy_pass http://localhost:3000; # 替换成你第一个应用的实际运行地址(比如本地端口)
# 下面这几个header是为了让后端应用能正确获取客户端信息,建议加上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 第二个域名对应的应用配置
server {
listen 80; # 和上面用同一个端口就行
server_name app2.com www.app2.com; # 第二个域名
location / {
proxy_pass http://localhost:4000; # 第二个应用的实际运行地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
配置完之后,记得做这两步:
- 用
nginx -t命令检查配置语法是否正确,出现test is successful就没问题 - 用
nginx -s reload命令重新加载Nginx配置,让修改生效
最后再提醒你几个关键点:
- 确保你的两个域名都已经正确解析到服务器的公网IP上
- 如果需要HTTPS,把
listen 80改成listen 443 ssl;,然后在每个server块里加上ssl_certificate和ssl_certificate_key指向你的SSL证书文件即可(可以用各自的证书,也可以用通配符证书) - 如果有默认域名需求,可以加一个
server_name _;的server块作为默认路由,处理不匹配任何域名的请求
备注:内容来源于stack exchange,提问作者Wige




