Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1000132
  • 博文数量: 361
  • 博客积分: 25
  • 博客等级: 民兵
  • 技术积分: 1759
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-22 23:18
个人简介

学海无涯 个人blog lnmps.com 新站

文章分类

全部博文(361)

文章存档

2017年(1)

2015年(2)

2014年(55)

2013年(303)

分类: LINUX

2013-05-28 16:50:18


发表于439 天前 ? , , ? ? 被围观 +

简介

由于一些业务的需要,需要用python来编写一些api接口,为了能快速的开发python程序,需要选择一种框架能快速的实现python程序。目前已有的python框架有:、、、等等。基于以上框架,我选择了web.py来实现我的api接口。原因是web.py比较小巧,安装配置起来非常方便。

安装配置Python

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

在lnmp环境中配置运行python

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

阅读(1556) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~