当前位置: 首页 > 知识库问答 >
问题:

Docker Compose,PHP和Nginx不参与生产

傅恺
2023-03-14

我有一个非常简单的配置docker-complace与php: 7-fpmnginx我想用它来托管简单的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 

共有2个答案

王声
2023-03-14

您必须检查日志以找出错误。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映像定义免费的SSL证书。
  4. PHP 7.0自2019年1月10日起EOL(结束或生命周期)。请使用PHP 8.0或PHP 8.1。https://endoflife.date/php
  5. 不要在生产中使用标签nginx:最新。更新容器时可能会出现严重问题,因为将下载最后一个版本。
  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_passphp: 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

齐高寒
2023-03-14
  1. 您需要公开PHP容器的TCP端口9000,以使其他容器能够使用它(请参阅docker compose端口与expose端口之间的区别):
  php:
    image: php:7-fpm
    expose:
      - "9000"
    ...
location / {
    try_files $uri $uri/ =404;
}
 类似资料:
  • 我在nginxweb服务器上,我想删除来自url的扩展。 我目前有以下会议: 如果试图遵循一些类似的案例说明,但似乎没有任何工作与我的conf。 问题是这段代码 在两种情况下运行良好: 客户要求https://mywebsite.com/page.php:好的 客户要求https://mywebsite.com/page:好的 不重写url! 如果客户端试图访问具有文件扩展名的页面,我需要告诉NG

  • 我在使用nginx1.19版本。并在我的linux服务器上安装了PHP5-FPM。我的nginx php配置如下: 在我将nginx更新到1.6版之后。2和升级linux,我的php文件不工作。php请求返回白色页面,没有错误。 (在我的/var/run文件夹中找不到php-fpm.sock) 如何重新启动PHP?

  • 为了版本控制和安全,我想将两个Dockerfile合并为一个,然后为. sock=创建一个目录 第一个Dockerfile一半 第二个Dockerfiel代码是这个PHP代码的一半,相应的文件比这个代码高一级。我不会公开9000端口并注释掉CMD。所有这些都通过supervisord进行管理。 我在docker compose的帮助下构建了它 当我这样运行它时,设置php和nginx conf来使

  • 我有一台本地haproxy服务器(10.10.1.18),用于loadbalance 2台nginx本地Web服务器(web1=10.10.1.21,web2=10.10.1.22)。 我可以达到本地IP的web服务器到index.php文件成功http://10.10.1.21/http://10.10.1.22/ 但是,当我指向haproxy的本地ip时http://10.10.1.18/,它

  • 我花了几个小时在这个问题上,尽管相关帖子很多,但我无法解决它。我有一个Fedora 20盒与Nginx PHP-FPM,直到今天工作得很好(在我重新加载php-fpm.service我猜)。Nginx提供的静态文件没有问题,但是任何PHP文件都会触发错误403。 权限正常,nginx和php fpm在用户“nginx”下运行: 服务的文件也被设置为nginx用户,我甚至结束了chmoding 77

  • 问题内容: 我有一个特殊的URI方案,这给我带来了麻烦。我需要运行nodejs来提供以下服务: 我有这项工作没有问题,可以用来提供子域。但是,一旦URI类似于以下内容,我就需要提供静态内容和php: 这是我服务器上的某个目录。从该url下来的所有内容(例如)都将像您的典型目录方案一样工作。通常,我会将典型的proxy_pass传递给在某个端口上运行的节点,但是正如您在此处看到的那样,我需要node