Nginx 能否将本地的多个端口转发到同一端口的不同目录

2021-02-13 02:23:25 +08:00
 nellxzy

玩树莓派遇到的问题,自己查了很久资料没搞定,求求论坛的各位大神指点!

背景

设备是树莓派,用了花生壳的内网穿透,免费版只提供两个端口,SSH 用掉一个 22 端口,现在只剩一个端口了。

我有如下服务:

受到 Aria-NG 的启发,所以我在想能不能用 Nginx 实现如下转发:

我查到 Nginx 的默认端口是 80,如果上面可以实现的话,或许就可以只用一个 80 端口来使用多个服务。(应该是可以的,我之前试了 80 端口,用 外网域名:外网端口 /aria-ng 可以访问 Aria-NG,但是因为 Aria2 的 RPC 在 6800,所以只有 Aria-NG 的界面,没法实际使用。)

目前的失败尝试

/etc/nginx/nginx.conf中,进行如下修改:

html {
	......
    
    server {
        listen 80;
        server_name localhost;

        # Jupyter Notebook
        location /jupyter {
            proxy_pass http://localhost:8888;
            ......
        }

        # Aria2 JSONRPC
        location /jsonrpc {
            proxy_pass http://localhost:6800/jsonrpc;
            ......
        }
        
        # XXX
        location /xxx {
        	proxy_pass http://localhost:5299;
            ......
    }
}

重启 nginx 服务后,在树莓派上访问localhost/jupyter,错误 404 。局域网访问或外网访问自然也失败了。

查到的资料基本上都是一个端口或域名转发到另一个端口或域名的,基本没有我这里的多个端口转发到同一端口的不同目录。还有一些用到了 stream 模块,但也是局域网内的端口对端口。只有这个帖子比较像: https://www.imooc.com/wenda/detail/510191 ,但是没有详细答案。

当然,这个问题不用花生壳就能解决了,但还是好奇,上面提的方案有没有实现的可能性?

5004 次点击
所在节点    NGINX
29 条回复
cinhoo
2021-02-13 02:45:32 +08:00
location 和 proxy_pass 最后都加上 /试试
nellxzy
2021-02-13 02:51:31 +08:00
@cinhoo 试了一下,两个都加 /,两个分别加#,都没成功
ashong
2021-02-13 02:54:50 +08:00
```
location /jupyter {
proxy_pass http://localhost:8888/;
......
}
```

应该就可以了
Kobayashi
2021-02-13 02:55:00 +08:00
我记得需要被代理的服务支持,需要通知被代理服务它正在工作在某个目录下。如果是子域名就没有这种限制。
nellxzy
2021-02-13 03:06:19 +08:00
@ashong 这边还是 404
Qetesh
2021-02-13 03:14:09 +08:00
这种转发会把路径带过去,需要写 rewrite 。最好用域名做到不通网站访问
cz5424
2021-02-13 08:13:04 +08:00
是不是 docker 下,docker 下就不是 localhost
crclz
2021-02-13 08:42:40 +08:00
关键词 nginx rewrite
cz5424
2021-02-13 09:15:49 +08:00
# Aria2 JSONRPC
location /jsonrpc {
proxy_pass http://localhost:6800;
......
}
kingfalse
2021-02-13 09:28:59 +08:00
搜 Nginx 路径转发
snip
2021-02-13 09:34:58 +08:00
如果是自己用,就用 ssh 隧道解决
dier
2021-02-13 09:46:52 +08:00
server_name 填个域名,然后解析到花生壳的 cname 或 IP
dier
2021-02-13 09:47:46 +08:00
你只有 localhost,那就只能通过 localhost 来访问
dier
2021-02-13 09:50:22 +08:00
有些服务不支持路径的话,建议分成不同的 server{}块来区分,每一块都能监听 80 端口,修改成对应的 server_name 就可以了
OhYee
2021-02-13 10:43:27 +08:00
参考下这个的例子?貌似问题就在反向代理路径上

https://segmentfault.com/a/1190000022501310
chinvo
2021-02-13 10:46:09 +08:00
@dier #13 瞎说,server name 不决定外部访问方式,只是按 server 排列顺序匹配,都匹配不上则展示最后一个或 default server
Rysle
2021-02-13 12:17:12 +08:00
这个帖子回复需要各种验证?
Rysle
2021-02-13 12:21:11 +08:00
带链接的不让回,自己搜索一下 ngx_http_sub_module 的例子
SenLief
2021-02-13 12:43:50 +08:00
你应该是配置错了
location /jsonrpc {
proxy_pass http://localhost:6800;
}
不要在 proxy_pass 后跟目录,不加 /会自动替换请求链。可以试试
ihipop
2021-02-13 13:44:16 +08:00
说了这么说没一个人贴文档的,文档里面说的很清
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass


If the proxy_pass directive is specified with a URI, then when a request is passed to the server, the part of a normalized request URI matching the location is replaced by a URI specified in the directive:

location /name/ { proxy_pass http://127.0.0.1/remote/; }

假如你的 jupyter 工作在 8888 端口的 / ,不存在任何重定向,且木有绑定 host
@ashong 的例子应该可以 work 的
楼主也最好参阅一下 jupyter 的日志确定问题而不是乱试

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

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

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

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

© 2021 V2EX