我尝试使用此文档配置uWsgi,Django,Nginx: http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html
完成配置uwsgi.ini
文件,在/etc/uwsgi/vassals
创建一个软链接。
在最后一步失败:在系统启动时启动uWSGI 。
运行此命令时:
sudo /usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
我收到了这个错误:
clock source: unix
detected number of CPU cores: 1
current working directory: /etc/uwsgi/vassals
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
your processes number limit is 3813
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
bind(): Permission denied [core/socket.c line 227]
Tue May 27 05:29:26 2014 - [emperor] curse the uwsgi instance uwsgi.ini (pid: 1391)
Tue May 27 05:29:29 2014 - [emperor] removed uwsgi instance uwsgi.ini
如果我在没有sudo
的情况下运行此命令,一切正常。
我已添加用户" kk"进入群组" www-data",这里是uwsgi.ini
[uwsgi]
chdir = /home/kk/XXXXXXX
module = wsgi
home = /home/kk/XXXXXXX
master = true
processes = 10
socket = /home/kk/XXXXXXX/mysite.sock
chmod-socket = 666
vacuum = true
我想也许我在文件许可上犯了错误。有人有好主意吗?谢谢。
更新
官方文档是正确的,我按照步骤在另一个新的VPS中部署项目,没有发生错误。
答案 0 :(得分:14)
我遇到了这个问题。在不设置组和用户ID的情况下运行解决了问题。当我有更多时间来修复目录的文件权限时,我可能会重新审视这个问题,但它现在可以正常工作
/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals
修改强> 我有时间重温这个答案,我不得不说,在生产中运行uwsgi时,这是不是的良好做法。
本教程的问题在于它假定www-data
是用户,并且www-data
用户和组可以访问服务器上所需的所有文件;特别是套接字文件。将适当的参数替换为您的用户和组,并且您将会很高兴(并且不会在您的服务器上留下大量安全漏洞)。
因此,正确的命令(如果我是组ovangle
中的用户ovangle
)将是:
/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid ovangle --gid ovangle
最好创建一个具有成功运行服务器所需的特定权限的用户,但这样做是为读者留下的练习。
答案 1 :(得分:10)
我不知道为什么权限不起作用,但我遇到了同样的问题。
解决此问题的一种快速方法是将套接字移至/ tmp! (无论如何,这是一个保持套接字的合理位置......)
所以只需用:
更新uwsgi配置socket = /tmp/mysite.sock
和nginx-config with:
upstream django {
server unix:///tmp/mysite.sock;
}
它会开始工作!
答案 2 :(得分:3)
您向后执行了权限。
uwsgi作为www-data运行。
你的插座直接在kk的家中,可能是由kk用户和kk组拥有。
你这样做是为了让kk可以访问www-data拥有的所有内容,而不是www-data可以访问kk拥有的内容。
您想将www-data添加到kk的组中。这样,www-data可以到达kk的家中的套接字。
usermod www-data -aG kk
使用groups www-data
确认,然后您应该回复www-data : www-data kk
,表明www-data现在位于kk的主要群组中。
现在,如果kk的主文件夹权限至少具有' 6'对于组权限,www-data可以根据需要读取和写入套接字。例如。 chmod 660 /home/kk/XXXXXXX/mysite.sock
。
答案 3 :(得分:1)
这就是我如何让套接字安全启动。你是在运行virtualenv吗?当我使用我的应用程序获取virtualenv时,我收到了相同的错误消息,因为env中没有sudo。我必须deactivate
virtualenv然后在全球安装uwsgi。安装uWSGI之后我需要用sudo apt-get install uwsgi-plugin-python3
下载python3插件,并添加" plugins = python3"到我的uWSGI ini文件。毕竟,我能够用sudo / root eq启动uWSGI。 sudo uwsgi --ini mysite.ini
。
至于安全性,建议将这些行添加到ini文件中:
uid = www-data
gid = www-data
chmod-socket = 644
# Plus here's the plugin I mentioned
plugins = python3
要获得这些荣誉,www-data必须拥有将在其中创建mysite.sock文件的父目录,并且需要使用sudo启动uwsgi
命令。如果其中任何一个选项都关闭,则套接字将作为运行uwsgi
命令的用户创建。
答案 4 :(得分:0)
如果您可以使用Web端口套接字(如演示的第一部分)而不是unix套接字..您可以更改此信息。
# uwsgi.ini
socket = :8001
和... ..
# mysite_nginx.conf
upstream django {
# server unix:///home/teewuane/uwsgi-tutorial/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
您将避免许可问题。
答案 5 :(得分:0)
您询问的问题的原因是uwsgi正在尝试通过您配置的目录中的fastCGI协议创建一个unix套接字文件与网络服务器进行交互 / home / kk / XXXXXXX / 您应该将运行uwsgi的用户的写权限设置为目录 / home / kk / XXXXXXX /
答案 6 :(得分:0)
遇到完全相同的问题,在通过运行具有足够的套接字文件权限的用户和组解决它后,我意识到这可能是一个错误。
如果您可以使用uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
在当前用户中实际运行它,那会非常令人困惑,而在添加sudo
后,您会收到bind(): Permission denied
错误。
对此的唯一解释是,当您在没有sudo
的情况下运行它时,不知何故--uid www-data --gid www-data
部分不会工作,并且您实际上正在使用当前用户运行它有足够的渗透;添加sudo
后,--uid www-data --gid www-data
部分会再次神奇地工作,最终www-data
没有足够的权限来绑定套接字文件。
答案 7 :(得分:0)
我也有此错误。事实证明我的文件夹的所有者和组错误。里面的文件是正确的,所以我有一阵子没抓到它。
答案 8 :(得分:0)
想复活一个老问题,但我遇到了这个问题。
我找到了解决方案。我以前曾运行过uwsgi以root身份测试某些东西。后来我尝试将其作为www-data运行。最终,我发现统计信息服务器在/tmp/name.stats.sock
中创建了一个套接字文件,该文件是root拥有的,因此会导致uwsgi崩溃。我刚刚删除了它,现在就可以使用!
我希望这可以帮助任何陷入困境的人。
答案 9 :(得分:0)
我的错误是我希望如果将站点用户(USER
)添加到uwsgi
组中,它将能够写入/run/uwsgi
。但是事实证明,在这种情况下,补充组被忽略了。因此,我最终将套接字放在/run/nginx-PRJ/socket
(socket = /run/nginx-PRJ/socket
)上,将nginx
添加到站点用户组(GROUP
)和chmod-socket = 660
中。如果SELinux有效,则nginx
这样可以自动访问套接字:
# grep httpd_var_run_t /etc/selinux/targeted/contexts/files/file_contexts
/var/run/wsgi.* -s system_u:object_r:httpd_var_run_t:s0
/var/run/mod_.* system_u:object_r:httpd_var_run_t:s0
/var/run/httpd.* system_u:object_r:httpd_var_run_t:s0
/var/run/nginx.* system_u:object_r:httpd_var_run_t:s0
/var/run/apache.* system_u:object_r:httpd_var_run_t:s0
/var/run/php-fpm(/.*)? system_u:object_r:httpd_var_run_t:s0
/var/run/lighttpd(/.*)? system_u:object_r:httpd_var_run_t:s0
/var/lib/php/session(/.*)? system_u:object_r:httpd_var_run_t:s0
/var/lib/php/wsdlcache(/.*)? system_u:object_r:httpd_var_run_t:s0
/var/run/dirsrv/admin-serv.* system_u:object_r:httpd_var_run_t:s0
/var/opt/rh/rh-nginx18/run/nginx(/.*)? system_u:object_r:httpd_var_run_t:s0
/var/www/openshift/broker/httpd/run(/.*)? system_u:object_r:httpd_var_run_t:s0
/var/www/openshift/console/httpd/run(/.*)? system_u:object_r:httpd_var_run_t:s0
/opt/dirsrv/var/run/dirsrv/dsgw/cookies(/.*)? system_u:object_r:httpd_var_run_t:s0
/var/run/thttpd\.pid -- system_u:object_r:httpd_var_run_t:s0
/var/run/gcache_port -s system_u:object_r:httpd_var_run_t:s0
/var/run/cherokee\.pid -- system_u:object_r:httpd_var_run_t:s0
# yum install setools-console
# sesearch -A -C -s httpd_t -c sock_file -p write | grep httpd_var_run_t
allow httpd_t httpd_var_run_t : sock_file { ioctl read write create getattr setattr lock append unlink link rename open } ;
# man sesearch
-A, --allow
Search for allow rules.
-C, --show_cond
Print the conditional expression and state for all conditional rules found. This
option has no effect on unconditional rules.
-s NAME, --source=NAME
Find rules with type/attribute NAME as their source.
-p P1[,P2,...] --perm=P1[,P2...]
Find rules with at least one of the specified permissions. Multiple permissions may
be specified as a comma separated list; it is recommended that this list be quoted
for shells that interpret comma as a special character.
为确保目录始终存在,我使用了systemd-tmpfiles
:
/etc/tmpfiles.d/PRJ.conf
:
d /run/nginx-PRJ 0750 USER GROUP
# systemd-tmpfiles --create PRJ.conf
我在暴君模式下运行CentOS 7和uwsgi-2.0.17.1-2.el7
。在这种情况下,无需指定gid
,uid
。它们取自ini文件的权限。