本人是一个不懂后端的 iOS 开发,对 nginx 略知一二,知道它是做反向代理的,知道在哪改 nginx.conf,知道改完怎么 reload
现有一太内网机器,领导帮我配置了一个可外网访问的域名,并用 nginx 配置了一个 ssl 证书,端口是 8088 ;
我用 docker 部署了一个服务,暴露的端口是 3000 。
现在希望能将 3000 端口映射到 8088 端口的一个路径下,比如 https://xxx.com:8088/yyy,从而实现外网能访问 3000 端口的目的。
网络上搜索了几个结果,但都没有效果,现在的配置:
location /yyy/ { proxy_set_header Host $http_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; proxy_pass http://0.0.0.0:3000/; }
现在能实现的效果是能进首页,但是无法加载 css/js 等资源文件,提示 404,但是我不知道该怎么改了。
![]() | 1 XiaoxiaoPu 2021-08-02 15:13:34 +08:00 proxy_pass 这一行,去掉 ";" 前面的 "/" |
2 AoEiuV020 2021-08-02 15:24:59 +08:00 仅供参考,我自己配置过同样作用的, location ^~/clash/ { proxy_pass http://127.0.0.1:9090/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } |
3 dablwow 2021-08-02 15:32:01 +08:00 应该不是斜杠的问题,楼主发一下报错的 css/js 的请求路径吧,有可能是写死的,等于在读 8088 的资源(实际不存在) |
![]() | 4 weichengwu OP @XiaoxiaoPu #1 "/" 去掉之后首页都打不开 |
![]() | 5 weichengwu OP @AoEiuV020 #2 也不行 |
![]() | 6 weichengwu OP @dablwow #3 "GET /assets/application-1b7c2119d0cc0be69a0e6705ee19d5bf859cc64e949a0faf412286a8a53db169.js HTTP/1.1" 404 153 "https://xx x.com:8088/yyy/" |
7 AoEiuV020 2021-08-02 15:54:04 +08:00 @weichengwu 基本上确定是 html 问题,你希望整个网站都在 /yyy/下,但 html 请求了绝对路径的 js,要改成相对路径才行, |
![]() | 8 XiaoxiaoPu 2021-08-02 16:19:27 +08:00 抱歉看错了,没注意到 location 里有 /yyy/ 错误原因应该是如 AoEiuV020 所说。 |
![]() | 9 defunct9 2021-08-02 16:21:19 +08:00 开 ssh,让我上去看看 |
![]() | 10 weichengwu OP @AoEiuV020 #7 感谢,那我估计要改一下服务的源码了 |
![]() | 11 weichengwu OP @defunct9 #9 这个不太方便 整个设备是在内网的,公网访问是领导帮我配置的,这一块我也不会弄 |
![]() | 12 AllenHua 2021-08-02 17:26:03 +08:00 404 就是没有读取到 css/js 资源 建议把所有资源都通过 lcation / 匹配 反代 然后 server 块定义一个 root dir 另外既然有域名了,可以再配置一个子域名,使用 https://abc.example.com 访问服务,这样 url 不更优雅么 |
![]() | 13 ryd994 2021-08-02 17:30:42 +08:00 via Android 你再看看前端请求的资源文件是在根路径下还是在 /sss/下? 你可能需要 proxy_redirect 和 subs_filter 。 但是更正确的做法是修改后端,让后端正确配置到 /sss/ |
![]() | 14 yufeng0681 2021-08-02 17:39:23 +08:00 |
![]() | 15 fdppzrl 2021-08-02 17:48:45 +08:00 via Android 改改静态资源的访问路径或者 14 楼的方法 |
![]() | 16 bipy 2021-08-02 18:36:18 +08:00 盲猜一个常见坑,加一条配置试试 absolute_redirect off; |
![]() | 17 ik 2021-08-02 19:22:50 +08:00 via iPhone ![]() 0.0.0.0:3000 不知道你是不是故意改了的 应该是 127.0.0.1:3000 |
![]() | 18 kkidou 2021-08-02 19:26:24 +08:00 静态资源加载的问题, 楼上也都说了,可以看下把所需要的静态资源一并放到一个目录下 |
19 v2clay 2021-08-02 22:08:09 +08:00 我也遇到过这个问题,其实就是 静态文件路径问题。因为多了一个 yyy 。 你需要通匹配,把 js css 文件 匹配到 一个目录下 如 /opt/yyy, 然后把 web 资源下所有的文件 copy 过去就行了(其实只会匹配 js css 文件,全 copy,主要是因为懒)。 |
20 v2clay 2021-08-02 22:18:30 +08:00 @AoEiuV020 # 跟相对绝对没关系,看描述本来就是相对路径。 主要问题是 请求的 uri 里多了一个 yyy 。如果是相对路径,匹配的是 /yyy/xx.js ,肯定找不到。 如果是绝对路径,ip:8088/xx.js 匹配到 location / 下,肯定也找不到。 |
![]() | 21 cpstar 2021-08-02 22:23:32 +08:00 相对路径、绝对路径 看到问题,猜了大概,看到 6#确定了猜测。 但是解决这个问题,很大情况下源头不太好修改因为如果他容易修改的话,他就不会用绝对路径这个 SB 的策略了于是解决办法很有可能需要挨个 URL 做反代。 然后不知道 proxy_reverse 另外,location 最好用 2#的匹配,当然写你那样也没啥问题。然后结尾斜杠的问题,保持统一,要有都有,要没有都没有,/xxx 和 /xxx/是两个 URL 。 |
22 tqyq88 2021-08-02 22:25:01 +08:00 不用改路径,加一行 rewrite /yyy/(.*) /$1 break; |
![]() | 23 weichengwu OP 感谢楼上各位的回复,今天下午一直在开会,明天去公司一一尝试。 |
![]() | 24 weichengwu OP 感觉主要还是不懂 nginx 的工作方式,但是仅仅为了配置一个服务把 nginx 整个过一遍太吃精力了 |
![]() | 25 awker 2021-08-02 22:49:08 +08:00 可以参考:Nginx proxy_pass 后出现部分请求 404 的解决办法 https://www.jianshu.com/p/55bfbba45fed |
26 AoEiuV020 2021-08-03 09:13:09 +08:00 @v2clay 你这是在讲什么,#6 楼日志看了没有,问题就是 uri 里没有 yyy,到你这里还 uri 里多了一个 yyy, 要匹配的就是 /yyy/xx.js 才能被匹配反代到内网 /xx.js , |
27 Chieh 2021-08-03 13:14:38 +08:00 $http_host 试试 https://xxx.com:8088/ |
![]() | 28 abccccabc 2021-08-05 19:19:22 +08:00 楼主,解决了没有?最终答案是什么? |
![]() | 29 weichengwu OP @abccccabc #28 解决了哈,路径的方式没走通,换多级域名了 |