PR

[Linux] LAMP 環境をyum で簡単構築

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

参考文献

簡単に、と思って書き始めたのだが、SuExec もしたいなーと欲が出てしまいハマりまくった。ただ、単にエミュレートしたいと思っただけではなく、SuExec が有効になっている状態であってもその恩恵(オーナー権限で実行される)を受けたことがこれまで無かったから勉強しようと思った。思いの外深かった。

コメント