V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
weichengwu
V2EX  ›  NGINX

请教一个 nginx 的端口转发问题

  •  
  •   weichengwu · 2021-08-02 15:03:29 +08:00 · 3130 次点击
    这是一个创建于 969 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    本人是一个不懂后端的 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,但是我不知道该怎么改了。

    29 条回复    2021-08-25 18:23:07 +08:00
    XiaoxiaoPu
        1
    XiaoxiaoPu  
       2021-08-02 15:13:34 +08:00
    proxy_pass 这一行,去掉 ";" 前面的 "/"
    AoEiuV020
        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;
    }
    dablwow
        3
    dablwow  
       2021-08-02 15:32:01 +08:00
    应该不是斜杠的问题,楼主发一下报错的 css/js 的请求路径吧,有可能是写死的,等于在读 8088 的资源(实际不存在)
    weichengwu
        4
    weichengwu  
    OP
       2021-08-02 15:38:50 +08:00
    @XiaoxiaoPu #1 "/" 去掉之后首页都打不开
    weichengwu
        5
    weichengwu  
    OP
       2021-08-02 15:43:10 +08:00
    @AoEiuV020 #2 也不行
    weichengwu
        6
    weichengwu  
    OP
       2021-08-02 15:43:51 +08:00
    @dablwow #3 "GET /assets/application-1b7c2119d0cc0be69a0e6705ee19d5bf859cc64e949a0faf412286a8a53db169.js HTTP/1.1" 404 153 "https://xx x.com:8088/yyy/"
    AoEiuV020
        7
    AoEiuV020  
       2021-08-02 15:54:04 +08:00
    @weichengwu 基本上确定是 html 问题,你希望整个网站都在 /yyy/下,但 html 请求了绝对路径的 js,要改成相对路径才行,
    XiaoxiaoPu
        8
    XiaoxiaoPu  
       2021-08-02 16:19:27 +08:00
    抱歉看错了,没注意到 location 里有 /yyy/

    错误原因应该是如 AoEiuV020 所说。
    defunct9
        9
    defunct9  
       2021-08-02 16:21:19 +08:00
    开 ssh,让我上去看看
    weichengwu
        10
    weichengwu  
    OP
       2021-08-02 16:26:46 +08:00
    @AoEiuV020 #7 感谢,那我估计要改一下服务的源码了
    weichengwu
        11
    weichengwu  
    OP
       2021-08-02 16:27:39 +08:00
    @defunct9 #9 这个不太方便😂 整个设备是在内网的,公网访问是领导帮我配置的,这一块我也不会弄
    AllenHua
        12
    AllenHua  
       2021-08-02 17:26:03 +08:00
    404 就是没有读取到 css/js 资源

    建议把所有资源都通过 lcation / 匹配 反代

    然后 server 块定义一个 root dir

    另外既然有域名了,可以再配置一个子域名,使用 https://abc.example.com 访问服务,这样 url 不更优雅么
    ryd994
        13
    ryd994  
       2021-08-02 17:30:42 +08:00 via Android
    你再看看前端请求的资源文件是在根路径下还是在 /sss/下?
    你可能需要 proxy_redirect 和 subs_filter 。
    但是更正确的做法是修改后端,让后端正确配置到 /sss/
    yufeng0681
        14
    yufeng0681  
       2021-08-02 17:39:23 +08:00
    建议用不同的二级域名实现
    aaa.xxx.com >> A 网站
    bbb.xxx.com >> local:3000
    fdppzrl
        15
    fdppzrl  
       2021-08-02 17:48:45 +08:00 via Android
    改改静态资源的访问路径或者 14 楼的方法
    bipy
        16
    bipy  
       2021-08-02 18:36:18 +08:00
    盲猜一个常见坑,加一条配置试试

    absolute_redirect off;
    ik
        17
    ik  
       2021-08-02 19:22:50 +08:00 via iPhone   ❤️ 1
    0.0.0.0:3000

    不知道你是不是故意改了的

    应该是 127.0.0.1:3000
    kkidou
        18
    kkidou  
       2021-08-02 19:26:24 +08:00
    静态资源加载的问题, 楼上也都说了,可以看下把所需要的静态资源一并放到一个目录下
    v2clay
        19
    v2clay  
       2021-08-02 22:08:09 +08:00
    我也遇到过这个问题,其实就是 静态文件路径问题。因为多了一个 yyy 。
    你需要通匹配,把 js css 文件 匹配到 一个目录下 如 /opt/yyy, 然后把 web 资源下所有的文件 copy 过去就行了(其实只会匹配 js css 文件,全 copy,主要是因为懒)。
    v2clay
        20
    v2clay  
       2021-08-02 22:18:30 +08:00
    @AoEiuV020 # 跟相对绝对没关系,看描述本来就是相对路径。

    主要问题是 请求的 uri 里多了一个 yyy 。如果是相对路径,匹配的是 /yyy/xx.js ,肯定找不到。
    如果是绝对路径,ip:8088/xx.js 匹配到 location / 下,肯定也找不到。
    cpstar
        21
    cpstar  
       2021-08-02 22:23:32 +08:00
    相对路径、绝对路径
    看到问题,猜了大概,看到 6#确定了猜测。
    但是解决这个问题,很大情况下源头不太好修改——因为如果他容易修改的话,他就不会用绝对路径这个 SB 的策略了——于是解决办法很有可能需要挨个 URL 做反代。

    然后不知道 proxy_reverse

    另外,location 最好用 2#的匹配,当然写你那样也没啥问题。然后结尾斜杠的问题,保持统一,要有都有,要没有都没有,/xxx 和 /xxx/是两个 URL 。
    tqyq88
        22
    tqyq88  
       2021-08-02 22:25:01 +08:00
    不用改路径,加一行 rewrite /yyy/(.*) /$1 break;
    weichengwu
        23
    weichengwu  
    OP
       2021-08-02 22:36:40 +08:00
    感谢楼上各位的回复,今天下午一直在开会,明天去公司一一尝试。
    weichengwu
        24
    weichengwu  
    OP
       2021-08-02 22:37:27 +08:00
    感觉主要还是不懂 nginx 的工作方式,但是仅仅为了配置一个服务把 nginx 整个过一遍太吃精力了 😂
    awker
        25
    awker  
       2021-08-02 22:49:08 +08:00
    可以参考:Nginx proxy_pass 后出现部分请求 404 的解决办法 https://www.jianshu.com/p/55bfbba45fed
    AoEiuV020
        26
    AoEiuV020  
       2021-08-03 09:13:09 +08:00
    @v2clay 你这是在讲什么,#6 楼日志看了没有,问题就是 uri 里没有 yyy,到你这里还 uri 里多了一个 yyy,
    要匹配的就是 /yyy/xx.js 才能被匹配反代到内网 /xx.js ,
    Chieh
        27
    Chieh  
       2021-08-03 13:14:38 +08:00
    $http_host 试试 https://xxx.com:8088/
    abccccabc
        28
    abccccabc  
       2021-08-05 19:19:22 +08:00
    楼主,解决了没有?最终答案是什么?
    weichengwu
        29
    weichengwu  
    OP
       2021-08-25 18:23:07 +08:00
    @abccccabc #28 解决了哈,路径的方式没走通,换多级域名了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1250 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 18:00 · PVG 02:00 · LAX 11:00 · JFK 14:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.