在本地开发场景中,我们经常会同时运行多个不同端口的服务,比如前端项目运行在3000端口,后端API服务运行在8080端口,为了方便区分访问,通常会给不同服务绑定不同的本地Host域名,再通过Nginx根据Host把请求分发到对应的端口。phpEnv作为常用的本地集成环境,内置了Nginx服务,只需要简单修改配置就能实现这个需求。

前置准备
首先需要确保已经安装好phpEnv,并且Nginx服务处于正常运行状态。同时要提前规划好需要绑定的Host域名和对应的服务端口,比如我们规划两个规则:
- 域名front.test对应前端服务,端口3000
- 域名api.test对应后端服务,端口8080
还需要在本地hosts文件中添加对应的域名解析,把这两个域名指向127.0.0.1,hosts文件路径一般是C:WindowsSystem32driversetchosts,添加内容如下:
127.0.0.1 front.test 127.0.0.1 api.test
找到phpEnv的Nginx配置文件
打开phpEnv面板,点击左侧的Nginx选项,在右侧可以看到配置目录的入口,点击进入Nginx的配置文件夹,通常路径是phpEnv安装目录下的nginx/conf。我们需要找到虚拟主机的配置位置,phpEnv默认会在nginx.conf中通过include指令引入vhost目录下的所有.conf配置文件,所以我们可以在vhost目录下新建配置文件,避免直接修改主配置文件。
编写Host分发配置
在vhost目录下新建一个文件,比如命名为host_route.conf,然后添加以下配置内容:
# 前端服务配置,匹配Host为front.test的请求
server {
listen 80;
server_name front.test;
location / {
# 转发到3000端口的前端服务
proxy_pass http://127.0.0.1:3000;
# 保留原始请求的Host头
proxy_set_header Host $host;
# 保留客户端真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 后端服务配置,匹配Host为api.test的请求
server {
listen 80;
server_name api.test;
location / {
# 转发到8080端口的后端服务
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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
配置中的server_name就是用来匹配请求的Host字段,proxy_pass指定了对应请求要转发的目标端口地址。如果有更多服务需要添加,只需要按照同样的格式新增server块即可。
重载Nginx配置
配置文件保存后,回到phpEnv的Nginx管理面板,点击重载配置按钮,让新的配置生效,不需要重启整个Nginx服务。如果重载失败,可以查看Nginx的error.log日志排查问题,日志路径一般在nginx/logs/error.log。
测试配置是否生效
先确保3000端口和8080端口的服务都已经启动,然后打开浏览器分别访问front.test和api.test,如果能正确显示对应端口的服务内容,说明Host分发配置已经生效。如果访问出现404或者502错误,可以先检查目标端口的服务是否正常运行,再检查Nginx配置中的端口和Host是否填写正确。
注意事项
- 如果配置的端口对应的服务没有启动,Nginx转发请求时会返回502 Bad Gateway错误,需要先启动目标服务再测试
- 新增配置后一定要重载Nginx配置,否则修改不会生效
- 如果需要支持HTTPS,可以在server块中添加对应的SSL证书配置,监听443端口即可
- phpEnv的Nginx版本如果有更新,配置规则是通用的,不会受版本影响