使い勝手の向上のため、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モードに切り替えます。
- さくらのVPSでウェブサーバ、インストールマニュアル
- さくらVPSを申し込んで起動する
- パソコンにターミナルエミュレータをインストールする
- ユーザーを登録する
- ファイヤーウォールを設定する
- Webminをインストールする
- ApacheとPHPをインストールする
- MySQL、phpMyAdminをインストールする
- Apache + PHP を FPM/FastCGI で動かす
- ApacheをWorkerモードに切り替え&APCをインストールする
- 独自ドメインの取得&メールアドレスを設定する
- Apache の VirtualHost を編集する
- SSL証明書をインストールする(自分でやればこんなに激安!)
- SFTPでファイルを転送する
- DropboxでVPSサーバを丸ごと全自動バックアップする
ホームページの制作(デザイン・コーディング・プログラミング)に加え、ネットショップの販売促進に関するアドバイスも致します。 20年以上に渡って実際にネットショップを運営した経験を生かし、聞きかじりではない実績を伴ったノウハウを、自分の言葉でお伝えいたします。 プログラミングの経験は30年以上。HTML、CSS、JavaScript、TypeScript、Vue、NuxtJS、Node.js、MySQL、MongoDB、Elasticsearch、WordPress、PHP、Docker、Electronなど、幅広く対応します。
コメント
[…] Apache + PHP を FPM / FastCGI で動かす | 橋本技研ブログ […]