
我购置了一台 VPS,用 Docker 构建了几个常用的应用,这里假设叫 do1、do2、do3,分别把暴露端口代理到宿主的 8001、8002、8003 端口上,并分享给朋友使用。考虑到以后朋友使用可能越来越频繁,需求导致我要开的应用越来越多,我可能要不断地增加应用下去,这个时候还用 ip:80** (比如 192.168.0.1:8001~192.168.0.1:8009 )来访问应用显得不合理。
所以问题来了,我能不能只开一个 80 端口,然后用不同的访问地址来对应到不同的 Docker 应用? 比如访问 192.168.0.1 就默认跳到 192.168.0.1/do1,然后 192.168.0.1/do2、192.168.0.1/do3 对应原本 do1、do2、do3 的 Docker 应用?
我不是网工或者运维,所以我只知道我的需求,不知道怎么去解决,我搜了一晚,都找不准关键词。 但是我搜到二级代理这个词,所以我想我可不可以申请一个域名,比如 my.com 这样,然后通过 do1.my.com 、do2.my.com 和 do3.my.com 来访问不同的 Docker 应用?
以上的解决方案我不知道是否实际可行,Docker 我也是刚开始入门。请指点一个思路或者搜索关键词,谢谢。
因为我没有域名,所以想用第一个方案,我的期望是:
输入 ip/do1,do 应用下所有的访问,都是会代理到 ip/do1/**,比如 ip/do1/app 可以跳到 ip/do1/my/config。
我搜了 Nginx 和反向代理,按 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 来配:
server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } location /do1/ { proxy_pass http://127.0.0.1:8001; } location /do2/ { proxy_pass http://127.0.0.1:8002; } location /do3/ { proxy_pass http://127.0.0.1:8003; } } 结果访问 ip/do1 能跳到 ip/do1/login.php ,但只要一登陆,就会跳到 ip/index.php,显示 404 。即便手动跳转到期望的 ip/do1/index.php ,整个页面加载不完整,所有资源请求都不是以 ip/do1/ 开头的地址,而是直接访问 ip/ 里。
我知道加不加 / 有区别,我可能是理解错官网的意思了?我试着 location 和 proxy_pass 后面加不加 / 所有搭配了,还是不行,试过 rewrite 也不行,实在有点想不通。请问我是哪里配置错误了?
1 tiedan 2018-11-15 14:39:44 +08:00 nginx |
3 xiaomimei 2018-11-15 15:50:57 +08:00 via iPhone |
4 vjnjc 2018-11-15 15:51:49 +08:00 vhost? |
5 zgray 2018-11-15 15:52:58 +08:00 via iPhone 反向代理,docker 的话,建议看看 nginx-proxy 这个 image |
6 sunny352787 2018-11-15 15:53:18 +08:00 应该搜反向代理 |
7 lllllliu 2018-11-15 15:54:17 +08:00 反向代理 / a / b / xxx 都可以指定 IP 和端口。 |
8 1419co1in 2018-11-15 15:57:27 +08:00 proxy_pass 到各个端口 |
9 Liang 2018-11-15 16:01:50 +08:00 反代就好了 |
10 neoblackcap 2018-11-15 16:02:28 +08:00 两种都可以,前者是反向代理,后者是子域名+vhost |
11 kimqcn 2018-11-15 16:28:25 +08:00 用户 nginx 可以: server { listen 80; server_name oa.myweb.cn; access_log /bitnami/nginx/logs/oa.access.log; error_log /bitnami/nginx/logs/oa.error.log; location / { proxy_pass http://192.168.100.103:8080/; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header host $host:$server_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { listen 80; server_name mail.myweb.cn; access_log /bitnami/nginx/logs/mail.access.log; error_log /bitnami/nginx/logs/mail.error.log; location / { proxy_pass http://192.168.100.103:8081/; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header host $host:$server_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #client_max_body_size 100m; } } |
12 gamexg 2018-11-15 16:52:08 +08:00 我推荐 letsencrypt-nginx-proxy-companion |
13 jmyz0455 OP |
14 NicholasYX 2018-11-15 16:58:30 +08:00 nginx 反代 |
15 hack 2018-11-15 17:01:23 +08:00 11 is right |
16 Midnight 2018-11-15 17:02:48 +08:00 用 nginx-proxy 反向代理,docker-compose 编排到一起,最后用 docker-compose up -d [image-name] 运行某一个或不指定 |
17 cuberlzy 2018-11-15 17:11:20 +08:00 关键词是反向代理。 原理就是只监听某一个端口(比如 80),根据你的 Host 头(也就是访问时的域名),指派到不同的配置上去,替你从这个端口请求数据,然后把响应数据返还给你。 |
18 Kyle18Tang 2018-11-15 17:55:25 +08:00 nginx 也用 docker 的,所有的应用放一个 network 里,这样也不需要暴露额外的端口,只需要暴露 nginx 的 80 和 443 就可以了。 |
19 jmyz0455 OP @vjnjc @neoblackcap 暂时先不用域名,第一个方案能通就用了 |
20 jmyz0455 OP @zgray @sunny352787 @lllllliu @1419co1in @Liang @gamexg @NicholasYX @Midnight @cuberlzy @Kyle18Tang 我配 ip:do1/ 代理 8001 是没问题的,但是 ip:do1/ 下面的请求,比如 ip:do1/test/ 请求到 ip:do1/demo/ 失败了,只会跳到 ip:do1/demo/,就是丢失了 d1/ 这个路径,有配过这个配置的么。 |
21 jmyz0455 OP |
22 rockhu 2018-11-16 14:26:15 +08:00 Traefik 或者 Caddy 了解一下。 |
23 1747479654 2018-11-18 01:36:21 +08:00 你装个宝塔,然后用里面的 ngnix 反向代理,轻松又方便, 我的 leanote/docker 一些都是这样的,二级域名 /顶级域名指过来,不要太方便. |
24 jmyz0455 OP @1747479654 可以分享下你 Nginx 的 default.conf 吗 |