Apache + php-fpmで開発環境をつくる
長らくvagrant + VirtualBoxで構築していたローカル開発環境をDockerコンテナ化しようと試行錯誤していたところ、基本的なところで躓きました。
「どこにphpファイルを置けばいいか分からない」
Dockerイメージはphp:7-fpmを使っていて、この中には/var/www/htmlというそれっぽいディレクトリがあるので、最初はここに置いていました。
しかしブラウザからアクセスすると404でファイルが見つかりません。
httpd_1 | [Tue May 05 18:47:08.666369 2020] [proxy_fcgi:error] [pid 9:tid 140242887010048] [client 172.20.0.1:57380] AH01071: Got error 'Primary script unknown'
php_1 | 172.20.0.3 - 05/May/2020:18:47:08 +0000 "GET /info.php" 404
httpd_1 | 172.20.0.1 - - [05/May/2020:18:47:08 +0000] "GET /a.php HTTP/1.1" 404 16
結論から言うと、ApacheのDocumentRootに合わせればOKでした。
今回は/usr/local/apache2/htdocsだったので、PHP側のコンテナにも同じディレクトリを用意して、その下にinfo.phpを配置したところ期待通りに動作しました。
ファイル一式はこちらです。
https://github.com/yayyama/docker-apache-php-fpm
docker-compose.yaml
version: "3.7"
services:
httpd:
build:
context: ./services/httpd
ports:
- "80:80"
volumes:
- type: bind
source: ./public
target: /usr/local/apache2/htdocs
depends_on:
- php
php:
build:
context: ./services/php
volumes:
- type: bind
source: ./public
target: /usr/local/apache2/htdocs
Apache設定の補足
ApacheのDockerイメージはhttpd:2.4を使用しました。
php-fpmを使用するためにhttpd.confを編集しますが、既存のhttpd.confを取り出して、それを編集します。
docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > httpd.conf-default
コメントアウトされている次の行を有効にします。
LoadModule proxy_module modules/mod_proxy.so
...
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
<Directory "/usr/local/apache2/htdocs">内に次の記述を追加します。
ここでphp:9000としているのはPHP側コンテナのサービス名をphpにしているためです。
<FilesMatch \.php$>
SetHandler "proxy:fcgi://php:9000"
</FilesMatch>
ソースコードディレクトリのマウント
今回は開発環境なので、ソースコードディレクトリはコンテナ内に取り込まず、ホスト側のディレクトリをバインドしています。
本来はstaticなファイルとPHPのファイルをきちんと分けて、前者はWebサーバ、後者はPHPコンテナにバインドするのが良いと思いますが、手元のソースコードではそれらが混在しているため横着してどちらのコンテナにも同じソースコードディレクトリをバインドしました。
この記事が気に入ったらサポートをしてみませんか?