在没有sudo的情况下启动uWSGI服务器

时间:2015-01-26 16:16:22

标签: flask uwsgi

我正在尝试使用uWSGI部署我的Flask应用程序,但如果没有sudo,我似乎无法做到这一点。

这是我的开始脚本:

#!/bin/bash
set -v
set -e
cd /var/hpit/hpit_services
/var/hpit/hpit_services/env/bin/uwsgi --http [::]:80 --master --module wsgi --callable app --processes 4 --daemonize ../log/uwsgi.log --pidfile ../server_pid_file.pid
echo server started

以下是我在日志中的内容:

*** Starting uWSGI 2.0.9 (64bit) on [Mon Jan 26 15:53:26 2015] ***
compiled with version: 4.8.2 on 23 January 2015 20:35:44
os: Linux-3.18.1-x86_64-linode50 #1 SMP Tue Jan 6 12:14:10 EST 2015
nodename: <<blocked out>>
machine: x86_64
clock source: unix
detected number of CPU cores: 2
current working directory: /var/hpit/hpit_services
writing pidfile to ../server_pid_file.pid
detected binary path: /var/hpit/hpit_services/env/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
your processes number limit is 7962
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 764]

Core / socket.c第764行有:

if (bind(serverfd, (struct sockaddr *) &uws_addr, addr_len) != 0) {
    if (errno == EADDRINUSE) {
        uwsgi_log("probably another instance of uWSGI is running on the same address (%s).\n", socket_name);
    }
    uwsgi_error("bind()");
    uwsgi_nuclear_blast();
    return -1;
}

但我没有运行uWSGI的实例。这似乎是一个权限问题。我对/ var / hpit,/ var / hpit / hpit_services(应用程序的位置)和/ var / hpit / log的权限是bsauer:www-data。我的用户是bsauer。

如果我将sudo -E附加到我的启动脚本中调用uWSGI二进制文件的行,它似乎开始正常,但我读到服务器不应该以sudo身份启动。我在工作中继承了这个系统管理员角色,对所有这些都有点新鲜。

这是我的预感/思考:

  • 我知道uWSGI可以作为一个用户启动并进入另一个用户角色,但我并不真正理解这个过程,所以也许这就是问题。
  • uWSGI正试图访问我不知道的系统上的某些内容

感谢您的帮助,如有必要,我可以提供更多详细信息。

修改

奇怪的是,我的/var/hpit/log/uwsgi.log文件归bsauer所有:bsauer,而不是bsauer:www-data或www-data:www-data,正如我所料......

EDIT2

好的,通过查看页面底部的http://projects.unbit.it/uwsgi/wiki/Example,看起来问题是在端口80上运行。我将其更改为8080,但它仍然以bsauer运行,我不认为我想要。

1 个答案:

答案 0 :(得分:1)

据我所知,这是我提出的,如果有人想把这个更清晰的系统管理员语言我很乐意编辑。

解决方案毕竟与日志无关。问题是端口80(默认HTTP端口)受系统保护,只有root可以绑定到该端口。没有sudo,它不会让你绑定。绑定到另一个端口,如端口8080,工作正常。

我想绑定到端口80,但仍然将服务器作为www-data运行,因此我最终关注了此页面的最底层:http://projects.unbit.it/uwsgi/wiki/Example。基本上,端口80的套接字是共享的,uWSGI可以首先以sudo的身份访问它,然后下载到www-data中来运行服务器。

在调用uWSGI二进制文件之前,我仍然必须使用sudo -E,因为它需要root权限来更改uWSGI的用户和组ID,但是没关系,因为最终结果是服务器然后在非常有限的www-中运行数据用户。

最后,我的服务器启动行是: sudo -E /var/hpit/hpit_services/env/bin/uwsgi --shared-socket [::]:80 --http =0 --uid 33 --gid 33 --master --module wsgi --callable app --processes 4 --daemonize ../log/uwsgi.log --pidfile ../server_pid_file.pid