Apache / php-fpm でユーザー権限で動かす

linux

状況説明

共用サーバでは普通にただの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

コメント