Nginx 和 uWSGI:针对 502 Bad Gateway 问题的正确权限设置
Nginx and uWSGI: Proper permissions setup for 502 Bad Gateway issue
在 uWSGI 中,如果我将套接字位置更改为 /tmp/api
,网站将呈现。但是,如果我将套接字地址更改为 /srv/www/api/
,则会收到 502 网关错误。
我认为这是由于有关 /srv
文件夹和 Nginx/uWSGI 用户的权限问题。
在/var/log/nginx/error.log:
*1 connect() to unix:///srv/www/api/app.sock failed (2: No such file or directory) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: api.example.com, request: "GET / HTTP/2.0", upstream: "uwsgi://unix:///srv/www/api/app.sock:", host: "api.example.com"
Flask 项目代码位于/srv/www/api
。我以 username
用户身份登录。
权限:
$ ll -ld /srv/www/api/
drwxrwxr-x 4 www-data www-data 4096 Jun 28 20:52 /srv/www/api/
$ ll -ld /srv/www
drwxrwxr-x 4 username www-data 4096 Jun 27 21:41 /srv/www
$ ll -ld /srv
drwxrwxr-x 4 username username 4096 Jun 27 21:37 /srv
$ ll -ld /tmp
drwxrwxrwt 9 root root 4096 Jun 28 23:05 /tmp
用户组:
$ groups username
username : username sudo dev
$ groups www-data
www-data : www-data dev
$ grep 'dev' /etc/group
dev:x:1001:username,www-data
我有几个用户设置在 dev
组中。目标是让组中的用户能够读取和写入 /srv
而无需同时位于根组中(这是一种不好的做法吗?)。
/srv/www/api/app.ini:
[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = /tmp/app.sock
chmod-socket = 660
vacuum = true
die-on-term = true
/etc/nginx/sites/sites-available/api.example.com(位置部分):
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/app.sock;
}
有没有办法修复我的权限设置,以便:
- 可以在该文件夹中创建套接字
- dev 组中没有 sudo 的用户也可以读写
/srv
文件夹和子目录
我想通了。我最终将文件夹的所有者设置为:
chown -R username:www-data /srv/www/api
我还确保在每次更改后重新启动 systemctl 服务。我不记得之前做过那件事,所以这很可能是为什么即使在进行了所有更改之后也没有任何效果的原因。我只重启了 Nginx 而不是服务本身——负责创建套接字的服务。
重启systemctl服务:
sudo systemctl restart <service_name>
在 uWSGI 中,如果我将套接字位置更改为 /tmp/api
,网站将呈现。但是,如果我将套接字地址更改为 /srv/www/api/
,则会收到 502 网关错误。
我认为这是由于有关 /srv
文件夹和 Nginx/uWSGI 用户的权限问题。
在/var/log/nginx/error.log:
*1 connect() to unix:///srv/www/api/app.sock failed (2: No such file or directory) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: api.example.com, request: "GET / HTTP/2.0", upstream: "uwsgi://unix:///srv/www/api/app.sock:", host: "api.example.com"
Flask 项目代码位于/srv/www/api
。我以 username
用户身份登录。
权限:
$ ll -ld /srv/www/api/
drwxrwxr-x 4 www-data www-data 4096 Jun 28 20:52 /srv/www/api/
$ ll -ld /srv/www
drwxrwxr-x 4 username www-data 4096 Jun 27 21:41 /srv/www
$ ll -ld /srv
drwxrwxr-x 4 username username 4096 Jun 27 21:37 /srv
$ ll -ld /tmp
drwxrwxrwt 9 root root 4096 Jun 28 23:05 /tmp
用户组:
$ groups username
username : username sudo dev
$ groups www-data
www-data : www-data dev
$ grep 'dev' /etc/group
dev:x:1001:username,www-data
我有几个用户设置在 dev
组中。目标是让组中的用户能够读取和写入 /srv
而无需同时位于根组中(这是一种不好的做法吗?)。
/srv/www/api/app.ini:
[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = /tmp/app.sock
chmod-socket = 660
vacuum = true
die-on-term = true
/etc/nginx/sites/sites-available/api.example.com(位置部分):
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/app.sock;
}
有没有办法修复我的权限设置,以便:
- 可以在该文件夹中创建套接字
- dev 组中没有 sudo 的用户也可以读写
/srv
文件夹和子目录
我想通了。我最终将文件夹的所有者设置为:
chown -R username:www-data /srv/www/api
我还确保在每次更改后重新启动 systemctl 服务。我不记得之前做过那件事,所以这很可能是为什么即使在进行了所有更改之后也没有任何效果的原因。我只重启了 Nginx 而不是服务本身——负责创建套接字的服务。
重启systemctl服务:
sudo systemctl restart <service_name>