因此,我有一个 Ruby on Rails 应用程序,由/var/www/
拥有nginx
并具有755
权限。该应用程序旨在通过 puma 进行部署。
就像这样:
rvmsudo -u nginx bundle exec puma -e production -d -b unix:///var/www/my_app/tmp/sockets/my_app.socket
套接字的权限为:
srwxrwxrwx. 1 nginx nginx 0 Nov 6 09:43 tmp/sockets/my_app.sock
该进程当然归 nginx 所有:
nginx 7335 0.0 8.8 536744 90388 ? Sl 09:43 0:00 puma 2.9.2 (unix:///var/www/my_app/tmp/sockets/my_app.sock)
我的nginx
配置配置如下:
upstream my_app {
server unix:///var/www/my_app/tmp/sockets/my_app.sock;
}
server {
listen 80;
server_name www.example.com example.com;
root /var/www/my_app/public;
location / {
proxy_pass http://my_app;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
所有这些,但我的申请仍然被拒绝权限。
connect() to unix:///var/www/my_app/tmp/sockets/my_app.sock failed (13: Permission denied) while connecting to upstream,
我也以 root 用户身份尝试了所有这些操作。但仍然不起作用。
有人知道我做错了什么吗?
答案1
哈利路亚!这一切都是 SELinux 策略问题,特别是与 nginx 有关。经过几个小时的挖掘,我通过运行以下命令发现了此类拒绝:
sudo grep nginx /var/log/audit/audit.log
这些信息如下:
type=AVC msg=audit(1415283617.227:1386): avc: denied { write } for pid=1683 comm="nginx" name="my_app.sock" dev="tmpfs" ino=20657 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:var_run_t:s0 tclass=sock_file
为了解决这个问题,我找到了一篇很棒的文章腋生叶。
为了创建包含必要权限的策略,我必须安装audit2allow
并运行:
grep nginx /var/log/audit/audit.log | audit2allow -M nginx
完成后,我通过以下方式最终确定了政策:
semodule -i nginx.pp
不幸的是,我必须运行此过程两次才能访问我的应用程序,因为需要进一步的策略。尽管如此,这里还是有解决方案。
另外,还有一篇很好的文章谢尔盖·克雷尔科夫。
故事的寓意是:学习 SELinux。