簡體   English   中英

docker 下的多個 Nginx 服務器(api + 后端)

[英]Multiple Nginx servers (api + backend) under docker

我在 docker 下使用兩個 symfony 應用程序配置 docker 時遇到問題:

  • 前面(symfony)
  • 后端(symfony)
  • nginx

當我使用導航器時,我可以訪問http://dev.front.localhttp://dev.backend.local但我必須從前面調用后端,它不起作用,dev.backend.local無法識別(我有 symfony 錯誤:無法連接到服務器以獲取“ http://dev.backend.local ”)。

我如何強制前端 nginx “看到”后端 url? 我看到 nginx 代理,但我不知道在我的情況下該怎么做,如果它真的是強制性的。

原諒我的英語不好...

謝謝

docker-compose.yaml:

version: '3.7'

services:
  mysql:
    build:
      context: .
      dockerfile: docker/mariadb/Dockerfile
    ports:
      - '13306:3306'
    restart: always
    volumes:
      - './database/:/var/lib/mysql'
    networks:
      api_network:
        ipv4_address: 172.28.1.4

  php:
    container_name: backend
    build:
      context: .
      dockerfile: docker/backend/Dockerfile
    env_file:
      - .env
    ports:
      - '9001:9001'
    links:
      - mysql:db
    volumes:
      - './app/backend/:/var/www/app/backend:cached'
      - './logs/xdebug:/var/log/xdebug:cached'
    networks:
      api_network:
        ipv4_address: 172.28.1.1

  front:
    container_name: front-web
    build:
      context: .
      dockerfile: docker/front/Dockerfile
    env_file:
      - .env
    ports:
      - '9002:9002'
    links:
      - mysql:db
    volumes:
      - './app/front/:/var/www/app/front'
    networks:
      api_network:
        ipv4_address: 172.28.1.6


  nginx:
    container_name: nginx
    build: ./docker/nginx
    ports:
      - '80:80'
    links:
      - php
      - phpmyadmin
      - front
    volumes:
      - './docker/nginx/conf:/etc/nginx/conf.d/:cached'
      - './app/backend/:/var/www/app/backend:cached'
      - './app/front/:/var/www/app/front:cached'
    depends_on:
      - php
      - front
    networks:
      api_network:
        ipv4_address: 172.28.1.2

  phpmyadmin:
    container_name: phpmyadmin
    image: phpmyadmin/phpmyadmin
    ports:
      - '8080:80'
    links:
      - mysql:db
    environment:
      MYSQL_ROOT_PASSWORD: ****
    networks:
      api_network:
        ipv4_address: 172.28.1.3

networks:
  api_network:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16

nginx front.conf:

server {
   listen 80;
   listen [::]:80;

   server_name dev.front.local;
   root /var/www/app/front/public;

   location / {
        try_files $uri /index.php$is_args$args;
   }

   location ~ ^/.+\.php(/|$) {
      fastcgi_pass php-front;
      fastcgi_split_path_info ^(.+\.php)(/.*)$;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
      fastcgi_param DOCUMENT_ROOT $realpath_root;
      internal;
   }

   location ~ \.php$ {
       return 404;
       #error_page 404 /404_error.html;
   }

   error_log /var/log/nginx/front-error.log;
   access_log /var/log/nginx/front-access.log;
}

nginx back.conf:

server {
   listen 80;
   listen [::]:80;

   server_name dev.backend.local;
   root /var/www/app/backend/public;

   location / {
      try_files $uri /index.php$is_args$args;
   }

   location ~ ^/.+\.php(/|$) {
      fastcgi_pass php-upstream;
      fastcgi_split_path_info ^(.+\.php)(/.*)$;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
      fastcgi_param DOCUMENT_ROOT $realpath_root;
      internal;
   }

   error_log /var/log/nginx/backend-error.log;
   access_log /var/log/nginx/backend-access.log;
}

nginx.conf

user www;
worker_processes 4;
pid /run/nginx.pid;

events {
    worker_connections 2048;
    multi_accept on;
    use epoll;
}

http {
    upstream php-upstream {
        server php:9001 max_fails=3 fail_timeout=30;
    }

    upstream php-front {
        server front:9002 max_fails=3 fail_timeout=30;
    }

    server_tokens off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 15;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    access_log off;
    error_log off;
    gzip on;
    gzip_disable "msie6";
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    open_file_cache max=100;
    client_body_temp_path /tmp 1 2;
    client_body_buffer_size 256k;
    client_body_in_file_only off;
}

daemon off;

在她的子網絡中的內部 docker 為每個容器設置別名,這使得容器之間可以進行通信,因為容器的 ips 是動態的。 如果你想對你的前后容器進行請求,路線是: http://phphttp://backend因為你正在使用 container_name: backend

Docker-compose 可以使服務通過它們的名稱進行通信(后端為 php,前端為前端等...)如果你想你的服務 nginx 與你的后端通信,你必須使用服務的名稱。 (它就像 Docker-compose 用服務名稱填充您的 /etc/host)。

對於nginx,必須寫fastcgi-pass php和fastcgi-pass前面。

通信與容器名稱無關,而是與服務名稱相關(使用 Docker-compose)

容器名稱鏈接到 url? 我沒有注意到這一點。 我試過了,但它不起作用。 ngin back 和 front 在同一個容器中。 這里 ping http://phphttp://backend

/ # ping php
PING php (172.28.1.1): 56 data bytes
64 bytes from 172.28.1.1: seq=0 ttl=64 time=0.519 ms
64 bytes from 172.28.1.1: seq=1 ttl=64 time=0.136 ms

/ # ping backend
PING backend (172.28.1.1): 56 data bytes
64 bytes from 172.28.1.1: seq=0 ttl=64 time=0.103 ms

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM