Apache+UserDir+PHP+suEXEC

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/2PHP-CGI + suEXEC 環境の構築手順 (CentOS 6.x)2/2
「Vagon」 バーチャルホストでCGIを使う

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください