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项目,并测试运行:
- #创建项目,这里我们只使用django admin的功能
- django-admin.py startproject siteadmin
- #修改siteadmin的settting
- vim siteadmin/settings.py
- 修改如下参数:
- DATABASES项
- INSTALLED_APPS项里注释掉django.contrib.admin和django.contrib.admindocs前面的#号
- #修改siteadmin的urls.py
- vim siteadmin/urls.py
- 修改如下参数:
- 取消下面行的注释
- from django.contrib import admin
- admin.autodiscover()
- url(r'^admin/doc/
- url(r'^admin
- #数据库初始化
- python manage.py syncdb
- #直接用manage.py测试django是否可以正常运行
- python manage.py runserver 0.0.0.0:8080
完成,我再使用xml的方式来配置运行djano。
- #在siteadmin目录下,建立siteadmin.xml,内容如下
- <uwsgi>
- <socket>127.0.0.1:3031</socket>
- <chdir>/home/webapps/backend/django/myadmin</chdir>
- <pythonpath>..</pythonpath>
- <module>django_wsgi</module>
- </uwsgi>
- #在siteadmin目录下,建立dangjao_wsgi.py,因为django创建项目时本来就有一个siteadmin/wsgi.py,我们做个软连接即可
- ln -s siteadmin/wsgi.py django_wsgi.py
使用uwsgi启动django。
- uwsgi -x django.xml --uid nginx -t 30-M -p 4–limit-as 128-R 10000-d /home/django/siteadmin/logs/django.log
C.建立nginx配置文件:
- 在nginx配置文件里加入针对访问django的location
- location /django {
- include uwsgi_params;
- uwsgi_pass 127.0.0.1:3031;
- }
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目录是
1
|
/home/maemual/python/demo/
|
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:
1
|
uwsgi-xdjango_socket.xml
|
配置Nginx
打开Nginx的配置文件nginx.conf
1
|
sudo vim/etc/nginx/nginx.conf
|
在HTTP的括号里加入如下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
server{
listen 80;
server_name 127.0.0.1
charset UTF-8;
access_log /var/log/nginx/test_access.log;
error_log /var/log/nginx/test_error.log;
client_max_body_size75M;
location/{
include uwsgi_params;
uwsgi_pass127.0.0.1:8077;
uwsgi_read_timeout2;
}
location/static{
expires30d;
autoindex on;
add_header Cache-Control private;
alias/home/maemual/python/demo/static/;
}
}
|
其中/static目录是你的django项目中静态文件目录。然后就可以重新启动Nginx了。
1
|
nginx-s reload
|
此时就可以访问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,如能看到欢迎信息,就说明运行环境配置好了
四.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
基于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 |
} |
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] |
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 |
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的主要特点如下:
◆超快的性能。
◆低内存占用(实测为apache2的mod_wsgi的一半左右)。
◆多app管理。
◆详尽的日志功能(可以用来分析app性能和瓶颈)。
◆高度可定制(内存大小限制,服务一定次数后重启等)。
正式开工
uwsgi的文档虽然很多也很详细,这里是uwsgi的官方文档:http://projects.unbit.it/uwsgi/wiki/Doc。
1.安装uwsgi
ubuntu有uwsgi的ppa:
- add-apt-repository ppa:stevecrozz/ppa
- apt-get update
- apt-get install uwsgi
2. 用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())
- appapplication = app.wsgifunc()
再比如django就是:
- .......
- from django.core.handlers.wsgi import WSGIHandler
- application = WSGIHandler()
然后运行uwsgi监听9090,其中-w后跟模块名,也就是刚才配置的myapp
- uwsgi -s :9090 -w myapp
运行网站发现已经部署完成了。
3.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
4.为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服务了。
5.实战应用
最初的设置完毕以后,再添加的应用,只需要在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版本,文档缺失,各种兼容问题。
原文地址:http://obmem.info/?p=703
uwsgi官网:http://projects.unbit.it/uwsgi/
这算是学习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数据库。从网上找了个方面的资料,终于完成了。
当然里面具体的一些配置涵义我是不理解的,只是能用了。
#########################################################
http://hi.baidu.com/ghiewa/blog/item/c9fabbfb19de2f2a4f4aeab6.html
对于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 IOflup官方说:flup不提供文档,flup源代码本身就是最好的文档(瀑布汗 -_-!),所以之好根据flup server示例写了个1.py代码: if __name__ == '__main__': 本机用Python运行 $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数据代码里加一个 ['__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的方法就是
wsgi.errors同理得到
![]() |
http://tech.lezi.com/archives/238