mattintosh note

どこかのエンジニアモドキの備忘録

PHP-FPM 環境で .htaccess に php_value は書ける?

「.htacess に php_value を書くとエラーになる」という事象があったのでちょっと調べた。

エラーはこんな感じ。

/var/www/html/.htaccess: Invalid command 'php_value', perhaps misspelled or defined by a module not included in the server configuration

Apache モジュール版の PHP を使っている場合は問題ないんだけど PHP-FPM で動かしているときは .htaccessphp_value が使えないっぽい。とりあえず AWS Amazon Linux 2 では amazon-linux-extrasPHP 7.3 をインストールするとデフォルトで PHP-FPM になる。

で、Qiita に代替え手段を書いている人がいたんだけど

.htaccess

SetEnv PHP_VALUE "post_max_size = 16M"
SetEnv PHP_VALUE "upload_max_filesize = 8M"

のように書いても PHP_VALUE という環境変数はひとつしか設定出来ないので post_max_sizeupload_max_filesize によって上書きされてしまう。

で、裏技っぽいものを思いついて、パラメータの間に CR を挟んで「Apache には一行として認識させ、PHP には複数行として認識させる」という方法を使ったところ複数の値を設定することが出来た。

.htaccess

SetEnv PHP_VALUE "post_max_size = 16M^Mupload_max_filesize = 8M"

が、こんなアホっぽいことやってられるかとなった。

なので .htaccessSetEnv PHP_VALUE で設定するという方法は恐らく間違いなんだろうなと思って PHP のパラメータを見ていたら user_ini.filename というものがちゃんとある。

詳細はドキュメントを読んでもらえればわかるのだけど、PHP ファイルが置いてある場所からドキュメントルートまで辿って .user.ini を探してくれる(PHP ファイルが置いてある場所がドキュメントルート配下外であればそのディレクトリをスキャンする)。

ということで下記のようなファイルを作成すれば .htaccessphp_value を書く必要は無い。

/var/www/html/.user.ini

post_max_size = 16M
upload_max_filesize = 8M

.htaccess に記述する場合と異なり、user_ini には user_ini.cache_ttl というパラメータが用意されていてこの値で読込頻度を決定している。デフォルトは 300 秒(5 分)なので .user.ini を書き換えても反映まで最長で 5 分待つ必要がある。PHP-FPM を再起動してしまえば即時反映なのだがそれなら php.ini で設定すればいいのではという考えもある。しかし、.user.ini はアプリケーションエンジニアでも書き換えが出来るし、頻繁に設定を変えるものでもないのでアプリケーションエンジニアに任せたほうがいいだろう。(たったこれだけのためにインフラエンジニアが呼び出されても困る)

なお、Amazon Linux 2 の PHP では /etc/httpd/conf.d/php.conf 内で .user.ini へのアクセスを拒否するように設定されているので .user.ini にアクセスしても 403 となる。

Amazon Linux 2: /etc/httpd/conf.d/php.conf

<Files ".user.ini">
    Require all denied
</Files>

もちろん .user.ini のように不可視なドットファイルではなく php.ini のような可視ファイルに変更することも出来るけど、上記のアクセス制御も変更する必要が出てくるので user_ini.filename の変更には気を使ったほうが良さそう。