Docker-Compose with PHP and Nginx not working on production

yfwxisqw  于 2023-06-20  发布在  PHP
关注(0)|答案(2)|浏览(139)

我在docker-compose中使用php:7-fpmnginx进行了一个非常简单的配置,我想用它来托管简单的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
zwghvu4y

zwghvu4y1#

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"
1.除了PHP处理程序之外,使用默认位置(尽管您的网站即使没有它也应该可以工作,但不将其添加到nginx配置中是一个不好的做法):

location / {
    try_files $uri $uri/ =404;
}
q8l4jmvw

q8l4jmvw2#

您必须检查日志以找出错误。https://docs.docker.com/engine/reference/commandline/logs/
这些问题可能会发生:
1.缺少一个PHP模块
1.用户/权限不正确。你的nginx和php-fpm配置中定义了www-data吗?
1.使用HTTPS和端口443,而不是HTTP和端口80。HTTP可能被您的浏览器阻止。您可以使用Let's Encrypt Docker镜像定义免费的SSL证书。

  1. PHP 7.0自2019年1月10日起终止(end or life)。请使用PHP 8.0或PHP 8.1。https://endoflife.date/php
    1.不要在生产环境中使用标签nginx:latest。更新容器时可能会遇到严重问题,因为将下载最新版本。
    1.不要在生产上装载目录。请在Dockerfile中使用COPY。
    1.检查服务器上的防火墙
    以下是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

相关问题