【问题标题】:how to setup a single nginx server with multiple php-fpm docker containers如何使用多个 php-fpm docker 容器设置单个 nginx 服务器
【发布时间】:2020-09-30 12:05:46
【问题描述】:

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

site.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-available/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 'code-network' 在docker-compose up -d 上被重命名为 appname-code-network

【问题讨论】:

    标签: php docker nginx


    【解决方案1】:

    想通了。

    在 nginx 服务器配置中,root 是服务器主机上代码的位置,即 /home/user/CODE/site

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

    fastcgi_param SCRIPT_FILENAME /app$fastcgi_script_name;
    

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

    fastcgi_pass 172.21.0.2:9000;
    

    由主机名 -I 发现,在容器上使用 bash 时。

    我还没有发现如何改用容器主机名

    【讨论】:

    • 嗨。感谢分享解决方案。您对fastcgi_param 的评论对我帮助很大。我想我也可以重播你:) 在 docker-compose 中使用container_name: your-name。然后,您可以使用它而不是 IP 来获取fastcgi_pass。希望对您有所帮助!
    【解决方案2】:

    要代理多个 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 设置(版本等)。

    希望它有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-10
      • 2021-02-23
      • 2018-07-17
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2012-12-23
      相关资源
      最近更新 更多