使用mpm-itk以不同用户身份运行Apache的实战指南

本文详细介绍了在WordPress开发和托管环境中,如何利用Apache的mpm-itk模块为每个虚拟主机配置独立的运行用户,以解决文件权限问题,并讨论了Docker容器和Exim4邮件发送功能相关的配置难点与解决方案。

如何通过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允许您在每个虚拟主机下使用独立的用户ID(uid)和组ID(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相关的问题

它无法在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的mail函数将无法与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

添加指令:

1
LimitUIDRange 0 2000

最后:

1
2
a2enconf mpm_itk_with_php_mail
systemctl restart apache2.service

(请注意,此方法可能对生产使用不安全)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计