无法在Nginx容器后面到达容器化服务

时间:2019-02-24 13:45:50

标签: docker nginx docker-compose

我有了这种架构,并且几乎正在工作。

  • 我可以直接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/; 
  }
}

2 个答案:

答案 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