我在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
2条答案
按热度按时间zwghvu4y1#
1.您需要公开PHP容器的TCP端口9000,以使其他容器能够使用它(参见What is the difference between docker-compose ports vs expose):
1.您真的希望您的站点在TCP端口8080而不是标准端口80上可用吗?如果不是,请将
"8080:80"
更改为"80:80"
。1.除了PHP处理程序之外,使用默认位置(尽管您的网站即使没有它也应该可以工作,但不将其添加到nginx配置中是一个不好的做法):
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.不要在生产环境中使用标签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
在这个docker-compose.prod.yml文件所在的目录下,创建一个php-fpm目录:
mkdir php-fpm
(或在docker-compose.prod.yml文件中的build
下编写的目录架构。)在php-fpm目录下,请添加这个名为
Dockerfile
的Dockerfile当然,添加项目所需的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
替换为容器名称。当然,容器名称必须是唯一的。然后,建立您的设置