我有了这种架构,并且几乎正在工作。
curl
服务,然后将请求分派到后面运行的副本。 nginx
容器。docker exec -i nginx curl http://articleservice:8080/somemethod
。但是我的配置似乎有问题。 Nginx和容器位于同一网络上。
架构:
[replica 2]
/
[incoming traffic] -> [nginx] -> [service a]
\
[replica 1]
docker-compose.yml
version: "3"
services:
articleservice:
image: elps/articleservice:1.1.0.5
deploy:
replicas: 2
restart_policy:
condition: on-failure
placement:
constraints:
- node.role == manager
ports:
- "8080:8080"
environment:
- MYSQL_HOST=192.168.178.96
- MYSQL_DB=catalog
- MYSQL_USER=root
- MYSQL_PASSWORD=root
networks:
- webnet
nginx-default:
image: nginx
deploy:
restart_policy:
condition: on-failure
placement:
constraints:
- node.role == manager
ports:
- "80:80"
networks:
- webnet
networks:
webnet:
nginx-config
server {
listen 80;
listen [::]:80;
server_name example.com;
location /article {
proxy_pass http://articleservice:8080/;
}
}
答案 0 :(得分:1)
再次,我忘记在标题中添加主机。
解决方案:
curl -H 'host: example.com' http://articleservice:8080/somemethod
答案 1 :(得分:0)
您应该在nginx-default服务中创建一个卷,以便它可以使用nginx.conf文件。
示例:
nginx-default:
image: nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
deploy:
restart_policy:
condition: on-failure
placement:
constraints:
- node.role == manager
ports:
- "80:80"
networks:
- webnet
另一个问题是,如果您访问网址 example.com/article/someMethod ,它将转换为 articleservice:8080 / article / someMethod
要删除前缀“ / article”部分,可以将其重写:
location /article {
proxy_pass http://articleservice:8080/;
rewrite ^/article(.*)$ $1 break;
}
现在,您可以使用 curl example.com/article/someMethod 来使用articleService