提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

前面我写过一篇文章讲解如何在 Debian环境下配置Python + Django + Nginx + uWSGI + MySQL ,也是具有借鉴意义的,欢迎大家先阅读那篇文章。

nginx安装我就不介绍了,直接apt-get即可。

Python大部分Linux系统里应该预装了,我也不介绍安装了,基本上我们这里需要Python 2.7即可,通过命令 python --version 确认一下默认Python的版本号。

通过命令安装uwsgi:

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

注意这个uwsgi-plugin-python是必不可少了,否则uwsgi的log日志会提示 -- unavailable modifier requested: 0 --

好了,下面我们介绍如何安装Pyramid,大家也可以参考Pyramid的官方文档 《Installing Pyramid》 ,我这里再简单的叙述下:

1. 检查setuptools是否已经安装,正常情况下如果setuptools已经安装了:

[chrism@thinko docs]$ python2.7
Python 2.7.3 (default, Aug  1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import setuptools
>>>

如果setuptools没有安装,会提示 ImportError: No module named setutptools 错误:

[chrism@thinko docs]$ python2.7
Python 2.7.3 (default, Aug  1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import setutptools
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named setutptools
>>>

如果不幸没有安装setuptools,那么对于Python2系列,我们可以通过下面的命令来安装:

wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py

2. 有了setuptools后这一步就是安装virtualenv了:

sudo easy_install virtualenv

使用virtualenv的好处就是可以隔离各类Python项目的配置以及环境变量,这样各个项目可以互不干扰,整个系统也会更加稳定。

3. 使用virtualenv创建工作区(workspace):

virtualenv --no-site-packages pyramidproj

切换到名为pyramidproj的工作区:

cd pyramidproj

完成上步切换后,再使用工作区环境内的easy_install安装pyramid:

bin/easy_install pyramid

4. 创建一个带SQLAlchemy的项目:

cd pyramidproj
bin/pcreate -s alchemy project1

5. 启用开发模式,具体什么模式由你的需求而定:

cd project1
../bin/python setup.py develop

6. 初始化数据库,如果这个项目带有数据库的话,需要执行此步:

cd project1
../bin/initialize_project1_db development.ini # 开发模式配置文件

根据上述6步,Pyramid项目已经配置完成并可以使用了,如果有不明白的地方,可以看 Pyramid的官方示例

下面我将介绍如何将Pyramid、uWSGI以及Nginx连接起来,使他们能够协同工作。

1. 创建Pyramid的WSGI配置文件,这点和之前配置Django一致,也可以参考官方文档 《Running a Pyramid Application under mod_wsgi》

假设我们的Pyramid项目位于 /home/user/www/pyramidproj/project1 ,egg cache位于 /home/user/.python-eggs/ ,那么配置文件pyramid.wsgi可以这么写:

import os
os.environ['PYTHON_EGG_CACHE'] = '/home/user/.python-eggs/'

import sys
print sys.path
from pyramid.paster import get_app
application = get_app(
  '/home/user/www/pyramidproj/project1/development.ini', 'main')

值得注意的是上面仍然使用了开发模式下的配置文件development.ini,这个视需求情况而定。将这个配置文件pyramid.wsgi存入项目路径下供下面uwsgi配置备用。

还有就是PYTHON_EGG_CACHE环境变量不指定的话,可能会 因为权限问题报如下错误

Can't extract file(s) to egg cache 
The following error occurred while trying to extract file(s) to the Python egg
 
cache:
   [Errno 13] Permission denied: '/root/.python-eggs'
 The Python egg cache directory is currently set to:
   /root/.python-eggs
 Perhaps your account does not have write access to this directory?  You can
 change the cache directory by setting the PYTHON_EGG_CACHE environment
 variable to point to an accessible directory.

2. 建立我们项目的uWSGI配置文件:

cat > /etc/uwsgi/apps-enabled/project1.ini << EOF
[uwsgi]
chmod-socket = 666
master = true

harakiri = 60
harakiri-verbose = true
limit-post = 65536
post-buffering = 8192

daemonize = /var/log/uwsgi.log

max-requests = 1000

reload-on-as = 128 
reload-on-rss = 96
no-orphans = true

log-slow = true

virtualenv = /home/user/www/pyramidproj
wsgi-file = /home/user/www/pyramidproj/project1/pyramid.wsgi

EOF

# 重启uwsgi
invoke-rc.d uwsgi restart

3. 建立Nginx配置文件:

cat > /etc/nginx/sites-enabled/www << EOF
server {
    listen          80;
    access_log      off;
    error_log       /var/log/nginx/http.error.log;

    charset         utf-8;
    location / {
        uwsgi_pass  unix:///var/run/uwsgi/app/www/socket;
        include     uwsgi_params;
    }
}
EOF

# 重新加载nginx配置
nginx -s reload

到这里配置算是全部结束了,如果不出意外你的Pyramid项目应该能够正常运行了,如果显示502 Bad Gateway,请检查/var/log/uwsgi/app下面的log信息。

参考文档: Pyramid + Nginx + uWSGI + MySQL Getting Pyramid to work with uWSGI in a buildout environment