Scribble at 2023-09-19 10:10:57 Last modified: 2023-09-22 09:52:53

SAKURA インターネットのクラウドから、当社のコーポレート・サイトなど幾つかのサイトを AWS へ移設している。大半が静的なコンテンツとなっている LP 専用のサイトとか、クライアントから金すらもらわずに「サービス」で運営しているステージングなんかは、さっさと動かしてしまったのだけれど、コーポレート・サイトや弊部の専用サイトなどはフォームがあるので、今週中の予定で挙動を確認しながらの移設となる。もちろん、コンテンツを動かすのは大して時間のかかる話ではなく、既に AWS で揃えてある。

というわけで挙動を確認しているところなのだが、試しに DNS で A レコードを EC2 の Elastic IP に変更してみると・・・これまた古典的な問題が起きる。HTML ファイルをダウンロードしてしまうのだ。もちろん、この問題は殆どサーバ・エンジニアなり PHP のプログラミングを始めた頃からの付き合いなので、慣れてしまっているとはいえ、やはり実際に起きると忌々しいものである。そして、なんで僕らのようなベテランが作業しても起きるのかと言えば、表面的には同じ問題だが原因が違うからだ。特に、今回から Amazon Linux 2023 という Fedora ベースの新しい OS イメージを使っていて、PHP も 8.2 だから実質は CGI である(php-fpm)。つまり、httpd とは別の子プロセスとして稼働しているので、従来のように AddType がないとか、そういう既知の対策とは別の対策が必要になることもある。実際、AddType なんて設定するのが当たり前になっているため、これが virtual.conf や .htaccess に欠落しているなんてことはない。

さっそくエラー・ログを見ると、"AH01071: Got error 'Primary script unknown'" というわけである。PHP で処理できていないのだから、よくわからないものとして UA にダウンロードさせることになる。僕は、Apache の仕様として「処理方法が分からなければコンテンツを UA に向かって吐き出す」というのがディフォールトの挙動になっている理由が分からないのだが(こんなのソース・コードを渡すことになるのだから、危険に決まってる)、ともかくそういう仕様なので仕方がない。

さてしかし、困ったことに複数あるサイトの一部だけにこういう問題が起きる。

/var/www/www.somedomain.com/public_html/index.php

こんな具合に PHP ファイルを直に置いてアクセスすると動く。でも、これを HTML ファイルに書くと、ページをダウンロードしてしまう。かといって AddType などは書いてある。

こういう場合、初めて使う OS ではあるから、公式の Amazon Linux 2023 のドキュメントを調べてみるとよいだろう。ということで色々調べていると、

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2023.html

というページが見つかった。なるほど、ディレクトリのパーミションの問題という可能性がある。いまは全ての VirtualHost を ec2-user:root の所有権でディレクトリを作成しているため、これがいけないという可能性がある。実際、グループを apache にしてみたら、HTML ファイルでも PHP のコードがちゃんと動いている。

・・・が、やはり一部のサイトだけ HTLM どころか PHP ファイルですらダウンロードになってしまう。VirtualHost の設定内容は、ほぼ FQDN くらいしか違わないのに、どうしてこんな挙動になるのか。しかも、おかしな挙動のサイトは、いわゆる trailing slash ですらサイトにアクセスできない。ふつう、ここまでの異常があると、たとえば目的のパスにディレクトリが存在しない(どこかでスペル・ミスしてる)といった仕様とは関係のないところに原因があるのだけれど、そういうところは全て丁寧に確認してある。これは、ちょっと手間がかかりそうだ。特に、このサイトは普段は使っていないのだけれど、今年だけ取引先企業からインボイス番号を申請してもらうフォームを設けてあるので、とりあえず動かしておかないといけない。

[追記:2023-09-22] もちろん、php-fpm の運用について幾つか基本的な情報は押さえてあって、たとえば /etc/php-fpm.d/www.conf というファイルの "security.limit_extensions" というディレクティブに .html を追加したり、/etc/httpd/conf.d/php.conf の <FilesMatch> ディレクティブに html の拡張子を追加したりとやってはいるが、やはり HTML に埋め込んだ PHP のコードを php-fpm が認識しないので、ソースがそのまま出てしまう。ちなみに、ファイルがダウンロードされてしまう理由は、これまでの DSO 版のように AddType のディレクティブが幾つかの設定ファイルに残ってしまっていたからだ。AddHandler は無害だが、AddType で "application/x-httpd-php .php .html" なんてことをやると、ファイルのダウンロードになってしまう。

  1. もっと新しいノート <<
  2. >> もっと古いノート

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Twitter Facebook