Docker-Compose 使用 PHP 和 Nginx 不适用于生产环境

问题描述 投票:0回答:2

我在 docker-compose 中有一个非常简单的配置,其中包含

php:7-fpm
nginx
,我想用它来托管简单的 php 网站。但我在将其投入生产时遇到了问题。

有人可以告诉我我做错了什么吗?

这里是 docker-compose.prod.yml:

version: '3.8'
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ../company/site:/code

      - ./site.prod.conf:/etc/nginx/conf.d/default.conf

  php:
    image: php:7-fpm
    volumes:
      - ../company/site:/code

这是 site.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 
php docker nginx docker-compose
2个回答
5
投票
  1. 您需要公开 PHP 容器的 TCP 端口 9000,以使其他容器能够使用它(请参阅docker-compose 端口与公开端口有何区别):
  php:
    image: php:7-fpm
    expose:
      - "9000"
    ...
  1. 您真的希望您的站点在 TCP 端口 8080 而不是标准端口 80 上可用吗?如果不是,请将
    "8080:80"
    更改为
    "80:80"
  2. 除了 PHP 处理程序之外,请使用默认位置(尽管即使没有它,您的站点也应该可以工作,但不将其添加到 nginx 配置中是一个不好的做法):
location / {}

3
投票

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

这些问题可能会发生:

  1. 缺少 php 模块
  2. 用户/权限不正确。您的 nginx 和 php-fpm 配置中是否定义了 www-data ?
  3. 使用 HTTPS 和端口 443,而不是 HTTP 和端口 80。HTTP 可能会被您的浏览器阻止。您可以使用 Let's Encrypt Docker 镜像定义免费的 SSL 证书。
  4. PHP 7.0 自 2019 年 1 月 10 日起 EOL(结束或寿命)。请使用 PHP 8.0 或 PHP 8.1。 https://endoflife.date/php
  5. 请勿在生产环境中使用标签 nginx:latest。更新容器时可能会遇到严重问题,因为将下载最新版本。
  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-compose.prod.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
(或 docker-compose.prod.yml 文件中
build
下编写的目录架构。)

在 php-fpm 目录中,请添加这个名为

Dockerfile

的 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
© www.soinside.com 2019 - 2024. All rights reserved.