学海无涯 个人blog lnmps.com 新站
分类: LINUX
2013-05-28 16:50:18
由于一些业务的需要,需要用python来编写一些api接口,为了能快速的开发python程序,需要选择一种框架能快速的实现python程序。目前已有的python框架有:、、、等等。基于以上框架,我选择了web.py来实现我的api接口。原因是web.py比较小巧,安装配置起来非常方便。
1.首先安装python2.7.2
1
2
3
4
5
6
7
8
|
wget
tar jxvf Python2.7.2.tar.bz2
cd Python2.7.2
./configure
make && make install
#自此,python2.7安装后路径默认是在/usr/local/lib/python2.7
ln -s /usr/local/bin/python2.7 /usr/bin/python
python -V
|
需要注意的是yum使用的python2.4.* 此时python升级到2.7.*将导致yum不可用。
解决方法:
1
2
|
vi /usr/bin/yum
将#/usr/bin/python修改为#/usr/bin/python2.4
|
2.安装setuptools来使用easy_install命令安装所需扩展
1
2
3
4
5
6
|
wget
tar zxvf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
./configure && make && make install
vim ~/.bashrc
增加export PATH=$PATH:/usr/local/bin
|
3.安装mysqldb和web.py
1
2
|
easy_install MySQLdb
easy_install web.py
|
python可以使用fcgi和wsgi模块来运行python,但都比较麻烦,这里我使用uWSGI,uWSGI,既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据说该协议大约是fcgi协议的10倍那么快。有个比较见下图:
uWSGI的主要特点如下:
◆超快的性能。
◆低内存占用(实测为apache2的mod_wsgi的一半左右)。
◆多app管理。
◆详尽的日志功能(可以用来分析app性能和瓶颈)。
◆高度可定制(内存大小限制,服务一定次数后重启等)。
1.安装uwsgi
1
|
easy_install uwsgi
|
2.为uwsgi配置多个站点
01
02
03
04
05
06
07
08
09
10
|
easy_install virtualenv
#然后设置一个/多个app基准环境:
virtualenv /var/www/myapp
#应用环境,在此环境下安装的软件仅在此环境下有效:
source /var/www/myapp/bin/activate
pip install django
pip install mako
pip install web.py
pip install mysql-python
...
|
3.配置nginx
最后配置nginx,注意每个站点必须单独占用一个server
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
server {
listen 82;
server_name _;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9091;
uwsgi_param UWSGI_PYHOME /var/www/myapp;
uwsgi_param UWSGI_SCRIPT code;#入口脚本
uwsgi_param UWSGI_CHDIR /var/www/myapp/example;#指程序所在的目录
}
location /static/{
root /var/www/myapp/example/;
}
}
|
4.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 /path/to/uwsgi.log
|
为了让多个站点共享一个uwsgi服务,必须把uwsgi运行成虚拟站点:去掉“-w myapp”加上”–vhost”
1
|
uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000 -d /path/to/uwsgi.log --vhost
|
5.启动运行示例
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
cd /var/www/myapp
mkdir myappdir1
vi test.py
#!/usr/bin/env python
# coding:utf-8
import web
urls = (
'/(.*)', 'hello'
)
app = web.application(urls, globals())
class hello:
def GET(self, name):
if not name:
name = 'World'
return 'Hello, ' + name + '!'
application = app.wsgifunc()
|
启动服务&&访问
1
2
3
4
|
service nginx restart
uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000 -d /path/to/uwsgi.log --vhost
|
1.502 Bad Gateway
没有启动uwsgi服务,使用命令查看是否启动
1
|
netstat -antp | grep "uwsgi"
|
2.cannot allocate memory
可能是我虚拟机运行的缘故,导致出现此类错误。解决方法在启动uwsgi的时候去掉–limit-as 128
3.多次刷新出现拒绝服务问题
使用tcpdump抓包分析
1
2
3
|
tcpdump -i eth0 -nn port 81 -X
#tcpdump 監聽 (1)來自 eth0 介面卡且 (2)通訊協定為 port 22 ,(3)目標來源為 192.168.1.100 的封包資料
tcpdump -i eth0 -nn 'port 22 and src host 192.168.1.100'
|
4.实用web.py静态资源无法访问到,解决方法
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
nginx:
location /static/{
root /var/www/myapp/example/;
}
apache:
ServerName example.com:80
DocumentRoot /doc/root/
# mounts your application if mod_wsgi is being used
WSGIScriptAlias / /script/root/code.py
# the Alias directive
Alias /static /doc/root/static
Order Allow,Deny
Allow From All
Options -Indexes
# because Alias can be used to reference resources outside docroot, you
# must reference the directory with an absolute path
# directives to effect the static directory
Options +Indexes
|
参考网站:
http://blog.csdn.net/yeqihong/article/details/1477050
http://developer.51cto.com/art/201010/229615.htm