uWSGI 皇帝配置

Posted

技术标签:

【中文标题】uWSGI 皇帝配置【英文标题】:uWSGI Emperor configuration 【发布时间】:2015-08-18 08:31:25 【问题描述】:

我一直在努力使用 uWSGI 将烧瓶应用程序部署到我的服务器 皇帝模式一整天,不知道为什么它不起作用。我在这里阅读了所有其他 uWSGI Emperor 模式问题,并在 #uwsgi 和邮件列表中提出了问题,但没有得到回复。

我的设置是 nginx (1.4.6-1ubuntu3.2),uWSGI==2.0.10 通过 pip 安装 进入 virtualenv、Flask==0.10.1 和 Python 3.4.0。监督是 负责启动Emperor进程。

当我手动启动绑定到 TCP 端口的烧瓶应用程序以及手动运行 uwsgi 时,烧瓶应用程序本身工作正常:

uwsgi -s /tmp/oauthsvc.sock -w wsgi --stats /tmp/oauthsvc-stats.sock

我确实注意到,即使我认为我将封臣配置为使用 unix socket,它在启动时报告它正在监听http://127.0.0.1:5000/

我用 strace 验证了 nginx 正在打开套接字,并且权限 该套接字的数量为 777:

srwxrwxrwx 1 oauthsvc oauthsvc 0 Jun  3 18:34 /tmp/oauthsvc.sock
srwxrwxrwx 1 oauthsvc oauthsvc 0 Jun  3 18:08 /tmp/oauthsvc-stats.sock

但连接最终只是超时。

我的配置和一些日志输出如下。

nginx 配置非常简单:

server                                                                     
    listen 80;                                                              
    server_name default;                                                    

    location = /robots.txt   access_log off; log_not_found off;           
    location = /favicon.ico  access_log off; log_not_found off;           

    location /                                                             
        include uwsgi_params;                                               
        uwsgi_pass unix:/tmp/oauthsvc.sock;                                 
                                                                           
 

supervisor 使用以下命令启动 emporer 进程:

[program:oauthsvc-emperor]                                                      
command=/services/oauthsvc/services/oauthsvc/bin/uwsgi --emperor /services/oauthsvc/etc/uwsgi/vassals --die-on-term --uid 1005 --gid 1005 --logto /services/oauthsvc/var/log/uwsgi/emperor.log
user=oauthsvc                                                                   
autostart=true                                                                  
autorestart=true                                                                
redirect_stderr=true 

vassal 的 ini 文件如下所示:

[uwsgi]                                                                         
# do not turn on master mode when spawned by emperor                            
# http://***.com/questions/15055002/uwsgi-master-with-emperor-spawns-two-emperors
#master = true                                                                  
protocol = uwsgi                                                                
socket = /tmp/oauthsvc.sock                                                     
stats = /tmp/oauthsvc-stats.sock                                                
daemonize = /services/oauthsvc/var/log/uwsgi/oauthsvc.log                       
chdir = /services/oauthsvc/services/oauthsvc/oauthsvc-server                    
wsgi-file = wsgi.py                                                             
callable = app                                                                  
chmod-socket = 777                                                              
uid = 1005                                                                      
gid = 1005                                                                      
virtualenv = /services/oauthsvc/services/oauthsvc                               
# PYTHONHOME                                                                    
home = /services/oauthsvc/services/oauthsvc                                     
#env =                                                                           
processes = 4
vacuum = true                                                                   
# If you start uWSGI without threads, the Python GIL will not be enabled, so    
# threads generated by your application will never run unless you include:      
enable-threads = true
harakiri = 30

最后,wsgi.py:

#!/usr/bin/env python3                                                          

from oauthsvc.flask.server import parse_args, configured_app                    

args = parse_args()                                                             
app = configured_app(args.config, debug=args.debug)                             
app.run()  

皇帝日志:

*** Starting uWSGI 2.0.10 (64bit) on [Wed Jun  3 18:34:25 2015] ***
compiled with version: 4.8.2 on 03 June 2015 18:32:12
os: Linux-3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015
nodename: ip-10-0-1-224
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /
detected binary path: /services/oauthsvc/src/bs-oauth-svc.2015-06-03.183113/bin/uwsgi
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 30038
your memory page size is 4096 bytes
detected max file descriptor number: 1024
*** starting uWSGI Emperor ***
*** has_emperor mode detected (fd: 6) ***
[uWSGI] getting INI configuration from oauthsvc.ini

附庸日志:

*** Starting uWSGI 2.0.10 (64bit) on [Wed Jun  3 18:34:25 2015] ***
compiled with version: 4.8.2 on 03 June 2015 18:32:12
os: Linux-3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015
nodename: ip-10-0-1-224
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /services/oauthsvc/etc/uwsgi/vassals
detected binary path: /services/oauthsvc/src/bs-oauth-svc.2015-06-03.183113/bin/uwsgi
chdir() to /services/oauthsvc/services/oauthsvc/oauthsvc-server
your processes number limit is 30038
your memory page size is 4096 bytes
 *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers ***
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to UNIX address /tmp/oauthsvc.sock fd 3
Python version: 3.4.0 (default, Apr 11 2014, 13:08:40)  [GCC 4.8.2]
Set PythonHome to /services/oauthsvc/services/oauthsvc
Python main interpreter initialized at 0x135d4d0
python threads support enabled
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 363840 bytes (355 KB) for 4 cores
*** Operational MODE: preforking ***
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

【问题讨论】:

【参考方案1】:

uWSGI 邮件列表上的 Brian 为我解决了这个问题。答案是:不要在 wsgi.py 文件中调用 app.run() !我知道这会很尴尬。

【讨论】:

以上是关于uWSGI 皇帝配置的主要内容,如果未能解决你的问题,请参考以下文章

uwsgi + nginx 配置

uWSGI实战之Django配置经验

nginx +uwsgi + django配置

uWSGI实战之Django配置经验

部署(5.安装配置uwsgi)

uwsgi+nginx 的简单配置