Debian环境 Python + Pyramid + Nginx + uWSGI配置备忘

!本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使用方面,本人不保证相应的兼容和可操作性。

前面我写过一篇文章讲解如何在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 + MySQLGetting Pyramid to work with uWSGI in a buildout environment

若无特别说明,本网站文章均为原创,原则上这些文章不允许转载,但是如果阁下是出于研究学习目的可以转载到阁下的个人博客或者主页,转载遵循创作共同性“署名-非商业性使用-相同方式共享”原则,请转载时注明作者出处谢绝商业性、非署名、采集站、垃圾站或者纯粹为了流量的转载。谢谢合作!

请稍后...

发表评论

电子邮件地址不会被公开。 必填项已用*标注