CentOS7+Apache2.4+PHP7+SuexecでPHPを(ユーザーディレクトリで)CGIモード化する

このページでは、CentOS7上で稼働するPHP7をCGIモード化する手順を解説します。当方ではAddHandlerを使ってドツボにはまりました。

もくじ

  • 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 SuexecUserGroup hoge hoge ServerName example.com ErrorLog /var/log/httpd/example.com_error_log CustomLog /var/log/httpd/example.com_access_log combined DocumentRoot “/home/hoge/public_html/piyo” SetHandler php-cgi Action php-cgi /php-hoge [/VIM] 書き終えたら保存しましょう。

ちなみに、ここで「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モード化成功です。

このブログを応援する・寄付する

当ブログでは暗号通貨による寄付を募っております。

モナゲボタン モナゲボタン

Bitcoin:

Monacoin:

Litecoin: