单个uwsgi进程服务多个Django应用

来源:互联网 发布:js统计下载次数 编辑:程序博客网 时间:2024/05/22 11:40
      之前使用Nginx+uwsgi部署Django应用的方式是每个应用对应一个uwsgi进程,如果项目过多就会非常不便,
现在想使uwsgi像php-fpm那样只启动一个进程就能处理所有的请求,现总结方法如下:

1.Nginx类似这么配置:
location / {  include uwsgi_params;  uwsgi_pass 127.0.0.1:9090;
  #uwsgi_pass unix:///tmp/uwsgi.sock;}
上面的对应的uwsgi的启动方式为:uwsgi -s 127.0.0.1:9090 -M -p 2 -t 30 -R 10000 -d /root/uwsgi.log
下面对应的uwsgi的启动方式为:uwsgi -s /tmp/uwsgi.sock -M -p 2 -t 30 -R 10000 -d /root/uwsgi.log
2.Django项目的创建这里就不再赘述了,假设大家都会创建Django项目了。
   网上说的要想一个uwsgi服务于多个Django项目必须要使用虚拟环境,但是完全不必,不过为了便于管理还是建议开一个虚拟环境,
不过完全不必一个Django项目对应一个虚拟环境,一个虚拟环境可以对应很多个应用。
我这里有两个项目,一个是发布系统,一个是签到系统,都位于虚拟环境中,位置为:
/root/.virtualenvs/capistrano/djcode/capistrano   发布系统
/root/.virtualenvs/capistrano/djcode/qiandao    签到系统
我现在用的uwsgi的启动方式是:
uwsgi -s /tmp/uwsgi.sock -M -p 2 -t 30 -R 10000 -d /root/uwsgi.log --vhost
参数:
-s 指定socket文件或者监听的IP和端口
-M 采用一个主进程和N个子进程的方式,子进程的数目由-p指定
-p 指定子进程的数目
-t 超时时间
-R 达到10000个request后重启uwsgi进程
-d 以服务的方式启动,后面跟uwsgi的日志文件
--vhost 这个参数是关键,需要加上

3.下面给出具体的Nginx配置:
   server {        listen       80;        server_name  cap.test.com;        location / {                include uwsgi_params;                uwsgi_pass unix:///tmp/uwsgi.sock;                uwsgi_param UWSGI_PYHOME /root/.virtualenvs/capistrano/djcode/capistrano;   # 这一行非必须                uwsgi_param UWSGI_SCRIPT cap_wsgi;   # 这是一个模块,即Python文件,位于上面的目录下,内容见下面cap_wsgi.py文件,和manage.py同级                uwsgi_param UWSGI_CHDIR /root/.virtualenvs/capistrano/djcode/capistrano;    # 这一行必须        }    }    server {        listen       80;        server_name  qiandao.xizhi.com;
        location ^~ /dist {     # 这里是静态文件所在的地方
                add_header Cache-Control max-age=21600;
                root /root/.virtualenvs/capistrano/bootstrap/;
        }        location / {
                include uwsgi_params;                uwsgi_pass unix:///tmp/uwsgi.sock;                uwsgi_param UWSGI_PYHOME /root/.virtualenvs/capistrano/djcode/qiandao; # 这一行非必须                uwsgi_param UWSGI_SCRIPT qiandao_wsgi;  # 这是一个模块,即Python文件,位于下面的目录下,内容见下面qiandao_wsgi.py文件                uwsgi_param UWSGI_CHDIR /root/.virtualenvs/capistrano/djcode/qiandao;        }    }
重启Nginx就可以了
cap_wsgi.py文件的内容:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE","capistrano.settings")   # 这个是对应的发布系统里的设置
from django.core.handlers.w    sgi import WSGIHandler                                                                                      
application = WSGIHandler()

qiandao_wsgi.py文件的内容:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE","qiandao.settings")   # 这个是对应的签到系统的设置
from django.core.handlers.wsgi import WSGIHandler                                                                                      
application = WSGIHandler()
另外,可以把uwsgi的启动参数写成ini配置文件,然后写一个启动脚本:
配置文件为/etc/uwsgi.ini:(参数大致和命令行启动的参数一样)
[uwsgi]
socket = /tmp/uwsgi.sock
vhost = true
workers = 2
master = true
reload-mercy = 30
max-requests = 10000
pidfile = /tmp/uwsgi.pid
daemonize = /root/uwsgi.log
启动文件为/etc/init.d/uwsgi:
#! /bin/bash
# Written by Tuxinhang(tuxinhang@gongchang.com)  2014/3/27
# chkconfig 2345
uwsgi_bin=/root/.virtualenvs/capistrano/bin/uwsgi
uwsgi_ini=/etc/uwsgi.ini
pid_file=/tmp/uwsgi.pid
. /etc/init.d/functions
start() {
    [ -x $uwsgi_bin ] || exit 5
    [ -f $uwsgi_ini ] || exit 6
    uwsgi_pid=`cat $pid_file 2> /dev/null`
    echo -n $"Starting uwsgi: "
    if [ -n "$uwsgi_pid" ]; then
        echo -n "uwsgi is already running..."
        echo_failure
        echo
    else
        $uwsgi_bin --ini $uwsgi_ini >& /dev/null
        [ $? -eq 0 ] && echo_success || echo_failure
        echo 
    fi
}
stop() {
    uwsgi_pid=`cat $pid_file 2> /dev/null`
    echo -n $"Stopping uwsgi: "
    if [ -z "$uwsgi_pid" ]; then
        echo -n "uwsgi already stopped!"
        echo_failure
        echo
    else
        $uwsgi_bin --stop $pid_file        rm -f $pid_file
        echo_success
        echo
    fi
}
status() {
    if [ -n "$uwsgi_pid" ]; then
        echo $"uwsgi is running..."
    else
        echo $"uwsgi is not running"
    fi
} 
status() {    $uwsgi_bin --reload $pid_file}case "$1" in
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    stop
    start
    ;;reload)    reload    ;; 
status)
    status
    ;;
*)
    echo $"Usage: $0 {start|stop|restart|reload|status}"
    exit 2
esac
配置完之后可以通过service uwsgi start|stop|restart|reload|status进行启动控制

0 0