CentOS のインストール が終わり、CentOS インストール後にやっておくこと を終えたらProFTP インストールと設定 かLAMP 環境の構築をするのが一般的な作業になるだろう。ここでは簡単にLAMP 環境をインストールする手順を記載する。なお、ここで利用するyum はRedHat 系(CentOS など)のアプリケーション管理ソフトウェア。
LAMP とは
LAMP(ランプ)とは、Linux、Apache、MySQL、Perl/PHP/Python の頭文字を取った造語。多くのソフトウェアがこの上で動作する。
L=Linux
Linux サーバーの構築は各種ディストリビューションについて本サイトで個別の記事で解説しているので参考にしていただくとして、その次からを記載していく。
A=Apache
yum install httpd -y service httpd start chkconfig httpd on
スポンサードリンク
バーチャルホストに設定する場合(例)
vi /etc/httpd/conf/httpd.conf <VirtualHost *:80> DocumentRoot /home/casey/public_html ServerName www.example.com AddHandler cgi-script .cgi </VirtualHost> service httpd restart
※DocumentRoot の末尾にスラッシュを付けない
バーチャルホストをSuExec で実行する場合(例)
※レンタルサーバー環境をエミュレートする場合など。「/var/www」でなければならず、シンボリックリンクではダメなのでマウントしてしまうというスゴ技…。コンパイルなしでいける。オーナー権限で実行されたときは感動した!動作確認には簡単なスクリプトを書いてもよいし サーバーアナライザー – futomi’s CGI Cafe などを利用しても良いだろう。
マウントして誤魔化す
# mkdir /var/www/casey_mnt # mount --bind /home/casey/public_html/ /var/www/casey_mnt/
再起動時に再マウントするようにする
# vi /etc/fstab /home/casey/public_html /var/www/casey_mnt none bind 0 0
httpd.conf の設定例
vi /etc/httpd/conf/httpd.conf NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot /var/www/casey_mnt ServerName www.example.jp SuexecUserGroup casey casey AddHandler cgi-script .cgi <Directory /var/www/casey_mnt> Options ExecCGI -Indexes FollowSymLinks -MultiViews AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> service httpd restart
ハマりどころ
SuExec の場合、スクリプトのパーミッションに注意する。通常700 で動作。
アクセスしてみると 403 forbidden となり、エラーログには「(13)Permission denied: access to / denied」となる。404 になるはずのものがならない。上記バーチャルホストの例の場合、ディレクトリ public_html のパーミッションを 711 に設定する。
参考→ pc.casey.jp » Apache 初期設定ほか
M=MySQL
yum install mysql-server -y service mysql start chkconfig mysqld on
参考→ pc.casey.jp » [MySQL] MySQLの初期設定
P=PHP
yum install php php-mysql php-mbstring -y service httpd restart
セーフモードの設定と解除
httpd.conf に以下を追記しOn/Off を制御できる(バーチャルホスト毎に設定する場合)
php_admin_flag safe_mode on
Apache を再起動する
service httpd restart
※セーフモードは国内レンタルサーバー業者の多くが適用しており(原則セーフモードとしておき、必要に応じて.htaccess により CGI モードで実行など)、それらの上で動作させるプログラムを作成する場合などは有効にしておきたい。一方、海外では向こうに設定されていることが多いように感じる。また、PHP のマニュアルによれば PHP 5.3.0 以降セーフモードは非推奨となった。
php-cgi をコピー、拡張子をcgi にして所有者情報を合致させる
# cp /usr/bin/php-cgi /var/www/casey_mnt/www.example.jp/php5.cgi # chown casey. /var/www/casey_mnt/www.example.jp/php5.cgi
httpd.conf の記述を変更
NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot /var/www/casey_mnt/www.example.jp ServerName www.example.jp SuexecUserGroup casey casey AddHandler cgi-script .cgi <Directory /> Options ExecCGI -Indexes FollowSymLinks -MultiViews AllowOverride All Order allow,deny Allow from all SetEnv PHPRC /etc #AddHandler x-httpd-phpcgi .php Action x-httpd-phpcgi /php5.cgi php_admin_flag safe_mode on </Directory> <Location ~ "/php5\.cgi$"> Order Deny,Allow Deny From All </Location> </VirtualHost>
エラーなど
2つめ以降のバーチャルホストでCGI モードのPHP が500 エラーを起こす場合
一度作成した php5.cgi をFTP でダウンロードして別のディレクトリ(別のDocumentRoot)に他のファイルとアップロードしたところ、何をやってもエラーになった。エラーはPHP が実行されなかったり500 エラーになったり。最初は httpd.conf の問題かと思って試行錯誤したが解決しなかった。最終的にはファイルを覗いたらそれがバイナリであることを知り、 FTP を疑う。そこで、cp 手順を行ったところあっさり解決…。
PHP セッションを利用するスクリプトがCGI モードでエラーを起こす場合
[Tue Jan 25 03:52:51 2011] [error] [client 192.168.1.17] PHP Warning: Unknown: open(/var/lib/php/session/sess_duc11im8ebg6g6g6006fhmrl9lc6j5cm, O_RDWR) failed: Permission denied (13) in Unknown on line 0, referer: http://www.example.jp/phpMyAdmin/ [Tue Jan 25 03:52:51 2011] [error] [client 192.168.1.17] PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0, referer: http://www.example.jp/phpMyAdmin/
権限やエラーチェックが必要らしいが、これらは上手く行かなかった。
chmod apache:apache /var/lib/php/session chmod 777 /var/lib/php/session/
以下のパス内の既存セッション情報を削除したところ、ユーザ権限でセッションが作成され、正常に動作した。
/var/lib/php/session
特定のディレクトリの動作をCGI モードにする
coresever のような動作をエミュレート。 .htaccess による特定スクリプトの挙動だけをCGI モードにする。原則セーフモードで動作。
.htaccess 記述例
<files wp-cron.php> AddHandler application/x-httpd-phpcgi .php </files>
参考→ pc.casey.jp » WordPressをCORESERVERに設置する
CGI モードが正しく動作しないとき
CakePHP との同居でエラーがでた。回避策は.htaccess に以下を記述(抜粋)
<IfModule mod_rewrite.c> RewriteCond %{REQUEST_URI} php5.cgi RewriteRule ^.*$ - [L] </IfModule>
参考→ pc.casey.jp » CakePHPのWebrootを使わない方法
モジュールモードかCGI モードか確認する
phpinfo() を実行し、Server API を見る。
CGIモードなら「CGI」、モジュールモードなら「Apache」や「Apache 2.0 Handler」と表示される。
セーフモードの確認
<?php echo ini_get('safe_mode') ? "safe_mode" : "cgi_mode"; ?>
上記のような簡単なスクリプトを用意して確認する。
構文テストを行う場合
apachectl configtest
テストにはツールを使うと幸せになれる
参考→ pc.casey.jp » Firefox hosts切替アドオン-SwitchHosts
参考文献
- apache を利用しての public_html が公開できない – いろきゅう.jp ~Programmable maiden~ Tech side
- apache を利用しての public_html が公開できない – 解 – いろきゅう.jp ~Programmable maiden~ Tech side
- 小粋空間: PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例
- Apache2でのバーチャルホストの設定について – BSD系OS – 教えて!goo
- コドモと犬とギリギリおとん:ServersMan@VPS – CentOS5 – suexec環境でshopformerを利用する
- PHP を CGI として実行させ suExec – Enjoi Blog
- 恒久的にマウントしたのですが – Yahoo!知恵袋
- PHP5.0/2.Apache2の設定 – Ground-SunLight
- phpのsuEXEC化 - Linux Square - @IT
- PHPをモジュール版で動いてるところにpcntl拡張を使いたくてCGIでも動かそうとしたら、結構大変であわゎとなった – それ図解で。・・・tohokuaikiのチラシの裏
- phpがモジュールモードで動いているか?cgiモードで動いているか?を知る方法 – purazumakoiの[はてな]
- mod_suexec – Apache HTTP サーバ
- Premature end of script headers – 帰ってきただらだら日記–
- シンボリックリンクを張ってみたが、何回見たか解らないメッセージ、command not in docrootと怒られてしまった
- yumで入れたapache+suexecのdocroot問題 : Nacky – Snowland.net
- error: command not in docroot
- /var/www 以下に実態があればいいので (シンボリックリンクではだめだった) むりやり実態を mount するという荒技
- PHPがセーフモードかをチェックする関数 – KEINOSの日記
- PHP: セーフモード – Manual
簡単に、と思って書き始めたのだが、SuExec もしたいなーと欲が出てしまいハマりまくった。ただ、単にエミュレートしたいと思っただけではなく、SuExec が有効になっている状態であってもその恩恵(オーナー権限で実行される)を受けたことがこれまで無かったから勉強しようと思った。思いの外深かった。
コメント