我有一个 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 文件在创建时自动获得正确的上下文(或者至少在创建过程中自动重置其上下文)?