多个 Nginx + PHP 容器
Multiple Nginx + PHP container
我有这样的配置:
- 1 Nginx(开发)docker + 1 Php(开发)docker
- 1 个 Nginx(产品)docker + 1 Php(专业)docker
我使用 traefik 和 docker-compose。
问题是我无法将 dev php docker 连接到 dev nginx docker... 我有 "File not found." 错误。说明nginx找不到fastcgi配置
这是我的 docker-撰写:
version: '3'
networks:
proxy:
external: true
internal:
external: false
services:
mysql:
image: 'mysql:5.7'
environment:
MYSQL_ROOT_PASSWORD: null
ports:
- "3306:3306"
networks:
- internal
labels:
- traefik.enable=false
portainer:
image: portainer/portainer
networks:
- internal
- proxy
labels:
- "traefik.frontend.rule=Host:portainer.xxx.xyz"
- "traefik.port=9000"
- "traefik.backend=portainer"
- traefik.docker.network=proxy
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
restart: unless-stopped
Nginx-Pro:
image: nginx:alpine
build:
context: .
dockerfile: Dockerfile_Nginx
container_name: Nginx-Pro
labels:
- traefik.backend=Nginx-Pro
- traefik.frontend.rule=Host:xxx.fr,www.xxx.fr, yyy.fr, www.yyy.fr
- traefik.docker.network=proxy
- traefik.frontend.passHostHeader=true
- "traefik.port=80"
- "traefik.frontend.entryPoints=http,https"
networks:
- internal
- proxy
depends_on:
- mysql
volumes:
- /var/www/nginx-pro/:/usr/share/nginx/
- /etc/nginx/nginx-pro/:/etc/nginx/
links:
- php-pro
Nginx-Dev:
image: nginx:alpine
build:
context: .
dockerfile: Dockerfile_Nginx
container_name: Nginx-Dev
labels:
- traefik.backend=Nginx-Dev
- traefik.frontend.rule=Host:trombi.xxx.xyz
- traefik.docker.network=proxy
- traefik.frontend.passHostHeader=true
- "traefik.port=80"
- "traefik.frontend.entryPoints=http,https"
networks:
- internal
- proxy
depends_on:
- mysql
volumes:
- /var/www/nginx-dev/:/usr/share/nginx/
- /etc/nginx/nginx-dev/:/etc/nginx/
links:
- php-dev
php-pro:
container_name: php-pro
image: php:7.2-fpm-alpine3.7
build:
context: .
dockerfile: Dockerfile_PHP
labels:
- traefik.docker.network=proxy
- "traefik.port=9000"
networks:
- internal
- proxy
volumes:
- /var/www/nginx-pro/:/usr/share/nginx/
php-dev:
image: php:7.2-fpm-alpine3.7
container_name: php-dev
build:
context: .
dockerfile: Dockerfile_PHP
labels:
- traefik.docker.network=proxy
- "traefik.port=9001"
ports:
- 9001:9000
networks:
- internal
- proxy
volumes:
- /var/www/nginx-dev/:/usr/share/nginx/
这是我的 php 站点配置文件:
server {
listen 80;
server_name trombi.xxx.xyz www.trombi.xxx.xyz;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/trombi.xxx.xyz;
index index.html index.htm index.php;
try_files $uri $uri/ /index.php$is_args$args;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~* \.PHP$ {
fastcgi_index index.php;
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/trombi.xxx.xyz/$fastcgi_script_name;
}
}
日志中出现此错误:
2018/05/17 06:59:47 [error] 8#8: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.19.0.5, server: trombi.xxx.xyz, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://172.20.0.4:9000", host: "trombi.xxx.xyz"
172.19.0.5 -
- [17/May/2018:06:59:47 +0000] "GET /info.php HTTP/1.1" 404 47 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 OPR/52.0.2871.97"
谢谢你的帮助:)我找不到它的来源...
UDPATE:感谢@Constantin Galbenu
只需更改 nginx conf:
fastcgi_pass php:9000;
至:
fastcgi_pass php-dev:9000;
在 docker-compose 中,可以通过名称访问服务。 Docker会自动解析服务的IP地址(不需要使用IP地址)。
在您的例子中,PHP
服务的名称是 php-dev
而不仅仅是 php
。
解决办法是把fastcgi_pass php:9000;
换成fastcgi_pass php-dev:9000;
我有这样的配置: - 1 Nginx(开发)docker + 1 Php(开发)docker - 1 个 Nginx(产品)docker + 1 Php(专业)docker
我使用 traefik 和 docker-compose。 问题是我无法将 dev php docker 连接到 dev nginx docker... 我有 "File not found." 错误。说明nginx找不到fastcgi配置
这是我的 docker-撰写:
version: '3'
networks:
proxy:
external: true
internal:
external: false
services:
mysql:
image: 'mysql:5.7'
environment:
MYSQL_ROOT_PASSWORD: null
ports:
- "3306:3306"
networks:
- internal
labels:
- traefik.enable=false
portainer:
image: portainer/portainer
networks:
- internal
- proxy
labels:
- "traefik.frontend.rule=Host:portainer.xxx.xyz"
- "traefik.port=9000"
- "traefik.backend=portainer"
- traefik.docker.network=proxy
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
restart: unless-stopped
Nginx-Pro:
image: nginx:alpine
build:
context: .
dockerfile: Dockerfile_Nginx
container_name: Nginx-Pro
labels:
- traefik.backend=Nginx-Pro
- traefik.frontend.rule=Host:xxx.fr,www.xxx.fr, yyy.fr, www.yyy.fr
- traefik.docker.network=proxy
- traefik.frontend.passHostHeader=true
- "traefik.port=80"
- "traefik.frontend.entryPoints=http,https"
networks:
- internal
- proxy
depends_on:
- mysql
volumes:
- /var/www/nginx-pro/:/usr/share/nginx/
- /etc/nginx/nginx-pro/:/etc/nginx/
links:
- php-pro
Nginx-Dev:
image: nginx:alpine
build:
context: .
dockerfile: Dockerfile_Nginx
container_name: Nginx-Dev
labels:
- traefik.backend=Nginx-Dev
- traefik.frontend.rule=Host:trombi.xxx.xyz
- traefik.docker.network=proxy
- traefik.frontend.passHostHeader=true
- "traefik.port=80"
- "traefik.frontend.entryPoints=http,https"
networks:
- internal
- proxy
depends_on:
- mysql
volumes:
- /var/www/nginx-dev/:/usr/share/nginx/
- /etc/nginx/nginx-dev/:/etc/nginx/
links:
- php-dev
php-pro:
container_name: php-pro
image: php:7.2-fpm-alpine3.7
build:
context: .
dockerfile: Dockerfile_PHP
labels:
- traefik.docker.network=proxy
- "traefik.port=9000"
networks:
- internal
- proxy
volumes:
- /var/www/nginx-pro/:/usr/share/nginx/
php-dev:
image: php:7.2-fpm-alpine3.7
container_name: php-dev
build:
context: .
dockerfile: Dockerfile_PHP
labels:
- traefik.docker.network=proxy
- "traefik.port=9001"
ports:
- 9001:9000
networks:
- internal
- proxy
volumes:
- /var/www/nginx-dev/:/usr/share/nginx/
这是我的 php 站点配置文件:
server {
listen 80;
server_name trombi.xxx.xyz www.trombi.xxx.xyz;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/trombi.xxx.xyz;
index index.html index.htm index.php;
try_files $uri $uri/ /index.php$is_args$args;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~* \.PHP$ {
fastcgi_index index.php;
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/trombi.xxx.xyz/$fastcgi_script_name;
}
}
日志中出现此错误:
2018/05/17 06:59:47 [error] 8#8: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.19.0.5, server: trombi.xxx.xyz, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://172.20.0.4:9000", host: "trombi.xxx.xyz"
172.19.0.5 -
- [17/May/2018:06:59:47 +0000] "GET /info.php HTTP/1.1" 404 47 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 OPR/52.0.2871.97"
谢谢你的帮助:)我找不到它的来源...
UDPATE:感谢@Constantin Galbenu 只需更改 nginx conf:
fastcgi_pass php:9000;
至:
fastcgi_pass php-dev:9000;
在 docker-compose 中,可以通过名称访问服务。 Docker会自动解析服务的IP地址(不需要使用IP地址)。
在您的例子中,PHP
服务的名称是 php-dev
而不仅仅是 php
。
解决办法是把fastcgi_pass php:9000;
换成fastcgi_pass php-dev:9000;