このエントリーをはてなブックマークに追加
スポンサーリンク

apacheとPHPのインストール

apacheのインストール

apacheをインストールします。ここでは、それと同時にPHPも組み込んでみましょう。

apacheやPHPは、RedHatやCentOSではインストール時に選択すれば自動で組み込まれますし、バイナリコード(RPM)も配布されています。しかし、apacheもPHPも、重大なバグ修正やセキュリティパッチが頻繁に行われているため、rpmではなくソースからコンパイル&インストールする方が望ましいです。なので、ここでは、ソースからコンパイル&インストールする方法を説明します。

ソースの入手
以下のアドレスなどから、ソースを入手します。

apacheの公式サイト
http://httpd.apache.org/

圧縮ファイルの解凍
tar xvzf httpd-(バージョン).tar.gz
cd httpd-(バージョン)

apacheのconfigure
apacheの./configureを実行します。以前、このサイトではPHPを静的リンクする方法を紹介しましたが、現在では動的リンクがメジャーになっています。apacheに外部モジュールを動的にリンクするために、--enable-modules=soを指定します。
./configure --enable-modules=so

sslを使う場合はさらに--enable-sslを指定します。
./configure (上記オプションに加えて) --enable-ssl

apache2.2.4以降でaprライブラリが内蔵されたのはいいのですが、 コンパイルオプションを指定しないと、Linux標準ディレクトリから読みに行って、 aprライブラリのバージョンが合わないというエラーになってしまいます。 なので、以下のようにします。
./configure(上記オプションに加えて) --with-included-apr

さらに、64ビット版のOSでは、lib64に入っているexpatライブラリがapacheと 合わずにエラーになるので、apacheのソースコードに内包されたexpatライブラリを 使うように指示します。
./configure (上記オプションに加えて) --with-expat=builtin

make
make install
--enable-module=XXと、--enable-modules=XXと、--enable-XX
外部モジュールを指定する際に、apache1.xxでは--enable-module=XXと指定しました。 しかし、apache2.xxからは--enable-modules=XXという風にsが付くようになったため、以前の コンパイルオプションをそのまま流用するとコンパイルエラーや、実行時エラーになってしまう場合があります。

また、apache2.xxからはソース一式(.tar.gzファイル)に同梱のモジュール (例えばApache2.xxではmod_ssl)を使う場合、enable-(モジュール名)というような指定が可能になりました。

例)
apache1.xxの場合
--enable-module=ssl
apache2.xxの場合
--enable-modules=ssl (もしくは--enable-ssl)

SSLキー作成

apache2からは、make certificateがなくなってしまったので、自力でopensslを使って キーと証明書(自己証明)を作成します。

cd /usr/local/apache2/conf
mkdir sslkey
cd sslkey
openssl md5 /var/log/messages > rand.dat
openssl genrsa -rand rand.dat -des3 1024 > key.pem
パスフレーズを聞いてきますので、2回入力します。

ただし、このままではapacheを起動するたびにパスフレーズを入力しなければなりません。その方がセキュリティ上では望ましいのですが、サーバーが何らかのアクシデントでリブートしてしまった際にも常にパスフレーズの入力が必要です。それでは困るという方は、パスフレーズを削除します。
openssl rsa -in key.pem -out key.pem
パスフレーズを聞いてきますので、入力します。パスフレーズが正解ならば、key.pemにパスフレーズのないキーが出力されます。

CSRを作ります。CSRがないとベリサイン等にサーバーIDの申請ができないだけでなく、自己証明もできませんので、作成しておきます。
openssl req -new -days 365 -key key.pem -out csr.pem
この後、英文字で項目を聞いてくるので入力します。

・自己証明の場合
プライベートなサーバーで、サイトの信頼性の証明が不要という場合は、コモンネームだけは正式なものにして、他の項目はEnterキーで送ってしまっても良いでしょう。そうしてできあがったCSRファイルを元に、自己証明書を作成します。
openssl x509 -in csr.pem -out cert.pem -req -signkey key.pem -days 365

・証明機関を利用する場合
ベリサインやジオトラスト等の正式な証明機関を使う場合は、CSRの項目は正しく入れてください。でないと、サーバーIDが発行してもらえないだけでなく、証明書のシールをダブルクリックした際にCSRで入れた情報がそのまま表示されますので、サイトの信頼性にかかわってしまいます。

コモンネームは、サブドメインも含めて正式なものにしてください。例えば、サブドメインなしで運用するのであれば、コモンネームもサブドメインなし、wwwというサブドメインをつけるのであれば、コモンネームもwwwサブドメイン付きで入力します。でないと、httpsでアクセスした際にブラウザに警告が表示されてしまいます。

証明機関を使う場合は自己証明書ではなく証明機関から発行されたサーバーIDをサーバーにアップします。

httpd.confの編集

/usr/local/apache2/conf/httpd.conf
というファイルに設定ファイルがあります。これを正しく記述しておかないと、apacheは起動しません。

以下に httpd.confの主な設定箇所について説明します。

サーバーの動作に関する設定

・サーバーの管理者のメールアドレス
ServerAdmin 管理者のメールアドレス

・サーバー名
ServerName サーバー名
サーバー名をフルドメインで記述しない時(サブドメインのみ)の時は、/etc/hostsにてサブドメインとIPの対応が記述されている必要があります。

・実行権限
デフォルトはnobodyになっています。
User nobody
Group nogroup
ただ、httpd.conf上の注釈によると、”On HPUX you may not be able to use shared memory as nobody”と書いてあり、「HPUXではnobody権限では共有メモリを使う事ができない」となっています。つまり、ヒューレッドパッカード製のワークステーションなど、nobody権限で共有メモリの使用が許可されてないサーバーでは、設定を変更する必要があります。

また、Linuxで使う場合であっても、apacheが動作する権限は明確にしておく方が良いです。なので、ここではapacheというユーザー/グループを作って、
User apache
Group apache
のようにしておきましょう。

・ドキュメントルート
ブラウザからサーバー名だけ(たとえば、http://www.aufheben.net/)で呼び出された時に、表示するページが入っているディレクトリを指定します。
DocumentRoot "/usr/local/apache2/htdocs"
デフォルトの設定のままだと「あなたの予想に反してこのページが見えているでしょうか?」が表示されます。また、デフォルトのドキュメントルートはroot権限になっているので、webadminみたいなドキュメントルートを操作するユーザーを作っておき、/home/webmaster/htdocs等に変更しておきます。この設定は古いバージョンではsrm.conf というファイルで設定していましたが、今では httpd.conf に統合されました。

・ユーザー名でアクセスされた時に表示するディレクトリ名
<IfModule mod_userdir.c>
  UserDir public_html
</IfModule>
デフォルトのままだと、http://サーバーのアドレス/~ユーザー名でアクセスした場合には、/home/ユーザー名/public_htmlになります。

・ディレクトリ名でアクセスした時に表示するファイルと優先順位
DirectoryIndex index.html index.htm index.cgi index.shtml index.php
ブラウザからディレクトリ名のみが指定された時に、表示するファイルと、その優先順位を記述します。この例でいくと、最初に index.html次にindex.htm次に、index.cgi の順番に探します。デフォルトではindex.htmlとなっていて、それ以外のファイル名はディレクトリ名のみでは表示しない設定になっていますが、トップページとしてindex.htmやindex.php等を使いたい場合は、上記のように設定する必要があります。

・アクセスの制御をするファイルの名前
AccessFileName .htaccess
デフォルトのままだと.htaccessになります。

・環境変数REMOTE_HOSTにホスト名を代入するかどうか
HostnameLookups Off
ここがOnになっていると、PerlやPHPスクリプトで、環境変数REMOTE_HOSTを参照するとアクセス元の逆引き名が入ってきます。ここがOffになっている時は、IPアドレスが入りますので、PerlやPHPスクリプトでgethostbyaddr()関数で逆引き名を取得しなければなりません。

Onにするとサーバーはリクエストがあった端末のホスト名の逆引きを試みてからデーターを送信するようになるため、もし逆引きできない端末からアクセスした場合にDNSのタイムアウトまで待たされることになるアクセス速度が低下します。また、一度に大量のアクセスがあるサーバーでホスト名の逆引きを行うと全般的にアクセス速度が低下しますし、DNSサーバーにも負担がかかります。

というような理由で、今はOffになっている場合が多いです。デフォルトはOffです。

拡張子に関する設定

・拡張子.cgiをCGIとして認識させる
AddHandler cgi-script .cgi
拡張子.cgiのファイルは、CGIスクリプトであるとサーバーに認識させます。この設定がないと、CGIプログラムを動かそうとしてもただソースが表示されるだけになってしまいます。セキュリティー上の関係で、ユーザーにCGIファイルを実行させたくない場合はこの設定はしません。大手サーバーでも、設定がデフォルトでされておらず、.htaccessをユーザー側で設置して、そこで指定しなければならない場合が多いです。

・拡張子.phpをPHPスクリプトとして認識させる
AddType application/x-httpd-php .php
拡張子、phpを、PHPプログラムとして認識するようにします。PHPプログラムを実行させる時には必要です。apacheの古いバージョンでは雛型がコメント文で入っていたのですが、バージョン1.3.xxあたりから雛型がなくなってしまったので、このページからコピーペーストするなどして設定を追加します。

・拡張子htmlでPHPスクリプトを動かしたい場合
AddType application/x-httpd-php .php .html
とします。これにより、一見静的なコンテンツに見えて実はスクリプトだ、という事ができます。ただし、PHPをインストールする前にこの設定をしてしまうと、全ての
htmlページが、htmlというファイルのダウンロードになってしまうので、必ずPHPを組み込んでから設定しましょう。

・携帯電話への対応
AddType text/x-hdml;charset=Shift_JIS .hdml
AddType image/bmp .bmp
AddType image/png .png
AddType image/gif .gif
AddType image/jpeg .jpg
AddType audio/vnd.qcelp .qcp
AddType application/x-smaf .mmf
各種拡張子をサーバーに関連付けさせておきます。設定しておくと、これら拡張子のファイルを出力する際に、apacheの方でヘッダーを付加してくれます。パソコンからInternetExplorerでアクセスする場合は、拡張子をサーバーに関連付けておく必要はさほどありませんが、携帯電話からアクセスする時は拡張子を正しく設定しておかないと、携帯電話がファイルの種類を正しく認識してくれない場合があります。

携帯コンテンツではこの他にもデコメ等の色々な拡張子がありますので、必要に応じて追加してください。

アクセス制限に関する設定

・ユーザーのドキュメントルートの設定
<Directory /home/*/public_html>
      AllowOverride ・・・・・
      Options ・・・・・・
      :
</Directory>
ユーザーのドキュメントルートディレクトリ内で、ユーザーに権限を許可したり禁止したりできます。以前は、access.confというファイルで設定を行っていましたが、今では httpd.conf に統合されました。

AllowOverride
httpd.confの設定以外に、ユーザーが.htaccessファイルを置いて設定の追加/変更ができるかどうかを指定します。

all
.htaccessの全ての設定を許可します。

none
.htaccessの全ての設定を禁止します。

AuthConfig
認証に関する設定変更のみ許可します。

Limit
接続元によるアクセス制限のみ許可します。

Options
後述のOptionsパラメーターの使用を許可します。

FileInfo
AddTypeによる拡張子の関連付けを許可します。

Options
この単語に続いてスペースで区切ってオプションを記述できます。(例:Options ExecCGI Includes Indexes)

ExecCGI
指定ディレクトリでCGIが実行できる事を指定します。

Includes
指定ディレクトリでSSIが実行できる事を指定します。

IncludesNoExec
SSIは許可するが、execコマンドは禁止する事を指定します。

Indexes
ブラウザからディレクトリのみ名が指定されて、かつ、<IfModule mod_dir.c> 内のDirectoryIndexの項目で指定されたファイルが見つからない場合、ディレクトリの中身の一覧をブラウザに返す事を示しています。

この設定にした場合、訪問者がURL削りをしてディレクトリ名のみでアクセスした時にcgiディレクトリが丸見えになってしまいます。サーバーによってはデフォルトでこの設定になっている所があるので、それを防止するためには、cgiディレクトリに.htaccessかIndex.htmlを入れて、ディレクトリが見えないようにしておく必要があります。(相対指定の項目参照)

FollowSymLinks
ドキュメントルート以下にシンボリックリンクがある場合、そのシンボリックリンクの 先までファイルをたぐって行ける事を許可します。つまり、ドキュメントルート外へのシンボリックリックがあるとブラウザで表示してしまいます。mod_rewriteを使う場合にはFollowSymLinksを許可する必要があります。(内部的にシンボリックリンクを使っているようなので。)

none
上記のオプションを何も許可しないようにします。

all
上記のオプションを全て許可するようにします。

Multiviews
指定したファイルが存在しない場合、404 not foundなどのエラーメッセージをブラウザに返します。ここで、Multiviewsが指定されているとエラーメッセージがブラウザの言語を判別してバイリンガル表示になります。

しかしながら、apacheではドイツ語やスペイン語などに対応してはいるものの、日本語のエラーメッセージには対応しておらず、さらにMSIEでは独自のエラーメッセージ(いわゆる「ページが表示できません」)を表示してしまうので、今ではこのオプションにはあまり意味がなかったりします。
・相対指定
ディレクトリーの指定が重複する場合、(たとえば、先に全ユーザーの /*/public_html を指定しておいて、その下にある特定のユーザーの /shiyou/public_html を指定する場合)、先の指定に追加あるいは削除の指定ができます。

相対指定は、主に .htaccess ファイルで行います。

例)
+ExecCGI (先の指定に追加して、CGIを実行可にする)
-Indexes(先の指定から、ディレクトリの一覧を出す機能を除外する)

・直リンク禁止の設定
setenvif referer "リンク元1" bad_referer1
setenvif referer "リンク元2" bad_referer2
      :
order allow,deny
allow from all
deny from env=bad_referer1
deny from env=bad_referer2
      :

リンク元1、リンク元2………のように、複数のリンク元(ime.nu、ime.stなど)からの直リンクを禁止するように設定できます。リンク元1、リンク元2には、直リンクされたくないサーバーのURLを書きます。直リンクを禁止したいリンク元が2ヶ所以上ある場合は、bad_referer3以降も設定しておきます。

ただし、アクセスしてきた人がブラウザプライバシーを有効にしていたり、インターネットエクスプローラ以外のブラウザ(いわゆる専ブラ)を使っている場合は、あまり効果を期待できません。

セキュリティーに関する設定

・バージョン番号を隠す
ServerSignature Off
telnetで80番ポートを指定して、HEADコマンドでバージョン番号や組み込みモジュールを検査されてしまうのを防ぎます。この行がなければ非通知になるのですが、デフォルトのhttpd.confではOnと書いてあるので、Offにします。

ServerTokens ProductOnly
404Not Foundや、Forbiddenエラーが出た時に、ブラウザーにはエラーメッセージとともにapacheのバージョン番号が表示されます。(もっともMSIEでは専用のエラーページが出ますが)そこで、この指定をしておけば、バージョン番号は表示されず、単に「Apache」とだけ表示されるようになります。

・バージョン番号を隠す理由
apacheは世界中で使われているサーバーです。なので、どのバージョンには、どのセキュリティーホールがあって、どのバージョンにどういう攻撃をすれば不正アクセスが可能かという情報は、世界中に広まっています。なので、apacheのバージョンを通知してしまうと危険です。apacheのバージョン番号は常に隠すように設定しておきましょう。

バーチャルホストの設定

1台のサーバーに複数のドメイン/サブドメインをつけたい場合があります。たとえば、www2.aufheben.netというサーバーに、www3.aufheben.netという別のサブドメインをつけたり、または全く別のドメイン名をつけたりしたい時があります。このような場合は、バーチャルホストの設定をします。

NameVirtualHost (IPアドレス)
(IPアドレス)には、このサーバーのIPアドレスを記述します。

この設定をすると、先に設定したDocumentRootは無効になります。ドメイン(サブドメイン)ごとにルートディレクトリを設定しなおす必要があります。

<VirtualHost (IPアドレス)>
      :
</VirtualHost>
アクセスを許可するサーバー名ごとに設定します。複数のサーバー名でアクセスを許可する場合は、この<VirtualHost>〜</VirtualHost>の設定を複数記述します。

最初に記述したVirtualHostはデフォルトとなり、ここに記述されてないドメイン名(例えばIPアドレス)でアクセスされた場合にも適用されます。また、VirtualHostの設定を全てインクルードファイルにした場合、例えば、
Include virthost/*.inc
とした場合は、アルファベット順で最初のファイル名の設定ファイルがデフォルトになります。
ServerAdmin
サーバー管理者のメールアドレスを書きます。

DocumentRoot
このサーバー名でアクセスした時のルートディレクトリを設定します。

ServerName
サーバー名を書きます。ブラウザからアクセスさせるサーバー名を書きます。

ErrorLog
エラーログのパスを書きます。

CustomLog
アクセスログのパスと、アクセスログのタイプを指定します。アクセスログのタイプは、

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

のように定義されていますが、オリジナルのログタイプを自分で作ってもかまいません。既存のタイプを使う場合は、combinedとか、commonという風に指定してください。

・apache2.2の場合
apache2.2の場合ルートディレクトリが
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
のように、表示禁止になっていますので、各バーチャルホストの設定で、
Order allow,deny
Allow from all
を記述して表示許可に設定します。これにより、表示させようと思わなかった場所(/usr/local/apache2/htdocs等)がいつの間にか表示されていた、という事が起こりにくくなります。

sslのキーを設定する

自己証明を使う場合でも、証明機関を使う場合でも、秘密鍵とサーバーIDの設定が必要になります。

apache1.x系の場合
/usr/local/apache/httpd.conf apache

apache2.0.x系の場合
/usr/local/apache2/conf/ssl.conf apache

apache2.2.x系の場合
/usr/local/apache2/conf/extra/httpd-ssl.conf

をそれぞれ編集します。

・サーバーID
SSLCertificateFile /usr/local/apache2/conf/sslkey/cert.pem
サーバーIDの場所を指定します。パスはそれぞれ配置した所に読み替えてください。

・秘密鍵
SSLCertificateKeyFile /usr/local/apache2/conf/sslkey/key.pem
パスはそれぞれ配置した所に読み替えてください。

・中間証明書
自己証明の場合やジオトラストの場合は、コメントアウトのままにします。また、ベリサインでもセキュアサーバーで、2007年6月以前の証明書の場合はコメントアウトのままにします。

グローバルサーバーの場合
SSLCertificateChainFile /usr/local/apache2/conf/sslkey/グローバルサーバー用の中間証明書

セキュアサーバー(2007年6月18日以降)の証明書の場合
SSLCertificateChainFile /usr/local/apache2/conf/sslkey/セキュアサーバー用の中間証明書

ここで、中間証明はベリサインのサイトから事前に取得してサーバにセットしておきます。中間証明書は必ず証明書(cert.pem)で指定されたものを入れます。これが合ってないと、PCからのアクセスでは証明書のチェイン構造が切れて表示されてしまいますし、DoCoMoからアクセスした場合には、アクセスを拒絶されてしまいます。

apacheを起動する

apacheを起動するには、/usr/local/apache2/bin/apachectl (スイッチ) というapacheを制御するコマンドがあるので、これを使います。

apachectl start
で起動します。

apachectl stop
で停止させます。

apachectl restart
で再起動させます。

もしも、失敗した時は、 /usr/local/apache2/logs/error_log にエラーの原因が入るので、
tail /usr/local/apache2/logs/error_log
などのようにして、エラーの原因を調べてください。

apache1+mod_sslや、apache2.0系ではSSL付きで起動させるために、スイッチをstartsslとしました。しかし、apache2.2系からはSSL付きで起動するかどうかはhttpd.confの設定に委ねられましたので、SSL付きで起動させる場合でも単にstartとします。

サーバー起動時にapacheを起動するようにする

サーバー起動時に自動的にapacheを起動させるためには、/etc/rc.d/init.dに自動起動スクリプトを記述します。同ディレクトリ内にある他の起動スクリプトをコピーしてからちょっといじれば簡単です。

vi /etc/rc.d/init.d/apche
#!/bin/bash
#
#       /etc/rc.d/init.d/apache
#
# Starts the at daemon
#
# chkconfig: 345 95 5
# description: Runs commands scheduled by the at command at the time \
#    specified when at was run, and runs batch commands when the load \
#    average is low enough.
# processname: apache

# Source function library.
. /etc/init.d/functions

RETVAL=0
LOCK=

start() {
        echo -n "Starting apache..."
        if [ -f /usr/local/apache2/logs/httpd.pid ];
           then
             RETVAL=1
           else 
             /usr/local/apache2/bin/apachectl start
             RETVAL=0
        fi
        [ $RETVAL -eq 0 ] && success || failure
        echo ""
}

stop() {
        echo -n "Stopping apache..."
        if [ -f /usr/local/apache2/logs/httpd.pid ];
           then
             /usr/local/apache2/bin/apachectl stop    
             RETVAL=0
           else
             RETVAL=1
        fi
        [ $RETVAL -eq 0 ] && success || failure
        echo ""
}

restart() {
        echo -n "Restarting apache..."
        /usr/local/apache2/bin/apachectl restart
        RETVAL=$?
        [ $RETVAL -eq 0 ] && success || failure
        echo ""
}

configtest() {
        /usr/local/apache2/bin/apachectl configtest
}


# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        restart
        ;;
  configtest)
        configtest
        ;;
  *)
        echo "Usage: apache {start|stop|restart|configtest}"
        exit 1
esac

exit $RETVAL
chmod 755 /etc/rc.d/init.d/apache
chkconfig apache on

注意:
これはあくまで例です。単にコピペして「動かないよー」という方は、お使いの環境に合わせて以下を修正してください。
・apache1.xxを使うのであれば、パスは/usr/local/apache/binです。
・apache1.xx+modsslや、apache2.0xでsslを使うのであれば、startではなくstartsslです。
・apache2.2xではsslを使う場合でも使わない場合でも、startです。逆にstartsslはエラーになります。

apacheも2005年ぐらいまでは仕様がまだ定まっておらず、このような仕様のゆらぎが頻繁に起こったのですが、最近では比較的安定しているようです。それはさておき、起動してみましょう。 /etc/rc.d/init.d/apache start としてみて、apacheが正しく動作しているかどうかpsコマンドで確認します。

例)
ps ax | grep httpd
627 ? S 0:11 /usr/local/apache2/bin/httpd
628 ? S 0:16 /usr/local/apache2/bin/httpd
629 ? S 0:10 /usr/local/apache2/bin/httpd
630 ? S 0:15 /usr/local/apache2/bin/httpd
       :

上記のように、 httpd というプロセスがいくつか起動していれば、うまくいった事になります。プロセスが立ち上がるまでに少々タイムラグがありますので、startさせてから少し間をあけてから確認した方が良いです。

PHPのインストール

以下のアドレスからPHPのソースファイル一式をダウンロードしてください。
http://www.php.net/downloads.php

その後、圧縮ファイルを展開した後、configureを行います。PHPのconfigureオプションは非常に長いので、スクリプトにしておくと便利です。その際に、改行の直前に\を入れておくことで、1つのコマンドを複数行に渡って記述する事ができるようになります。

例)
vi mkphpconf

./configure \
--with-config-file-path=/etc \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-gd \
--enable-gd-native-ttf \
--with-openssl \
--with-zlib \
--enable-exif \
--enable-ftp \
--enable-magic-quotes \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-sysvmsg \
--enable-track-vars \
--enable-trans-sid \
    :
 (ここに必要なオプションを列記します)
    :

chmod 755 mkphpconf
./mkphpconf

この方式だと、コンパイルオプションのミスでエラーが発生した場合や、どうしてもエラーの出るオプションだけをあきらめて取り除く場合に楽です。
PHPで使える主なオプション

・--with-config-file-path
php.iniのある場所を指定します。指定しないと/usr/local/libになりますが、php.iniは比較的よく使うので、/etcにあった方が便利と思います。

・--with-apxs2=apxs2へのパス
--whth-apxsと指定することで、自動的にapacheのシェアードオブジェクトとしてlibphp5.soが追加され、起動時に組み込まれるようになります。apache2.xxを使う場合--with-paxs2と指定しますが、apache1.xxを使うなら--with-apxsです。これは、同じサーバーにapache1.xxと2.xxを共存させている場合に、どちらのapacheにPHPを組み込むのかを区別させるためです。

・マルチバイト文字列関数
PHPの開発初期の段階では、マルチバイト文字(日本語や中国語などの1文字に1バイト以上必要な文字)をサポートしていませんでした。そのため、EUCコードを用いることで日本語を扱う事は可能ではありましたが、日本語1文字で2文字として数えなければならなかったり、2バイトコードの1文字目で切れないようにする処理を自作しなければならない、など色々苦労しました。

当初は、日本人の手によってjstringという外部ライブラリでマルチバイト処理が可能でしたが、今ではマルチバイト文字の処理が正式にサポートされています。マルチバイト文字の処理機能を有効にするには、--enable-mbregex --enable-mbstring --enable-mbstr-enc-trans を指定してください。

・暗号化ライブラリ
現在、LinuxのshadowパスワードやapacheのBASIC認証では、mcryptライブラリで暗号化されたパスワードを使っています。PHPプログラムでBASIC認証のパスワードを生成したい時や、独自プログラムで暗号化パスワードの認証を行いたい場合など、暗号化ライブラリを使う場合は、--with-mcrypt --disable-posix-threads を指定します。

また、事前にlibmcryptライブラリがインストールされている必要があります。

・GDライブラリ
PHPプログラムで画像処理関数を使う事により、画像を生成したり、連結したりする事ができます。そのためには、--with-gd=(GDライブラリの場所)を指定します。

GDライブラリは、バージョン1.6以上と、バージョン1.6未満で大きな違いがありました。これは、特許の関係でgifのサポートを中止し、pngのサポートに切り替えたためです。しかし、特許が切れたためGD2ライブラリからはGIFのサポートが復活しています。

GDライブラリでPNGを扱う場合、事前にlibpngを、また、JPEGを使う場合、事前にlibjpegを組み込んでおく必要があるでしょう。

・freetype2ライブラリ
freetypeとは、Windowsでいうところのtrue type fontのことで、つまり、拡大縮小が自由にできるフォントのことです。このライブラリを組み込んでおくと、PHPで拡大/縮小フォントを生成できるようになります。

GDライブラリと同時に使います。GDライブラリをコンパイルする前にfreetype2ライブラリを組み込んでおきます。

例)
--with-freetype --with-gd

・Zライブラリ
libzライブラリを使った圧縮関数を使う場合は、--with-zlib=(Zライブラリの場所)を指定します。いわゆる、*****.gzファイルと同じ圧縮アルゴリズムを使う事ができるようになります。Zライブラリの圧縮アルゴリズムは無料で使用できるため、Zライブラリの圧縮が事実上UNIX標準になっています。

・MySQL、PostgreSQL
PHP上でデーターベースに連動したプログラムを作る事ができます。そのためには、MySQLやPostgreSQL等のデーターベース連動機能を組み込んでおく必要があります。

MySQLと連動させる場合、--with-mysql=(MySQLのディレクトリ)
PostgreSQLと連動させる場合、--with-pgsql=(PostgreSQLのディレクトリ)

とします。あるいは、どちらも使う場合は両方指定します。ただし、前もってMySQLやPostgreSQLがインストールされている必要があります。

MySQLを使う時は、php.iniに mysql.default_socket = /var/lib/mysql/mysql.sock という風にソケットの場所を正しく指定してください。(デフォルトでは、/tmp/mysql.sockになる。)
configureで何もエラーがなければMakefileファイルが生成されますので、PHPをコンパイル&インストールします。

例)
make
make install

--with-apxs2を指定してPHPをインストールすると、自動的にapacheのシェアードオブジェクトとしてPHPが追加されますので、あとはapacheを再起動するだけでPHPが使えるようになります。

例)
/etc/rc.d/init.d/apache restart

・PHP5.2.4以降の場合
5.2.4以降のバージョンでは、以下のオプションは指定が不要ですし、指定するとワーニングが表示されます。これはenableやwithと指定しなくとも標準で組み込まれるようになったためです。
--enable-track-vars
--enable-trans-sid
--enable-yp
--enable-memory-limit
--enable-dbx
--enable-dio
--with-libxml
--with-xml
--enable-filepro
--with-expat-dir=/usr
--with-xslt-sablot=shared,/usr/lib
--with-dom

また、以下のライブラリで、より新しいバージョンを要求してくるので、rpmを探してインストールしておきます。
libxslt
libxslt-devel
libgcrypt
libgcrypt-devel

・RedHat9 + PHP5の場合
PHP5はRedHat9ではbzip2-develとibxml2-develでより新しいバージョンを要求してきますので、rpmかソースを探してインストールしておきます。

・コンフィギュアやコンパイルでエラーが出た場合
ライブラリが足りなさそうな時は、RPMかソース(tar.gzファイル)をネットから入手してインストールします。

原因不明な場合は、エラーメッセージそのものをGoogleにペーストして検索すると同じ原因で悩んでいる人や、それを解決した人のメッセージを発見できる事がありますので、色々と探ってみましょう。RedHat系は使っている人が多いので、同じ事で悩んでいる人がメーリングリストで質問していて、それに対する回答が見つかるかもしれません。

どうしても検索でいい情報が見つからない時は、Googleで日本語のページのみにせずに、英語のページも検索の対象としてみます。残念ながらLinuxに関しては外人さんの方が有益な情報を持っている事が多いからです。

php.iniの設定

PHPの各種設定を記述したファイル、php.iniの設定を変更します。

雛形のコピー

PHPの設定ファイルphp.iniは、--with-config-file-pathを指定しなかった場合は、/usr/local/lib/php.iniを見に行きます。指定した場合は、指定された所から探します。いずれの場合も、標準ではコピーされないので、手動でコピーします。ソースを展開したディレクトリに雛形(php.ini-dist)があるので、それを/usr/local/lib(または、--with-config-file-pathで指定した場所)にコピーします。

例)
cp /usr/local/src/php/php-(バージョン)/php.ini-dist /usr/local/lib/php.ini

php.iniの編集

・MySQLソケットの変更
MySQLのデフォルトのソケットは、/tmp/mysql.sockに設定されています。MySQLをソースからコンパイル&インストールした場合のデフォルトがここになっているためです。しかし、MySQLをRPMからインストールするとソケットが、/var/lib/mysql.sockに設定される場合があるので、その場合は変更する必要があります。
mysql.default_socket=/var/lib/mysql/mysql.sock
(デフォルトでは、 = のあとが空白になっているので、/var/lib/mysql.sockを書き足せばOKです。)

・register_globalsの変更
PHPのバージョン4.1.xx以下では特に問題はありませんが、バージョンが4.2.xx以降の場合に設定する必要があります。

これまで、PHP言語では、URLに続いて、…….php?ID=0&PAGE=2 のように引数を指定することによって、直接グローバル変数に値が格納されるようになっていました。しかし、それが災いして、利用者が意図的にグローバル変数を操作できてしまい、それによって意図的にデーターを破壊する方法が発見されてしまいました。そのため、PHPのバージョン4.2.xxからは、引数を直接グローバル変数に格納する機能がオフになっています。

しかし、従来の(バージョン4.1.xx以下の)PHP用に作られたスクリプトは、ほぼ全てがこの機能を使っています。そのため、デフォルトのインストールでは、従来のスクリプトは全く動作しなくなってしまいます。

そこで、従来のスクリプト資産を生かすためには、php.iniに以下の指定を追加します。

register_globals=On
(デフォルトではOffとなっているので、Onに直す)

ただし、この機能は従来のスクリプトとの互換性のためのものです。これからPHPを導入する場合、できる限り以下の変数を使うようにしてください。
$_POST["変数名"] -> <input name="変数名" value="値">の値
$_GET["変数名"] -> ?変数名=値の値
$_COOKIE["変数名"] -> クッキーの値
$_SERVER["変数名"] -> サーバー変数(PHP_SELF等)
$_ENV["変数名"] -> 環境変数
ただし、従来のスクリプトから改造する時に、変数を全てこれらから代入していたのでは、変更箇所があまりに多すぎます。そこで、extractという命令を頭に入れる事で、より少ない変更で対応が可能になります。

extract("$_GET");
extract("$_PUT");

等を最初に追加すれば、従来通りGETやPUTで送信された情報が各変数に代入されます。ただし、このようにすると、せっかくPHPがセキュリティーを向上させた事が無意味になってしまいます。この設定にする時は、SQLインジェクション等のクラック対策は十分にしてください。

・mbstring.encoding_translationの変更
デフォルトではオフになっています。これをOnに設定しておくことで、もしブラウザからJISやシフトJISなどさまざまなコードでPHPにデーターが送られたとしても、指定の文字コード(ここではEUC)に変換してくれます。
;; 出力バッファリングを無効にする
output_buffering      = Off

;; HTTP charsetヘッダを設定
default_charset       = EUC-JP    

;; デフォルトの言語を日本語にする
mbstring.language = Japanese

;; HTTP 入力変換を有効にする
mbstring.encoding_translation = On

;; HTTP 入力エンコーディング変換をautoに設定
mbstring.http_input   = auto 

;; HTTP出力をEUC-JPに設定
mbstring.http_output  = EUC-JP    

;; 内部エンコーディングをEUC-JPに設定
mbstring.internal_encoding = EUC-JP    

;; 無効な文字を出力しない
mbstring.substitute_character = none
・PHPバージョン番号の隠蔽
せっかくapacheでバージョン番号を出なくする設定をしたのに、HEADコマンドでPHP側がバージョン番号を出力してしまいます。そこで、PHP側もバージョン番号を通知しないように設定します。

expose_php = Off
これで、PHPのバージョン番号が完全に隠蔽できます。

※ただし、そこまでしてまでPHPのバージョンを隠さないと攻撃されてしまうサイトは、そのサイト自体の運営方針を見直す方が良いかもしれません。

互換性に関する設定
PHPではバージョンアップが頻繁に行われており、新しいバージョンの方がバグが少なく脆弱性も改善されており、 新しくサーバーを立てるのであれば最新バージョンを使うべきです。

ところが、今まで正常に動いていたサーバーのPHPのバージョンを新しくしたり、 新しいサーバーのPHPにこれまで使っていたプログラムを流用したりすると思わぬエラーが出たりします。 それは、PHPが古いバージョンとの互換性を切り捨てる場合がしばしばあるためです。

しかしながら、そういった場合、php.iniの設定で回避できる場合がほとんどです。 なので、サーバー管理の仕事をしている人は、PHPのホームページを見る、Googleで検索する、 などして頻繁に互換性に関する情報を得ていなければなりません。 また、メジャーバージョン番号(小数点1桁目以上)がアップされた場合には、 少し様子を見て、ある程度ネットに情報が広まってから使った方が良いでしょう。

date.timezone = Asia/Tokyo
PHP5.1から追加された設定で、この設定をしていないとdate()関数を使った時にタイムゾーンが設定されていないというエラーが出ます。しかし、PHP5.1以前に作られたプログラムではタイムゾーンの設定はしていないでしょうから、php.iniの方でタイムゾーンをTokyoと設定しておきます。

error_reporting = E_ALL & ~E_NOTICE

error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
PHP5.3から、split関数を使うと非推奨エラーが出るようになりました。 しかし、実際の開発現場では以前作ったプログラムを流用するでしょうし、 splitって稀にしか使わないのでデバッグから漏れてしまうかもしれません。 というわけで、古い資産を使いまわすために、非推奨エラーを出ないように設定します。 ただし、これから作るプログラムでは、explodeかpreg_splitを使うようにしてください。

アップロードに関する設定
file_uploads = On
upload_max_filesize = 100M
post_max_size = 200M
upload_max_filesizeは、アップロードを許可するファイルサイズの上限です。 デフォルトは2Mぐらい(多分)だったと思いますが、動画や音声やpdfファイルなどをアップする機能をサイト内の設置するのであれば、 2Mでは全然足りないので、100Mぐらいに増やします。あんまり増やしすぎると、わざと巨大ファイルを送りつけてサーバーをダウンさせる攻撃に耐えられなくなるので、上限は必要最小限にしてください。

post_max_sizeは、一度にPOSTでサーバーに送信できる最大サイズです。これをアップロードを許可するファイルサイズと同じにしてしまうと、 送信者の名前とかファイルの説明とかを送信できないので、アップロードできるファイルサイズよりは多めに設定します。

PHPの動作の確認

PHPが正しくconfigureされたかどうか。また、php.iniが正しく設定されたかどうかを確認するために、phpの動作状況を表示させる関数phpinfo()を使います。BASIC認証でパスワードのかかったディレクトリに、info.phpというファイルを作っておきます。

(注意)BASIC認証のかかってないエリアに作ってしまうと、第三者にインストールされているPHPのバージョンだけでなく追加モジュールまで全て見られてしまうので、必ずBASIC認証をかけておいてください。
<?PHP phpinfo();?> 
そして、ブラウザからこのinfo.phpというファイルにアクセスします。すると、アクセスすると、


こんな画面が出て、configure自に指定したオプションや、どのオプションが有効になっているかが表示されます。
 コラム 4月1日にphpinfoを表示させると・・・

なぜか4月1日にアクセスすると、phpのロゴマークのところに、PHPの作者が割り箸をくわえた写真が出てきます。まあ、いわゆるエイプリールフールなんでしょう。

suEXECのインストール

CGIは通常、httpd.confにて設定されたユーザーの権限で実行されます。つまり、

User nobody

のように設定しておくと、nobody権限でCGIが実行されます。普通はそれでも問題はないのですが、CGIがテンポラリーファイルやログを出力すると、nobody権限のファイルを作ってしまいます。そうすると、ユーザーが自分でそのファイルを削除することができず、その都度サーバー管理者に削除を依頼しなければなりません。

apacheにsuEXEC機能をインストールすると、CGIがそのディレクトリの所有者の権限で実行されます。つまり、CGIから出力されたCGIが、ディレクトリと同じ所有者で作成されるようになり、メンテが楽になります。

suEXECを組み込むには

suEXECを組み込むために、apacheの./configure時に、--enable-suexec 等を指定します。詳しくは
--enable-suexec apacheにsuEXEC機能を組み込むことを指定します。
--suexec-caller=ユーザー suEXECを呼び出すユーザー名を指定します。apacheを実行させるユーザーのことです。
--suexec-docroot= suEXEC機能を有効にするディレクトリを指定します。
--suexec-userdir= suEXEC機能を有効にするサブディレクトリを指定します。
例えば、--enable-suexec --suexec-caller=apache --suexec-docroot=/home --suexec-userdir=public_html という風に指定します。(もちろん、PHPやSSLを組み込む場合は、その指定も一緒にします)

apacheはデフォルトではnobody権限で実行するように指定してあると思います。しかし、suEXECを使うのであれば、きちんとapacheを動かすユーザーを作った方がいいです。
apacheの実行権をapacheにする場合
・useraddコマンドでapacheというユーザーを作ります。
・httpd.confの実行権限の指定を、nobodyからapacheに変更します。

suEXEC組み込み時の注意

suEXECを組み込んだ場合、ディレクトリやファイルのパーミッションが777になっているとCGIが動作しなくなります。

よく、フリーのCGIで、CGI本体とテンポラリーファイルが同じディレクトリを使うものがあります。そういうCGIは、本体を入れるディレクトリのパーミッションを777にするように指示してあるでしょう。その場合はテンポラリーファイルをtemp/以下に作るように修正して、temp/ディレクトリのパーミッションを777にして、CGI本体を格納するディレクトリは、755にしておきます。

mod_rewriteのインストール

mod_rewriteとは
apacheのモジュールの1つです。 長い引数のcgiやphpを、特定のURLに割り当てたり、 同じcgiやphpの引数だけ違うページを、別々の固定ファイル名のページに 見せかけたりする事ができるようになります。

例)
aaa.html→ index.php?str=aaa
bbb.html→ index.php?str=bbb
ccc.html→ index.php?str=ccc
上の例では、ともにindex.phpという同じプログラムを読んでいるが、 URL的にはaaa.html、bbb.html、ccc.htmlという別々のファイルに見える。

configureする
apache1.xxなら--enable-module=rewrite、apache2.xxなら--enable-modules=rewriteまたは--enable-rewriteを指定します。(apache2の場合、modulesのsに注意) その他のオプションも同時に指定しておきます。

httpd.confの変更
以下は、httpd.confに設定しますが、 AllowOverrideが許可されているディレクトリであれば、 .htaccessに記述する事も可能です。 ただ、どうも.htaccessで指定する場合、その.htaccessを置いたディレクトリに対してしか有効ではないらしく、置き換え元にディレクトリ名が指定できません。置き換え元に絶対パスを指定する場合、httpd.confに書かないとだめなようです。

リライトエンジン有効を指定
RewriteEngine on
RewriteRule 変換前 変換後 [フラグ]
変換前には正規表現が使えます。 正規表現中に()があると、部分一致として使えます。 変換後に、部分一致した箇所をPerlのように$1、$2という風に 指定できます。

例) /cgi-bin/(\S+) /cgi-bin/link.cgi?url=%1
URLを/cgi-bin/aaa.htmlとすると、/cgi-bin/link.cgi?url=aaa.htmlと 指定された場合と同じ動作をします。

フラグには以下のものが指定できます。
L・・最後のルールという意味です。最後の行にのみ指定します。
R・・リダイレクトするという意味です。R=コードとする事で、 ブラウザに指定のコードを返すこともできます。コードを指定しない場合、 302(ページ移動)というコードを返します。
F・・変換前ルールにマッチした場合、Forbiddenコードを返します。 ブラウザにはForbiddenエラーが表示されます。
G・・ページ消去済みコードを返します。 検索エンジンがアクセスした場合に、ページを消去してくれる 可能性が高くなります。
NE・・リダイレクト時にURLエンコードをかけない事を指示します。 つまり、2バイト文字や?&#などの記号をエンコードせずにそのままリダイレクトします。この場合、URLに#マークが含まれていた時はうまく引き継がれないので、ツイッターの個人の発言などURLに#が含まれるアドレスにリダイレクトする際には、別途#だけPHPのstr_replace等でエンコードしておく必要があります。

フラグを複数指定する時は、カンマで区切ります。例えば、 リダイレクトの指示で、かつ、最後の行である場合は、[L, R=302]という風に指定します。

apacheがシンボリックリンクをたどれるようにする
<Directory リダイレクト先ディレクトリ>
Options +FollowSymLinks
</Directory>

どうも、mod_rewrite自体が一時ファイル(一時シンボリックリンク?)を 利用しているようで、シンボリックリンクが使えない設定になっていると エラーが出てしまいます。

▼エラーログ
Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden:

この設定は、.htaccessが許可されていれば、RewriteEngine onの上に書いておけばOKです。

mod_proxyのインストール

mod_proxyとは
mod_proxyは、apacheサーバーにプロキシ機能をつけ、特定のディレクトリを他のサーバーのURLに割り当てる機能を追加するモジュールです。

configureする
apacheをconfigureする際にオプションを指定します。その他のオプションを指定する場合は、同時に指定しておいてください。

Apache1の場合
静的リンクする場合
--enable-module=proxy
動的リンクする場合、
--enable-shared=proxy

Apache2の場合
静的リンクする場合
--enable-proxy
または
--enable-proxy=static
動的リンクする場合
--enable-proxy=shared

注:apache1でもapache2でも、動的リンクする場合はmod_soモジュールも同時に使用可能にした上で、それぞれのapacheのバージョン用にコンパイルされたlibproxy.soがlibexec/以下にあり、またhttpd.conf内に
LoadModule proxy_module libexec/libproxy.so
の指定が必要です。

リバースプロキシの設定
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPass /ディレクトリ/ http://読み込みURL
ProxyPassReverse /ディレクトリ/ http://読み込みURL
</IfModule mod_proxy.c>

ProxyRequests Off
他方よりプロキシのリクエストがあった場合に受け付けない事を示します。そうしないとオープンプロキシになってしまいます。

ProxyPass
指定の/ディレクトリ/にアクセスがあった場合に、代わりに他のサーバーにあるhttp://読み込みURLの内容を表示します。こうする事で他のサーバーの内容をさも自分のサーバーの内容のように表示できますが、他人のサーバーになりすますというよりは、むしろディレクトリ毎にローカル内にあるサーバーに負荷を分散させる場合に使います。

ProxyPassReverse
Locationヘッダなど、リダイレクトの要求があった場合にも、プロキシを経由するようにします。こうしないと、読み込み先のURLでリダイレクト(Location:ヘッダ)をしていた場合に、相手サーバーのURLに移動してしまいます。

例)
ProxyPass /aaa/ http://192.168.10.10/aaa/
ProxyPassReverse /aaa/ http://192.168.10.10/aaa/
ディレクトリ/aaa/にアクセスがあったら、192.168.10.10サーバーの/aaa/以下を表示。

許可IP/禁止IPの設定
・指定IPのみ許可する
<Proxy *>
Order Deny,Allow
Deny from all
Allow from 許可IP
</Proxy>

・指定IPのみ禁止する
<Proxy *>
Order Allow,Deny
Allow from all
Deny from 許可IP
</Proxy>

analogのインストール

サーバーを管理していると、ある時異様にサーバーが重くなる場合があります。原因はさまざまですが、時として外部より画像ファイルに直リンクされていたり、あるいは特定の1つのファイルを集中的に複数の場所からアクセスされたり(DoS攻撃)さえたりします。また、知らない間にクラッカーがサーバー内で勝手に、サーバー管理者が貸してもいないエリアにホームページを作っていたりします。

ただ、そういう不正な行為がなかったとしても、自分のサイトのどのファイルにアクセスが多いかは、サイト作りの参考になります。なので、アクセスログはまめにチェックするようにします。

そこで、ここではanalogというログ解析ツールを使う事にします。

・ソース一式の取得&コンパイル
公式サイト(http://www.analog.cx/download.html)に行き、ファイルanalog-5.32.tar.gzをダウンロードして、/usr/local/src/analogに入れます。
cd /usr/local/src/analog
tar xvzf analog-5.32.tar.gz
cd analog-5.32
make
ソースがコンパイルされます。

・analog表示用エリアの設置
analogはブラウザを通してアクセスします。そのため、ブラウザから見える場所に表示用エリアを置く必要がありますが、そのままではログが第三者にも解析されてしまうため、BASIC認証のかかっているエリアに表示エリアを作ります。

ここでは、/home/root/public_html/analogというエリアに表示用エリアを作り、ブラウザから http://ドメイン/analog/という名前でアクセスするものとします。ディレクトリ名は皆様のお使いの環境に合わせて読み替えてください。

analogで使うイメージファイルをコピーします。
cd /home/root/public_html/analog/
mkdir images
cp /usr/local/src/analog/analog-5.32/images/* images

・analog.cfgの変更
analog.cfgを変更します。
LOGFORMAT書式
ログファイルの形式を指定します。apacheのhttpd.confと同じものを指定します。COMMONや、COMBINEDが指定できます。また、apacheのログ形式をオリジナルのものを使っている場合は、apacheのログ形式と同じ書式で指定します。

LOGFILE パス
ログファイル(access_log)へのパスを指定します。

OUTFILE パス
結果の出力ファイルを指定します。/home/root/public_html/analog/index.htmlと指定しておくと、ブラウザから http://ドメイン/analog/という名前でアクセスする事ができるようになります。

HOSTNAME"[ホスト名]"
ホスト名を入れておきます。タイトルに表示されます。

ここで、注釈に、
# If you need a LOGFORMAT command (most people don't -- try it without first!),
# it must go here, above the LOGFILE commands.

と書いてあると思いますが、これは、「もしLOGFORMATコマンドを指定する必要がある時は、(ほとんどの人は必要ないと思うが・・・まずはナシで試してみて!)LOGFILEコマンドの上に書く必要がある」という意味です。(多分)

なので、LOGFORMATコマンドはLOGFILEコマンドの1つ上の行に書かなければなりません。また、ログファイルが複数存在する時は、

LOGFORMAT
LOGFILE

の組み合わせを複数記述してください。

HOSTEXCLUDE localhost
HOSTEXCLUDE 192.168.0.*

サーバーそのもの、または、ローカルエリアからアクセスがあった場合は、集計から除外するという設定です。自分のホームページエリアに一番多くアクセスするのは、おそらく自分でしょうから、自分を集計にしれると正確な値にならないので、このように指定しておきます。

LANGUAGE JAPANESE-EUC
表示言語を指定します。ここでは日本語のEUCコードで出力するように指示しています。他にも、JAPANESE-SJIS,とJAPANESE-JISが指定できます。
実際にanalogを実行してみましょう。

./analog

とした後、http://ドメイン/analog/としてブラウザからアクセスしてみてください。

・検索単語の文字化け対策
googleから日本語を検索すると、

http://www.google.co.jp/search?q=%E6%97%A5%E6%9C%AC%E8%AA%9E&ie=UTF-8&hl=ja&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=

のように、日本語はURLエンコードされます。アクセスログにも、このままの形で保存されています。なので、analogの検索単語でもエンコードされたままになってしまいます。これでは、訪問者が何で検索したのかわかりません。

そこで、URLデコードするソフトを仲介させることにします。このURLデコードソフトは、Googleで検索すれば多くの人が作っていることがわかります。それらのソフトを利用してデコードをかけるのも良いでしょう。

私も、urldecというURLデコードをするソフトを作りましたので、よろしければ使ってください。

・自動実行スクリプトの作成
アクセス解析をするたびにtelnetでアクセスして手動で実行しても良いのですが、いささか面倒なので定期的に自動実行させます。まず、一連の作業を行うシェルスクリプト(analog.sh)を作成します。実行属性をつけておきます。
#!/bin/sh
/usr/local/src/urldec/urldec -i /usr/local/apache2/logs/access_log -o /usr/local/src/analog/analog-5.32/access_log
/usr/local/src/analog/analog-5.32/analog
このスクリプトが定期的に実行するようにcrontabに登録します。
0 * * * * /usr/local/src/analog/analog-5.32/analog.sh > /dev/null 2>&1
これで、ブラウザから http://ドメイン/analog/でアクセスすると、少なくとも1時間前までのアクセス状況を確認することができます。

ログのローテーション

apacheのアクセスログaccess_logと、エラーログerror_logはそのまま放置しておくとファイルサイズが2ギガになってしまいます。アクセスログかエラーログのファイルサイズが2ギガに達すると、それ以上ログを記録しなくなり、また、apacheをリスタートした際に再起動せずに落ちてしまいます。

そこで、何らかの方法でアクセスログとエラーログをローテーションさせなければなりません。ここでは、2つの方法を説明しますので、良いと思った方を使ってみてください。

logrotateを使う場合

logrotateとはapacheとは別にLinuxにインストールされている、ログをローテーションさせるアプリです。/etc/logrotate.d/に登録されている設定に従ってログをローテーションしてくれます。ここで、/etc/logrotate.d/apacheというファイルを作成します。
/usr/local/apache2/logs/access_log /usr/local/apache2/logs/error_log {
missingok 
dairy
sharedscripts 
postrotate
/usr/local/apache2/bin/apachectl restart
endscript
}
この各種設定の意味は、

missingok
ログファイルが存在しなくてもエラーを出さない。

daily
毎日ログローテーションする。 1日のアクセスがさほど多くなく、週単位のローテーションでもログが2ギガに達しない場合は、weeklyとしても良いでしょう。

sharedscripts
複数指定したログファイルを実行した後に、postrotateコマンドを実行する。

postrotate
endscriptとの間に記述されたコマンドを最後に実行する。

/usr/local/apache2/bin/apachectl restart
apacheをリスタートする。

という意味です。

access_logはいったん消えるため、新しいファイルを作らせるためにapacheをリスタートする必要があります。この設定では、4世代前のログまで記録され、4世代以上前のファイルは削除されます。(実際には3世代目で上書きされる)。

もっと長く残したい場合は、
rotate 30
のようにして、残す世代数を指定します。

設定が終了したら、
logrotate -d /etc/logrotate.conf
としてエラーにならない事を確認します。ここで設定ミスがあると、apacheのログだけでなく、logrotate.dがローテーションすべきログの全てがローテーションされなくなってしまい、/var/log以下のどこかのファイルが2ギガ超えしてしまうので、エラーがない事は必ず確認しましょう。

rotatelogsを使う場合

apacheの方でもログをローテーションする機能を持っています。これは、/usr/local/apache2/conf/httpd.conf内で設定します。
TransferLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/access_log 86400"
TransferLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/error_log 86400"
|/usr/local/apache2/bin/rotatelogsは、ログをローテーションさせるスクリプト名です。
/usr/local/apache2/logs/access_logは、ローテーションさせるログのパスです。
86400は、ローテーションさせる間隔で、秒で指定します。86400秒で1日になります。

この方法では、apacheのアクセスログは、1世代前、2世代前、3世代前……と延々とできてしまうので、別途crontabで定期的に○世代後は削除するようにしないと結局はハードディスク延々と消費されてしまいます。

なので、こちらの方法は一般的にあまり使われてないようです。
スポンサーリンク