如何从 Apache 提供文档根目录之外的图像?
我有一个 devops 流程,它运行 UI 测试构建,生成屏幕截图并将其存储到/tmp/images
。
当构建失败时,屏幕截图会标识 UI 中发生错误的位置。因此,为了帮助开发人员看到失败,我希望我的构建服务器(在 Apache 上运行)能够提供这些 png 屏幕截图,以便每个人都可以轻松访问它们。由于这些图像与仅持续一两天的构建记录相关联,因此存储这些图像/tmp
是可以的,并且我有一个单独的 cronjob 用于根据时间戳清除它们。
根据文档,为了在文档根目录之外提供文件,我需要做的就是添加类似以下内容的内容:
Alias "/images" "/tmp/images"
添加到我的站点配置文件中。但是,在将其添加到我的标签末尾<VirtualHost>
并重新启动 Apache 后,我仍然无法访问存储在/tmp/images
Apache 中的任何 png 文件,它只是返回“无此类资源”。
Apache 主要只是作为 Buildbot 服务器的代理工作,所以我的站点配置文件如下所示:
<VirtualHost *:80>
ServerName mydomain.com
ServerAdmin [email protected]
<Location />
AuthType Basic
AuthName "admin"
AuthUserFile /var/www/htpasswd
Require valid-user
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)$
RewriteRule . - [E=RU:%1,NS]
RequestHeader set REMOTE_USER %{RU}e
</Location>
<Location /ws>
ProxyPass ws://127.0.0.1:8010/ws
ProxyPassReverse ws://127.0.0.1:8010/ws
</Location>
ProxyPass /ws !
ProxyPass / http://127.0.0.1:8010/
ProxyPassReverse / http://127.0.0.1:8010/
SetEnvIf X-Url-Scheme https HTTPS=1
ProxyPreserveHost On
Alias "/images" "/tmp/images"
</VirtualHost>
为什么 Apache 无法提供任何服务/tmp/images
?
答案1
为什么 Apache 无法提供 /tmp/images 中的任何内容?
可能有几个原因。
/tmp
传统上,它是所有本地服务和用户的共享空间。多年来,它也是各种服务安全问题的一大根源。由于可猜测的 /tmp 临时文件而导致的符号链接攻击和 DoS 漏洞很常见。
这就是为什么 systemd 引入了PrivateTmp=yes
环境。
如果为 true,则为执行的进程设置一个新的文件系统命名空间,并在其中挂载私有目录
/tmp/
和/var/tmp/
不与命名空间外的进程共享的目录。这对于确保对进程临时文件的访问安全很有用,但/tmp/
使得通过或进行进程间共享变得/var/tmp/
不可能。如果为 true,服务停止后,这些目录中由服务创建的所有临时文件都将被删除。默认为 false。可以使用该指令在同一个私有
/tmp/
命名空间内运行两个或多个单元/var/tmp/
JoinsNamespaceOf=
换句话说,/tmp/images
您的 devops 进程写入的内容无法被 apache httpd 看到,因为它在具有私有 /tmp 的命名空间中运行。
解决方案:将图像写入不同的目录中,但不写入 /tmp。
或者:让 devops 进程也在命名空间中运行,其中将命名空间与JoinsNamespaceOf=
Apache httpd 无法访问/tmp
、selinux、apparmor 等可能还有其他原因。
ProxyPass / http://127.0.0.1:8010/
Alias "/images" "/tmp/images"
这ProxyPass
指令可能优先于Alias
指令。
您可能需要对 /images 执行之前对 /ws 执行的操作,将该路径从 ProxyPass / 中排除
Alias "/images" "/tmp/images"
ProxyPass /ws !
ProxyPass /images !
ProxyPass / http://127.0.0.1:8010/