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

Hun*_*ger 23 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
Run Code Online (Sandbox Code Playgroud)

如果我没有运行此命令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
Run Code Online (Sandbox Code Playgroud)

我想也许我在文件许可上犯了错误.有人有好主意吗?谢谢.


更新:

官方文档是正确的,我按照步骤在另一个新的VPS中部署项目,没有发生错误.

ova*_*gle 18

我遇到了这个问题.在不设置组和用户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

最好创建一个具有成功运行服务器所需的特定权限的用户,但这仍然是读者的练习.


Nor*_*ing 10

我不知道为什么权限不起作用,但我遇到了同样的问题.

解决这个问题的一个快速方法是将套接字移动到/ tmp!(无论如何,这是一个保持套接字的合理位置......)

所以只需用以下命令更新uwsgi配置:

socket          = /tmp/mysite.sock
Run Code Online (Sandbox Code Playgroud)

和nginx-config:

upstream django {
    server unix:///tmp/mysite.sock;
}
Run Code Online (Sandbox Code Playgroud)

它会开始工作!


tee*_*ane -1

如果您可以使用 Web 端口套接字(如演示的第一部分)而不是 unix 套接字..您可以更改此..

# uwsgi.ini
socket = :8001
Run Code Online (Sandbox Code Playgroud)

和这个..

# 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)
}
Run Code Online (Sandbox Code Playgroud)

您将避免权限问题。