見出し画像

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コンテナにバインドするのが良いと思いますが、手元のソースコードではそれらが混在しているため横着してどちらのコンテナにも同じソースコードディレクトリをバインドしました。



この記事が気に入ったらサポートをしてみませんか?