如何使用mpm-itk让Apache以不同用户身份运行
在WordPress开发和WordPress托管中,让Apache以不同用户身份运行非常有用。在Debian/Ubuntu系统中,Apache默认以www-data用户运行。然而,这在WordPress安装中并不方便:
在生产服务器上:
- 许多WordPress文件必须由SSH/SFTP用户拥有才能应用更改
- 大多数WordPress文件必须由Web服务器用户拥有,以便应用WordPress更新
在开发环境中更是如此:
除了上述原因外,许多WordPress文件必须由PC用户拥有,以便:
- 使用IDE处理代码
- 使用git(如果需要)
- 轻松进行备份
使用mpm-itk让Apache以不同用户身份运行
这个问题有几种解决方案,其中之一是mpm-itk。根据官方页面描述:
apache2-mpm-itk(简称mpm-itk)是Apache Web服务器的一个MPM(多处理模块)。mpm-itk允许您在每个虚拟主机下使用独立的uid和gid运行——简而言之,一个虚拟主机的脚本和配置文件不再需要被所有其他虚拟主机读取。
只需安装:
1
|
apt-get install libapache2-mpm-itk
|
并在您的虚拟主机配置文件中使用以下指令:
1
2
3
|
<IfModule mpm_itk_module>
AssignUserId your_user your_group
</IfModule>
|
示例配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<VirtualHost *:443>
ServerName example.com
ServerAdmin you@your_email.com
DocumentRoot /var/www/html/example.com
<IfModule mpm_itk_module>
AssignUserId your_user your_group
</IfModule>
<Directory /var/www/html/example.com>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined
# 压缩配置
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|ico|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .pdf$ no-gzip dont-vary
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
SSLEngine on
SSLCertificateFile /etc/ssl-dev/your_cert.pem
SSLCertificateKeyFile /etc/ssl-dev/your_cert_key.pem
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
|
Docker中的问题
mpm-itk无法在Docker容器中运行。在Apache的error.log中会出现如下错误:
1
|
[mpm_itk:warn] [pid 1783] (itkmpm: pid=1783 uid=33, gid=33) itk_post_perdir_config(): setgid(1000): Operation not permitted
|
解决方案是以不同的权限运行容器(安全性较低——不推荐在生产环境中使用):
1
2
3
4
|
docker run \
--name "my-container" \
--cap-add=SYS_NICE --cap-add=DAC_READ_SEARCH \
vendor/image
|
更多信息请参考相关文档。
PHP邮件功能和Exim4的问题
如果您安装了libapache2-mpm-itk,PHP邮件功能无法与exim4配合工作(!)
当WordPress尝试发送电子邮件时,exim会崩溃,在paniclog(/var/log/exim4/paniclog)中您会看到类似这样的内容:
1
|
2023-01-30 19:25:27 unable to set gid=33 or uid=0 (euid=0): forcing real = effective
|
根据mpm-itk的官方页面和相关资源,解决方案是在Apache配置中添加LimitUIDRange 0 2000。
创建配置文件:
1
|
nano /etc/apache2/conf-available/mpm_itk_with_php_mail.conf
|
添加指令:
最后启用配置并重启Apache:
1
2
|
a2enconf mpm_itk_with_php_mail
systemctl restart apache2.service
|
(可能对生产使用不安全)