linux - nginx uWSGI 连接到 unix 套接字失败

标签 linux sockets unix nginx centos7

我正在尝试将 CentOS 7 上的 uWSGI Flask 应用程序与 nginx 连接,/var/log/nginx/error.log 中的 nginx 错误日志给出:

2017/10/04 22:35:29 [crit] 24381#0: *54 connect() to unix:/var/www/html/CON29Application1/socket.sock failed 
(13: Permission denied) while connecting to upstream, client: 80.44.138.51, 
server: 188.226.174.121, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://unix:/var/www/html/CON29Application1/socket.sock:",
host: "188.226.174.121", referrer: "http://188.226.174.121/"

uWSGI 错误日志显示我认为 uWSGI 运行正确:

WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x1a1ebd0 pid: 26364 (default app)

这是我在 Linux 上的第一次部署,但在这里阅读另一个 SO 答案:Nginx can't access a uWSGI unix socket on CentOS 7 这个人回答了他自己的问题,并引用了关于 SE Linux 的博客文章 http://axilleas.me/en/blog/2013/selinux-policy-for-nginx-and-gitlab-unix-socket-in-fedora-19/ ,说 SE Linux 是问题所在。我真的不明白什么在 SE Linux 上的什么地方运行,解决方案似乎涉及更改 nginx audit.log 中的“AVC”消息,我有点头疼了!

正如博文所提到的,我确实在/var/log/audit/audit.log 收到了提及拒绝写入和 nginx 的 AVC 消息:

 type=AVC msg=audit(1507153878.777:559609): avc:  denied  { write } for  pid=24381 
comm="nginx" name="socket.sock" dev="vda1" ino=715975 
scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:var_t:s0 tclass=sock_file

但是作为一个新手,有没有更简单的方法,也许我做错了,可以用 chmod 权限或 chown 来修复?感谢任何想法。 套接字权限:

ls -l socket.sock
srwxrwxrwx. 1 will nginx 0 Oct  4 17:02 socket.sock

最佳答案

好吧,我的 SELinux 设置最终确实有所不同,更改它让我的 Web 应用程序真正工作了!我看了另一个教程:https://www.digitalocean.com/community/tutorials/an-introduction-to-selinux-on-centos-7-part-1-basic-concepts

我必须说,从一个 Linux 新手的角度来看,我看到其他一些帖子提到 Digital Ocean 的教程有多好(我当然与他们没有任何从属关系..)。

对于阅读本文的其他新手,SELinux 代表安全增强型 Linux,现在显然包括在许多 Linux 发行版中,包括 CentOS 7。它的存在是为了增加某种安全性。我运行了他们在此页面上列出的最简单的命令:getenforce 哪个输出

执行

正如 Digital Ocean 教程所说,“SELinux 目前应该被禁用”,我的没有 - 不知道为什么,我没有触及 SELinux 上的任何东西,因为直到 2 天前才知道它是什么。

无论如何,按照他们的建议尝试最简单的修复:

vi /etc/sysconfig/selinux

或者实际上我认为我没有权限以我的用户身份执行此操作,必须以 root 身份执行此操作:

sudo vi /etc/sysconfig/selinux

此文件中实际上只有 2 个设置。所以重置:

SELINUX=permissive

然后尝试使用 reboot 作为他们重启服务器的建议,所以很明显 SE Linux 将开始记录一些安全的胡言乱语,即我认为这意味着它记录了安全错误和入侵系统的人而不是而不是阻止他们。重新启动然后要求我提供 Cloud something 密码,我认为这一定是我的 sudo 密码,它不是,然后在尝试这几次后崩溃了,所以重新启动它我认为这是重新启动是吗?我的网站现在可以正常运行了。

正如我在这里提到的另一篇文章,我认为这意味着 SELinux 在设置为 enforcing 时会做一些事情来阻止 nginx 运行。但是这里的另一篇文章对于新手来说似乎比像我在这里所做的那样只更改一个设置更复杂,更有可能产生更多问题。如果我可以进一步开发这个或另一个应用程序,我认为需要找到具有更多 Linux 经验的人。

关于linux - nginx uWSGI 连接到 unix 套接字失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46575792/

相关文章:

python - PyQt 中的服务器-客户端连接

java - 通过发送多个数据包通过线性回归计算带宽

java - 将IP从服务器发送到客户端。 Java网络

java - CentOS 7 上的 Tomcat 8 管理器访问被拒绝(错误 403)而不提示输入登录名/密码

linux - 重新连接后的 GNU screen 滚动历史记录

node.js - 如何执行 "sudo nvm"?

shell - 如何使用 Head 和 Tail 打印文件的特定行

linux - 如何过滤前九个字符至少包含一个 "x"的行

python - 通过 SSH 命令从 Mac OS X 计算机启动远程脚本

linux - 比格骨黑;错误的 SPI 频率