さまざまなユーザー(プロジェクトごとに1人のユーザー)でApache仮想ホストとPHP-FPMプールを設定する正しい方法は何ですか?
- 各ユーザー/プロジェクトはファイルアクセスの点で互いに独立しています。
- 一般的なApache / projectsを使用して
www-data
プールされたプロジェクトにアクセスできませんか?
私は仮想ホストでApacheを使用して設定し、各仮想ホストを独自のプールに設定しようとしphp-fpm
ています。
- Apache 仮想ホスト
site1.conf
:
<VirtualHost *:443>
DocumentRoot /var/www/site1/public
<Directory /var/www/site1/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
# 2.4.10+ can proxy to unix socket
SetHandler "proxy:unix:/run/php/php-fpm.site1.sock|fcgi://localhost/"
</FilesMatch>
</VirtualHost>
- PHPプール
site1
:
[site1]
user = site1
group = site1
listen.owner = site1
listen.group = www-data
listen.mode = 0660
- ディレクトリは次から始まります
/var/www/site1
。
drwxr-xr-x 15 site1 site1 4,0K ago 31 11:48 .
drwxr-xr-x 15 site1 site1 4,0K ago 31 11:48 public
- そしてユーザー:
id site1
uid=1007(site1) gid=1007(site1) grupos=1007(site1),33(www-data)
virtualhostの他の設定ファイルと同じで、site2
適切な場合は変更します。
これでこの設定が機能し、すべてのファイルが提供されますが、意図した目的と比較してオープンすぎます。
まず、パブリック領域のファイルとディレクトリは次のものをsite1
使用する必要があります。世界中で読むことができるライセンス(例rwxr--r-- site1 site1 file
:)。 site1でのみファイルを読み取ることができるように設定すると、どこでもHTTP 403
エラーが発生しますEACCESS
。私はApacheがある時点でこれらのファイルにアクセスする必要があることを理解していますが、FPMプールの全体的な目的はそのアクセスを処理することだと思います。
これはまた、プロジェクトユーザーが十分に設定しない限り、作成した新しいumask
ファイルに十分な権限がない可能性があり、Webサーバー(またはFPM?)がアクセスできるようにするには、まず誰でも読みやすいように手動で設定する必要があることを意味します。
私の考えに潜在的な解決策は、Apacheを実行しているユーザーをwww-data
(etc ...)のメンバーにすることです。ただし、これにより、Apacheで実行されている他のプロジェクトに、Laravel設定、バックエンドコネクタなどのフロントエンド以外の要素を含むプロジェクトファイルへのフルアクセス権が付与されます。など。理論的にはこれはうまくいきません。site1
site2
2番目のオプションは、Apacheユーザーが具体的に読み取れるようにACL()の読み取りディレクティブを使用するか、または各プロジェクトのディレクトリを設定することですpublic
。しかし、最初にApacheへのフルパスアクセスを許可しないと、これがどのように機能するのかわかりません。読み取り Linux ディレクトリパスは次の条件でのみ読み取ることができるので、プロジェクトは実行可能ですか?www-data
setgid
ẁww-data
setfacl
みんなその親パスはです。うまくいきますが、その設定が何であるかは完全にわかりません。
私が見ることができる唯一の別のオプションは、別の仮想ホストが自分のユーザーによって実行されるようにApache自体を設定することです。ただし、そのような設定に関する文書は見つかりません。私が見つけた最も近いのはapache2-mpm-itk
この機能を宣伝することですが、実際にApacheがサービスを提供できるようにするために使用可能な設定を見つけられませんでした。スタートこのモジュールが有効になっている場合。実際、Debian 9システムのitkのデフォルト設定では起動時にセグフォルトが発生します。
正しい設定を達成するために私が見逃しているものは何ですか?私はそれを受け入れる持つ可能です。少なくとも普通のWebホストなら誰でもそうすると思います。
ベストアンサー1
最近、パフォーマンス上の理由からApacheグローバル読み取りのみを許可する同様の設定を設定しました。 mpm_event_moduleを使用します。
ApacheとPHP-FPMは2つの独立したプロセスであることを考慮する必要があります。どちらも独立した設定と環境を持ち、PHP-FPMはApacheの権限を管理するため、互いに影響を与えません。
フォームを使用して既存の方法でファイルをアップロードする場合、Apache には静的ファイルに対する読み取りまたは書き込み権限が必要です。 PHPコードでファイルをアップロードすると、PHP-FPMが起動します。 PHP-FPMはPHPコードのみを処理します。
listen.owner = site1
listen.group = www-data
listen.mode = 0660
Apacheプロセスの場合、.phpファイルをPHP-FPM unixソケットに渡す(書き込む)ことができます。
user = site1
group = site1
プールはPHPコードを実行する実際のユーザー/グループです。ユーザーsite1
必然ではないwww-data
攻撃はsite1
グループ権限を持つ別の仮想ホストディレクトリに書き込むことができるからですwww-data
。
問題の解決策はapache-mpm-itkです。
Apacheがグローバルに読み取ることを許可すると、すべてのマルチプロセスモジュール(MPM)を使用できます。 apache-mpm-itk はスレッド MPM と互換性がありません。唯一のオプションはmpm_prefork_moduleです。名前にもかかわらず、apache-mpm-itkは技術的にMPMではありません。これは改善されたプリフォークです。
PHP-FPMの各プールにopen_basedirディレクティブを設定することを忘れないでください。
2020年にはDebian 10(buster)をお勧めします。