StackOverflow似乎有很多关于此的问题,但遗憾的是没有任何对我有用。
我在nginx上获得了一个502坏网关,以及日志中的以下内容:connect() to ...myproject.sock failed (13: Permission denied) while connecting to upstream
我在wsgi
上正在运行nginx
和ubuntu
,我一直关注this guide from Digital Ocean。我显然在wsgi
工作后正确配置了uwsgi -s myproject.sock --http 0.0.0.0:8000 --module app --callable app
,但我一直收到nginx
权限被拒绝错误,我不明白为什么:
在遇到this question和this other one后,我更改了.ini
文件并添加了chown-socket
,chmod-socket
,uid
和{{ 1}}参数(也尝试设置前两个,或者,以及几个不同的权限设置 - 甚至最宽松的也不起作用。)
This one seemed promising,但我不认为我的Ubuntu上安装了gid
(正在运行selinux
赠送“未安装包'selinux',因此未删除”和{{1没有显示任何东西)。不过,为了以防万一,我也尝试了this post推荐的内容。卸载sudo apt-get remove selinux
(find / -name "selinux"
)也无效。
每次进行更改时,我都会运行apparmor
,但我只看到502网关错误(以及读取日志时出现权限被拒绝错误)。
这是我的sudo apt-get install apparmor
配置文件:
sudo service nginx restart
nginx
档案:
server {
listen 80;
server_name 104.131.110.156;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/user/myproject/web_server/myproject.sock;
}
}
.conf
档案:
description "uWSGI server instance configured to serve myproject"
start on runlevel [2345]
stop on runlevel [!2345]
setuid user
setgid www-data
env PATH=/root/.virtualenvs/my-env/bin
chdir /home/user/myproject/web_server
exec uwsgi --ini /home/user/myproject/web_server/myproject.ini
(如果有帮助,这些是我的数字海洋机器的规格:.ini
)
如果我有什么可以做的,请告诉我,非常感谢。
答案 0 :(得分:7)
我也遵循了该教程并遇到了同样的问题。经过相当多的试验和错误后,以下步骤使我能够成功运行uWSGI和nginx:
我的nginx.config
文件:
server {
listen 80;
server_name localhost;
location / { try_files @yourapplication; }
location @yourapplication; {
include uwsgi_params;
uwsgi_pass unix:/PATH_TO_PROJECT/PROJECT.sock;
}
}
我的.ini
文件工作得不好,所以我决定利用uWSGI提供的广泛论据。这是我使用的:
uwsgi -s /PATH_TO_PROJECT/PROJECT.sock -w wsgi:app -H /PATH_TO_PROJECT/venv --http-processes=4 --chmod-socket=666 --master &
其中:
-s /PATH_TO_PROJECT/PROJECT.sock
=我的.sock
文件的位置
-w wsgi:app
=我的wsgi.py
文件的位置,app
是我的Flask对象的名称
-H /PATH_TO_PROJECT/venv
=虚拟环境的位置
--http-processes=4
=要创建的uWSGI的http进程数
--chmod-socket=666
=在套接字上设置的权限
--master
=允许uWSGI与其主进程管理器一起运行
&
=在后台运行uWSGI
希望这有帮助!
答案 1 :(得分:6)
路径:unix:/PATH_TO_PROJECT/PROJECT.sock
应放在/tmp
这解决了我的问题。
答案 2 :(得分:5)
在遵循此主题中的所有建议后,我仍然遇到权限错误。最后遗漏的部分是更正user
文件中的nginx /etc/nginx/nginx.conf
:
# old: user nginx;
user www-data;
答案 3 :(得分:4)
(13:许可被拒绝)
这表明由于权限问题,Nginx无法连接到uWSGI套接字。通常,在受限制的环境中创建套接字或权限错误时会发生这种情况。虽然uWSGI进程能够创建套接字文件,但Nginx无法访问它。
如果根目录(/)与套接字文件之间的任何位置的权限有限,则会发生这种情况。我们可以通过将socket文件的绝对路径传递给namei命令来查看套接字文件及其每个父目录的权限和所有权值:
namei -nom /PATH_TO_YOUR_SOCKET_FILE/YOUR_SOCKET.sock
输出应与此类似(您的案例可能有不同的文件夹名称)
f: /run/uwsgi/firstsite.sock
drwxr-xr-x root root /
drwxr-xr-x root root run
drwxr-xr-x sammy www-data uwsgi
srw-rw---- sammy www-data firstsite.sock
输出显示每个目录组件的权限。通过查看权限(第一列),所有者(第二列)和组所有者(第三列),我们可以确定允许哪种类型的访问套接字文件。
在上面的示例中,通向套接字文件的每个目录都具有全局读取和执行权限(目录的权限列以r-x而不是---结尾)。 www-data组对套接字本身具有组所有权。通过这些设置,Nginx进程应该能够成功访问套接字。
如果导致套接字的任何目录不归www-data组所有,或者没有世界读取和执行权限,则Nginx将无法访问套接字。通常,这意味着配置文件有错误。
因此,您解决了此问题,但使用此命令为所有上层文件夹提供了权限:
chmod 755 directory_name
我知道现在已经很晚了,但为了帮助其他人更快地克服这个问题,我已经发布了这个答案。希望它有所帮助,祝你好运。
答案 4 :(得分:1)
如果您已经测试了所有权限但仍然无法正常工作,那么可能启用了SELinux,这将导致相同的行为。
运行getenforce
,如果结果为Enforcing
,则无效。
快速修复是禁用它,setenforce 0
但需要重新启动。
答案 5 :(得分:1)
总结其他人为解决nginx中的权限被拒绝错误而所说的话(您可以查看/var/log/nginx/error.log
的原因通常是由于以下原因:
.sock
文件要解决1:首先,不要按照此处server fault answer的建议在.sock
处写入/tmp
文件,因为不同的服务在fedora中会看到不同的/tmp
。您可以在~/myproject/mysocket.sock
之类的地方写东西。 Nginx用户必须有权访问我们的应用程序目录才能访问那里的套接字文件。默认情况下,CentOS会非常严格地锁定每个用户的主目录,因此我们将nginx用户添加到用户组中,以便我们随后可以打开授予访问权限所需的最低权限。
您可以使用以下命令将nginx用户添加到您的用户组中。在命令中用您自己的用户名替换用户:
sudo usermod -a -G $USER nginx
现在,我们可以向我们的用户组授予对主目录的执行权限。这将允许Nginx进程输入和访问以下内容:
chmod 710 / path / to / project / dir
如果permission denied
错误仍然存在:
那么骇客sudo setenforce 0
就可以解决问题。
答案 6 :(得分:0)
如果用户www-data可能没有创建新的权限,则可能会发生这种情况 套接字在给定路径中,所以使用root用户。 将用户www-data重新用于nginx.conf中的用户root;
ex: #nginx.conf
#user www-data;
user root;
worker_processes auto;
pid /var/run/nginx.pid;
.............
答案 7 :(得分:0)
检查nginx.conf文件第一行中的用户字段。默认情况下是www-data。如果您以root用户身份登录,请在nginx.conf文件中将名称更改为root用户。
答案 8 :(得分:0)
两件事帮助了我
我在nginx中配置正确,我也用两只眼睛在文件夹中看到了/tmp/wsgi.sock,但是仍然存在权限被拒绝或目录不存在:
在文件/lib/systemd/system/nginx.service
中设置PrivateTmp=false
并重新启动nginx(不要忘记systemctl daemon reload
以刷新配置)
运行命令setenforce 0
奖励材料:
/usr/local/bin/uwsgi --chdir /home/biohazard/myproject -s /tmp/wsgi.sock -w api:app --chmod-socket=777 --master --thunder-lock --http-processes=2
,其中api:app
中的api代表/home/biohazard/myproject/api.py
和
location = /api { rewrite ^ /api/; }
location /api { try_files $uri @api; }
location @api {
include uwsgi_params;
uwsgi_pass unix:/tmp/wsgi.sock;
}
nginx仅在为我的http://example.org/api
端点提供服务的地方
答案 9 :(得分:0)
使用Nginx和Gunicorn部署Flask时,我也遇到了同样的问题。 我通过将.Sock文件放在/ temp文件夹中解决了这个问题。
答案 10 :(得分:0)
很多原因都可能导致此特定错误,就我而言,是导致我的PROJECT.socket
文件所有权的原因。
代替:
srwxr-xr-x 1 yourusername yourusername 0 Nov 4 22:32 PROJECT.sock
它应该是:srwxr-xr-x 1 www-data www-data 0 Nov 4 22:32 PROJECT.sock
只需运行sudo chown www-data:www-data PROJECT.sock
就可以了。