連載
» 2011年12月12日 00時00分 UPDATE

仕事で使える魔法のLAMP(34):PHPスクリプトを実行できるようにする準備

必要なエクステンションは前回までにほとんど組み込みました。今回は、PHPスクリプトを実行できるようにする方法を解説します(編集部)

[山口晴広,株式会社イメージズ・アンド・ワーズ]

Apache〜PHPのビルド手順を振り返る

 前回までで、よく使うPHPエクステンションを有効にしてPHPをビルドするという作業が終わりました。今後もし足りないエクステンションが出てきたら、前回までの内容を応用すればできるはずです。使わないことがはっきりしているエクステンションはビルド時に無効にするなど、自分流にアレンジしてください。

 今回からは、Apache HTTP Server(以下Apache)PHPを組み込んで使うことをテーマにして解説を進めます。その前に、ここまでの内容を復習しつつ、手順を整理しましょう。

 まずはApacheおよびPHPのビルド手順です。最初に、必要なライブラリのパッケージをインストールしておきます。1行目でインストールしているのがApacheとPHPの両方が利用しているライブラリで、2行目以降はすべてPHPから利用しているライブラリです。

$ sudo yum install zlib-devel openssl-devel db4-devel pcre-devel
$ sudo yum install libicu-devel gettext-devel
$ sudo yum install readline-devel libxml2-devel libxslt-devel
$ sudo yum install libjpeg-devel libpng-devel freetype-devel
$ sudo yum install libmcrypt-devel

 Apacheのconfigureスクリプトのコマンドラインは次のようになります。MPM(Multi Processing Module)はPHPで推奨されているpreforkを選択(第15回)、標準的なモジュールはすべてビルドし、さらにSSLモジュールを有効にしています(16回)。加えて、PCREはApache付属のものではなくOSのものを使い(第28回)、DBMにはBerkeley DBを選択しています(第19回)。

./configure \
  --prefix=/opt/apache-httpd-2.2.21 \
  --enable-mods-shared=all \
  --enable-ssl \
  --with-pcre \
  --with-mpm=prefork \
  --with-berkeley-db \
  2>&1 | tee configure_log.txt

 configureを実行したら、「make; sudo make install」でビルド、インストールします。Apacheのインストールが完了したら、PHPのconfigureを実行します。よく利用されるPHPエクステンションを有効にした結果、最終的には次のような長大なコマンドラインになりました。

./configure \
  --prefix=/opt/php-5.3.8 \
  --with-apxs2=/opt/apache-httpd-2.2.21/bin/apxs \
  --enable-mbstring \
  --enable-intl \
  --with-icu-dir=/usr \
  --with-gettext=/usr \
  --with-pcre-regex=/usr \
  --with-pcre-dir=/usr \
  --with-readline=/usr \
  --with-libxml-dir=/usr/bin/xml2-config \
  --enable-soap \
  --enable-wddx \
  --with-xmlrpc \
  --with-xsl=/usr \
  --with-mysql=mysqlnd \
  --with-mysqli=mysqlnd \
  --with-pdo-mysql=mysqlnd \
  --with-zlib=/usr \
  --with-zlib-dir=/usr \
  --enable-dba \
  --with-db4=/usr \
  --with-gd \
  --with-jpeg-dir=/usr \
  --with-png-dir=/usr \
  --with-freetype-dir=/usr \
  --enable-gd-native-ttf \
  --enable-gd-jis-conv \
  --with-openssl=/usr \
  --with-mcrypt=/usr \
  --enable-bcmath \
  2>&1 | tee configure_log.txt

 configure実行後はApacheと同様にビルド、インストールします。この状態で、第24回で解説したApacheの基本的な設定を済ませ、Apacheを起動できる状態にしておきます。無事Apacheが起動し、バーチャルホストやHTMLの公開がうまくできたら、次に進みましょう。

PHPのApacheモジュールを組み込み

 PHPはApache内で動作することで、ランタイムの起動や初期化に要する時間を抑えます。また、Webサーバに.phpファイルを置くだけで実行できるというのも特徴の1つです。これを実現するために、PHPの実行環境はApacheモジュールの形態でもビルド、インストールが必要です。

 いままでは、ビルドしたPHPの動作確認にコマンドライン版を使ってきました。コマンドライン版は「/opt/php-5.3.8」にインストールされましたが、Apacheモジュール版は、自動的にApacheのモジュールディレクトリにインストールされます。

$ ls -l /opt/apache-httpd-2.2.21/modules | grep php
-rwxr-xr-x 1 root     root  29623602 Dec  8 10:16 libphp5.so

 ということで、まずはこのモジュールをApacheに組み込むように設定しなければなりません。Apacheモジュールを組み込むApacheのディレクティブは「LoadModule」です。Apacheのインストールディレクトリにある「conf/httpd.conf」内に、「LoadModule」が並んでいるところがありますので、そこに付け加えます。

 ファイルを実際に開いてみると、次の行がすでにあることを確認できると思います。

LoadModule php5_module        modules/libphp5.so

 これはPHPのインストーラが自動的に追記したものです。前述の流れで普通にインストールしていれば、「LoadModule」の追加は意識しなくてもよいということになります。ただし、httpd.confを別のところ(例えばバックアップなど)から戻すような場合は、気を付けるようにしてください。

PHPのファイルであることをApacheに教える

 「LoadModule」設定だけではPHPは使えるようにはなりません。PHPスクリプトのファイルをApacheが認識できないと、ユーザーがアクセスしたときに、単にPHPスクリプトのファイルをそのままダウンロードさせてしまうことになります。

 いくつかの方法がありますが、よく使われるのは、.phpという拡張子のファイルがPHPスクリプトであると設定することです。そのための設定ディレクティブは次のようになります。

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>

 「FilesMatch」は第21回で解説したセクションになります。正規表現にマッチするファイルに対してのみ、セクション内部のディレクティブを設定します。「"\.php$"」という正規表現が、.phpという拡張子を示しています。そして「SetHandler」ディレクティブにより、PHPであることを設定しています。

 第24回の構成では、「/srv/httpd/www3026ub.sakura.ne.jp/apache.conf」がバーチャルホストの設定ファイルになっています。バーチャルホスト名の部分は、適宜、皆さんの環境で読み替えてください。この中の「Directory」ディレクティブ内に上記のディレクティブを記述します。最終的な内容は次のようになります。

ServerName www3026ub.sakura.ne.jp
 
CustomLog /srv/httpd/www3026ub.sakura.ne.jp/logs/access.log combined
 
LogLevel warn
ErrorLog /srv/httpd/www3026ub.sakura.ne.jp/logs/error.log
 
DocumentRoot "/srv/httpd/www3026ub.sakura.ne.jp/webspace/"
<Directory "/srv/httpd/www3026ub.sakura.ne.jp/webspace/">
    Options None
    AllowOverride None
    Order Allow,Deny
    Allow from all
 
    <FilesMatch "\.php$">
        SetHandler application/x-httpd-php
    </FilesMatch>
</Directory>

 これで「/srv/httpd/www3026ub.sakura.ne.jp/webspace/」ディレクトリ内に置いた、拡張子.phpのファイルがPHPスクリプトとしてApacheに認識されるようになったはずです。

 では、念のため設定ファイルのテストを実行しましょう。

$ sudo /opt/apache-httpd-2.2.21/bin/apachectl configtest
Syntax OK

 問題なければ、再起動して設定を有効にします。テストを実行するときに、末尾をgracefulと指定すると、接続中のユーザーがいるときは、そのApacheプロセスへの接続が終わり次第再起動します。そして、restartを指定するとユーザーからの接続を強制的に切断して再起動します。

$ sudo /opt/apache-httpd-2.2.21/bin/apachectl graceful

phpinfo()でテスト

 簡単なPHPスクリプトを設置して、実行してみましょう。これまで何度か確認のためにコマンドラインから使った、「phpinfo()」を実行してみることにします。

 「/srv/httpd/www3026ub.sakura.ne.jp/webspace/phpinfo.php」として、次の内容のファイルを作成します。

<?php
phpinfo();
?>

 次に、ブラウザで「http://www3026ub.sakura.ne.jp/phpinfo.php」にアクセスしてみます。図1のようなページが表示されたでしょうか。もし表示されず、作成したファイルの内容がそのまま表示された場合は、「FilesMatch」の設定に失敗しています。設定したバーチャルホストなどをよく確認してください。

図1 phpinfo()の出力をWebブラウザ経由で見たところ。クリックすると拡大 図1 phpinfo()の出力をWebブラウザ経由で見たところ。クリックすると拡大

 第31回で、コマンドラインでphpinfo()を実行する方法を解説しましたが、その方法に比べると、Webブラウザで確認できるこの方法は、出力が表形式になっているなど、だいぶ読みやすくなっています。「phpinfo()」の内容は、今後も設定の確認などで利用します。いつでも参照できるようにしておくのが良いでしょう。

 ただし、外部から、phpinfo()を実行できる状態にしておくのは良くありません。phpinfo()の表示内容が、攻撃のヒントになることもあり得るのです。オフィスなどであればオフィスのIPアドレスからのみ参照可能にするなどのアクセス制御をしておくのがよいでしょう。

拡張子.phpを使いたくない場合は?

 今回の設定は、拡張子.phpを使うものでした。シンプルで分かりやすいのですが、誰から見てもPHPで作られたWebアプリケーションであることが一目瞭然です。PHPスクリプトであるということが攻撃のヒントになることもあるので、拡張子.phpは使いたくないと考えることもあるでしょう。

 であれば、拡張子.htmlにPHPスクリプトを関連付けることもできます。ただし、単純にこう設定してしまうと、大きな範囲に影響が及ぶので、PHPスクリプトがあるディレクトリに対してのみ設定するのがよいでしょう。そのほかにも、Apacheが実行するPHPファイルは数個に限定しておき、URLを見て動作を切り替えるということもできます。このあたりの内容はどちらかといえばPHPプログラムの開発の範囲になるかもしれませんので、いずれ機会があれば解説します。

 次回は、Apache内のPHPの設定方法について解説します。

著者紹介

株式会社イメージズ・アンド・ワーズ
代表取締役
山口晴広(やまぐち はるひろ)



「仕事で使える魔法のLAMP」バックナンバー

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。