uWSGI相关

 http://heipark.iteye.com/blog/1750970

What is WSGI ?

WSGI is the Web Server Gateway Interface. It is a specification for web servers and application servers to communicate with web applications (though it can also be used for more than that)

 

WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。

 

关于WSGI协议看这里:WSGI

 

what is uWSGI ?

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。

Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

 

WSGI vs uwsgi(小写) vs uWSGI ?

uwsgi同WSGI一样是一种通信协议,而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

 

关于uwsgi协议看这里:The uwsgi protocol

 

有了uWSGI为什么还需要nginx?

nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。

 

why uWSGI ?

how to use uWSGI ?

 

安装uWSIG

 

pip install uwsgi

 

 

 

参考:

http://wsgi.readthedocs.org/en/latest/what.html

http://stackoverflow.com/questions/7739810/wsgi-vs-uwsgi-with-nginx

 

 

 

 http://www.zhihu.com/question/21016845

重启 uwsgi 进程显然是为了让新代码生效, 如果你仅是在开发环境调试程序,直接使用django 的 manager.py runserver 可以自动重载修改的py文件, 生产环境也不会存在你在上面不停修改py文件而需要不停重载uwsgi的需求吧.

另外可以参考 uwsgi 的控制信号 Managing the uWSGI server

如果要重载 uwsgi 的程序, 只需要发送一个 SIGHUP 的信号给 uwsgi 的主进程即可.

uwsgi --reload uwsgi.pid

其中uwsgi.pid是进程的pid文件

uwsgi本身就是这样的机制,主要还是为了效率。它有一个reload的参数,可以指定某个文件,当文件发生变化时,会自动重启。你也可以考虑用这个。

 

 

 

 

 

 

              ====================================================================================

 http://django-china.cn/topic/101/

Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。

在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。

可见,uwsgi的作用就类似一个桥接器。起到桥梁的作用。

NOTE:不使用nginx,只使用uwsgi+django也是可以实现WEB服务的。uwsgi也可以直接处理WEB请求。

为了完成上述的方式部署,我将分成两篇文章来分别进行阐述。

  • 第一步先解决uwsgi与django的桥接。解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器。

  • 第二步解决uwsgi与Nginx的桥接。通过nginx与uwsgi的桥接,打通nginx与django的连通,从而比较完美的实现django的部署。

本文将分成五步来详细阐述uwsgi+django的部署方式。nginx+uwsgi+django的部署将在下一篇 文章中阐述。

本文大纲:

  • 环境介绍
  • 安装uwsgi
  • 测试uwsgi
  • 配置django
  • 连接django和uwsgi,实现简单的WEB服务器。

环境介绍

  1. Ubuntu 12.04.1 LTS
  2. django 1.4.2

安装uwsgi

1.安装pip

可以参考这篇文章:http://www.jsxubar.info/install-pip.html

2.安装uwsgi

$ export LDFLAGS="-Xlinker --no-as-needed"
$ pip install uwsgi

测试uwsgi

在你的机器上写一个test.py

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World"

然后执行shell命令:

uwsgi --http :8001 --wsgi-file test.py

访问网页:

http://127.0.0.1:8001/

看在网页上是否有Hello World

配置django

NOTE:

请保证你的django项目是正常使用的。可以使用

python manage.py runserver 0.0.0.0:8002

来测试一下你的django项目是否能正常跑起来。

请保证你的django程序已经关闭。

编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下。

注意: 编写文件时需要注意语句os.environ.setdefault。比如,如果你的项目为mysite,则你的语句应该是 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/usr/bin/env python
# coding: utf-8

import os
import sys

# 将系统的编码设置为UTF8
reload(sys)
sys.setdefaultencoding('utf8')

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

连接django和uwsgi,实现简单的WEB服务器。

我们假设你的Django项目的地址是/home/work/src/sites/testdjango1/testdjango/mysite,

然后,就可以执行以下命令:

uwsgi --http :8000 --chdir /home/work/src/sites/testdjango1/testdjango/mysite --module django_wsgi

这样,你就可以在浏览器中访问你的Django程序了。所有的请求都是经过uwsgi传递给Django程序的。

最后:

关于如何将uwsgi与Nginx连接,可以期待下篇文章 《五步教你实现使用Nginx+Uwsgi+Django方法部署Django程序(下)》

最后面,请大家要支持Django中国社区哦,单靠一两个人是不行的,一起推广一下,让Django社区更有力量哈!更有人气哈!

推广链接: http://django-china.cn/

参考、解释及其它

  • wsgi: WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。

    关于WSGI协议看这里:WSGI

  • uWSGI: http://uwsgi-docs.readthedocs.org/en/latest/index.html uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

  • uwsgi: uwsgi同WSGI一样是一种通信协议,而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

    uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

    关于uwsgi协议看这里:The uwsgi protocol

  • 有了uWSGI为什么还需要nginx?

    nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。

  • 参考文献:http://heipark.iteye.com/blog/1750970

END

Last edited by Django中国社区 (2013-05-12 23:35)

http://django-china.cn/topic/124/

在上一篇文章《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》中,阐述了如何只使用uWSGI来部署Django程序。

当然,单单只有uWSGI是不够的,在实际的部署环境中,Nginx是必不可少的工具。

在本篇文章中,我将一直延用“N步法”的风格来阐述如何将uWSGI与Nginx做连接来部署Django程序。并在最后,会较为完整的阐述本社区的部署方法。

本文大纲:

  • 环境介绍
  • 配置uWSGI
  • 配置Nginx
  • Nginx+uWSGI+Django的实现方式
  • 一些建议

环境介绍

  1. Ubuntu 12.04.1 LTS
  2. django 1.4.2
  3. nginx/1.2.6
  4. uWSGI 1.4.4

关于uWSGI的安装可参见上一篇文章 上一篇文章《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》

我们假定你已经安装好Nginx了。

配置uWSGI

在上一篇文章《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》中,我们是直接使用命令行来启动uWSGI,在实际部署环境中,我们常用的是配置文件的方式,而非命令行的方式。我的一般做法是用命令行来测试是否uWSGI安装成功,然后用配置文件来真正部署。

另外,为了实现Nginx与uWSGI的连接,两者之间将采用soket来通讯方式。

在本节中,我们将使用uWSGI配置文件的方式来改进uWSGI的启动方式。

假定你的程序目录是 /home/work/src/sites/testdjango1/testdjango/mysite

我们将要让Nginx采用8077端口与uWSGI通讯,请确保此端口没有被其它程序采用。

注意,请确定你在上一节《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》中的django_wsgi.py文件已经存在了。

新建一个XML文件:

djangochina_socket.xml,将它放在 /home/work/src/sites/testdjango1/testdjango/mysite 目录下:

<uwsgi>
    <socket>:8077</socket>
    <chdir>/home/work/src/sites/testdjango1/testdjango/mysite</chdir>
    <module>django_wsgi</module>
    <processes>4</processes> <!-- 进程数 --> 
    <daemonize>uwsgi.log</daemonize>
</uwsgi>

在上面的配置中,我们使用 uwsgi.log 来记录日志,开启4个进程来处理请求。

这样,我们就配置好uWSGI了。

配置Nginx

我们假设你将会把Nginx程序日志放到你的目录/home/work/var/test/logs/下,请确保该目录存在。

我们假设你的Django的static目录是/home/work/src/sites/testdjango1/testdjango/collectedstatic/ , media目录是/home/work/src/sites/testdjango1/testdjango/public/media/,请确保这些目录存在。

我们假设你的域名是 www.you.com (在调试时你可以设置成你的机器IP)

我们假设你的域名端口是 80(在调试时你可以设置一些特殊端口如 8070)

基于上面的假设,我们为conf/nginx.conf添加以下配置

server {

        listen   80;
        server_name www.you.com;
        access_log /home/work/var/test/logs/access.log;
        error_log /home/work/var/test/logs/error.log;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
         include        uwsgi_params;
         uwsgi_pass     127.0.0.1:8077;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location /static/ {
            alias  /home/work/src/sites/testdjango1/testdjango/collectedstatic/;
            index  index.html index.htm;
        }

        location /media/ {
            alias  /home/work/src/sites/testdjango1/testdjango/public/media/;
        }
    }

在上面的设置后,可以让Nginx来处理静态文件(/static/ 和 /media/ )。非静态文件请求Nginx会发给 socket 8077,然后让uWSGI来进行处理。

Nginx+uWSGI+Django的实现方式

在完成上面配置后,需要按以下步骤来做:

  1. 重启Nginx服务器,以使Nginx的配置生效。

    nginx -s  reload
    

    重启后检查Nginx日志是否有异常。

  2. 启动uWSGI服务器

    cd /home/work/src/sites/testdjango1/testdjango/mysite
    
    uwsgi -x djangochina_socket.xml
    

    检查日志 uwsgi.log 是否有异常发现。

  3. 访问服务

    基于上面的假设你的域名是www.you.com

    因此,我们访问 www.you.com,如果发现程序与 单独使用Django启动的程序一模一样时,就说明成功啦!

  4. 关闭服务的方法

    将uWSGi进程杀死即可。

一些建议

  1. uWSG配置文件的进程数,可以根据实际情况分配。不要开得太大,否则机器可能会内存耗用太高。一般来说,对于一个小社区来说,4个进程已经足够了。

  2. 一般情况下,可以编写一下 stop.sh 脚本 来关闭uWSGI。

最后

最后面,请大家要支持Django中国社区哦,单靠一两个人是不行的,一起推广一下,让Django社区更有力量哈!更有人气哈!

推广链接: http://django-china.cn/

END

 

 

                     =========================================================================

http://blog.chinaunix.net/uid-26638338-id-3552185.html

最近学习了python框架,并且利用框架做了个后台管理系统,经过综合的对比,最后决定让管理后台运行在nginx+uwsgi构架上。
  性能方面,uWSGI既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据说该协议大约是fcgi协议的10倍那么快(暂时无法论证)。想深入了解uwsgi的同学可以访问官方wiki http://projects.unbit.it/uwsgi/wiki。
  uwsgi的另一个强大之处在于可以支持很多种编程语言,包括python(最初支持的就是python)、lua、perl、ruby、Erlang、PHP、GO、JVM。并且可以同时支持多种框架。本文是以python的django框架为例,同时uwsgi还支持python的web.py、flask、web2py等框架。
  以下开始部署安装:

  1、安装并配置nginx

  nginx安装暂时不介绍,可自行搜索下装法。新版nginx都已经默认支持uwsg。

  这里的nginx安装目录是在/usr/local/nginx
  打开nginx.conf,并加入一个主机配置

点击(此处)折叠或打开

  1. server {
  2.       server_name www.mysite.com;
  3.       location / {
  4.           set $app mysite;
  5.           include uwsgi_params;
  6.           uwsgi_pass 127.0.0.1:3031;
  7.        }
  8.   }


  2、安装并配置uwsgi

  下载uwsgi 

点击(此处)折叠或打开

  1. wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
  解压安装

点击(此处)折叠或打开

  1. tar zxvf uwsgi-latest.tar.gz
  2. cd uwsgi-1.9
  3. make
  4. cd ..
  编译不出现错误的话,当前目前下会出现一个二进制uwsgi文件。为了方便管理,把uwsgi-1.9目录拷贝到/usr/local/目录

点击(此处)折叠或打开

  1. mv uwsgi-1.9 /usr/local/uwsgi
 uwsgi可执行文件直接加参数即可运行,但为了方便管理,需要配置两个文件.
  1. cd /usr/local/uwsgi
  2. mkdir -p conf
  3. cd conf
  4. cat >server.ini <<EOF
  5. [uwsgi]
  6. socket = 127.0.0.1:3031           #建立的socket端口
  7. chdir = /home/server/mysite/    #django项目所在目录
  8. pythonpath = /usr/local/python2.7/      #python目录
  9. env = DJANGO_SETTING_MODULE=mysite.settings.py
  10. processes = 4
  11. threads = 2
  12. wsgi-file = /usr/local/uwsgi/conf/serverlist.py #另一个配置文件的位置
  13. EOF
  14. cat > server.py<<EOF
  15. #serverlist.py
  16. import sys
  17. import os
  18. from django.core.handlers.wsgi import WSGIHandler
  19. mysite_dir = '/home/server/mysite/'
  20. #sys.path.append(os.path.abspath(os.path.dirname(__file__)))
  21. sys.path.append(mysite_dir)
  22. os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
  23. application = WSGIHandler()
  24. EOF

  3、启动uwsgi并访问网站

  执行 /usr/local/uwsgi/uwsgi /usr/local/uwsgi/conf/server.ini
      打开www.mysite.com (视自己网址而定)即可看到网站页面。

个人觉得php最方便的就是deployment了,只要把php文件丢到支持php的路径里面,然后访问那个路径就能使用了;无论给主机添加多少php应用,只要把目录改好就没你的事了,完全不用关心php-cgi运行得如何,deployment极为方便。

反观python,部属起来真是头痛,常见的部署方法有:

  1. fcgi:用spawn-fcgi或者框架自带的工具对各个project分别生成监听进程,然后和http服务互动
  2. wsgi:利用http服务的mod_wsgi模块来跑各个project

无论哪种都很麻烦,apache的mod_wsgi配置起来很麻烦,内存占用还大,如果要加上nginx作为静态页面的服务器那就更麻烦了;反正我的应用基本上到后来都是是各个project各自为战,且不说管理上的混乱,这样对负载也是不利的,空闲的project和繁忙的project同样需要占用内存,很容易出现站着茅坑不拉屎的现象。

如果有个啥东东能像php-cgi一样监听同一端口,进行统一管理和负载平衡,那真是能省下大量的部署功夫。偶然看到了uWSGI,才发现居然一直不知道有那么方便地统一部署工具。

uWSGI,既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据说该协议大约是fcgi协议的10倍那么快,有个比较见下图

shootout

uWSGI的主要特点如下,其中一些功能让我感动得泪流满面

  1. 超快的性能
  2. 低内存占用(实测为apache2的mod_wsgi的一半左右)
  3. 多app管理(终于不用冥思苦想下个app用哪个端口比较好了-.-)
  4. 详尽的日志功能(可以用来分析app性能和瓶颈)
  5. 高度可定制(内存大小限制,服务一定次数后重启等)

总而言之uwgi是个部署用的好东东,正如uWSGI作者所吹嘘的:

If you are searching for a simple wsgi-only server, uWSGI is not for you, but if you are building a real (production-ready) app that need to be rock-solid, fast and easy to distribute/optimize for various load-average, you will pathetically and morbidly fall in love (we hope) with uWSGI.

正式开工

uwsgi的文档虽然蛮多也很详细,但是他们网站的排版真是让人无语,粗粗看上去根本不知道文档在哪里。其实是在这里:http://projects.unbit.it/uwsgi/wiki/Doc

0.安装uwsgi

ubuntu有uwsgi的ppa

add-apt-repository ppa:stevecrozz/ppa
apt-get update
apt-get install uwsgi

1. 用uwsgi代替mod_wsgi

nginx的整体配置说来话长,我也不再罗嗦了,假设已经明白nginx的基本配置,那么uwsgi就类似这么配置:

location / {
  include uwsgi_params
  uwsgi_pass 127.0.0.1:9090
}

这就是把所有url传给9090端口的uwsgi协议程序来互动。

再到project目录建立myapp.py,使得application调用框架的wsgi接口,比如web.py就是

......
app = web.application(urls, globals())
application = app.wsgifunc()

再比如django就是

.......
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

然后运行uwsgi监听9090,其中-w后跟模块名,也就是刚才配置的myapp

uwsgi -s :9090 -w myapp

运行网站发现已经部署完成了。

2. uwsgi的参数

以上是单个project的最简单化部署,uwsgi还是有很多令人称赞的功能的,例如

并发4个线程

uwsgi -s :9090 -w myapp -p 4

主控制线程+4个线程

uwsgi -s :9090 -w myapp -M -p 4

执行超过30秒的client直接放弃

uwsgi -s :9090 -w myapp -M -p 4 -t 30

限制内存空间128M

uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128

服务超过10000个req自动respawn

uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000

后台运行等

uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log

更多用法见文档:http://projects.unbit.it/uwsgi/wiki/Doc

3.为uwsgi配置多个站点

为了让多个站点共享一个uwsgi服务,必须把uwsgi运行成虚拟站点:去掉“-w myapp”加上”-vhost”

uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log --vhost

然后必须配置virtualenv,virtualenv是python的一个很有用的虚拟环境工具,这样安装

apt-get install python-setuptools
easy_install virtualenv

然后设置一个/多个app基准环境

virtualenv /var/www/myenv

应用环境,在此环境下安装的软件仅在此环境下有效

source /var/www/myenv/bin/activate
pip install django
pip install mako
...

最后配置nginx,注意每个站点必须单独占用一个server,同一server不同location定向到不同的应用不知为何总是失败,我猜也算是一个bug。

   server {
        listen       80;
        server_name  app1.mydomain.com;
        location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:9090;
                uwsgi_param UWSGI_PYHOME /var/www/myenv;
                uwsgi_param UWSGI_SCRIPT myapp1;
                uwsgi_param UWSGI_CHDIR /var/www/myappdir1;
        }
    }
    server {
        listen       80;
        server_name  app2.mydomain.com;
        location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:9090;
                uwsgi_param UWSGI_PYHOME /var/www/myenv;
                uwsgi_param UWSGI_SCRIPT myapp2;
                uwsgi_param UWSGI_CHDIR /var/www/myappdir2;
        }
    }

如此这般,重启nginx服务,两个站点就可以共用一个uwsgi服务了。

4.实战应用

最初的设置完毕以后,再添加的应用,只需要在nginx里面进行少量修改,无需重启uwsgi,就能立刻部署完毕。uwsgi自带了基于django的监控uwsgi运行状态的工具,就拿它来部署好了:

server {
    listen 80;
    root   /var/www/django1.23;
    index  index.html index.htm;
    server_name uwsgiadmin.django.obmem.info;
    access_log  /var/log/nginx/django.access.log;
    location /media/ {
        root /var/www/django1.23/adminmedia;
        rewrite ^/media/(.*)$ /$1 break;
    }
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:9090;
        uwsgi_param UWSGI_PYHOME /var/www/django1.23/vtenv;
        uwsgi_param UWSGI_CHDIR /var/www/django1.23/uwsgiadmin;
        uwsgi_param UWSGI_SCRIPT uwsgiadmin_wsgi;
    }
}

于是uwsgi的监控信息可以在http://uwsgiadmin.django.obmem.info 看到用户名密码都是admin。

再比如LBForum论坛程序的部署:根据安装说明安装完毕,再按部署说明修改完配置文件,然后只需修改nginx配置文件:

server {
    listen 80;
    root   /var/www/django1.23;
    index  index.html index.htm;
    server_name lbforum.django.obmem.info;
    access_log  /var/log/nginx/django.access.log;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:9090;
        uwsgi_param UWSGI_PYHOME /var/www/django1.23/vtenv;
        uwsgi_param UWSGI_CHDIR /var/www/django1.23/LBForum/sites/default;
        uwsgi_param UWSGI_SCRIPT lbforum_wsgi;
    }
}

于是 http://lbforum.django.obmem.info 就是论坛程序了。

后记

虽然写出来寥寥几行,配置的时候我可吃尽了uwsgi的苦头,有些想当然的用法完全不能成立,-no-site参数一加上去其他都好使LBForum怎么都部署不了,一开始多站点公用uwsgi怎么都成功不了等等。

python世界很有趣,一直会发现好玩的东东,但是python世界也很折腾人,大部分东东都是dev版本,文档缺失,各种兼容问题……大约是因为在python中,有个idea到实现出来实在是太过高效的关系吧,唉,被折腾死了。

 

 

 

 

 

 

 

              ########################################################################################

 http://www.cnblogs.com/QLeelulu/archive/2011/03/02/1969289.html

抛弃Fastcgi,用uwsgi来部署你的Django程序吧

在新浪微群一天一技术分享里面看到一篇有童鞋分享的一篇fcgi vs. gunicorn vs. uWSGI的文章,文章的测试附图很是让人兴奋:

fcgi vs. gunicorn vs. uwsgi

于是自己在本地测试了一下,结果基本和上面的结果一致。

(以下为简单的ab测试结果: ab –c 100 –n 1000 http://127.0.0.1/ )
首先是 nginx + fcgi的结果(fcgi prefork 4 processors):

image

接着是nginx + uwsgi的结果(uwsgi 4 workers):

image

这个测试结果基本和我上次测试的node.js的结果差不多了。

怎样安装uwsgi和部署,这里就不多说了,直接贴两个链接:

http://obmem.info/?p=703

http://www.westphahl.net/blog/2010/4/8/running-django-nginx-and-uwsgi/

uwsgi已经是nginx的内置模块了,所以nginx+uwsgi部署还是很方便的。
uwsgi可以通过命令行、xml文件、ini文件等方式来配置运行参数,配置起来也算简单。

忘了uwsgi的官方地址:http://projects.unbit.it/uwsgi/wiki

最后贴一下uwsgi官网的一个FAQ:

image

哈哈~~~HTTP协议真可怜。

作者:QLeelulu Follow QLeelulu on Twitter 
出处:http://QLeelulu.cnblogs.com/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
 
51.la 专业、免费、强健的访问统计 
 
分类: Django
标签: Djangouwsgi

 

 

 

 http://artori.us/easy-deploy-with-uwsgi/

快速使用uwsgi部署

之前尝试在阿里云部署一个bottle.py写的web服务,选择了unbuntu12.04,一穷二白的ubuntu上用uwsgi部署还挺简单的。这里简单记录一下。

先要改一改程序代码,声明一个application

1
application = bottle.app()

然后安装uwsgi,demo.py就是修改过的bottle的代码。

这里我遇到了— unavailable modifier requested: 0 --,要安装uwsgi-plugin-python,并且uwsgi启动时候添加--plugin python

一些uwsgi的操作看这里

1
2
apt-get install uwsgi uwsgi-plugin-python
uwsgi --socket :8000 --plugin python --file demo.py --processes 4 --pidfile /tmp/demo.pid --touch-reload=/tmp/restart -d uwsgi.log

安装nginx

1
2
3
4
5
6
7
apt-get install libpcre3 libpcre3-dbg libpcre3-dev
apt-get install zlib1g zlib1g-dbg zlib1g-dev
apt-get install make
cd /path/to/nginx
./configure
make
make install

最后配置nginx。默认安装路径在/usr/local/nginx/conf/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
server {
    listen       80;
    server_name  demo.artori.us;
    location /static/ { alias /home/root/demo/static/; }
    location / {
        uwsgi_pass      127.0.0.1:8000;
        include         uwsgi_params;
    }
}

自此搞定

via:

 

 

 

 

 

 

 

 http://2goo.info/blog/panjj/Django/2013/05/16/549

 

Virtualenv+Django+uWSGI+Nginx部署方式备忘录

 

阅读量(1409)  |  发表 于 2013-05-17 00:44:17

Nginx 0.86以后的版本内置了uWSGI模块,用它部署Django应用性能不错,而且很省内存,所以一年前尝试Virtualenv+Django+uWSGI+Nginx这种组合方式去部署2goO网站,因为那时只看到uWSGI的测试结果,很兴奋,什么材料都没有看,直接下载包安装到服务器上折腾了,一时不了解里面的机制原理,过程中竟然遇到了很大的挫折,相比fastCGI,个人感觉难了不少,所以就放下了,终于到了2012年的年底,趁着春节,有点时间,啃了一晚上,终于搞定了。以下作为笔记以备忘。


Virtualenv可以建立一个独立的Python虚拟环境,使Python环境不受另一个环境的干扰。我喜欢这种方式去部署Django应用,因为每个Djanog应用所引用到的第三方库是不完全相同的,隔开后,让环境免遭污染。


Django 1.3以后完全支持wsgi协议,新建的项目myproject文件夹里就有一个wsgi.py文件,我没有修改里面的东西,直接在虚拟环境里安装uWSGI,使用它和wsgi.py文件桥接即可。


安装步骤:

在虚拟环境里安装uWSGI: pip install uwsgi

Virtualenv的安装和建立环境参考之前写的:《Django环境搭建常用的工具及做法》 http://2goo.info/blog/panjj/Django/2011/06/05/521


完整步骤如下:
#先安装pip工具
apt-get install python-pip  
#再安装virtualenv包
pip install -U virtualenv
#直接到/home/www-data/目录下建立一个twogoo的虚拟环境
cd /home/www-data/
virtualenv --no-site-packages --distribute twogoo  
#进入建立好的twogoo环境 安装项目所需的python库,比如uWSGI PIL psycopg2 Django South等等
cd twogoo  
source bin/activate
#在虚拟环境twogoo里安装uWSGI
pip install uwsgi


#安装其他库
pip install Django==1.4.5
pip install South
...

 

在虚拟环境里新建项目myproject:

django-admin.py startproject myproject


这时候,/home/www-data/twogoo/ 这个文件夹就是我建立的虚拟环境了,twogoo里面的结构如下:
twogoo
..lib
..local
..include
..myproject #我建立的项目
....myproject
......wsgi.py
......settings.py
......urls.py
...... ...
....static
....media
....templates
....manage.py


安装uwsgi后,需要简单的配置启动参数,这次使用ini文件配置,当然可以使用其他的文件格式,参考官方文档吧。
我在twogoo文件夹里建立一个配置文件 twogoo_uwsgi.ini,twogoo_uwsgi.sock
cd /home/www-data/twogoo/ 
touch twogoo_uwsgi.ini
touch twogoo_uwsgi.sock


这时twogoo里面的结构如下:
twogoo
..lib
..local
..include


..myproject #我建立的项目
....myproject
......wsgi.py
......settings.py
......urls.py
...... ...
....static
....media
....templates
....manage.py


..twogoo_uwsgi.ini #刚才建立的配置文件
..twogoo_uwsgi.sock #配置文件用到的sock文件


twogoo_uwsgi.ini 文件里的内容如下:


[uwsgi]
vhost = false #注意多个项目的时候不能true哦,否则多个项目都共用这个配置参数了,这个很折腾人
plugins = python
#socket = 127.0.0.1:9000 #这个注释掉了,我采用sock的方式,当然你可以使用端口方式,nginx配置的时候修改一下即可
socket = /home/www-data/twogoo/twogoo_uwsgi.sock #配置文件用到的sock文件
master = true
enable-threads = true
workers = 6 #进程数
wsgi-file = /home/www-data/twogoo/myproject/myproject/wsgi.py  #这是项目wsgi.py文件的路径
virtualenv = /home/www-data/twogoo/   #twogoo虚拟环境的路径
chdir = /home/www-data/twogoo/myproject  #twogoo下myproject项目的路径


配置文件已经好了,在twogoo_uwsgi.ini(/home/www-data/twogoo/)同级目录下可以启动uwsgi了:


nohup uwsgi --ini twogoo_uwsgi.ini&


好,ctrl+c 
tail -f -n 1000 nohup.ou 可以看到uwsgi是否启动成功了。


剩下就是配置nginx,让nginx代理uwsgi进程:


我那时是通过apt-get安装nginx的,默认路径在/etc/nginx/下,配置步骤:


新建twogoo.conf文件,并配置参数
touch /etc/nginx/sites-enabled/twogoo.conf
nano /etc/nginx/sites-enabled/twogoo.conf


配置参数如下:
server {
    listen 80;
    server_name 2goo.info www.2goo.info;

    access_log /home/www/twogoo/logs/access.log;
    error_log /home/www/twogoo/logs/error.log;

    root /home/www/twogoo/myproject;
    index index.html index.htm;

    charset utf-8;

    location ~ ^/static/
    {
      root /home/www/twogoo/myproject/;
      expires 24h;
      access_log   off;
    }

    location ~ ^/media/
    {
      root /home/www/twogoo/myproject/;
      expires 24h;
      access_log   off;
    }


    location / {
        uwsgi_pass unix:/home/www/twogoo/twogoo_uwsgi.sock;
        # uwsgi_pass 127.0.0.1:9000;
        include /etc/nginx/uwsgi_params;
        proxy_http_version 1.1;
    }
  }


配置完成了,重启nginx:
/etc/init.d/nginx restart

(完)

 

标签: 无标签

 

posted @ 2013-08-28 11:37  陳聽溪  阅读(851)  评论(0)    收藏  举报