我购置了一台 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 吗
|