CentOS7+Apache2.4+PHP7+SuexecでPHPを(ユーザーディレクトリで)CGIモード化する
投稿日:2017年03月17日
最終更新日:
もくじ
- Apache2.4とPHP7のインストールと初期設定
- SELinuxの設定変更
- ユーザーディレクトリ・ユーザー権限でPHPを稼働させる準備
- 実行してみる
前提条件
以下、ユーザー名をhogeとします。また、WEBサイトはユーザーディレクトリに(/home/hoge/public_html 以下のディレクトリに)構築し、ユーザー権限でPHPを動かします。今回は例として/home/hoge/public_html/piyoをドキュメントルートとします。
Apache2.4とPHP7のインストールと初期設定
Apache2.4
Apacheは普通にyumでインストールすればいいでしょう。また、サーバー再起動時にApacheも自動で再起動されるようにします。 [VIM] sudo yum install httpd #自動再起動設定 sudo systemctl enable httpd [/VIM]
インストールしたら設定作業を行います。 [VIM] sudo vim /etc/httpd/conf/httpd.conf [/VIM] 設定ファイルを開いたら、以下のように書き換えます。 [VIM] #86行目あたりの記述…本来は管理者のメアドを書くべきだが #書かなくても動作には差し支えなし(書かなくてOK) ServerAdmin root@localhost #95行目あたりの記述…VPSサーバー用に独自ドメインを用意しているならそれを書く #(コメントアウトを外す・ポート番号は80番決め打ちでOK) ServerName www.example.com:80 #144行目あたりの記述…OptionsディレクティブについてIndexesという文字列を削除 Options FollowSymLinks #最終行に追記 ServerTokens Prod KeepAlive On [/VIM]
ユーザーディレクトリの公開設定も行いましょう。ユーザーディレクトリでCGIを実行できるようにします。 [VIM] sudo vim /etc/httpd/conf.d/userdir.conf [/VIM] 設定ファイルを開いたら、以下の記述を編集します。 [VIM] #17行目あたり…disabledをenabledに書き換える UserDir enabled #24行目辺り…コメントアウトを外す UserDir public_html #33行目辺り…Indexesの記述を削除し、ExecCGIを追記する Options MultiViews SymLinksIfOwnerMatch IncludesNoExec ExecCGI [/VIM]
バーチャルホストの設定については、PHPのCGIモード化設定時にまとめて行います。また、HTTPの通信を許可していない場合は、以下のコマンドで許可してください。 [VIM] sudo firewall-cmd –add-service=http –zone=public –permanent sudo firewall-cmd –reload [/VIM]
PHP7
PHP7をインストールする場合は、こちらのページを参考にしてサードパーティリポジトリ(Remi)を導入した上で、yumで入れます。 [VIM] sudo yum –enablerepo=remi,remi-php70 install php [/VIM]
PHPをインストールしたら、php.iniを開いて設定をいじります。 [VIM] sudo vim /etc/php.ini [/VIM] php.iniを開いたら、以下の記述を修正します。 [VIM] #359行目辺り…OnをOffに修正 expose_php = Off [/VIM] 今回はここだけ修正しましたが、必要であればその他の部分も修正してください。ちなみに、あるディレクトリだけPHPの設定を変えたい場合は、対象ディレクトリに.user.iniという名前の設定ファイルを置けばOKです。
SELinuxの設定変更
ユーザーディレクトリにWEBサイトを構築し、PHPをユーザー権限で(CGIモードで)動かす場合は、SELinuxの設定を変更する必要があるので、以下のコマンドを打ちます。 [VIM] #ユーザーのホームディレクトリを公開する sudo setsebool -P httpd_enable_homedirs 1 #PHPなどでのTCP接続を許可する(WordPressなどを使うなら必要) sudo setsebool -P httpd_can_network_connect 1 #Apacheによるファイルの書き込み許可 sudo setsebool -P httpd_unified 1 #Apacheによるファイルの書き込み許可 sudo setsebool -P allow_httpd_sys_script_anon_write 1 #ユーザーコンテンツへのアクセスを許可 sudo setsebool -P httpd_read_user_content 1 [/VIM]
ユーザーディレクトリ・ユーザー権限でPHPを稼働させる準備
ユーザー権限でphp-cgiを稼働させる
まずはCGIモードのPHPをユーザー権限で動かす準備です。以下のコマンドを打ちます。 [VIM] sudo mkdir /var/www/cgi-bin/hoge-cgi sudo chown hoge:hoge /var/www/cgi-bin/hoge-cgi chmod 711 /var/www/cgi-bin/hoge-cgi [/VIM] WEBサイトを公開するユーザーが複数いる場合は、ユーザーごとにCGI実行用のディレクトリを作ってください。
ディレクトリを作ったら、シェルスクリプトを作ります。このシェルスクリプトにより、インストールされているphp-cgiを呼び出します。 [VIM] sudo vim /var/www/cgi-bin/hoge-cgi/php-cgi #中身は以下の2行 #!/bin/sh exec /usr/bin/php-cgi [/VIM] 保存したら、以下のコマンドでシェルスクリプトの所有者をPHPを使用するページを公開するユーザーにします。 [VIM] sudo chown hoge:hoge /var/www/cgi-bin/hoge-cgi/php-cgi sudo chmod 755 /var/www/cgi-bin/hoge-cgi/php-cgi [/VIM]
バーチャルホストの設定
今度はバーチャルホストの設定を行います。
[VIM]
sudo vim /etc/httpd/conf.d/vhosts.conf
[/VIM]
バーチャルホストの設定ファイルを以下のように書き換えます。複数ユーザー・複数ドメイン名でWEBサイトを構築する場合は、ユーザーごとにScriptAliasの設定を記述し、ドメイン名ごとに<VirtualHost *:80>から</VirtualHost>までの部分の設定を書いてください。
[VIM]
NameVirtualHost *:80
ScriptAlias /php-hoge /var/www/cgi-bin/hoge-cgi/php-cgi
ちなみに、ここで「AddHandler php-cgi .php」と書くとドツボにはまります。その理由についてはこちらで説明します。
Suexecの設定
Suexecのパーミッションを変更します。 [VIM] sudo chmod 4755 /usr/sbin/suexec [/VIM]
Suexecを使うことにより、WEBサーバーユーザー(Aoache)とは別のユーザーの権限でCGIを実行できるようになります。バーチャルホストの設定で出てきた「SuexecUserGroup」は、どのユーザーの権限でCGIを実行するかを指定するディレクティブです。
実行してみる
ここまでで設定は終わりです。Apacheを起動しましょう。 [VIM] #文法チェック(Syntax OK と表示されれば大丈夫) apachectl configtest #Apache再起動 sudo systemctl restart httpd [/VIM]
Apache再起動後、設定したディレクトリでPHPがCGIモード化されているかを確かめましょう。以下のPHPプログラムをコピペして(任意の半角英数).php という名前で保存し、CGIモード化の設定を行ったディレクトリにアップロードしてください。
[VIM]
\n”;
echo $_SERVER[‘DOCUMENT_ROOT’] . “
\n”;
phpinfo();?>
[/VIM]
アップロードしたらブラウザでアクセスしてみましょう。
このように、ディレクトリ所有者名がユーザー名として表示され、「Server API」の項目に「CGI/FastCGI」と表示されていれば、CGIモード化成功です。