我在 docker-compose 中有一個非常簡單的配置php:7-fpm,nginx我想用它來托管簡單的 php 網站。
有人可以告訴我我做錯了什么嗎?
這是 docker-compose.prod.yml:
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
這是 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
uj5u.com熱心網友回復:
- 您需要公開 PHP 容器的 TCP 埠 9000 以使其他容器能夠使用它(請參閱What is the difference between docker-compose ports vs expose):
php:
image: php:7-fpm
expose:
- "9000"
...
- 您真的希望您的站點在 TCP 埠 8080 上可用,而不是標準埠 80?如果沒有,請更改
"8080:80"為"80:80". - 除了 PHP 處理程式,使用默認位置(盡管您的站點即使沒有它也應該可以作業,但不將其添加到您的 nginx 配置中是一種不好的做法):
location / {
try_files $uri $uri/ =404;
}
uj5u.com熱心網友回復:
您必須檢查日志以找出錯誤。https://docs.docker.com/engine/reference/commandline/logs/
這些問題可能會發生:
- 缺少一個 php 模塊
- 用戶/權限不正確。您的 nginx 和 php-fpm 配置中是否定義了 www-data ?
- 使用 HTTPS 和埠 443 而不是 HTTP 和埠 80。HTTP 可能會被您的瀏覽器阻止。您可以使用 Let's Encrypt Docker 映像定義免費的 SSL 證書。
- PHP 7.0 自 2019 年 1 月 10 日起 EOL(終止或生命)。請使用 PHP 8.0 或 PHP 8.1。https://endoflife.date/php
- 不要在生產中使用標簽 nginx:latest。更新容器時可能會遇到嚴重問題,因為將下載最新版本。
- 不要在生產環境中掛載目錄。請在 Dockerfile 中使用 COPY。
- 檢查服務器上的防火墻
這是 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或寫在builddocker-compose.prod.yml 檔案下的目錄架構。)
在 php-fpm 目錄中,請添加這個名為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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/498029.html
