如何使用多个php-fpm-doker容器设置单个nginx服务器



Nginx正在我的服务器上运行(不是docker映像(,以将子域请求代理到我的docker容器。

每个图像都有一个额外的nginx容器,效果如下:

docker-compose.yml

version: '2'
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
volumes:
- .:/app
- ./site.conf:/etc/nginx/conf.d/default.conf
networks:
- code-network
php:
image: php:fpm
volumes:
- .:/app
networks:
- code-network
networks:
code-network:
driver: bridge

站点.conf

server {
listen 80;
index index.php index.html;
server_name localhost;
error_log  /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /app;
location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}

/etc/nginx/sites/dev.domain.co.uk

server {
listen 80;
listen [::]:80;
server_name dev.domain.co.uk;
location / {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}

但是为每个php站点增加一个nginx实例似乎很浪费。

如何将nginx的服务器实例直接路由到每个php:fpm容器?

注意:docker"代码网络"在docker-compose up -d上被重命名为appname代码网络

想明白了。

在nginx-server conf中,根是服务器主机上代码的位置,即/home/user/code/site

fastcgi_param是代码在Docker容器上的位置,(/app(如Docker-compose.yml 中所定义

fastcgi_param SCRIPT_FILENAME /app$fastcgi_script_name;

您还需要将ip:传递给docker容器主机

fastcgi_pass 172.21.0.2:9000;

正如hostname-I在容器上使用bash时发现的那样。

我还没有发现如何使用容器主机名来代替

要代理多个php fpm docker实例,需要为每个php实例提供一个唯一的别名,然后在服务器配置中引用该别名。

例如:

在docker-compose.yml文件中(请参阅"别名"部分中的php1(:

php:
image: php:fpm
volumes:
- .:/app
networks:
code-network:
aliases:
- php1

然后在site.conf中使用fastcgi_pass php1:9000;参见php1

为每个php容器实例提供一个唯一的别名,可以使用单个nginx容器在同一主机上运行不同的php设置(版本等(。

希望它有意义。

最新更新