CentOS下搭建python web生产环境(nginx+web.py+uwsgi)

首先使用环境介绍: 系统: CentOS 5.5 32位

Python版本:2.7.2

nginx:1.0.13

ip:192.168.3.3/24

由于CentOS默认自带都python(2.4.3)版本较低,所以我们采用手动编译安装python的方式来使用python 2.7.2

首先安装python 2.7.2

cd /usr/src/
mkdir python
cd python
#下载python2.7.2
wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2
tar -jvxf Python-2.7.2.tar.bz2
cd Python-2.7.2
./configure --prefix=/usr/local/python27 --enable-unicode=ucs4

先别急着安装,为什么后面的步骤能顺利进行我们需要我们的python支持zlib模块,

vi Modules/Setup
#在454行左右找到:#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
# 去掉注释
zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
然后接着编译
make && make install

安装完成后我们想更方面的使用我们新安装的Python我们做如下更改.

mv /usr/bin/python /usr/bin/python24
ln -s /usr/local/python27/bin/python /usr/bin/python
ln -s /usr/local/python27/bin/python2.7 /usr/bin/python2.7

这样改完我们的yum就无法工作了,我们要修改yum来使yum工作:

vi /usr/bin/yum

将/#!/usr/bin/python改为#!/usr/bin/python2.4即可正常工作(版本可能不一样需查看自己系统自带的版本是什么)

现在我们执行python -V查看应该就是我们刚刚安装的2.7.2版本:

python -V
Python 2.7.2

我们安装了python下面我们就来武装我们的新python,

我们先为新的Python安装python的setuptools,配备easy_install.easy_install用于安装Python第三方扩展包而且只要一个命令即可完成:

下载:

wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg#md5=fe1f997bc722265116870bc7919059ea

然后直接执行安装:

sh setuptools-0.6c11-py2.7.egg

安装好之后我们做一个软链接方便我们使用:

ln -s /usr/local/python27/bin/easy_install* /usr/bin/

然后我们来使用easy_install来安装Python第三方扩展

安装本文所需要的web.py

easy_install web.py

然后我们打开Python shell输入

import web

如果没有报错则说明我们安装成功 安装flup:

easy_install flup

安装Spawn-fcgi :

wegt http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz
tar -zxvf spawn-fcgi-1.6.3.tar.gz
cd spawn-fcgi-1.6.3
./configure --prefix=/usr/local/spawn-fcgi
make && make install
ln -s /usr/local/spawn-fcgi/bin/spawn-fcgi /usr/bin/

到这里我们就完成了Python的所有包安装,下面我们来部署nginx(本博有大量文章来介绍安装nginx,这里还是再来一遍吧..)

yum -y install zlib-devel pcre-devel openssl-devel  # 安装依赖
wget http://nginx.org/download/nginx-1.0.13.tar.gz # 下载
tar -zxvf nginx-1.0.13.tar.gz
cd nginx-1.0.13
 ./configure --prefix=/usr/local/nginx\   # 指定安装目录为/usr/local/nginx
--with-openssl=/usr/include/openssl\  # 启用ssl
--with-pcre\                          # 启用正规表达式
--with-http_stub_status_module        # 安装可以查看nginx状态的程序
make  && make install

我们修改nginx的配置文件:

        location / {
#           root   html;
#          index  index.html index.htm;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            fastcgi_pass unix:/tmp/pyweb.sock;
            fastcgi_param SERVER_ADDR $server_addr;
            fastcgi_param SERVER_PORT $server_port;
            fastcgi_param SERVER_NAME $server_name;
        }

然后创建一个web.py程序:

#!/usr/bin/env python
#-*-coding:utf8-*-
import web
urls = ("/.*", "hello")
app = web.application(urls, globals())

class hello:
        def GET(self):
                return 'Hello, world!'

if __name__ == "__main__":
        web.wsgi.runwsgi = lambda func, addr = None: web.wsgi.runfcgi(func, addr)
        app.run()

将内容保存到/usr/local/nginx/html/下命名为index.py(或任意你喜欢的名字) 然后赋予其执行权限:

chmod +x /usr/local/nginx/html/index.py

通过命令创建spawn-fcgi进程:

spawn-fcgi -d /usr/local/nginx/html/ -f /usr/local/nginx/html/index.py  -s /tmp/pyweb.sock -u nobody -g nobody

我们使用unix socket,并用nginx的用户来创建.现在我们访问http://192.168.3.3/就可以看到:Hello, world!

 

 

 


一、分别正常apt安装nginx+php5+spawn-fcgi即可;

二、关于配置的说明:
1、网上有很多介绍使用fpm补丁或先安装lighttpd然后复制spawn-fcgi甚至关闭lighttpd自动启动来解析php页面的方法。本人发现可直接apt安装spawn-fcgi,并在/etc/rc.local中加入/usr/bin/spawn-fcgi.standalone -a 127.0.0.1 -p 9000 -C 8 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid即可。请注意:此处最好为spawn-fcgi.standalone,很多文章只是说使用/usr/bin/spawn-fcgi,但经查,spawn-fcg连接至/etc/alternatives/spawn-fcgi,且该文件又链接回/usr/bin/spawn-fcgi.standalone,故直接使用。

2、一定要加入 -C 8参数,此处为spawn-fcgi启动的子进程数,如果没有此参数,将很容易出现502 bad gateway错误。当然可以使用-C 128或512等,但经实际测试在使用-C 8的情况下,赛扬M1.7的CPU 1G内存 ubuntu 9.10 i386,webbench 并发3000连接持续运行3600秒,在测试同时及结束后均可以正常连入服务器phpinfo.php页面。而未加-C 8时,并发1000连接才几秒就出现502 bad gateway错误。因我的服务器使用需求远未达到持续3000并发数的使用环境,故未设置超过8的参数来测试,一直都是使用-C 8已可稳定运行。

3、网上还有文章提出使用upstream解决502 bad gateway的方法,经实际测试在不加-C ?进程数而使用upstream的情况下,同样很快出现502错误。

4、关于nginx配置文件nginx.conf方面,建议worker_processes数值不用设置太大,一般生产环境为了保障稳定性设置为2即可。经一台Xeon E5405 4核CPU、16G内存的服务器webbench并发3000连接数实际测试,worker_processer设置为1、2、4(加worker_cpu_affinity优化及不加)、8共5中环境,测试结果表明worker数为4且加cpu_affinity的情况下,性能最差,反而worker数为1的时候CPU使用率最低,性能最强。但5中情况下进行3轮测试取平均值,测试结果没有太大差别,排除测试先后及硬盘内存影响的话,本人认为在5种测试环境下,很难有明显的性能区分。所以我的nginx是设置worker_processer为2,并且一直都运行得很好。

posted on 2013-11-12 16:44  一个石头  阅读(4908)  评论(0编辑  收藏  举报