一个 Nginx 反向代理问题

2023-05-30 22:36:45 +08:00
 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 *;
    }
  }
}
5034 次点击
所在节点    NGINX
32 条回复
lovelylain
2023-05-31 14:23:37 +08:00
子目录访问要求被反代的应用要么使用相对路径,要么本身有做支持,否则建议换域名或者端口。
我也有追求所有应用都通过 homeassistant 以子目录访问:
adguardhome: 相对路径
nodered: 相对路径
zigbee2mqtt: 相对路径
frigate: 本身有做适配,传 X-Ingress-Path 头
openwrt 里的 netdata: 相对路径
openwrt 里的 ttyd: 相对路径
openwrt: 最开始换了域名反代,后来用 sub_filter 等解决了
虽然大部分都实现了,但还是建议对于非相对路径的直接换域名不折腾。
yxisenx
2023-05-31 15:01:43 +08:00
懒得麻烦就用二级域名
luhuisicnu
2023-05-31 15:32:11 +08:00
我们有这样的使用案例,统一一个域名做入口,根据 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
2023-05-31 15:34:46 +08:00
重新排版试试
我们有这样的使用案例,统一一个域名做入口,根据 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
2023-05-31 16:29:33 +08:00
@qwertty01 你的抄了一下可以用。看来只能用域名来搞了,这样可以在路由器少映射很多端口。阿里的免费证书不支持泛域名,得每个域名都申请一个证书,很麻烦,兄弟怎么解决?
vivisidea
2023-05-31 16:39:07 +08:00
@shiyuu 内网如果有 dns 的话,可以自己加个 dns 解析,或者设备不多的话,手动每个设备加个 hosts

我用 ikuai 软路由,内部搞了个 .lan 域名,比如 nas.lan 就是群辉,router.lan 就是路由器
qwertty01
2023-05-31 17:09:07 +08:00
@shiyuu #25 我因为是自己搞着玩得,用的是 mkcert 生成的泛域名证书,然后让浏览器信任一下就可以了

https://www.jianshu.com/p/7cb5c2cffaaa
shiyuu
2023-05-31 17:24:38 +08:00
@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
2023-05-31 17:32:51 +08:00
@shiyuu #28 这个我就不太清楚了,你看一下解析配置的有没有问题,或者看一下 access.log
shiyuu
2023-05-31 20:42:41 +08:00
@qwertty01 知道怎么弄了, “添加一个新的 server 块,用于处理所有未知域名。我们使用 default_server 参数将其指定为默认监听器,并将 server_name 设置为 _。在 location 规则中,我们返回一个 404 错误,告诉客户端该域名未配置。如果需要,您可以将此规则更改为一个自定义的重定向或其他行为。”
mk0114
2023-06-01 08:56:34 +08:00
泛域名证书用 certbot 吧,就是三个月要申请一次,或者你的域名解析商能提供 api 的话,可以做自动化更新证书。
bingfengfeifei
2023-06-01 14:34:04 +08:00
优雅的方法就是域名,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