一个 Nginx 反向代理问题

344 天前
 shiyuu

家里的内网有多个应用,现在 nginx 部署在一台单独的服务器上 192.168.2.180 现在想改造一下访问方式变成访问:

https://192.168.2.180:9444/chat 可以访问到部署的 chatgpt: http://192.168.2.4:50021

https://192.168.2.180:9444/pve 可以访问到 PVE 虚拟机 https://192.168.2.2:8006/

https://192.168.2.180:9444/adguard/ 可以访问到 adguard 的应用 http://192.168.2.200/

但是按照下面的配置,访问到的页面不全,页面各种缺失。 是不是这样的方法不适用??

worker_processes auto;
events {
  worker_connections 1024;
}

http {
  server {
    listen 9444 ssl;
    server_name 192.168.2.180;
    ssl_certificate /etc/nginx/ssl.crt;
    ssl_certificate_key /etc/nginx/ssl.key;
    location /chat/ {
      proxy_pass http://192.168.2.4:50021/;
      proxy_set_header Host $proxy_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location /pve/ {
      proxy_pass https://192.168.2.2:8006/;
      proxy_set_header Host $proxy_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Accept-Encoding "";
      sub_filter_types *;
    }
    location /adguard/ {
      proxy_pass http://192.168.2.200/;
      proxy_set_header Host $proxy_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Accept-Encoding "";
      sub_filter_types *;
    }
  }
}
4314 次点击
所在节点    NGINX
32 条回复
lovelylain
344 天前
子目录访问要求被反代的应用要么使用相对路径,要么本身有做支持,否则建议换域名或者端口。
我也有追求所有应用都通过 homeassistant 以子目录访问:
adguardhome: 相对路径
nodered: 相对路径
zigbee2mqtt: 相对路径
frigate: 本身有做适配,传 X-Ingress-Path 头
openwrt 里的 netdata: 相对路径
openwrt 里的 ttyd: 相对路径
openwrt: 最开始换了域名反代,后来用 sub_filter 等解决了
虽然大部分都实现了,但还是建议对于非相对路径的直接换域名不折腾。
yxisenx
344 天前
懒得麻烦就用二级域名
luhuisicnu
344 天前
我们有这样的使用案例,统一一个域名做入口,根据 path 来区分业务,转发到内网的其他域名下,大概像这样:
server {
listen 80;
server_name api.test.com;

location /server1/ {
rewrite /server1/(.*) /$1 break;
proxy_pass http://1.1.1.1:80;
}

location /server2/ {
rewrite /server2/(.*) /$1 break;
proxy_set_header Host server2.local.test.com;
proxy_pass http://2.2.2.2:80;
}

location /server3/ {
proxy_set_header Host server3.local.test.com;
proxy_pass http://3.3.3.3:80/;
}
}
server1 是不带域名的,server2 带域名转发,所以要设置内部域名的 header ,server3 是 server2 的另一种写法。转发后的 path ,是不带 server1, server2 ,server3 的。可以试试。
luhuisicnu
344 天前
重新排版试试
我们有这样的使用案例,统一一个域名做入口,根据 path 来区分业务,转发到内网的其他域名下,大概像这样:
```
server {
listen 80;
server_name api.test.com;

location /server1/ {
rewrite /server1/(.*) /$1 break;
proxy_pass http://1.1.1.1:80;
}

location /server2/ {
rewrite /server2/(.*) /$1 break;
proxy_set_header Host server2.local.test.com;
proxy_pass http://2.2.2.2:80;
}

location /server3/ {
proxy_set_header Host server3.local.test.com;
proxy_pass http://3.3.3.3:80/;
}
}
```
server1 是不带域名的,server2 带域名转发,所以要设置内部域名的 header ,server3 是 server2 的另一种写法。转发后的 path ,是不带 server1, server2 ,server3 的。可以试试。
shiyuu
344 天前
@qwertty01 你的抄了一下可以用。看来只能用域名来搞了,这样可以在路由器少映射很多端口。阿里的免费证书不支持泛域名,得每个域名都申请一个证书,很麻烦,兄弟怎么解决?
vivisidea
344 天前
@shiyuu 内网如果有 dns 的话,可以自己加个 dns 解析,或者设备不多的话,手动每个设备加个 hosts

我用 ikuai 软路由,内部搞了个 .lan 域名,比如 nas.lan 就是群辉,router.lan 就是路由器
qwertty01
344 天前
@shiyuu #25 我因为是自己搞着玩得,用的是 mkcert 生成的泛域名证书,然后让浏览器信任一下就可以了

https://www.jianshu.com/p/7cb5c2cffaaa
shiyuu
344 天前
@qwertty01 不过我现在还遇到个问题,抄你的这么写了 4 个域名对应的系统。
pve.xx.com
nas.xx.com
adguard.xx.com
route.xx.com
用对应域名都能正常访问到对应的系统了。

但是有个情况,另外还有一些域名比如 alist.xx.com ,我 nginx 上都还没配置,直接访问的话会居然能访问到 pve 的系统上,我没设置 error_page ,是不是也要配置一个 error_page 。

upstream pve {
server 192.168.2.2:8006;
}
upstream nas {
server 192.168.2.4:5000;
}
upstream adguard {
server 192.168.2.200;
}
upstream route {
server 192.168.2.1;
}
qwertty01
344 天前
@shiyuu #28 这个我就不太清楚了,你看一下解析配置的有没有问题,或者看一下 access.log
shiyuu
343 天前
@qwertty01 知道怎么弄了, “添加一个新的 server 块,用于处理所有未知域名。我们使用 default_server 参数将其指定为默认监听器,并将 server_name 设置为 _。在 location 规则中,我们返回一个 404 错误,告诉客户端该域名未配置。如果需要,您可以将此规则更改为一个自定义的重定向或其他行为。”
mk0114
343 天前
泛域名证书用 certbot 吧,就是三个月要申请一次,或者你的域名解析商能提供 api 的话,可以做自动化更新证书。
bingfengfeifei
343 天前
优雅的方法就是域名,12 楼的方法也可以解决问题。
我是使用了 12 楼的这种方法,但是不一定每一个页面都能成功。这个方法是修改 WEB 返回内容,将返回的资源绝对路径加上你的转发前缀。
有些页面他的请求 URL 是写到 JS 里面的,掺杂在代码里面,非常难以替换。
而且有些页面会有跳转重定向,在 location 字段里面跳转,也需要特殊处理。没有通用的方法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/944337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX