无法以root身份运行uwsgi,“bind():权限被拒绝”

时间:2014-05-27 09:39:41

标签: linux nginx uwsgi

我尝试使用此文档配置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中部署项目,没有发生错误。

10 个答案:

答案 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/socketsocket = /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。在这种情况下,无需指定giduid。它们取自ini文件的权限。