发布一个完全不同的解决方案,以防有人遇到相同症状但不同问题的情况。在我的情况下,我正在运行启用了安全增强型 Linux 的 RHEL。
SELinux 可能会阻止 Nginx 访问套接字,即使文件系统权限看起来是正确的。要检查 SELinux 是否是罪魁祸首,可以使用以下命令将其临时置于宽容模式:
sudo set enforce 0
它是否有效?
如果有效,您可能希望对规则进行例外处理。
记得恢复!
sudo setenforce 1
Red Hat 有一个关于
创建 SELinux 策略的教程(RHEL 文档)。
这是一个捷径——如果您尝试启动 Nginx 但被拒绝访问 Gunicorn 套接字,那么拒绝将被记录在审计日志中。您可以使用这些日志生成自定义的 SELinux 策略模块。
sudo grep gunicorn /var/log/audit/audit.log | sudo audit2allow -M nginx_gunicorn
看着套接字的上下文,
ls -lZ /run/gunicorn.sock
,我看到了:
system_u:object_r:var_run_t:s0
而对于nginx,
ps -eZ | grep nginx
:
system_u:system_r:httpd_t:s0
注意上下文中的
var_run_t和
httpd_t。
cat nginx_gunicorn.te
显示了策略,它可能应该包含允许这两个上下文进行交互的内容。
allow httpd_t var_run_t:sock_file write;
在向SELinux守护程序祈祷的同时,您可以尝试启用该策略。
sudo semodule -i nginx_gunicorn.pp
sudo systemctl restart nginx
**如果这个方法不起作用,你可以尝试一种变体的神圣Grep咒语来搜索nginx的审计日志。首先,禁用你添加的策略,然后再创建并启用它。**
sudo semodule -r nginx_gunicorn
sudo grep nginx /var/log/audit/audit.log | sudo audit2allow -M nginx_gunicorn
sudo semodule -i nginx_gunicorn.pp
祝一路顺风。