如何在 Apache 中从 /tmp 提供静态图像

如何在 Apache 中从 /tmp 提供静态图像

如何从 Apache 提供文档根目录之外的图像?

我有一个 devops 流程,它运行 UI 测试构建,生成屏幕截图并将其存储到/tmp/images

当构建失败时,屏幕截图会标识 UI 中发生错误的位置。因此,为了帮助开发人员看到失败,我希望我的构建服务器(在 Apache 上运行)能够提供这些 png 屏幕截图,以便每个人都可以轻松访问它们。由于这些图像与仅持续一两天的构建记录相关联,因此存储这些图像/tmp是可以的,并且我有一个单独的 cronjob 用于根据时间戳清除它们。

根据文档,为了在文档根目录之外提供文件,我需要做的就是添加类似以下内容的内容:

Alias "/images" "/tmp/images"

添加到我的站点配置文件中。但是,在将其添加到我的标签末尾<VirtualHost>并重新启动 Apache 后,我仍然无法访问存储在/tmp/imagesApache 中的任何 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/

相关内容