Quantcast
Channel: mattintosh note
Viewing all articles
Browse latest Browse all 891

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

$
0
0

「.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が使えないっぽい。とりあえず AWSAmazonLinux 2 では amazon-linux-extrasPHP 7.3 をインストールするとデフォルトで PHP-FPM になる。

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

.htaccess

SetEnvPHP_VALUE"post_max_size = 16M"SetEnvPHP_VALUE"upload_max_filesize = 8M"

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

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

.htaccess

SetEnvPHP_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 はアプリケーションエンジニアでも書き換えが出来るし、頻繁に設定を変えるものでもないのでアプリケーションエンジニアに任せたほうがいいだろう。(たったこれだけのためにインフラエンジニアが呼び出されても困る)

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

AmazonLinux 2: /etc/httpd/conf.d/php.conf

<Files".user.ini">Requireall denied
</Files>

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


Viewing all articles
Browse latest Browse all 891

Trending Articles