wsgi nginx error: permission denied while connecting to upstream
wsgi nginx error: permission denied while connecting to upstream
Whosebug 上似乎有很多关于此的问题,但不幸的是,没有任何问题对我有用。
我在 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 and this other one后,我更改了.ini
文件并添加了chown-socket
、chmod-socket
、uid
和gid
参数(也尝试只设置前两个,要么,要么,以及几个不同的权限设置——即使是最宽松的也不起作用)。
This one seemed promising, but I don't believe selinux
is installed on my Ubuntu (running sudo apt-get remove selinux
gives "Package 'selinux' is not installed, so not removed" and find / -name "selinux"
doesn't show anything). Just in case, though, I tried what this post也推荐。卸载 apparmor
(sudo apt-get install apparmor
) 也没有用。
每次我进行更改时,我 运行 sudo service nginx restart
,但我只看到 502 网关错误(以及读取日志时的权限被拒绝错误)。
这是我的 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
文件:
[uwsgi]
module = wsgi
master = true
processes = 5
socket = /home/user/myproject/web_server/myproject.sock
chown-socket=www-data:www-data
chmod-socket = 664
uid = www-data
gid = www-data
vacuum = true
die-on-term = true
(如果有帮助,这些是我的 Digital Ocean 机器的规格:Linux 3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
)
如果有什么我能做的,请告诉我,非常感谢。
我也跟着那个教程 运行 进入了同样的问题。经过大量的试验和错误后,以下步骤让我成功 运行 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 在后台
路径:unix:/PATH_TO_PROJECT/PROJECT.sock
应该放在 /tmp
这解决了我的问题。
在遵循了该线程中的所有建议后,我仍然遇到权限错误。最后遗漏的部分是更正 /etc/nginx/nginx.conf
文件中的 nginx user
:
# old: user nginx;
user www-data;
(13: 权限被拒绝)
这表明由于权限问题,Nginx 无法连接到 uWSGI 套接字。通常,当在受限环境中创建套接字或权限错误时,会发生这种情况。虽然 uWSGI 进程能够创建套接字文件,但 Nginx 无法访问它。
如果根目录 (/) 和套接字文件之间的任何位置的权限都有限,就会发生这种情况。我们可以通过将套接字文件的绝对路径传递给 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
我知道来晚了,但为了帮助其他人更快地解决问题,我发布了这个答案。希望对你有帮助,祝你好运。
如果用户 www-data 可能没有创建新文件的权限,则可能会发生这种情况
给定路径中的套接字,因此使用 root 用户。
将用户 www-data 更改为 nginx.conf 中的用户 root;
ex: #nginx.conf
#user www-data;
user root;
worker_processes auto;
pid /var/run/nginx.pid;
.............
如果您已经测试了所有权限但它仍然无法正常工作,则可能启用了 SELinux,这将导致相同的行为。
运行 getenforce
如果结果是 Enforcing
那也无济于事。
快速修复是禁用它,setenforce 0
但需要重新启动。
总结一下其他人说的解决 nginx permission denied 错误的方法(你可以看看 /var/log/nginx/error.log
通常是由于以下原因:
- 你在 nginx 没有权限的地方写入
.sock
文件
- SELinux 导致了问题
解决1:首先,不要按照这里server fault answer的建议在/tmp
写入.sock
文件,因为不同的服务在fedora中看到不同的/tmp
。你可以写在一些地方,比如~/myproject/mysocket.sock
。 nginx 用户必须有权访问我们的应用程序目录才能访问那里的套接字文件。默认情况下,CentOS 非常严格地锁定每个用户的主目录,因此我们将 nginx 用户添加到我们的用户组中,这样我们就可以打开授予访问权限所需的最小权限。
您可以使用以下命令将nginx 用户添加到您的用户组。将命令中的用户替换为您自己的用户名:
sudo usermod -a -G $USER nginx
现在,我们可以授予我们的用户组对我们的主目录的执行权限。这将允许 Nginx 进程在以下范围内输入和访问内容:
chmod 710 /path/to/project/dir
如果 permission denied
错误仍然存在:
那么 hack sudo setenforce 0
就可以了。
检查 nginx.conf 文件第一行的用户字段。默认情况下它是 www 数据。如果您以 root 身份登录,请在 nginx.conf 文件中将名称更改为用户 root。
2 件事帮助了我
我在 nginx 中的配置是正确的我也在文件夹中用我的两只眼睛看到了 /tmp/wsgi.sock,但仍然存在权限被拒绝或目录不存在的问题:
在文件/lib/systemd/system/nginx.service
中设置PrivateTmp=false
并重启nginx(不要忘记systemctl daemon reload
刷新配置)
运行命令setenforce 0
奖金material:
/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
端点提供服务
我在使用 Nginx 和 Gunicorn 部署 Flask 时也遇到了同样的问题。
我通过将 .Sock 文件放在 /temp 文件夹中解决了这个问题。
有很多因素会导致此特定错误,在我的例子中,是我的 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
就是这样。
Whosebug 上似乎有很多关于此的问题,但不幸的是,没有任何问题对我有用。
我在 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 and this other one后,我更改了.ini
文件并添加了chown-socket
、chmod-socket
、uid
和gid
参数(也尝试只设置前两个,要么,要么,以及几个不同的权限设置——即使是最宽松的也不起作用)。
This one seemed promising, but I don't believe selinux
is installed on my Ubuntu (running sudo apt-get remove selinux
gives "Package 'selinux' is not installed, so not removed" and find / -name "selinux"
doesn't show anything). Just in case, though, I tried what this post也推荐。卸载 apparmor
(sudo apt-get install apparmor
) 也没有用。
每次我进行更改时,我 运行 sudo service nginx restart
,但我只看到 502 网关错误(以及读取日志时的权限被拒绝错误)。
这是我的 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
文件:
[uwsgi]
module = wsgi
master = true
processes = 5
socket = /home/user/myproject/web_server/myproject.sock
chown-socket=www-data:www-data
chmod-socket = 664
uid = www-data
gid = www-data
vacuum = true
die-on-term = true
(如果有帮助,这些是我的 Digital Ocean 机器的规格:Linux 3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
)
如果有什么我能做的,请告诉我,非常感谢。
我也跟着那个教程 运行 进入了同样的问题。经过大量的试验和错误后,以下步骤让我成功 运行 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 在后台
路径:unix:/PATH_TO_PROJECT/PROJECT.sock
应该放在 /tmp
这解决了我的问题。
在遵循了该线程中的所有建议后,我仍然遇到权限错误。最后遗漏的部分是更正 /etc/nginx/nginx.conf
文件中的 nginx user
:
# old: user nginx;
user www-data;
(13: 权限被拒绝)
这表明由于权限问题,Nginx 无法连接到 uWSGI 套接字。通常,当在受限环境中创建套接字或权限错误时,会发生这种情况。虽然 uWSGI 进程能够创建套接字文件,但 Nginx 无法访问它。
如果根目录 (/) 和套接字文件之间的任何位置的权限都有限,就会发生这种情况。我们可以通过将套接字文件的绝对路径传递给 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
我知道来晚了,但为了帮助其他人更快地解决问题,我发布了这个答案。希望对你有帮助,祝你好运。
如果用户 www-data 可能没有创建新文件的权限,则可能会发生这种情况 给定路径中的套接字,因此使用 root 用户。 将用户 www-data 更改为 nginx.conf 中的用户 root;
ex: #nginx.conf
#user www-data;
user root;
worker_processes auto;
pid /var/run/nginx.pid;
.............
如果您已经测试了所有权限但它仍然无法正常工作,则可能启用了 SELinux,这将导致相同的行为。
运行 getenforce
如果结果是 Enforcing
那也无济于事。
快速修复是禁用它,setenforce 0
但需要重新启动。
总结一下其他人说的解决 nginx permission denied 错误的方法(你可以看看 /var/log/nginx/error.log
通常是由于以下原因:
- 你在 nginx 没有权限的地方写入
.sock
文件 - SELinux 导致了问题
解决1:首先,不要按照这里server fault answer的建议在/tmp
写入.sock
文件,因为不同的服务在fedora中看到不同的/tmp
。你可以写在一些地方,比如~/myproject/mysocket.sock
。 nginx 用户必须有权访问我们的应用程序目录才能访问那里的套接字文件。默认情况下,CentOS 非常严格地锁定每个用户的主目录,因此我们将 nginx 用户添加到我们的用户组中,这样我们就可以打开授予访问权限所需的最小权限。
您可以使用以下命令将nginx 用户添加到您的用户组。将命令中的用户替换为您自己的用户名:
sudo usermod -a -G $USER nginx
现在,我们可以授予我们的用户组对我们的主目录的执行权限。这将允许 Nginx 进程在以下范围内输入和访问内容:
chmod 710 /path/to/project/dir
如果 permission denied
错误仍然存在:
那么 hack sudo setenforce 0
就可以了。
检查 nginx.conf 文件第一行的用户字段。默认情况下它是 www 数据。如果您以 root 身份登录,请在 nginx.conf 文件中将名称更改为用户 root。
2 件事帮助了我
我在 nginx 中的配置是正确的我也在文件夹中用我的两只眼睛看到了 /tmp/wsgi.sock,但仍然存在权限被拒绝或目录不存在的问题:
在文件
/lib/systemd/system/nginx.service
中设置PrivateTmp=false
并重启nginx(不要忘记systemctl daemon reload
刷新配置)运行命令
setenforce 0
奖金material:
/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
端点提供服务
我在使用 Nginx 和 Gunicorn 部署 Flask 时也遇到了同样的问题。 我通过将 .Sock 文件放在 /temp 文件夹中解决了这个问题。
有很多因素会导致此特定错误,在我的例子中,是我的 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
就是这样。