#
ドキュメント

Document

自分のための備忘録です。

DockerでPHP 7.27、ApacheでSymfony アプリをホスト

前提

AWS AppRunnerは2022-01-07現在複数コンテナのオーケストレーション機能がない。 そのためphp:7.4.27-apacheを使用する。

Apache設定

全体

ドキュメントルートは/var/www/html/publicにする

Apache設定手順

  1. 000-default.confDocumentRoot /var/www/html/publicを追加
  2. .htaccessを使用するために、/etc/apache2/apache2.conf/var/www/html/publicAllowOverrideディレクトティブにAllを設定
  3. Dockerfileにa2enmod rewriteを追記
  4. .htaccess/var/www/html/publicに作成

000-default.confにDocumentRoot /var/www/html/publicを追加

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
+	DocumentRoot /var/www/html/public

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

AllowOverrideディレクトティブにAllを指定

AllowOverride All.htaccessで上書きを有効にするディレクティブなので、 親ディレクトリで有効なものみ.htaccessに記載する場合は当該ディレクトリの設定は必要ない。

※ 該当ディレクトリにAllowOverride Allが設定されているディレクトリのみ.htaccessを使用できると勘違いしていたが、
.htaccessAllowOverride Allが設定されていないディレクトリでも使用できる。

AllowOverride Allはあくまで.htaccessでの上書きを許可するかを設定するもの

以下は必要なかった。

+ <Directory /var/www/html/public>
+	Options Indexes FollowSymLinks
+	AllowOverride All
+	Require all granted
+ </Directory>

Dockerfileにa2enmod rewriteを追記

FROM php:7.4.27-apache

EXPOSE 80

COPY .docker/php-httpd/000-default.conf /etc/apache2/sites-available/000-default.conf 
COPY .docker/php-httpd/apache2.conf /etc/apache2/apache2.conf

COPY ./ ./

RUN a2enmod rewrite
RUN chown -R www-data:www-data /var/www/html

.htaccessを/var/www/html/publicに作成

# .htaccess
# @see https://gist.github.com/Guibzs/a3e0b3ea4eb00c246cda66994defd8a4
<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>
        RedirectMatch 302 ^/$ /index.php/
    </IfModule>
</IfModule>

Appendix

起動中のコンテナ内のファイルをコピーするにはdocker cpを使用する。

docker cp

コンテナが稼働している最中にコンテナ内のファイルをローカルにコピーする。
またはその逆。

ref. http://docs.docker.jp/v19.03/engine/reference/commandline/cp.html

# コンテナ内の/path/to/sourceをローカルの./path/to/destinationにコピー
$ docker cp コンテナID:/path/to/container ./path/to/local
// 例
docker cp symfony-micro-app:/etc/apache2/sites-available/000-default.conf ./000-default.conf

モジュール

  • 組み込みモジュール
  • 動的モジュール
# 組み込みモジュールを確認
$ apachectl -l
Compiled in modules:
  core.c
  mod_so.c  <=== これが表示されれば動的モジュールを利用できる
  mod_watchdog.c
  http_core.c
  mod_log_config.c
  mod_logio.c
  mod_version.c
  mod_unixd.c