如何配置NGINX在局域网通过多子域名访问多个应用?
问题原因
你的NGINX配置里的server_name都是xxx.localhost,但Windows电脑访问的是xxx.test.dev,请求的Host头和NGINX的任何server块都不匹配,因此NGINX会自动使用当前监听80端口下第一个加载的server块(按配置文件名的字母顺序),导致所有子域名请求都跳转到同一个服务。
解决方案
1. 修改NGINX的服务配置文件
将每个服务的server_name同时设置为本地localhost子域名和局域网test.dev子域名,确保两端请求都能匹配到对应的server块。以homarr为例,修改后的配置如下:
# /etc/nginx/sites-enabled/homarr.localhost.conf server { listen 80; # 同时支持本地和局域网的子域名访问 server_name homarr.localhost homarr.test.dev; location / { proxy_pass http://localhost:9000; # 补充代理头,避免应用因请求信息缺失出现异常 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; } }
对gitea和nextcloud的配置文件做同样修改:
- gitea的
server_name改为gitea.localhost gitea.test.dev,proxy_pass指向http://localhost:9002 - nextcloud的
server_name改为nextcloud.localhost nextcloud.test.dev,proxy_pass指向http://localhost:9001
2. 验证并重启NGINX
先检查配置文件语法是否正确:
sudo nginx -t
如果输出test is successful,则重启NGINX服务使配置生效:
sudo systemctl restart nginx
3. 确认Windows端Hosts配置生效
在Windows的命令行执行以下命令,验证子域名是否正确解析到服务器IP:
ping gitea.test.dev ping homarr.test.dev ping nextcloud.test.dev
若返回的IP是192.168.1.15,说明解析正常;若不是,检查Hosts文件是否保存,或执行ipconfig /flushdns刷新DNS缓存。
额外说明
添加proxy_set_header系列配置是为了让后端应用(尤其是NextCloud这类需要识别请求来源的服务)能正确获取客户端的真实信息,避免出现登录异常、资源加载失败等问题。
内容的提问来源于stack exchange,提问作者SpaceBurger
相关产品推荐
相关产品推荐

