Nginx.http.sock 被重新创建,selinux 上下文不正确

我有一个 Discourse 实例,通过 Apache 反向代理并经由 socket 通信,具体配置如此处所述。

我启用了 SELinux。为了让 httpd 能够使用该 socket,我按照建议为该 socket 设置了允许 httpd 读写的安全上下文:

semanage fcontext -a -t httpd_sys_rw_content_t /var/discourse/shared/standalone/nginx.http.sock
restorecon /var/discourse/shared/standalone/nginx.http.sock

这确实有效,效果很好!

(附注:更合适的上下文是否应该是 httpd_var_run_t?因为 socket 本身并非“内容”,且 httpd 为其他运行时基础设施使用的正是此上下文。)

然而,每当 Discourse 容器重启时,socket 文件都会以原始上下文重新创建,而非我设置的新上下文。因此,在 Apache 能够与 Discourse 通信之前,我必须手动执行 restorecon。这很容易忘记,从而导致论坛无法访问。我曾想过编写一个 cron 脚本来定期运行 restorecon,以免手动操作,但这显然是一种笨拙的变通方案。

我该如何确保 socket 文件在创建时自动获得正确的上下文(或者至少在创建过程中自动重置其上下文)?

我会编写一个重启脚本来启动容器并更改权限(以及另一个用于重新构建的脚本)。

重启脚本无法捕捉的情况是通过管理员面板从网页执行升级——这正是我上次遇到的问题,也促使我思考是否存在一种能解决所有情况的修复方案。

我还想说明一下:我不明白为什么 socket 在创建时无法获得正确的上下文。SELinux 显然知道 socket 的默认上下文应该是什么,因为运行 restorecon 命令可以验证这一点。(此外,我可以在 /etc/selinux/targeted/contexts/files/file_contexts.local 中看到通过运行 semanage fcontext 创建的 socket 条目。)