状況説明
共用サーバでは普通にただのWEBサーバとして動かしてると、PHPなどを動かす時にapacheユーザーでファイルが作られたり、wordpressが動かなかったりと色々弊害がある。ユーザー権限で動かすためにsuexecすることもあったが、CGIで動くのでサーバの負荷が高くなるという弊害もあった。何年か前(もう10年ぐらい?)に、サードパーティのモジュールだけど、mod_process_securityが出てきてモジュール版で高速に動かすことができるようになった。
そんなこんなでやりくりしてきた共用サーバであるが、CentOS8,RHEL8のApacheからはマルチプロセスで動作するpreforkからeventにデフォルト値が変わった。この結果、mod_phpが使えなくなりphp-fpmが使われることになった。(nginxでは良く利用してたがapacheでは使ってなかった)その結果、mod_process_securityも使えないので別の方法でユーザー権限で実行できるようにサーバを構築し直した。というのが今回のお話。
(※説明文は偉い方々の受け売り)
ということで、サーバの設定をやっていく
準備
- RHEL8(Red Hat Enterprise Linux)
最低限必要なものインストール(細かいconfigの設定は割愛)
$ dnf install httpd
$ dnf module list php
## 7.2がデフォルトで指定されてるので、RHEL8でEOSの長い7.4に変更
$ dnf module install php:7.4
確認と起動
## デフォルトがeventになってる
$ apachectl -V | grep MPM
Server MPM: event
## httpdの起動
$ systemctl start httpd
## php-fpmの起動 (phpインストール時に合わせてインストールされる)
$ systemctl start php-fpm
ユーザー環境
## アカウント情報
$ tail -2 /etc/passwd
hoge:x:1002:1001::/home/web/hoge.com:/bin/bash
fuga:x:1003:1001::/home/web/fuga.com:/bin/bash
$ tail -1 /etc/group
staff:x:1001:
## vhosts (一部だけを抜粋)
$ cat /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
ServerName http://hoge.com:80/
DocumentRoot /home/web/hoge.com/public_html
</VirtualHost>
<VirtualHost *:80>
ServerName http://fuga.com:80/
DocumentRoot /home/web/fuga.com/public_html
</VirtualHost>
## ユーザーディレクトリ
$ ls -l /home/web/hoge.com/public_html/
-rw-r--r-- 1 hoge staff 382 12月 5 15:49 file_w.php
$ ls -l /home/web/fuga.com/public_html/
-rw-r--r-- 1 fuga staff 382 12月 5 15:49 file_w.php
動作確認用PHP:file_w.php(ファイルを作成するスクリプト)
<?php
$file_handle = fopen( "./data.txt", "w");
fwrite( $file_handle, "保存したいテキスト");
fclose($file_handle);
?>
ユーザー権限で実行するための設定追加
php-fpmでユーザー個別の環境configファイルを作成
$ cd /etc/php-fpm.d/
$ cp -p www.conf www-hoge.conf
$ vi www-hoge.conf
=============================================================
[www]
↓
[www-hoge]
=============================================================
user = apache
group = apache
↓
user = hoge
group = staff
=============================================================
listen = /run/php-fpm/www.sock
↓
listen = /run/php-fpm/www-hoge.sock
=============================================================
php_value[session.save_path] = /var/lib/php/session
↓
php_value[session.save_path] = /var/lib/php/hoge/session
=============================================================
## fugaの分も同様に作成
セッションファイル設置場所の作成
$ cd /var/lib/php/
$ mkdir -p hoge/session
$ chown -R hoge:staff hoge/session
$ mkdir -p fuga/session
$ chown -R fuga:staff fuga/session
apacheのvhostsへ設定追加 (設定の一部を抜粋)
$ vi /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
ServerName http://hoge.com:80/
DocumentRoot /home/web/hoge.com/public_html
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www-hoge.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>
<VirtualHost *:80>
ServerName http://fuga.com:80/
DocumentRoot /home/web/fuga.com/public_html
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www-fuga.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>
php-fpmの再起動とpool確認/apacheの再起動
$ systemctl restart php-fpm.service
$ systemctl status php-fpm.service
● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2022-12-05 23:29:18 JST; 6s ago
Main PID: 39974 (php-fpm)
Status: "Ready to handle connections"
Tasks: 7 (limit: 11418)
Memory: 9.5M
CGroup: /system.slice/php-fpm.service
tq39974 php-fpm: master process (/etc/php-fpm.conf)
tq39976 php-fpm: pool www-fuga
tq39977 php-fpm: pool www-fuga
tq39978 php-fpm: pool www-hoge
tq39979 php-fpm: pool www-hoge
tq39980 php-fpm: pool www
mq39981 php-fpm: pool www
$ systemctl restart httpd.service
動作確認
テスト用PHPを実行して、ユーザー権限のファイルが生成されていればOK
$ curl -H "Host:hoge.com" http://localhost/file_w.php
$ ls -l /home/web/hoge.com/public_html/
-rw-r--r-- 1 hoge staff 27 12月 5 23:39 data.txt
-rw-r--r-- 1 hoge staff 129 12月 5 23:41 file_w.php
$ curl -H "Host:fuga.com" http://localhost/file_w.php
$ ls -l /home/web/fuga.com/public_html/
合計 16
-rw-r--r-- 1 fuga staff 27 12月 5 23:45 data.txt
-rw-r--r-- 1 fuga staff 382 12月 5 15:49 file_w.php
wordpressも問題無くインストールできて稼働した。
オマケ
apacheのvirtualhostに各ユーザーごとのsetHandlerを追加しないと、/etc/httpd/conf.d/php.conf 内の設定値を読まれて、デフォルトの動作が行われ、apacheユーザーで実行される。また、ディレクトリにapacheユーザーで書き込めるよう権限を与えておかないとファイルすら出力できない。
$ ls -l /home/web/hoge.com/public_html/
-rw-r--r-- 1 apache apache 27 12月 6 03:12 data.txt
-rw-r--r-- 1 hoge staff 129 12月 5 23:41 file_w.php
コメント