Apache + PHP を FPM/FastCGI で動かす。

さくらのVPSサーバ構築手順

使い勝手の向上のため、PHP や Perl のプログラムを指定したユーザー権限で実行できるように設定します。

PHPやPerlのプログラムを指定のユーザー権限で実行できるようにする

ここまでの Apache と PHP の設定では、PHP は Apache のモジュールとして登録されていますので、PHP の実行エンジンは Apache の機能のひとつとして働きます。つまり PHP プログラムは Apacheユーザー権限で実行されます。

Apache にセキュリティホールが見つかって不正な攻撃を受けた場合に、一般のユーザーよりも権限の少ないApacheユーザーで実行した方が安全なためです。

ところがこの場合、不便なこともあります。
PHP の実行によって新しく作られるファイルは Apacheユーザーの所有物となるため、他のユーザーがファイルを簡単に削除することが出来なくなります。

例えば WordPress の管理画面から画像をアップロードしたり新しいプラグインを追加すると、それらのファイルは Apacheユーザーの所有物になるため、他のユーザーは削除することが出来ないわけです。

レンタルサーバの多くは、こうしたパーミッションの問題を解消するために、PHPがユーザー権限で実行されるように設定されていることが多いようです。

ファイルを削除するためだけに su するのも面倒ですので、PHP や Perl のプログラムは指定したユーザー権限で実行できるように設定したいと思います。

FastCGI をインストールする

Apache用の FastCGIモジュールには、mod_fcgid と mod_fastcgi があります。
どちらもFstCGiプロトコルを使いてメモリ空間中に常駐することによってウェブサーバーのレスポンスを向上させる働きがあります。PHPプログラムが Apache とは別のプロセスで実行されますので、これらを使用すれば、ウェブサーバーのレスポンスを向上させつつ今回の希望を満たすことが出来るわけです。

mod_fastcgi をインストールする

今回は少ないメモリでも扱いやすい(らしい)mod_fastcgi を選択しました。

yumi で mod_fastcgi をインストールします。
mod_fastcgi は標準のリポジトリには含まれないので、rpmforgeリポジトリからインストールします。

rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
yum --enablerepo=rpmforge update -y
yum --enablerepo=rpmforge install -y mod_fastcgi

mod_fastcgi の設定をする

ここからの設定作業は、Webminのファイルマネージャーを利用すれば楽々設定できます。

fastcgi.conf という設定ファイルを /etc/httpd/conf.d ディレクトリ内に設置します。
/etc/httpd/conf.d/fastcgi.conf

/etc/httpd/conf.d/ に置かれた拡張子が「.conf」のファイルは apache が起動する際に自動的に読み込まれます。他の設定ファイルに追記しても良いのですが、モジュール毎に設定ファイルを分けておいた方が管理しやすいでしょう。

以下のように入力して保存します。

LoadModule fastcgi_module modules/mod_fastcgi.so

ScriptAlias /fcgi-bin/ /var/www/fcgi-bin/
FastCGIExternalServer /var/www/fcgi-bin/php-fpm -host 127.0.0.1:9000
AddHandler php-fastcgi .php
Action php-fastcgi /fcgi-bin/php-fpm

mod_fastcgi モジュールの読み込み指示と、拡張子が .php のファイルがあったら、localhost(127.0.0.1)の9000番ポートに投げるよう指定しています。

/var/www/fcgi-bin/php-fpm というファイルは無くても大丈夫ですが、ディレクトリは存在する必要がありますので作ってください。中身は空でOKです。
/var/www/fcgi-bin

mkdir /var/www/fcgi-bin

apache標準のPHPモジュールを無効化する

phpがapache標準のPHPモジュールで実行されないよう、php.conf をリネームして無効にしておきます。拡張子を.conf 以外にすれば読み込まれなくなります。

/etc/httpd/conf.d/php.conf

/etc/httpd/conf.d/php.conf.old

PHP-FPMの設定をする

以下の設定ファイルを編集します。
/etc/php-fpm.d/www.conf

修正するのはハイライトした4行です。

; Start a new pool named 'www'.
[www]

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9000

; Set listen(2) backlog. A value of '-1' means unlimited.
; Default Value: -1
;listen.backlog = -1
 
; List of ipv4 addresses of FastCGI clients which are allowed to connect.
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
; must be separated by a comma. If this value is left blank, connections will be
; accepted from any ip address.
; Default Value: any
listen.allowed_clients = 127.0.0.1

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions. 
; Default Values: user and group are set as the running user
;                 mode is set to 0660
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = www

; RPM: Keep a group allowed to write in log dir.
group = www

; Choose how the process manager will control the number of child processes.
; Possible Values:
;   static  - a fixed number (pm.max_children) of child processes;
;   dynamic - the number of child processes are set dynamically based on the
;             following directives:

~ 以下省略 ~

  • 39行目: PHPを実行するユーザ名を指定します。
  • 42行目: PHPを実行するグループ名を指定します。

sessionディレクトリのパーミッションを変更する

PHPがユーザー権限で動くため、そのままではセッション情報を書き換えることができません。sessionデータが保管されるディレクトリのパーミッションを変更しておきます。

chmod 1733 /var/lib/php/session
chown root:root /var/lib/php/session

apacheの設定を変更する

例として VirtualHost の設定を示します。
後ほどドメインの設定の際に設定しますので、ここでは要点だけ押さえておいてください。

<VirtualHost *:80>
	ServerName hogehoge.com
	ServerAlias www.hogehoge.com
	DocumentRoot "/var/www/html"
	<Directory "/var/www/html">
		Options FollowSymLinks Includes ExecCGI
		AllowOverride None
		Order allow,deny
		Allow from all
	</Directory>
</VirtualHost>

重要なのは、ExecCGI を加えている点です。
PHPがCGIとして動きますので、ディレクトリに対してCGIを実行する許可を与える必要があります。Option に ExecCGI を必ず追加してください。

CGIプログラムを指定したユーザー権限で実行されるよう設定する

http.confを修正します。
/etc/httpd/conf/http.conf

以下の行を追加して保存します。
ここでは、www というユーザー権限で実行するよう指定しています。

SuExecUserGroup www www

これでPerlプログラムが wwwユーザー権限で実行されるようになります。
wwwユーザー&グループに su して 実行(exec)というイメージですね。

ウェブサイトのディレクトリの権限を変更する

ウェブサイトのデータを置くディレクトリの権限をユーザーの権限に変更します。
ここでは、ウェブサイトのデータを置くディレクトリを「/var/www/html」とし、ユーザー名を「www」としています。

cd /var/www
chown www:www html
chmod 775 html

PHP-FPMとapacheを起動する

PHP-FPMを起動します。また、再起動の際に自動的に起動するように設定します。

service php-fpm start
chkconfig php-fpm on

apacheを再起動します。

service httpd restart

以上でPHPがwwwユーザー権限で実行されるようになりました。

次は、パフォーマンスアップを狙って、ApacheをWorkerモードに切り替えます。

ApacheをWorkerモードに切り替え&APCをインストールする
ウェブサーバのパフォーマンスを1ランクアップさせる設定を行います。 Apache の MPM を Worker モードに切り替える CentOSにパッケージされている Apacheは、マルチプロセスの Preforkモードとマルチプロセス+...
  1. さくらのVPSでウェブサーバ、インストールマニュアル
  2. さくらVPSを申し込んで起動する
  3. パソコンにターミナルエミュレータをインストールする
  4. ユーザーを登録する
  5. ファイヤーウォールを設定する
  6. Webminをインストールする
  7. ApacheとPHPをインストールする
  8. MySQL、phpMyAdminをインストールする
  9. Apache + PHP を FPM/FastCGI で動かす
  10. ApacheをWorkerモードに切り替え&APCをインストールする
  11. 独自ドメインの取得&メールアドレスを設定する
  12. Apache の VirtualHost を編集する
  13. SSL証明書をインストールする(自分でやればこんなに激安!)
  14. SFTPでファイルを転送する
  15. DropboxでVPSサーバを丸ごと全自動バックアップする

 

コメント

  1. […] Apache + PHP を FPM / FastCGI で動かす | 橋本技研ブログ […]

タイトルとURLをコピーしました