WebサーバーがApacheで、UserDirで(http://www.example.com/~hoge/)、PHPをsuEXECのCGIモードで動かす方法のメモ。
VirtualHostの場合だといろいろ見つかるのだが、UserDirの場合については説明しているところがあまり見つけられなかった。
ということでメモメモ。
OS:CentOS 7.9.2009
Apache:2.4.6
PHP:5.4.16
User:hoge
/etc/httpd/conf/httpd.conf変更
root作業
294行のコメントを外してCGIが使えるように設定
AddHandler cgi-script .cgi
/etc/httpd/conf.d/userdir.conf変更
root作業
UserDirを有効にして、各ユーザーの~/public_html/cgi-binでCGIが使えるようにして、PHPファイルを自分で作った(これから作る)ラッパーを介して起動するように設定。
変更箇所は以下の通り:
(省略) #UserDir disabled (省略) UserDir public_html (省略)
更に以下を追加:
<Directory "/home/*/public_html/cgi-bin"> Options +ExecCGI </Directory> <Directory "/home/hoge/public_html"> <FilesMatch \.php$> Action php-cgi /~hoge/cgi-bin/php-cgi.cgi SetHandler php-cgi </FilesMatch> </Directory>
/home/hoge/public_html/cgi-bin/php-cgi.cgi作成
ここは普通のユーザー(hoge)で作業
ラッパー(php-cgi.cgi)を作成
#! /bin/sh exec /usr/bin/php-cgi
ラッパーの所有者がhoge、グループがhogeであることを確認し、パーミッションを0755に設定
chmod 0755 php-cgi.cgi
apacheを再起動
root作業
変更した設定を有効にするためにapacheを再起動
systemctl restart httpd
もしもエラーが出たら、
systemctl status httpd
としてエラー内容を確認して修正
テスト
ここは普通のユーザー(hoge)で作業。
設定・再起動が終わったらテストしよう。whoamiの結果がapacheではなくて、使っているユーザー名(この例だとhoge)となっていればOK。
Perl CGIのテスト:
/home/hoge/public_html/cgi-bin/perl.cgiを作成してブラウザーで読み込む(http://localhost/~hoge/cgi-bin/perl.cgi)
#! /usr/bin/perl -w print "Content-Type: text/html\n"; print "\n"; print "<html><body>whoami : " . `whoami` . "</body></html>";
パーミッション変更も忘れずに
chmod 0755 perl.cgi
PHPのテスト:
/home/hoge/public_html/php.phpを作成してブラウザーで読み込む(http://localhost/~hoge/php.php)
<?php echo 'whoami : ' . exec('whoami'); ?>
正常に動かない場合
エラーは/var/log/httpd/error_logと/var/log/secureを確認。
特に注意が必要なのがCGIファイル、ディレクトリーのパーミッション。groupやotherに書き込み権限が付いているとsuEXECはエラーを起こすので注意。
file is writable by others: (/home/hoge/public_html/cgi-bin/perl.cgi) directory is writable by others: (/home/hoge/public_html/cgi-bin)
滅多にないとは思うがCGIファイル、ディレクトリーの所有者・グループにも注意。グループはメインのグループでないとダメ。
これは ↓ グループが正しくない場合(gidが1000ではなくて10(=wheel)になっている場合)のエラーメッセージ。
target uid/gid (1000/1000) mismatch with directory (1000/10) or program (1000/10)
参考URL
「APACHEドキュメント」suEXECサポート
「レンタルサーバー・自宅サーバー設定・構築のヒント」 apache で phpのモジュール版とcgi版の切り替えを行ってみる / apache のsuEXEC で phpを動かしてみる
「Linuxサーバ構築ガイド」 PHP-CGI + suEXEC 環境の構築手順 (CentOS 6.x)1/2 / PHP-CGI + suEXEC 環境の構築手順 (CentOS 6.x)2/2
「Vagon」 バーチャルホストでCGIを使う