我在 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:
image: php:7-fpm
expose:
- "9000"
...
"8080:80"
更改为 "80:80"
。location / {}
您必须检查日志以找出错误。 https://docs.docker.com/engine/reference/commandline/logs/
这些问题可能会发生:
这里是 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