在Nginx上使用uWSGI部署Pyramid的问题

时间:2012-11-25 20:20:36

标签: python nginx pyramid web-deployment init

我似乎在部署Pyramid Web应用程序时遇到了一些小问题。问题似乎在我的init脚本中,我用它来启动我的Web应用程序。出于某种原因,除非我的套接字设置为具有“nobody.nobody”权限或者在我的uwsgi init脚本之后启动Nginx,否则uWSGI将无法工作。我更改了我的init脚本以反映这些更改,但它似乎没有起作用。 init脚本(或启动uwsgi的部分)如下所示:

#!/sbin/runscript
args="--ini-paste /var/www/pyramid/app1/development.ini"
command="/var/www/pyramid/bin/uwsgi"
pidfile="/var/run/uwsgi.pid"
sock="/var/tmp/proxy/uwsgi.sock"
nobody="nobody.nobody"

start() {
  ebegin "Starting app1"
  chown $nobody $sock
  start-stop-daemon --start --exec $command -- $args \
      --pidfile $pidfile 
  chown $nobody $sock
  einfo "app1 started"
  eend $?
}

我的Nginx配置如下:

location / { 
    include uwsgi_params;
    uwsgi_pass unix:///var/tmp/proxy/uwsgi.sock;
    uwsgi_param SCRIPT_NAME "" ;
}  

我的ini文件包含以下内容:

[uwsgi]
socket = /var/tmp/proxy/uwsgi.sock
pidfile = /var/run/uwsgi.pid
master = true
processes = 1
home = /var/www/pyramid
daemonize = /var/log/uwsgi.log
virtualenv = /var/www/pyramid/
pythonpath = /var/www/pyramid/bin

Nginx会启动,然后uwsgi将启动。在/ var / tmp / proxy中执行“ls -la”会发现uwsgi.sock的权限设置为“root root”而不是“nobody nobody”。但是,重新启动Nginx将解决问题,无论套接字的权限是什么(但必须首先启动Nginx)。

因此,我可以通过以下方式实现这一目标:

  • 启动uwsgi
  • 启动nginx
  • 重启nginx

  • 启动nginx
  • 启动uwsgi
  • 重启nginx

我完全不知道为什么这不起作用。如果有人有任何建议我会非常感激!

2 个答案:

答案 0 :(得分:0)

您可以使用以下设置更改ini文件中其套接字的权限:

chmod-socket = 777 # socket permission
gid = www-data # socket group 
uid = www-data # socket user

答案 1 :(得分:0)

要考虑的另一件事是您是否实际上希望uWSGI以root身份运行。如果将--uid和--gid参数传递给uwsgi,则uwsgi将伪装成其他用户(最好是非root用户)。

例如,nginx通常以www-data用户和www-data组的身份运行。因此,如果您将wsgi应用程序设置为以“ --gid www-data”运行,然后使用“ --chmod-socket 020”向套接字文件至少添加组写入权限,则nginx将能够写入插座,您就可以做生意。

请参阅有关以下主题的博客文章:http://blog.jackdesert.com/common-hurdles-to-deploying-uwsgi-apps-part-1