我正在尝试将 uWSGI 与 nginx 结合使用。我遇到的根本问题是,当我尝试连接到 uWSGI 套接字文件时,nginx 提示“没有这样的文件或目录”。
当我使用以下设置时,我期望套接字文件的权限会发生变化。但是,并没有。它继续显示uwsgi:uwsgi
。
nginx 的错误是*17 connect() to unix:/tmp/myapp.sock failed (2: No such file or directory) while connecting to upstream, client: 192.168.1.122, server: , request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/tmp/myapp.sock:", host: "192.168.1.123:81"
myapp.ini (uwsgi)
[uwsgi]
chdir = /var/local/myapp
plugins = python
module = wsgi:app
home = /var/local/virtualenv/myapp
file = main.py
daemonize = /var/log/uwsgi/myapp.log
pidfile = /var/run/uwsgi/myapp.pid
socket = /tmp/%n.sock
chmod-socket = 777
chown-socket = webuser:nginx
uid = webuser
gid = nginx
vacuum = true
文件权限
srwxrwxrwx. 1 uwsgi uwsgi 0 Jul 3 12:43 myapp.sock
myapp.conf(nginx)
server {
listen 81;
access_log /var/log/nginx/myapp_access.log;
error_log /var/log/nginx/myapp_error.log;
location / {
try_files $uri @yourapplication;
}
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:/tmp/myapp.sock;
}
}
我也尝试过这个:
usermod -a -G nginx uwsgi
usermod -a -G uwsgi nginx
useradd webuser
usermod -a -G nginx webuser
usermod -a -G uwsgi webuser
我尝试了这个:
grep avc /var/log/audit/audit.log | audit2allow -M nginx
semodule -i nginx.pp
编辑
然后我尝试将 sock 文件移动到/var/run/uwsgi/myapp.sock
。在这种情况下,nginx 告诉我:connect() to unix:/var/run/uwsgi/myapp.sock failed (13: Permission denied) while connecting to upstream
编辑2
仅针对 kix,我尝试使用 TCP 端口而不是套接字文件。在这种情况下,我可以使用curl -XGET http://localhost:8000
并从 uwsgi/python 获取正确的 HTTP 响应。但是,在 nginx 日志中(当尝试通过浏览器进入 nginx 时,我得到:*1 connect() failed (111: Connection refused) while connecting to upstream
nginx 文件配置如下:uwsgi_pass uwsgi://localhost:8000;
答案1
您不能将用于进程间通信的套接字放入/tmp
。
RHEL/CentOS 7、Fedora 等,使用私人 /tmp 目录/tmp
,这意味着为其配置的每个守护进程(在本例中至少是 nginx)都有与其他守护进程完全不同的视图。
要解决该问题,请将套接字放在另一个目录中或使用 TCP 连接。
audit2allow
在没有了解情况的情况下,不要盲目行事。你可能会打开一些安全漏洞。