nginx+uwsgi(或者flup)+django(python)_squeeze

 http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html

http://projects.unbit.it/uwsgi/wiki/Example

http://weipengfei.blog.51cto.com/1511707/1135578

配置:

    建立项目主目录:

    django-admin.py startproject  my_django

    在django主目录中建立django_wsgi.py

    import  os,sys
    import  django.core.handlers.wsgi
    os.environ['DJANGO_SETTINGS_MODULE']='my_django.settings'   #这里的my_django.settings 表示 "项目名.settings"
    application=django.core.handlers.wsgi.WSGIHandler()

    在主目录下 创建 uwsgi.xml文件:

    
  <uwsgi>  
  <socket>0.0.0.0:3001</socket>  
  <listen>20</listen>  
  <master>true</master>  
  <pidfile>/usr/local/nginx/uwsgi.pid</pidfile>  
  <processes>2</processes>  
  <module>django_wsgi</module>
  <pythonpath>/data/my_django</pythonpath>  #刚才建立项目的路径
  <profiler>true</profiler>  
  <memory-report>true</memory-report>  
  <enable-threads>true</enable-threads>  
  <logdate>true</logdate>  
  <limit-as>6048</limit-as>  
  </uwsgi>    

    添加nginx配置:

server {  
        listen  80;  
        server_name  django.sigh.com.cn;  
        location / {  
            root /data/my_django;
            uwsgi_pass   127.0.0.1:3001;  
            include     uwsgi_params;  
         }
}

 

启动uwsgi和nginx

/usr/local/nginx/sbin/nginx
uwsgi -x /data/my_django/uwsgi.xml &

 

uwsgi 控制脚本:可以存放在 /etc/init.d/uwsgi_con

#!/bin/bash  

LOG=/var/log/uwsgi  
CONF=/data/my_django/uwsgi.xml 
  
case "$1" in  
  start)  
    echo  "Starting uwsgi"  
    if [ -n "$PID" ]; then  
      echo "uwsgi is already running"  
      exit  
    else  
      uwsgi -x $CONF -d $LOG &> /dev/null  
    fi  
    ;;  
  stop)  
    echo  "Stopping uwsgi"  
    killall -QUIT uwsgi &> /dev/null   
    ;;  
  restart)  
    $0 stop  
    sleep 1  
    $0 start  
    ;;  
  *)  
    echo "usage: $0 {start|stop|restart}"    
esac  
exit 0 

验证过程:

本文出自 “技术成就梦想” 博客,请务必保留此出处http://weipengfei.blog.51cto.com/1511707/1135578

 

http://www.opstool.com/article/229

完成后在我们的工作目录建立django项目,并测试运行:

  1. #创建项目,这里我们只使用django admin的功能
  2. django-admin.py startproject siteadmin
  3.  
  4. #修改siteadmin的settting
  5. vim siteadmin/settings.py
  6. 修改如下参数:
  7. DATABASES
  8. INSTALLED_APPS项里注释掉django.contrib.admindjango.contrib.admindocs前面的#号
  9. #修改siteadmin的urls.py
  10. vim siteadmin/urls.py
  11. 修改如下参数:
  12. 取消下面行的注释
  13. from django.contrib import admin
  14. admin.autodiscover()
  15. url(r'^admin/doc/
  16. url(r'^admin
  17.  
  18. #数据库初始化
  19. python manage.py syncdb
  20.  
  21. #直接用manage.py测试django是否可以正常运行
  22. python manage.py runserver 0.0.0.0:8080

完成,我再使用xml的方式来配置运行djano。

  1. #在siteadmin目录下,建立siteadmin.xml,内容如下
  2. <uwsgi>
  3. <socket>127.0.0.1:3031</socket>
  4. <chdir>/home/webapps/backend/django/myadmin</chdir>
  5. <pythonpath>..</pythonpath>
  6. <module>django_wsgi</module>
  7. </uwsgi>
  8. #在siteadmin目录下,建立dangjao_wsgi.py,因为django创建项目时本来就有一个siteadmin/wsgi.py,我们做个软连接即可
  9. ln -s siteadmin/wsgi.py django_wsgi.py

使用uwsgi启动django。

  1. uwsgi -x django.xml --uid nginx -t 30-M -p 4limit-as 128-R 10000-d /home/django/siteadmin/logs/django.log

C.建立nginx配置文件:

    1. nginx配置文件里加入针对访问djangolocation
    2. location /django {
    3. include uwsgi_params;
    4. uwsgi_pass 127.0.0.1:3031;
    5. }

 

http://www.douban.com/group/topic/33661333/

nginx里listen和server_name写好,然后pass指向后端uwsgi,uwsgi一般用env指定env = DJANGO_SETTINGS_MODULE=yourapp.settings,chdir不写也行,pythonpath指向manage.py所在的那一级目录,然后跑起来应该没问题了

 

你的uwsgi是socket方式启动的,他的端口是socket端口,不能直接访问,需要通过nginx来访问

 

 

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

http://my.oschina.net/sunpr/blog/68838

1. 安装 Nginx : http://nginx.org/en/download.html 

1 sudo add-apt-repository ppa:nginx/stable
2 apt-get update
3 apt-get install nginx

2. 安装 uWSGI : 

1 sudo apt-get install libxml2-dev python-dev python-pip
2 sudo pip install uwsgi

3. 安装 Django: 

1 sudo pip install django

4. 开发应用: 

1 cd
2 django-admin.py startproject mysite
3 cd mysite
4 python manage.py startapp myapp

5. 配置Nginx:

1 sudo vi /etc/nginx/conf.d/mysite.conf

内容如下: 
     server { 
        listen   80; 
        server_name 127.0.0.1; 
        location / { 
                uwsgi_pass 127.0.0.1:9090; 
                include uwsgi_params; 
        } 
    } 
6. 配置uWSGI: 

1 vi ~/mysite/uwsgi.xml

内容如下: 
    <uwsgi> 
     <master>true</master> 
        <socket>127.0.0.1:9090</socket> 
        <pythonpath>..</pythonpath> 
        <module>mysite.wsgi</module> 
    </uwsgi> 

7. 启动应用 

1 uwsgi -x ~/mysite/uwsgi.xml
2 sudo /etc/init.d/nginx restart

访问 http://127.0.0.1 出现 Welcome to django 界面。

 

http://maemual.net/2013/08/03/ubuntu-12-04%E4%B8%8B%E9%85%8D%E7%BD%AEdjangouwsginginx/

我的django目录是

 

 

Nginx和uWSGI的安装这儿就不说了。uWSGI相当于Nginx和Django之间的一道桥梁,所以只要设置uWSGI和Django连通,uWSGI和Nginx连通就好了。

配置uWSGI

在django目录下建立文件django_socket.xml,这是uWSGI的配置文件,内容如下:

1
2
3
4
5
6
7
<span class="tag"><uwsgi></span><span class="pln">
    </span><span class="tag"><socket></span><span class="pln">:8077</span><span class="tag"></socket></span><span class="pln">
    </span><span class="tag"><chdir></span><span class="pln">/home/maemual/python/demo</span><span class="tag"></chdir></span><span class="pln">
    </span><span class="tag"><module></span><span class="pln">django_wsgi</span><span class="tag"></module></span><span class="pln">
    </span><span class="tag"><processes></span><span class="pln">4</span><span class="tag"></processes></span><span class="pln"> </span><span class="com"><!-- 进程数 --></span><span class="pln">
    </span><span class="tag"><daemonize></span><span class="pln">uwsgi.log</span><span class="tag"></daemonize></span><span class="pln">
</span><span class="tag"></uwsgi></span>

再建立文件django_wsgi.py,这就是中间的桥梁了:

1
2
3
4
5
6
7
8
9
10
11
12
<span class="com">#!/usr/bin/env python</span><span class="pln">
</span><span class="com"># coding: utf-8</span><span class="pln">
 
</span><span class="kwd">import</span><span class="pln"> os
</span><span class="kwd">import</span><span class="pln"> sys
 
reload</span><span class="pun">(</span><span class="pln">sys</span><span class="pun">)</span><span class="pln">
sys</span><span class="pun">.</span><span class="pln">setdefaultencoding</span><span class="pun">(</span><span class="str">'utf8'</span><span class="pun">)</span><span class="pln">
os</span><span class="pun">.</span><span class="pln">environ</span><span class="pun">.</span><span class="pln">setdefault</span><span class="pun">(</span><span class="str">"DJANGO_SETTINGS_MODULE"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"demo.settings"</span><span class="pun">)</span><span class="pln">
 
</span><span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">core</span><span class="pun">.</span><span class="pln">handlers</span><span class="pun">.</span><span class="pln">wsgi </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">WSGIHandler</span><span class="pln">
application </span><span class="pun">=</span><span class="pln"> </span><span class="typ">WSGIHandler</span><span class="pun">()</span>

然后启动uWSGI:

 

 

配置Nginx

打开Nginx的配置文件nginx.conf

 

 

在HTTP的括号里加入如下内容

 

 

其中/static目录是你的django项目中静态文件目录。然后就可以重新启动Nginx了。

 

 

此时就可以访问127.0.0.1察看效果了。

 

http://www.cnblogs.com/zhouej/archive/2012/03/25/2379646.html

配置风格的简单介绍

当使用某一种配置风格或者将一种风格转换另一个风格时,需要注意一下规则:

命令行参数(command line args):需要给选项增加“--”前缀

例如socket选项:

--socket <path/address>

环境变量(environment variable):选项名都要换成大写,并且加上“UWSGI_”前缀,所有原来选项名中的“-”都要换成下划线“_”

例如max-vars选项将变成:

UWSGI_MAX_VARS="<n>"

xml文件:xml文件中的根结点应该是<uwsgi>,所有的选项值是作为文本节点。标识符类型的选项可以没有对应的值。

socket选项和master选项可以如下配置:

<uwsgi>
<socket>127.0.0.1:3031</socket>
<master/>
</uwsgi>

ini文件:配置域应该是uwsgi,标识符类型的选项的值可以设为true或者1。

socket选项和master选项可以如下配置:

[uwsgi]
socket = 127.0.0.1:3031
master = true

yaml格式文件:根元素需要设置为uwsgi,标识符类型的选项的值可以设为true或者1。

socket选项和master选项可以如下配置:

uwsgi:
socket: 127.0.0.1
master: 1

lda格式:这个格式比较复杂,你应该查阅专门的wiki文档。见useLDAP

无尽的选项列表...

深呼吸,现在我们开始。

socket or uwsgi-socket

指定uwsgi的客户端将要连接的socket的路径(使用UNIX socket的情况)或者地址(使用网络地址的情况)。你最多可以同时指定8个socket选项。当使用命令行变量时,可以使用“-s”这个缩写。

--socket /tmp/uwsgi.sock

以上配置将会绑定到 /tmp/uwsgi.sock 指定的UNIX socket

-s 127.0.0.1:1717

以上配置会绑定到ipv4地址127.0.0.1的1717端口

[uwsgi]
socket = 127.0.0.1:1717
socket = 127.0.0.1:2626

以上配置会绑定到ipv4地址127.0.0.1的1717端口以及ipv4地址127.0.0.1的2626端口。

protocol

设置默认的通信协议(uwsgi,http,fastcgi)

--protocol <protocol>

processes or workers

为预先派生模式设置工作进程的数量。这个设置是你的app能实现简单并且安全的并发能力的基础。你设置的工作进程越多,你就能越快的处理请求。每一个工作进程都等同于一个系统进程,它消耗内存,所以需要小心设置工作进程的数量。如果你设置的数量太多,就有可能是系统崩溃。

当你使用命令行参数时,你可以使用简化命令“-p”

--processes 8

以上配置会产生8个工作进程

--workers 4

以上配置会产生4个工作进程

-p 8 

以上会产生8个工作进程

<uwsgi>
<workers>3</workers>
</uwsgi>

这个配置会产生3个工作进程

 

xmlconfig or xml

加载指定的xml配置文件。当使用命令行参数时,可以使用简化命令“-x”。在xml配置文件中,你可以有多个“<uwsgi>”节,不同的节之间用id属性区分。通过在文件名后面增加id(使用冒号分隔)来选择应用哪个“<uwsgi>”节。

--xml /etc/myapp.xml

以上配置会加载/etc/myapp.xml这个配置文件。

--xml /etc/myapp.xml:django

以上命令会使用/etc/myapp.xml这个配置文件中的“django”这个节作为配置选项

这个文件内容可以像如下这样:

复制代码
<all_the_apps>

<uwsgi id="turbogears">
<socket>/tmp/tg.sock</socket>
</uwsgi>

<uwsgi id="django">
<socket>/tmp/django.sock>
</uwsgi>

</all_the_apps>
复制代码

这种情况下,根节点可以是任何你想要的名字(这就允许你可以将uwsgi这个配置节加到其他xml文件中)

如果在命令行的最后一个参数以“.xml”结尾,那么就隐含将加载该xml文件作为配置。

/usr/bin/uwsgi /etc/myapp.xml

以上命令会使uWSGI自动加载 /etc/myapp.xml配置文件。

 

daemonize

使进程在后台运行,并将日志打到指定的日志文件或者udp服务器

--daemonize /var/log/uwsgi.log

这个指令会让uWSGI在后台运行并将日志打到 /var/log/uwsgi.log文件中。

[uwsgi]
daemonize = 192.168.0.100:4000

这个配置将会使uWSGI在后台运行,并且将日志消息发送给监听192.168.0.100:4000这个地址的udp服务器。见UdpLogging

 

 

listen

设置socket的监听队列大小(默认:100)。

每一个socket都有一个相关联的队列,请求会被放入其中等待进程来处理。当这个队列慢的时候,新来的请求就会被拒绝。

队列大小的最大值依赖于系统内核。

 

master

启动主进程。

chroot

使用chroot()改变默认目录到指定目录。

gid

在uWSGI服务器将要运行的情况下,设置gid。

uid

在uWSGI服务器将要运行的情况下,设置uid。

ini

设置ini配置文件的路径。

--ini <inifile>

 

mount

 

允许同一个进程加载多个app。

 

--mount /pinax=/var/www/pinax/deploy/pinax.wsgi

 

threads

开启线程操作模式。你必须指定每个工作进程的线程数。

--threads 40 --workers 2

这个配置会导致生成2个工作进程,每个工作进程有40个子线程。

vhost

开启虚拟主机模式。见VirtualHosting

vhost-host

默认情况下,虚拟主机模式使用SERVER_NAME作为主机名的关键字。如果你希望使用HTTP_HOST,那就加这个选项。

 

static-index

在目录索引中用到的静态文件的文件名。

static-index = index.html

如果请求/doc/,那么uWSGI将检查/doc/index.html,如果存在就会提供给客户端。

 

 

 

http://mysrc.sinaapp.com/view_note/?id=142

1.安装nginx,uwsgi以及uwsgi-plugin-python

比如:apt-get install nginx,uwsgi,uwsgi-plugin-python

2.写一个测试文件叫wsgi_httpsvr.py,保存到/home/test_wsgi目录下,内容如下:

 

from wsgiref.simple_server import make_server

def application(environ, start_response):
    status ='200 OK'# HTTP Status
    headers =[('Content-type','text/plain')]# HTTP Headers
    start_response(status, headers)# The returned object is going to be printedyield"Hello World"if __name__=='__main__':
    httpd = make_server('',8000, application)print"Serving on port 8000..."# Serve until process is killed
    httpd.serve_forever()

3.在/etc/uwsgi/apps-available下创建一个名叫test_wsgi.xml的配置文件(名称随便),内容如下:

<uwsgi><socket>127.0.0.1:9006</socket><plugins>python</plugins><chdir>/home/test_wsgi</chdir><module>wsgi_httpsvr</module></uwsgi>

然后在/etc/uwsgi/apps-enabled下创建一下这个配置文件的link,比如:

ln -s /etc/uwsgi/apps-available/test_wsgi.xml /etc/uwsgi/apps-enabled/test_wsgi.xml

 

 

4.在/etc/nginx/sites-available下创建nginx配置文件(名称随便,这里叫test_wsgi),内容如下:

 

    server {
        listen   80;## listen for ipv4
        server_name wzw.th360.cn;#charset koi8-r;
        access_log  /var/log/nginx/test-wsgi.access.log access;# root   html

        location /{# First attempt to serve request as file, then# as directory, then fall back to index.html#try_files      $uri =404;#try_files $uri $uri/ /index.html;
            include        uwsgi_params;
            uwsgi_pass     127.0.0.1:9006;#uwsgi_pass     unix:///tmp/test_wsgi.socket;}}

5.执行如下指令:

 

service uwsgi restart

service nginx reload

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

很奇怪,配置uwsgi的socket为/tmp/test_wsgi.socket方式时,死活不成功,虽然tmp目录下也生成socket文件了,而且服务也正常启动,但是访问nginx时报502 back gateway错误,暂不知道什么原因

 

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

以下是两个真实布署django的uwsgi配置文件和nginx的配置文件例子:

 

<uwsgi><socket>127.0.0.1:9009</socket><master/><uid>www-data</uid><gid>www-data</gid><plugins>python</plugins><chdir>/mnt/data/home/websearch/wwwroot/new_cntsyy/th_payment/payment</chdir><pythonpath>..</pythonpath><module>wsgi</module></uwsgi>
server {
        listen       80;
        server_name  test.th010.com test.th360.cn;
        root /mnt/data/home/websearch/wwwroot/new_cntsyy/th_payment;

        access_log  /var/log/nginx/test.th360.cn.access.log access;#error_log  /var/log/nginx/test.th360.cn.error.log access;#配置django admin需要的文件
        location ~*^/media/(css|img|js)/.*$ {
                root /usr/local/lib/python2.7/dist-packages/django/contrib/admin;
                expires 30d;break;}

        location ^~/static  {
            autoindex on;
            alias   /home/websearch/wwwroot/new_cntsyy/th_payment/payment/static;}
        location /{###uwsgi config###
                include        uwsgi_params;
                uwsgi_pass     127.0.0.1:9009;
                uwsgi_param    UWSGI_SCHEME $scheme;
                uwsgi_param    SERVER_SOFTWARE    nginx/$nginx_version;}}

 

 

uwsgi官方文档:

http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html#installing-uwsgi-with-python-support

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

http://linuxguy.blog.51cto.com/1663606/866056

 

vi  uwsgi.xml

 —
<uwsgi>
  <socket>127.0.0.1:9001</socket>
  <listen>200</listen>
  <master>true</master>
  <pidfile>/usr/local/uwsgi/logs/uwsgi.pid</pidfile>
  <processes>8</processes>
  <pythonpath>/usr/local/python_web/www</pythonpath>
  <pythonpath>/usr/local/python_web</pythonpath>
  <module>django_wsgi</module>
  <profiler>true</profiler>
  <memory-report>true</memory-report>
  <enable-threads>true</enable-threads>
  <logdate>true</logdate>
  <limit-as>6048</limit-as>
  <daemonize>/usr/local/uwsgi/logs/django.log</daemonize>
</uwsgi>

 

http://blog.chinaunix.net/uid-11390629-id-3610722.html

6.配置并运行一个简单的python页面
cd /var/www/mysite
/var/www/mysite$ sudo vi demo.py
输入如下代码:
import  os,sys
import  django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE']='mysite.settings'
application=django.core.handlers.wsgi.WSGIHandler()

/var/www/mysite$ uwsgi -s 127.0.0.1:9090 -w demo 

如安装了libxml2,也可用如下方法处理:
在app目录创建个django.xml文件
/var/www/mysite$ sudo vi django.xml
内容如下:
<uwsgi>
    <socket>127.0.0.1:9090</socket>
    <chdir>/var/www/mysite/mysite</chdir>
    <pythonpath>..</pythonpath>
    <module>wsgi</module>
</uwsgi>
/var/www/mysite$ uwsgi -x django.xml 

访问本机IP:8000,如能看到欢迎信息,就说明运行环境配置好了 

 

 

http://www.vimer.cn/2011/07/linux%E4%B8%8Bnginxpythonuwsgi%E9%83%A8%E7%BD%B2%E6%80%BB%E7%BB%93djangoweb-py.html

四.web.py配置
创建文件 index.py :

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import web 
 
urls = ("/.*", "hello")
 
class hello:
    def GET(self):
        return 'Hello, world!'
 
app = web.application(urls, globals())
application = app.wsgifunc()

 

 

http://hi.baidu.com/jasonlyy/item/44022f0d1625cdfba0103410

4. 相关知识:egg包和setup tools

python的egg文件有点像java中的jar文件,是一个工程打包文件,便于安装部署,仅此一点,给多少pythoner带来了多少激动。而setup tools就是一个提供包管理的工具或者说是软件。

egg 是一个包含所有包数据的文件包。在理想情况中,egg 是一个使用 zip 压缩的文件,其中包括了所有需要的包文件。但是在某些情况下,setuptools 会决定(或被开关告知)包不应该是 zip 压缩的。在这些情况下,egg 只是一个简单的未曾压缩的子目录,但是里面的内容是相同的。使用单一的版本可以方便地进行转换,并可以节省一点磁盘空间,但是 egg 目录从功能和组织结构上来说都是相同的。

安装package是经常碰到事情, 而且安装也比较繁琐,最头疼就是包依赖的问题,有时候一个上午可能就为了安装一个包,就像我今天这样的。在Java里面有这样的包管理软件,那就是Maven了, 他会帮助你找到所依赖的包. 据说其他语言,比如, php, ruby, perl等 也有类似的工具软件.

 

 

 

参考资料:http://www.ibm.com/developerworks/cn/linux/l-cppeak3.html

 

最后的声明:蟒蛇蛋这个名字是我起的,呵呵,我看IBM有人发文章说的是孵化。我觉得python和egg放在一起很好玩。所以就想到了这个名字。

 

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

http://my.oschina.net/guol/blog/121418 

 

Nginx+uWSGI

9人收藏此文章, 我要收藏发表于4个月前(2013-04-09 11:56) , 已有245次阅读 ,共0个评论

 

基于python的web项目,常见的部署方法有:
   fcgi:用spawn-fcgi或者框架自带的工具对各个project分别生成监听进程,然后和http服务互动。
   wsgi:利用http服务的mod_wsgi模块来跑各个project。

   不过还有个uwsgi,它既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据作者说该协议大约是fcgi协议的10倍那么快。uWSGI的主要特点如下:
       超快的性能。
       低内存占用(实测为apache2的mod_wsgi的一半左右)。
       多app管理。
       详尽的日志功能(可以用来分析app性能和瓶颈)。
       高度可定制(内存大小限制,服务一定次数后重启等)。

环境ubuntu 12.04 IP:10.1.6.79

安装nginx

 

1 apt-get install nginx-full nginx-common

nginx配置/etc/nginx/sites-enabled/example

 

01 server {
02         listen          80;
03         server_name     10.1.6.79;
04         access_log      /var/log/nginx/example_access.log;
05         error_log       /var/log/nginx/example_error.log;
06         root            /var/www/example;
07         location / {
08             uwsgi_pass      127.0.0.1:9001;
09             include         uwsgi_params;
10             uwsgi_param     UWSGI_SCHEME $scheme;
11             uwsgi_param     SERVER_SOFTWARE    nginx/$nginx_version;
12         }
13 }
安装uwsgi

 

1 apt-get install uwsgi uwsgi-plugin-python

    如果你想安装所有的uwsgi插件,则可以安装uwsgi-plugin-all软件包

uwsgi配置/etc/uwsgi/apps-enabled/default.xml

 

01 <uwsgi>
02     <plugin>python</plugin>
03     <socket>127.0.0.1:9001</socket>
04     <pythonpath>/var/www/example/app/</pythonpath>
05     <app mountpoint="/">
06         <script>wsgi_configuration_module</script>
07     </app>
08     <master/>
09     <processes>4</processes>
10     <reload-mercy>8</reload-mercy>
11     <cpu-affinity>1</cpu-affinity>
12     <max-requests>2000</max-requests>
13     <limit-as>512</limit-as>
14     <reload-on-as>256</reload-on-as>
15     <reload-on-rss>192</reload-on-rss>
16     <no-orphans/>
17     <vacuum/>
18 </uwsgi>

    uwsgi配置文件中的参数也可以在命令行通过uwsgi指定,配置文件除了xml格式外,还可以写成ini格式的,软件包安装完毕后在/usr/share/doc/uwsgi/examples/conffile目录下会有一些xml和ini格式配置文件的例子。

wsgi_configuration_module.py脚本内容

 

01 #!/usr/bin/python
02 import os
03 import sys
04 sys.path.append('/var/www/example/app')
05 os.environ['PYTHON_EGG_CACHE'] = '/var/www/example/.python-egg'
06 def application(environ, start_response):
07     status = '200 OK'
08     output = 'Hello World!'
09     response_headers = [('Content-type''text/plain'),
10                     ('Content-Length', str(len(output)))]
11     start_response(status, response_headers)
12     return [output]
启动uwsgi

 

1 uwsgi -x /etc/uwsgi/apps-enabled/default.xml --daemonize /var/log/uwsgi/app/default.log

uwsgi 的参数: 
    -M 开启Master进程 
    -p 4 开启4个进程 
    -s 使用的端口或者socket地址 
    -d 使用daemon的方式运行, 注意, 使用-d后, 需要加上log文件地址, 比如-d /var/log/uwsgi.log 
    -R 10000 开启10000个进程后, 自动respawn下 
    -t 30 设置30s的超时时间, 超时后, 自动放弃该链接 
    –limit-as 32 将进程的总内存量控制在32M 
    -x  使用配置文件模式

并发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 

      除了直接用uwsgi命令启动外,还可以用init.d下的脚本启动, 不过需先修 改/etc/default/u wsgi中默认配置文件的路径,然后通过/etc/init.d/uwsgi start启动

 

1 #INHERITED_CONFIG=/usr/share/uwsgi/conf/default.ini
2 INHERITED_CONFIG=/etc/uwsgi/apps-enabled/default.xml
启动nginx

 

1 /etc/init.d/nginx start
效果如下:


    python在国内用来做web还不多,虽然python也有一些web框架,不过目前来看文档缺失、本身系统的稳定都还没经过量和时间的考验,要像PHP那样大规模的火起来还需一段时间。

 

nginx配置参考:http://wiki.nginx.org/HttpUwsgiModule#uwsgi_param

uwsgi安装参考:http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html

uwsgi配置参考:http://uwsgi-docs.readthedocs.org/en/latest/Options.html#vacuum

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

http://my.oschina.net/u/240562/blog/127298

研究了两天nginx和uwsgi今天终于搞定了

 

这里总结一下 
安装什么的就不说了,重点说一下配置和注意的问题: 
我的项目目录/home/charles/mysite/mysite 
和项目目录平级的还有/home/charles/mysite/uwsgi 
首先配置uwsgi,所有的uwsgi的配置都在/home/charles/mysite/uwsgi 目录中,查了很多文档 
uWsgi配置文档翻译 
Setting up Django and your web server with uWSGI and nginx, 
nginx + django +uwsgi+virtualenv 简要记录, 
uWSGI-http+Django

配置uwsgi: 
首先新建一个uwsgi的配置文件, touch uwsgi.ini 
然后新建 touch django_wsgi.py 
touch uwsgi.log 
touch uwsgi.pid 
uwsgi.ini是配置文件:

01 [uwsgi]
02 socket = :8000
03 master = true
04 #chdir = /home/charles/mysite/mysite
05 #module = mysite.wsgi
06 module = django_wsgi
07 processes = 8
08 listen = 120
09 enable-threads = true
10 daemonize = /home/charles/mysite/uwsgi/uwsgi.log
11 pidfile = /home/charles/mysite/uwsgi/uwsgi.pid
12 pythonpath = /home/charles/mysite
13 pythonpath = /home/charles/mysite/uwsgi
14 pythonpath = /home/charles/mysite/mysite
15 buffer-size =  32768
16 reload-mercy = 8
17 vacuum = true

django_wsgi.py 
#!/usr/bin/python

import os,sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

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

这样uwsgi就配置完毕, uwsgi.log是log文件, uwsgi.pid是存储进程号的地方。 开起服务器: uwsgi --ini uwsgi.ini 这个时候是不好使地, 哈哈, 如果要看看效果, 需要把uwsgi.ini中的socket改为http这样访问127.0.0.1:8000就能看到网站了 继续。。。。。。。。 配置nginx, nginx自带了uwsgi_params, 我们要做的是在nginx把uwsgi_params的各种参数传到uwsgi中, 打开nginx的配置文件,加入:

01 server {
02     listen         80;
03     server_name    127.0.0.1
04     charset UTF-8;
05     access_log      /var/log/nginx/test_access.log;
06     error_log       /var/log/nginx/test_error.log;
07  
08     client_max_body_size 75M;
09  
10     location / {
11         include uwsgi_params;
12         uwsgi_pass 127.0.0.1:8000;
13         uwsgi_read_timeout 2;
14     }  
15     location /static {
16         expires 30d;
17         autoindex on;
18         add_header Cache-Control private;
19         alias /home/charles/mysite/mysite/mysite/static/;
20      }
21  }

这样就搞定了,可以访问127.0.0.1看看网站了, 我在这犯了一个错误,就是在uwsgi.ini中写的是http所以不好使,后来把http改为socket好使了。

 

 

http://simple-is-better.com/news/756

接下来配置Nginx 和 uWSGI部署Django App 了. 首先我们在Nginx中新建一个站点配置文件:

sudo vi /etc/nginx/sites-enabled/blog.hysia.com

内容如下:

server {
    listen   80; ## listen for ipv4; this line is default and implied
    #listen   [::]:80 default ipv6only=on; ## listen for ipv6

    server_name blog.hysia.com;

    access_log /var/log/nginx/blog.hysia.com-access.log ;
    error_log /var/log/nginx/blog.hysia.com-error.log ;

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

}

 

这样Nginx算是配置完了,现在看我们的Django app如何配置。

  • 配置Django app

配置很简单,几乎不用改动你app的任何文件。
首先在你的app目录创建个wsgi.py 文件,内容如下:

import os,sys

if not os.path.dirname(__file__) in sys.path[:1]:
    sys.path.insert(0, os.path.dirname(__file__))
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
然后在app目录创建个django.xml文件,作为uWSGI运行的配置文件,内容如下:

<uwsgi>
    <socket>127.0.0.1:8630</socket>
    <chdir>/home/hysia/website/blog</chdir>
    <pythonpath>..</pythonpath>
    <module>wsgi</module>
</uwsgi>

 

 最后一步,运行 uWSGI 就行了,如下:

uwsgi -x /home/hysia/website/blog/django.xml

就这样你的Django app 就用 uWSGI hold住了。当然django.xml的配置远不止这些,比如log文件,内存限制等等,具体的大家可以参看 http://projects.unbit.it/uwsgi/wiki/Example uWSGI handle 多个 Django app 的时候性能更出众,更多的探索自己去动手实践吧。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 http://developer.51cto.com/art/201010/229615_1.htm

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

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

◆fcgi:用spawn-fcgi或者框架自带的工具对各个project分别生成监听进程,然后和http服务互动。

◆wsgi:利用http服务的mod_wsgi模块来跑各个project。

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

如果Python中能有个什么东西像php-cgi一样监听同一端口,进行统一管理和负载平衡,那真是能省下大量的部署功夫。偶然看到了uWSGI,才发现居然一直不知道有那么方便地统一部署工具。uWSGI,既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据说该协议大约是fcgi协议的10倍那么快,有个比较见下图:

uWSGI

uWSGI的主要特点如下:

◆超快的性能。

◆低内存占用(实测为apache2的mod_wsgi的一半左右)。

◆多app管理。

◆详尽的日志功能(可以用来分析app性能和瓶颈)。

◆高度可定制(内存大小限制,服务一定次数后重启等)。

正式开工

uwsgi的文档虽然很多也很详细,这里是uwsgi的官方文档:http://projects.unbit.it/uwsgi/wiki/Doc

1.安装uwsgi

ubuntu有uwsgi的ppa:

  1. add-apt-repository ppa:stevecrozz/ppa  
  2. apt-get update  
  3. apt-get install uwsgi 

2. 用uwsgi代替mod_wsgi

Nginx的整体配置说来话长,这里不再多说,假设已经明白Nginx的基本配置,那么uwsgi就类似这么配置:

  1. location / {  
  2.   include uwsgi_params  
  3.   uwsgi_pass 127.0.0.1:9090  

这就是把所有url传给9090端口的uwsgi协议程序来互动。再到project目录建立myapp.py,使得application调用框架的wsgi接口,比如web.py就是:

  1. ......  
  2. app = web.application(urls, globals())  
  3. appapplication = app.wsgifunc() 

再比如django就是:

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

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

  1. uwsgi -s :9090 -w myapp 

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

3.uwsgi的参数

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

并发4个线程:

  1. uwsgi -s :9090 -w myapp -p 4 

主控制线程+4个线程:

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

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

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

限制内存空间128M:

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

服务超过10000个req自动respawn:

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

后台运行等:

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

4.为uwsgi配置多个站点

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

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

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

  1. apt-get install Python-setuptools  
  2. easy_install virtualenv 

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

  1. virtualenv /var/www/myenv 

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

  1. source /var/www/myenv/bin/activate  
  2. pip install django  
  3. pip install mako  
  4. ... 

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

  1. server {  
  2.         listen       80;  
  3.         server_name  app1.mydomain.com;  
  4.         location / {  
  5.                 include uwsgi_params;  
  6.                 uwsgi_pass 127.0.0.1:9090;  
  7.                 uwsgi_param UWSGI_PYHOME /var/www/myenv;  
  8.                 uwsgi_param UWSGI_SCRIPT myapp1;  
  9.                 uwsgi_param UWSGI_CHDIR /var/www/myappdir1;  
  10.         }  
  11.     }  
  12.     server {  
  13.         listen       80;  
  14.         server_name  app2.mydomain.com;  
  15.         location / {  
  16.                 include uwsgi_params;  
  17.                 uwsgi_pass 127.0.0.1:9090;  
  18.                 uwsgi_param UWSGI_PYHOME /var/www/myenv;  
  19.                 uwsgi_param UWSGI_SCRIPT myapp2;  
  20.                 uwsgi_param UWSGI_CHDIR /var/www/myappdir2;  
  21.         }  
  22.     } 

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

5.实战应用

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

  1. server {  
  2.     listen 80;  
  3.     root   /var/www/django1.23;  
  4.     index  index.html index.htm;  
  5.     server_name uwsgiadmin.django.obmem.info;  
  6.     access_log  /var/log/nginx/django.access.log;  
  7.     location /media/ {  
  8.         root /var/www/django1.23/adminmedia;  
  9.         rewrite ^/media/(.*)$ /$1 break;  
  10.     }  
  11.     location / {  
  12.         include uwsgi_params;  
  13.         uwsgi_pass 127.0.0.1:9090;  
  14.         uwsgi_param UWSGI_PYHOME /var/www/django1.23/vtenv;  
  15.         uwsgi_param UWSGI_CHDIR /var/www/django1.23/uwsgiadmin;  
  16.         uwsgi_param UWSGI_SCRIPT uwsgiadmin_wsgi;  
  17.     }  

于是uwsgi的监控信息可以在http://uwsgiadmin.django.obmem.info看到(用户名密码都是admin)。再比如LBForum论坛程序的部署:根据安装说明安装完毕,再按部署说明修改完配置文件,然后只需修改nginx配置文件:

  1. server {  
  2.     listen 80;  
  3.     root   /var/www/django1.23;  
  4.     index  index.html index.htm;  
  5.     server_name lbforum.django.obmem.info;  
  6.     access_log  /var/log/nginx/django.access.log;  
  7.     location / {  
  8.         include uwsgi_params;  
  9.         uwsgi_pass 127.0.0.1:9090;  
  10.         uwsgi_param UWSGI_PYHOME /var/www/django1.23/vtenv;  
  11.         uwsgi_param UWSGI_CHDIR /var/www/django1.23/LBForum/sites/default;  
  12.         uwsgi_param UWSGI_SCRIPT lbforum_wsgi;  
  13.     }  

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

后记

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

Python世界很有趣,一直会发现有趣的东西,但是Python世界也很折腾人,大部分东西都是dev版本,文档缺失,各种兼容问题。

原文地址:http://obmem.info/?p=703

uwsgi官网:http://projects.unbit.it/uwsgi/

 

http://blog.upxin.com/django%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83debianuwsgi%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3/

这算是学习DJANGO以来碰到的第一个麻烦事
以前PHP的时候,非常方便,一键包轻轻松松配置完美
现在,完全靠自己,折腾了N久,终于搞定
1.安装Python
2.安装PIP
apt-get install python-pip python-dev build-essential
3.用PIP安装DJANGO和UWSGI
4.安装nginx
5.修改nginx配置文件,conf.d下default

location / {
include uwsgi_params
uwsgi_pass 127.0.0.1:9090
}

6.在项目文件夹,myapp下,和manage.py平行的目录,新建一个wsgi.py(切忌不能是uwsgi)

import os,sys

if not os.path.dirname(file) in sys.path[:1]:
sys.path.insert(0, os.path.dirname(file))
os.environ['DJANGO_SETTINGS_MODULE'] = ‘myapp.settings’

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

7.然后uwsgi -s :9090 -w myapp就OK了

一些配置技巧
并发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

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

uwsgi -s :9090 -M -p 4 -t 30 –limit-as 256 -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服务了。

 

 

 

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

http://sa3.org/program/nginx-uwsgi/

Debian 安装Django nginx uwsgi

分类-程序人生 Apr 26,2010 19:59浏览-24363 评论-4 
标签: nginx uWSGI Django

uWSGI 是一个快速的、纯C语言开发的、自维护的、对开发者友好的 WSGI 服务器,旨在提供专业的 Python web应用发布和开发。

本文主要记载了在Debian下安装Nginx和uWSGI,以及配置Django。

说明:uWSGI稳定版本为0.9.4,但Debian中的Python版本为2.5.4,安装好后,配置文件不支持XML,所以本文采用了开发版本0.9.5。

Nginx:http://nginx.org/download/nginx-0.7.65.tar.gz 
uWSGI:http://projects.unbit.it/downloads/uwsgi-0.9.5-rc2.tar.gz

编译安装uWSGI

1.Install python-dev & libxml2-dev

apt-get install python-dev libxml2-dev

2.Install uWSGI

tar zvxf uwsgi-0.9.5-rc2.tar.gz
cd uwsgi-0.9.5-rc2
make -f Makefile.Py25
cp uwsgi /usr/sbin/uwsgi
cp nginx/uwsgi_params /etc/nginx/

编译安装Nginx

1.Install build-essential

apt-get install build-essential

2.Install ibpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev

apt-get install libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev

3.Install nginx

./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --user=www-data --group=www-data --http-client-body-temp-path=/var/lib/nginx/body --http-proxy-temp-path=/var/lib/nginx/proxy --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --with-md5=/usr/lib --with-sha1=/usr/lib --with-http_ssl_module --with-http_gzip_static_module --with-pcre --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_stub_status_module --add-module=../uwsgi-0.9.5-rc2/nginx/
make & make install

安装及配置Django

1.Install python-setuptools & Django

apt-get install python-setuptools
easy_install django

2.Configure uWSGI

uwsgi -s /tmp/uwsgi.sock --gid 33 --uid 33 -M -x /var/www/mylog/uwsgi.xml -d /var/log/nginx/uwsgi.log

3.Configure Nginx

=======

 

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

http://wangye.org/blog/archives/570/

Debian环境 Python + Django + Nginx + uWSGI + MySQL 配置备忘

最近尝试把项目迁移到Python环境下,特别新装了一台干净的Debian系统,准备重新配置环境,上网找了一些运行Python Web的环境方案,最后敲定Nginx+uWSGI组合,Nginx用得比较多,熟练些;uWSGI据说性能不错,想尝试一下。

网上大部分教程都是要求到uWSGI官方网站下载源码包,然后通过编译的方式安装,比如对于一台新Debian系统,可以通过下面的命令安装:

apt-get update
apt-get upgrade
apt-get install build-essential psmisc
apt-get install python-dev libxml2 libxml2-dev
apt-get install python-setuptools
cd /opt/
wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar -zxvf uwsgi-latest.tar.gz
mv uwsgi-latest/ uwsgi/
cd uwsgi/
python setup.py install

 

还有一些配置我就不介绍了,大家可以参考Linode Library的《Deploy Python Code with WSGI using uWSGI and nginx on Debian 6 (Squeeze)》介绍。

今天要介绍的是利用APT源直接apt-get install安装配置我们所需要的环境,首先按惯例先安装MySQL和Nginx:

apt-get install mysql-server
apt-get install nginx

然后通过Debian Packages网站找到我们所需要的uWSGI在sid里,sid版里的东西表示仍在开发测试中,不是最终稳定版,不过对于我们测试来说是够用了,为了用sid里面的软件包,我们还需要修改我们的/etc/apt/sources.list源,添加deb http://ftp.tw.debian.org/debian sid main non-free contrib这一行,或者直接输入命令:

echo "deb http://ftp.tw.debian.org/debian sid main non-free contrib" >> /etc/apt/sources.list

配置过源列表后,我们就可以通过下面的命令安装了:

apt-get update
apt-get install uwsgi uwsgi-core uwsgi-plugin-python

安装完成后,配置文件按惯例放在了/etc/uwsgi里面,服务控制可以通过invoke-rc.d uwsgi后面跟命令参数来实现,不过这里有个小插曲我不得不提一下,安装时可能会报这样的错误:

The following packages have unmet dependencies:
libc6-dev : Breaks: gcc-4.4 (< 4.4.6-4) but 4.4.5-8 is to be installed.
E: Broken packages

看样子是依赖包gcc版本不匹配,我后来通过下面的方式解决了:

apt-get update
apt-get upgrade # 先尝试升级系统软件包
 
apt-get install libc6-dev

接下来就是安装django以及Python的MySQL支持,继续APT命令:

apt-get install python-django python-mysqldb

通过上面的步骤,Python环境应该安装到你的系统里了,切换到/usr/lib

cd /usr/lib
ls -l | grep python

你可能会发现系统内被默认安装了几个版本的Python,比如我这里就安装有3个版本:

/usr/lib/python2.6
/usr/lib/python2.7
/usr/lib/python3

如何确定当前的Python默认版本呢?很容易,直接通过下面的命令就可以了:

python --version

大家知道django是安装到python目录下的site-packages下的,但是这几个python目录下都没有site-packages这个文件夹,其实我们可以先通过下面的命令定位一下:

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

上面的命令会在控制台上打印Python包路径,比如这里我们可能获得dist-packages这个目录,切换到这个目录你就会发现django在那儿啦。给django-admin.py加上权限,再做个符号连接,便于我们以后操作(我这里Django在Python2.7下):

chmod 777 /usr/lib/python2.7/dist-packages/django/bin/django-admin.py
ln -s /usr/lib/python2.7/dist-packages/django/bin/django-admin.py /usr/local/bin

记下Django所在的Python版本,然后通过下面的命令切换uwsgi的默认Python版本(一般不需要切换):

update-alternatives --config uwsgi-plugin-python

好啦,到这里基本上安装部分就介绍完了,下面讲解配置部分,首先建立我们项目的文件夹,比如说放在/home/user/www下,然后通过下面的命令创建名为mysite的Django项目:

cd /home/user/www
django-admin.py startproject mysite

好了,这下/home/user/www目录下应该有个子文件夹名字叫mysite,我们需要丢个wsgi的配置文件到/home/user/www/mysite/里面去,配置文件命名为wsgi.py,内容如下:

# wsgi.py
# /home/user/www/mysite/wsgi.py
import sys
import os
 
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
# 下面这行是mysite的父目录
sys.path.append('/home/user/www')
# 下面这行的值请改成相应项目名称.settings
# 我们这里是mysite.settings
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
 
import django.core.handlers.wsgi
 
application = django.core.handlers.wsgi.WSGIHandler()

接下来是修改uwsgi配置文件,先通过如下命令按照刚才的设置建立个配置文件:

cat > /etc/uwsgi/apps-enabled/www.ini << EOF
[uwsgi]
socket = /var/run/uwsgi/app/www/socket
chmod-socket = 666
limit-as = 256
processes = 6
max-request = 2000
memory-report = true
enable-threads = true
pythonpath = /home/user/www
chdir = /home/user/www/mysite
wsgi-file = /home/user/www/mysite/wsgi.py
EOF
 
# 重启uwsgi
invoke-rc.d uwsgi restart

注意上面的socket配置,这个在我机子上是这个路径,大家可以cd /var/run里面找下,然后配置正确,接下来建立Nginx配置文件:

cat > /etc/nginx/sites-enabled/www << EOF
server {
        listen   80;
        server_name localhost;
        location / {
                include uwsgi_params;
                uwsgi_pass unix:///var/run/uwsgi/app/www/socket;
        }
}
EOF

这里的uwsgi_pass依旧是上面我们找到的socket,注意一下server_name,这个是我们绑定的域名,通过nginx -s reload重新加载nginx。

好了,现在可以访问看看是不是成功了?如果出现502 Bad Gateway,可以检查一下uwsgi是否正常启动,通过ps aux | grep uwsgi看下进程列表,最后在检查下socket路径是否正确。

假如出现uWSGI Error:Python application not found这个问题,主要是路径配置问题,这点你可以查阅/var/log/uwsgi下面的日志文件,比如我就遇到过ImportError: No module named django.core.handlers.wsgi这个问题,实际上是wsgi.py里面路径配置不正确。

 

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

http://www.linuxidc.com/Linux/2010-12/30262.htm

首先我们必须明白这这3者在该环境下发挥的作用。

1.nginx:("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,作用和apache的类似。它可以处理一些静态文件的请求,而对于动态的文件的请求,它可以通过fastcgi方式,来分发请求给不同的动态语言处理。

2.flup:本身是一个使用python写的web服务器软件,它可以接受nginx发来的请求,执行相应的python代码,将结果返回给nginx。

 

 

3.django:基于python的一个web框架,它可以我们做一些基础性的东西,比如cookie,session管理,模板机制,权限管理等等。

在搭建环境之前,需要先安装好python环境,本文用的是python2.6.5,python的安装这里就不赘述。

1.安装相关支持文件
setuptools,通过setup.py安装python类库需要setuptools。

wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg
sh setuptools-0.6c11-py2.6.eggpcre,正则表达式相关的类库,ospenssh,安装nginx需要。

wget http://sourceforge.net/projects/pcre/files/pcre/8.02/pcre-8.02.tar.gz/download
tar zxvf pcre-8.02.tar.gz
cd pcre-8.02
./configure
make
make install
cd ..
apt-get install openssl libssl-develzlib,压缩相关的类库,很多软件都需要。

wget http://downloads.sourceforge.net/project/libpng/zlib/1.2.5/zlib-1.2.5.tar.gz?use_mirror=nchc
tar zxvf zlib-1.2.5.tar.gz
cd zlib-1.2.5
./configure
make 
make install
cd ..2.安装django
wget http://www.djangoproject.com/download/1.2.1/tarball/
tar zxvf Django-1.2.1.tar.gz
cd Django-1.2.1
python setup.py install
cd ..如果需要使用mysql数据的话,可以参考《Linux下安装Django1.2和Mysql-Python》。

3.安装flup
wget http://www.saddi.com/software/flup/dist/flup-1.0.2.tar.gz
tar zxvf flup-1.0.2.tar.gz
cd flup-1.0.2
python setup.py install
cd ..4.安装nginx
wget  http://nginx.org/download/nginx-0.8.39.tar.gz
tar zxvf nginx-0.8.39.tar.gz
cd nginx-0.8.39
./configure
make
make instll注意:安装后会显示一段Configuration summary信息,可以将它保存起来,【LINUX公社 www.LinuxIDC.com 】以便以后使用。

5.配置
配置flup和flup通过fastcgi方式通信,在运行python程序的server{..}配置节中的location{..}配置节添加以下配置:

fastcgi_pass unix:/tmp/mysite.sock;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;6.运行
创建django项目

cd ~
django-admin.py startproject mysite以cgi方式运行django

~/news/manage.py runfcgi daemonize=true socket=/tmp/mysite.sock启动nginx

/usr/local/nginx/sbin/nginx

 


享受django给你带来的乐趣吧!

 

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

http://www.zeuux.org/blog/content/3316/

半尾ubuntu下配置Nginx+Django+flup+MySQL

半尾  2010年08月29日 星期日 20:56 | 885次浏览 | 0条评论

一直以来都想在自己感兴趣的ubuntu下配置上Django的开发学习环境,一方面用来学习ubuntu基础的linux,一方面学习python的web框架django,当然离不开熟悉的MySQL数据库。从网上找了个方面的资料,终于完成了。
当然里面具体的一些配置涵义我是不理解的,只是能用了。

1.ubuntu版本 windows xp下安装的wubi ubuntu10.04lts 
2.python:系统自带python2.6.5 
3.安装django 
   网上下载django 1.2.1版本。 
   相应目录下 sudo python setup.py install 
4.安装nginx 
  sudo apt-get install nginx 
 安装后nginx到设置文件在/etc/nginx/nginx.conf 
 它的server设置在/etc/nginx/sites-available/default.conf 
 修改default.conf需要修改该文件的权限: 
配置default.conf 
server中添加: 
location / { 
                fastcgi_pass 127.0.0.1:8000; 
                fastcgi_param PATH_INFO $fastcgi_script_name; 
                fastcgi_param REQUEST_METHOD $request_method; 
                fastcgi_param QUERY_STRING $query_string; 
                fastcgi_param CONTENT_TYPE $content_type; 
                fastcgi_param CONTENT_LENGTH $content_length; 
                fastcgi_pass_header Authorization; 
                fastcgi_param REMOTE_ADDR           $remote_addr; 
                fastcgi_param SERVER_PROTOCOL       $server_protocol; 
                fastcgi_param SERVER_PORT           $server_port; 
                fastcgi_param SERVER_NAME           $server_name; 
                fastcgi_intercept_errors off; 
        } 
5.安装python-flup 
   可以在ubuntu软件中心下安装或者sudo apt-get install python-flup 

最后用fcgi的形式运行项目: 
python manage.py runfcgi host=127.0.0.1 port=8000 

这里会看到运行结果。“It's worked。“ 

6.安装mysql。 在ubuntu软件中心下找到mysql server 5.1安装。 
7.安装python-mysql ,同上。 可以在python里import MySQLdb试试。 
>>> import MySQLdb 
>>> conn = MySQLdb.Connection('localhost','root','123456','') 
>>> conn 
<_mysql.connection open to 'localhost' at 92fd30c> 
>>> conn.close() 
>>> conn 
<_mysql.connection closed at 92fd30c> 
8.安装mysql的管理工具,直接利用了ubuntu里到MySQL管理员。 

参考内容: 
http://hi.baidu.com/10428/blog/item/7b0301f403c559e77709d776.html 
http://lloydsheng.com/2010/06/how-install-django-flup-nginx-in-unbuntu.html 
http://blog.stevenwang.name/ngnix-django-175001.html 
http://andexiazi.blogcn.com/diary,25287160.shtml 
http://blog.robotercoding.com/?p=59 
http://blog.wgzhao.com/2010/05/20/deploy-django-with-nginx.html 
http://hi.baidu.com/ghiewa/blog/item/c9fabbfb19de2f2a4f4aeab6.html 
http://lloydsheng.com/2010/05/how-to-install-django12-and-mysql-python-in-linux.html 
http://hi.baidu.com/10428/blog/item/2c772a7ff637060c28388ada.html 
http://docs.djangoproject.com/en/dev/howto/deployment/fastcgi/ 
http://wenku.baidu.com/view/4573663f5727a5e9856a613a.html 
http://www.linuxidc.com/Linux/2010-04/25522.htm 
http://database.51cto.com/art/201005/202479.htm 
http://www.ourubuntu.com/config/2009/1111/ubuntu-mysql-install.html 
http://crucial-systems.com/installing-mysqldb-ubuntu-mysql-python

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

....

http://www.douban.com/note/13508388/

WSGI、flup、fastcgi、web.py的关系

2008-06-21 00:14:24
 

Apache/lighttpd: 相当于一个request proxy,根据配置,把不同的请求转发给不同的server处理,例如静态的文件请求自己处理,这个时候它就像一个web server,对于fastcgi/python这样的请求转发给flup这样的Server/Gateway进行处理

 flup: 一个用python写的web server,也就是cgi中所谓的Server/Gateway,它负责接受apache/lighttpd转发的请求,并调用你写的程序 (application),并将application处理的结果返回到apache/lighttpd

fastcgi: apache/lighttpd的一个模块,虽然flup可以作为一个独立的web server使用,但是对于浏览器请求处理一般都交给 apache/lighttpd处理,然后由apache/lighttpd转发给flup处理,这样就需要一个东西来把apache/lighttpd跟flup联系起来,这个东西就是fastcgi,它通过环境变量以及socket将客户端请求的信息传送给flup并接收flup返回的结果

web.py: 应该说有了上面的东西你就可以开始编写你的web程序了,但是问题是你就要自己处理浏览器的输入输出,还有cookie、session、模板等各种各样的问题了,web.py的作用就是帮你把这些工作都做好了,它就是所谓的web framework,另外一个出名的是django,不过感觉太复杂了,web.py差不多就够用了

WSGI : 除了flup Server/Gateway外还有很多其他人的写的Server/Gateway, 这个时候就会出问题了,如果你在flup上写了一个程序,现在由于各种原因你要使用xdly了,这个时候你的程序也许就要做很多痛苦的修改才能使用 xdly server了,WSGI就是一个规范,他规范了flup这个服务应该怎么写,应该使用什么方式什么参数调用你写的程序(application)等,当然同时也规范你的程序应该怎么写了,这样的话,只要flup跟xdly都遵守WSGI的话,你的程序在两个上面都可以使用了,flup就是一个WSGI server

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

http://www.fresh3g.org/blog/post/346/

一、什么是 WSGI 。

在认识 flup 之前,得先认识一下 WSGI 。

WSGI 的全称为: Python Web Server Gateway Interface v1.0 (Python Web 服务器网关接口),
它是 Python 应用程序和 WEB 服务器之间的一种借口,更多详细的细节,可以参考 PEP333 。

它的作用,类似于FCGI 或 FASTCGI 之类的协议的作用。

WSGI 的目标,是要建立一个简单的普遍适用的服务器与 WEB 框架之间的接口。

WSGI 的特点是:简单、可移植等。

二、什么是 flup 。

WSGI 还只是一种规范,一种标准,它要完成的作用是用来定义 Python 应用程序要如何于
apache/lighttpd/nginx 等之类的 WEB 服务器之间如何进行通信和交换信息,它不是实际
可以直接拿来用的东西。而 flup 就是使用 Python 语言对 WSGI 的一种实现,是可以用
于 Python 的应用开发中的一种工具或者说是一种库。

flup 的官方网站为: http://trac.saddi.com/flup 。flup 属于开源软件,采用了 BSD 风格
的开放源码授权。

那么, WSGI 除了 flup 外,还有没有其他的实现呢,当然有,更多的实现,可以参考:

http://wiki.python.org/moin/WSGIImplementations

三、flup 支持的 WSGI 服务器/网关

flup 支持三种 WSGI 服务器/网关,分别为 AJP 1.3 , FastCGI ,和 SCGI 。
而对于 flup 支持的这三种 WSGI 服务器/网关, flup 有分别提供了两种不同风格的版本:线程版本和进程版本。
这样, flup 实际就支持六种类型的 WSGI 服务器/网关,分别为:

flup.server.ajp
flup.server.ajp_fork
flup.server.fcgi
flup.server.fcgi_fork
flup.server.scgi
flup.server.scgi_fork
flup.server.cgi

使用的参考示例如下:


def myapp(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['Hello World!\n']

if __name__ == '__main__':
    from flup.server.fcgi import WSGIServer
    WSGIServer(myapp).run()



四、flup 在 Django 中的应用

作为一款非常著名和使用比较广泛的 Python Web 开发框架,Django 中就应用到了 flup 。
在 django/core/servers/fastcgi.py 文件中,就调用了 django/core/handlers/wsgi.py
中的 WSGIHandler() 负责对 WSGI 的应用进行处理。

五、WEB 处理流程

nginx <--------(fastcgi)-------> flup(wsgi/django)

lighttpd <-----(fastcgi)-------> flup(wsgi/django)

apache<------(cgi/fastcgi/scgi/mod_wsgi)------------> flup(wsgi/django) 

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

 

 

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

http://hi.baidu.com/ghiewa/blog/item/c9fabbfb19de2f2a4f4aeab6.html

ubuntu + django + mysql + nginx构建自己的实验主机
2009年03月27日 23:55

对于django和nginx安装都是采用的是源码的方式,原先我使用的是ubuntu server 6.10,没有什么

sudo apt-get insatll nginx以及

sudo apt-get install python-django这样的源,另一个原因就是自己也试图通过此减低对Ubuntu配置的生疏感

因为使用的server版本,开始安装的时候默认装备了Apache2,为了让Nginx好用,所以要卸载Apache

sudo apache2ctl stop

sudo apt-get remove apache2

sudo apt-get autoremove

最后,

sudo update-rc.d apache2 remove

 

http://initiative.yo2.cn/archives/465391

[Python+fastcgi]第一次接触flup

在一个项目中需要用到独立daemon的WebService,可惜众多Python Web Frameworks都是请求 - 响应模式,没有long-running, static对象,所以之好寻求更底层的FastCGI接口实现,所以用到了flup。flup是Python的FastCGI模块。

基本HTTP IO

flup官方说:flup不提供文档,flup源代码本身就是最好的文档(瀑布汗 -_-!),所以之好根据flup server示例写了个1.py代码:
[code:python]
def myapp(environ, start_response):
r=""
for x in environ: #得到系统环境变量
r+="%s\t%s\n" % (x, environ[x])
start_response('200 OK', [('Content-Type', 'text/plain')]) #构造CGI返回
return ['Flup works!\n'+r] #HTTP返回

if __name__ == '__main__':
From flup.server.fcgi import WSGIServer
WSGIServer(myapp, multiplexed=True, bindAddress=('0.0.0.0', 888 8) ).run()
[/code]

本机用Python运行python 1.py,然后到服务器上修改lighttpd.conf:

$SERVER["socket"] == "222.197.188.x:26143"{
    fastcgi.server = (
        "/tmp/est.fcgi" => (
            "main" => (
                "host" => "202.115.22.x",
                "port" => 8888,
                "check-local" => "disable",
            )
        ),
    )
    url.rewrite-once = (
        "^(/.*)$" => "/tmp/est.fcgi$1",
    )
}

访问http://222.197.188.x:26143,得到返回:

Flup works!
wsgi.multiprocess       False
HTTP_COOKIE     __utma=246624529.1596407260.1175768082.1187816436.1191204550.32; rtime=13; ltime=1188404661285; cnzz_eid=67275885-; .DottextCookie=173F2250A7BDB4B830A6DF27874674C3B7C00C7F4A359FCD2C62EA724E2E31FB03A8F25B0924F52CACAF1B9FEEF16150C350D3DE180E079C2CB325A7A4A8E97366CBB3AFB1D512BF20F67EC98A525EC775110B6DA7A55554; ASP.NET_SessionId=dvixpx55c40z13bnniayri45; __utma=180314994.97063850.1192419814.1192419814.1192419814.1; __utmc=180314994; __utmz=180314994.1192419814.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)
REDIRECT_STATUS 200
SERVER_SOFTWARE lighttpd/1.4.18
SCRIPT_NAME     /tmp/est.fcgi
REQUEST_METHOD  GET
PATH_INFO       /aadsfasddfasdf
SERVER_PROTOCOL HTTP/1.1
QUERY_STRING    a=123
HTTP_USER_AGENT Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.590; .NET CLR 3.5.20706)
HTTP_CONNECTION Keep-Alive
SERVER_NAME     grid2.dormforce.net:26143
REMOTE_PORT     58343
wsgi.url_scheme http
PATH_TRANSLATED /var/www//aadsfasddfasdf
SERVER_PORT     26143
SERVER_ADDR     222.197.188.x
DOCUMENT_ROOT   /var/www/
SCRIPT_FILENAME /var/www/tmp/est.fcgi
wsgi.input      
HTTP_HOST       grid2.dormforce.net:26143
wsgi.multithread        True
HTTP_UA_CPU     x86
REQUEST_URI     /aadsfasddfasdf?a=123
HTTP_ACCEPT     */*
wsgi.version    (1, 0)
GATEWAY_INTERFACE       CGI/1.1
wsgi.run_once   False
wsgi.errors     
REMOTE_ADDR     202.115.22.x
HTTP_ACCEPT_LANGUAGE    en-US,zh-CN;q=0.5
REDIRECT_URI    /tmp/est.fcgi/aadsfasddfasdf?a=123
HTTP_ACCEPT_ENCODING    gzip, deflate

flup works!

HTTP POST数据

代码里加一个str(dir(environ['wsgi.input']))得到

['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__iter__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_avail', '_buf', '_bufList', '_conn', '_eof', '_lock', '_pos', '_shrinkBuffer', '_shrinkThreshold', '_waitForData', 'add_data', 'next', 'read', 'readline', 'readlines']

那么获取HTTP POST的方法就是str(environ['wsgi.input'].read())
测试:

>>> import urllib2
>>> print urllib2.urlopen('http://grid2.dormforce.net:26143/','a=1').read()
Flup works!
a=1
>>>

wsgi.errors

同理得到environ['wsgi.errors']的方法列表:

['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_streamList', 'flush', 'write', 'writelines']

flup真不错
:-)

 

 

http://tech.lezi.com/archives/238

用python flup调试nginx fastcgi配置错误造成404的问题

 

最近几年php服务器都倾向于使用nginx+fastcgi/php-fpm。

但是配置nginx fastcgi遇到最棘手的问题,就是配置失败时,没有调试手段,不知道哪里有错误,怎么去修改nginx的配置。以前都是盲目尝试,直至配置成功。费时,没有线索。

特别是fastcgi有一堆变量,例如SCRIPT_FILENAME、PATH_INFO、QUERY_STRING、DOCUMENT_URI,如果在配置失败时能看到这些变量的值,对调整配置文件是很有指导意义的。

 

发现python的flup库有fastcgi的协议解析。用它写了一个小工具,能够打印出fastcgi的所有参数,方便诊断问题。flup的安装不介绍了,脚本内容如下:

01 #!/bin/env python
02 def myapp(environ, start_response):
03     = ''
04     for in environ:
05         r+="%s\t%s\n" % (x, environ[x])
06     print r
07     start_response('200 OK', [('Content-Type''text/plain')])
08     return ['Hello World!\n']
09  
10 if __name__ == '__main__':
11     from flup.server.fcgi import WSGIServer
12     WSGIServer(myapp,bindAddress=('0.0.0.0'9999)).run()

使用

  1. 用python 前台运行这个脚本
  2. 将你的nginx配置里面fastcgi_pass 改成9999端口,重启nginx。
  3. 用浏览器触发一个到nginx fastcgi路径的请求

这时python的终端会打印出所有的fastcgi参数

01 [jw@localhost sk]$ python fastcgi-debug.py
02 wsgi.multiprocess   False
03 HTTP_COOKIE vvsid=msaI0VbycTSLWFLF0zKmvRZA; orderby=time; last_login=neilxp
04 REDIRECT_STATUS 200
05 SERVER_SOFTWARE nginx/1.0.4
06 SCRIPT_NAME index.php
07 REQUEST_METHOD  GET
08 PATH_INFO   /xhprof/index.php
09 SERVER_PROTOCOL HTTP/1.1
10 QUERY_STRING
11 CONTENT_LENGTH
12 HTTP_ACCEPT_CHARSET ISO-8859-1,utf-8;q=0.7,*;q=0.3
13 HTTP_USER_AGENT Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1
14 HTTP_CONNECTION keep-alive
15 SERVER_NAME 127.0.0.1
16 REMOTE_PORT 1309
17 wsgi.url_scheme http
18 SERVER_PORT 80
19 SERVER_ADDR 192.168.7.114
20 DOCUMENT_ROOT   /home/www/nginx/html
21 SCRIPT_FILENAME /home/www/xhprof_html/index.php
22 DOCUMENT_URI    /xhprof/index.php
23 wsgi.input
24 HTTP_HOST   192.168.7.114
25 wsgi.multithread    True
26 HTTP_CACHE_CONTROL  max-age=0
27 REQUEST_URI /xhprof/index.php
28 HTTP_ACCEPT text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
29 wsgi.version    (1, 0)
30 GATEWAY_INTERFACE   CGI/1.1
31 wsgi.run_once   False
32 wsgi.errors
33 REMOTE_ADDR 192.168.7.101
34 HTTP_ACCEPT_LANGUAGE    de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
35 CONTENT_TYPE
36 HTTP_ACCEPT_ENCODING    gzip,deflate,sdch

您也许对以下文章感兴趣

posted @ 2012-04-19 17:23  陳聽溪  阅读(2848)  评论(0)    收藏  举报