[英]Multiple Nginx servers (api + backend) under docker
我在 docker 下使用兩個 symfony 應用程序配置 docker 時遇到問題:
當我使用導航器時,我可以訪問http://dev.front.local和http://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://php或http://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://php和http://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.