代码之家  ›  专栏  ›  技术社区  ›  ViaTech

Docker Compose,PHP和Nginx不参与生产

  •  0
  • ViaTech  · 技术社区  · 2 年前

    我在docker compose中有一个非常简单的配置 php:7-fpm nginx 我想用它来托管简单的php网站。

    谁能告诉我我做错了什么吗?

    这是docker compose。产品名称:

    version: '3.8'
    services:
      web:
        image: nginx:latest
        ports:
          - "8080:80"
        volumes:
          - ../nurock/hidden_creste:/code
    
          - ./site.prod.conf:/etc/nginx/conf.d/default.conf
    
      php:
        image: php:7-fpm
        volumes:
          - ../nurock/hidden_creste:/code
    
    

    这是网站。prod.conf文件:

    server {
        listen 80;
        index index.php index.html;
        server_name example.com;
        error_log  /var/log/nginx/error.log;
        access_log /var/log/nginx/access.log;
        root /code;
    
        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;
            }
    }
    
    

    我可以编写日志,日志看起来很好,当我运行docker ps时:

    docker ps
    CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                   NAMES
    c268a9cf4716   php:7-fpm      "docker-php-entrypoi…"   27 minutes ago   Up 16 seconds   9000/tcp                                example_code-php-1
    beaaec39209b   nginx:latest   "/docker-entrypoint.…"   27 minutes ago   Up 16 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   example_code-web-1
    
    

    然后检查端口,我认为这看起来很好:

    netstat -tulpn | grep :80
    tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      204195/docker-proxy 
    tcp6       0      0 :::8080                 :::*                    LISTEN      204207/docker-proxy 
    
    1 回复  |  直到 2 年前
        1
  •  2
  •   Ivan Shatsky    2 年前
    1. 您需要公开PHP容器的TCP端口9000,以使其他容器能够使用它(请参阅) What is the difference between docker-compose ports vs expose ):
      php:
        image: php:7-fpm
        expose:
          - "9000"
        ...
    
    1. 你真的希望你的站点在TCP端口8080上可用,而不是在标准端口80上吗?如果没有,请更改 "8080:80" "80:80" .
    2. 除了PHP处理程序之外,还可以使用默认位置(虽然即使没有它,您的站点也应该可以运行,但不将其添加到nginx配置中是一种糟糕的做法):
    location / {
        try_files $uri $uri/ =404;
    }
    
        2
  •  1
  •   dezaley    2 年前

    您必须检查日志以找出错误。 https://docs.docker.com/engine/reference/commandline/logs/

    这些问题可能会发生:

    1. php模块缺失
    2. 用户/权限不正确。您的nginx和php fpm配置中是否定义了www数据?
    3. 使用HTTPS和端口443,而不是HTTP和端口80。您的浏览器可能会阻止HTTP。您可以使用Let’s Encrypt Docker image定义一个免费的SSL证书。
    4. PHP 7.0自2019年1月10日起为EOL(结束或终止)。请使用PHP 8.0或PHP 8.1。 https://endoflife.date/php
    5. 不要使用标签nginx:latest on production。更新容器时可能会出现严重问题,因为将下载最新版本。
    6. 不要在生产上装载目录。请在Dockerfile中使用COPY。
    7. 检查服务器上的防火墙

    以下是Docker Docker最佳实践: https://docs.docker.com/develop/dev-best-practices/

    https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

    在这里,我建议这个docker撰写。产品yml

    version: '3.8'
    services:
      web:
        image: nginx:1.21
        depends_on:
          - my-php-container-name
        container_name: my-nginx-container-name
        working_dir: /code
        ports:
            - '80:80'
            - '443:443'
        volumes:
          - ../nurock/hidden_creste:/code
          - ./site.prod.conf:/etc/nginx/conf.d/default.conf
        restart: always
    
      php:
        build: php-fpm
        container_name: my-php-container-name
        working_dir: /code
        volumes:
          - ../nurock/hidden_creste:/code
        restart: always
    

    在与此docker compose相同的目录中。prod.yml文件,创建php fpm目录: mkdir php-fpm (或目录架构写在 build 在docker compose中。prod.yml文件。)

    在php fpm目录中,请添加名为 Dockerfile

    FROM php:8.1-fpm
    COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
    WORKDIR "/code"
    RUN apt-get update && apt-get install -y --no-install-recommends \
            libfreetype6-dev \
            libjpeg62-turbo-dev \
            libpng-dev \
            libicu-dev
        && docker-php-ext-configure gd --with-freetype --with-jpeg \
        && docker-php-ext-install -j$(nproc) gd pdo_mysql bcmath mysqli intl
    

    当然,添加项目所需的PHP扩展。这里有一个如何安装gd、pdo_mysql、bcmatch、mysqli、intl的示例。但还有其他扩展,如curl、xml、xdebug、mcrypt、memcache等。。。 https://github.com/mlocati/docker-php-extension-installer

    在nginx配置中,应该使用端口443定义HTTPS的配置。请同时更新此行 fastcgi_pass php:9000; . 代替 php 按容器名称。当然,容器名称必须是唯一的。

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass my-php-container-name:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
            }
    

    然后,建立您的设置

    docker-compose -f docker-compose.prod.yml build && docker-compose -f docker-compose.prod.yml up