PHPの設定

PHPのインストール

先ずは以下のようにして必要なものをインストールしてやる。

$ sudo aptitude install php5 php5-cli php-pear

PHPのモジュールはインストール後に読み込まれている状態になっていたので、a2enmodで読み込む必要は無し。

PHPの設定

以下は設定を変更した部分のみピックアップ。
なお、セキュリティにも一応気を使った設定となっている。

$ sudo vi /etc/php5/apache2/php.ini

; PHPのバージョンを隠す
expose_php = Off

; ログに記録するレベルを指定
; E_STRICTはPHP5で推奨されていない関数が使用された場合などに警告を出す
error_reporting  =  E_ALL & ~E_NOTICE | E_STRICT

; エラーをHTMLで表示しないようにする
display_errors = Off

; phpのエラーをログに記録する
log_errors = On

; ログに記録するサイズを増やす(4KB)
log_errors_max_len = 4096

; 記録するログのファイルを指定(あとで作成)
error_log = /var/log/php/php_error_log

; $HTTP_*_VARS のような古くて長い変数は使用しないので
register_long_arrays = Off

; Webアプリケーションではargcやargvは不要なので
register_argc_argv = Off

; 確実にoffにしておく。PHP6.0.0で削除される機能
magic_quotes_gpc = Off

; デフォルトの文字コードを指定
default_charset = "UTF-8"

; require()やinclude()するファイルのディレクトリを指定
include_path = ".:/usr/share/php:/usr/share/pear"

; 動的モジュールのロードをオフにする
enable_dl = Off

; ファイルアップロードを使わない場合は確実にOffに
file_uploads = Off

; URIをファイルとして扱わないようにする
; これが有効だとインターネットのどこからでもコードを読み込んで実行できてしまう可能性がある
allow_url_fopen = Off

; JavaScriptでセッションIDを使用しない場合は1に
session.cookie_httponly = 1

; セッションIDを作成する際の外部リソースへのパスを指定。読み込むバイト数も指定しておく
session.entropy_length = 32
session.entropy_file = /dev/urandom

; SHA-1の指定に変更しておく
session.hash_function = 1

[mbstring]
; 言語環境を日本語に設定
mbstring.language = Japanese

; default_charsetと同じ文字コードを指定
mbstring.internal_encoding = UTF-8

以上で設定は完了となるので、PHPのエラーをログに記録する際に指定したファイルの作成をしてやる。

$ sudo mkdir /var/log/php
$ sudo touch /var/log/php/php_error_log
$ sudo chown -R www-data. /var/log/php

以上が完了したら設定を反映させる為にApacheを再起動させる。

$ sudo /etc/init.d/apache2 restart

その他のセキュリティに関する設定

open_basedirの指定をしてやる。ここには、PHPを主に使いそうなディレクトリを指定する。
例えば、/etc/php5/apache2/php.iniの設定を以下のように変更した。

; PHPを実行できるディレクトリを指定
open_basedir = /usr/share/:/var/www/html:/home/chibi/

Apacheの設定でDocumentRootに設定した/var/www/html と 自分のホームディレクトリ以下で使用することが多いので上記のように設定した。なお、/usr/shareが無いとPearでインストールしたパッケージが使用できなくなったので、/usr/shareも追記。
なお、意図しないところでPHPが実行されるのを防ぐ為にも、このopen_basedirの設定は確実にしておくことが好ましい。
例えば、以下の様なプログラムはopen_basedirを設定していない状態だと、/etc/passwdの中身が丸見えになる。上記のようにopen_basedirを設定しておけば失敗する。

<?php
require_once "/etc/passwd";
?>

指定した関数を無効化したい場合は、disable_functionsの設定をする。

; 指定した関数を無効化する
disable_functions = openlog

状況に併せて、使わせたくない関数などをここに記述して禁止してやるのがいい。ここではopenlogを禁止にしている。

動作確認のサンプルプログラム

例えば、/var/www/html 以下に以下の様なプログラムを作成して実際にアクセスしてみて無事に表示できることを確認してみる。

$ vi hello.php

<html>
<body>
<?php
for ($i=1; $i<=5; $i++) {
  echo "<h$i>Hello PHP!</h$i>\n";
}
?>
</body>
</html>

また設定状況なども確認しつつ、PHPのサンプルを試したいなら以下を作成してアクセスしてみる(アクセスした後は確実に削除しておく)。

$ vi info.php

<?php
phpinfo();
?>

phpのログのローテーション

PHPのエラーをログに出力しているようにしているが、このままではログのローテーションは行われないので、ファイルがどんどん大きくなっていく一方だ。
例えば、PHPのエラーログを1週間という単位でローテーションさせたい場合は、以下のようなファイルを作成してやる。

$ sudo vi /etc/logrotate.d/php

/var/log/php/php_error_log {
  weekly  missingok
  notifempty
  sharedscripts
  postrotate
    /etc/init.d/apache2 reload > /dev/null 2>/dev/null || true
  endscript
}