我需要在本地设置 docker 并包含 3 个映射到子域的服务,例如:
共享公共域(例如 *app.com)非常重要,因为我需要此设置来进行 JSESSION cookie 测试。
使用 docker compose 和 nginx docker 服务实现这样的配置是否可行?
我已经有了 docker-compose.yaml:
version: '3.8'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/ssl:/etc/nginx/ssl
- ./nginx/generate-certs.sh:/usr/local/bin/generate-certs.sh
entrypoint: /bin/bash -c "/usr/local/bin/generate-certs.sh && nginx -g 'daemon off;'"
depends_on:
- service1
- service2
- service3
service1:
image: nginx:latest
ports:
- "8081:80"
volumes:
- ./html:/usr/share/nginx/html
service2:
image: nginx:latest
ports:
- "8082:80"
volumes:
- ./html2:/usr/share/nginx/html
service3:
image: nginx:latest
ports:
- "8083:80"
volumes:
- ./html3:/usr/share/nginx/html
和 nginx.conf:
events {
}
http {
upstream service1 {
server service1:80;
}
upstream service2 {
server service2:80;
}
upstream service3 {
server service3:80;
}
server {
listen 80;
server_name *.app.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name service3.app.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
proxy_pass http://service3;
proxy_set_header Host $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;
}
}
server {
listen 443 ssl;
server_name service1.app.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location /1 {
proxy_pass http://service1;
proxy_set_header Host $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;
}
}
server {
listen 443 ssl;
server_name service2.app.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location /2 {
proxy_pass http://service2;
proxy_set_header Host $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;
}
}
server {
listen 443 ssl;
server_name service3.app.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location /3 {
proxy_pass http://service3;
proxy_set_header Host $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;
}
}
}
每当我访问https://app.com时它对我很有帮助(我已将此主机添加到/etc/hosts) 但我无法从主机 - 我的电脑浏览器访问 https://service3.app.com
总结一下,我需要这样的架构:https://blog.florianlopes.io/host-multiple-websites-on-single-host-docker/
请指出我做错了什么。
/etc/hosts
那样更改系统配置文件。 这种基于主机名的路由不能单独使用 Docker 来设置;您需要 Docker 之外的东西来配置这些主机名。由于您已经有了反向代理,因此首先要尝试的就是将其所有块组合到单个 HTTP 服务中,例如
server {
listen 80;
location /1/ {
proxy_pass http://service1;
}
location /2/ {
proxy_pass http://service2;
}
location / {
proxy_pass http://service3;
}
}
然后您就可以拨打 例如 http://localhost/1/
并被路由至
service1
。 (如果该服务以某种方式构造绝对 URL,它可能需要知道它位于插入此路径前缀的代理后面。)这根本不依赖于主机名,因此您可以将其与普通 Docker(或 Compose)一起使用)而不尝试管理主机名到 IP 的映射。您谈到需要共享 cookie 域。 在此示例中,所有内容均通过相同的主机名和端口提供,因此服务可以共享 cookie。 服务到服务的调用都不会是跨源调用(如果服务 1 的浏览器内应用程序获取
/2/info.json
,它位于同一域中),因此 CORS 规则在此设置中也无关紧要。