如何运行nginx,gevent,virtualenv和django

我找不到一个很好的教程,介绍如何在virtualenv中运行Nginx作为反向代理,http服务器和django

我发现类似的教程 ,但是它的uWSGI而不是gevent。 任何指针如何使这与gevent工作将不胜感激。

谢谢

对于像我这样从未尝试过nginx,gunicorn和gevent的人来说,这可能会很复杂。 我正在使用Debian Squeeze,并且更喜欢使用virtualenv来处理deb包,因为stable中的某些包已经过时了,但是它们当然是稳定的。 有时候debs可以帮助管理(vide gunicorn解决方案)。 我不想chroot ,但是很简单 – 我只是相信这对我来说是没有必要的。

首先,您必须创建一个名为webd的用户来更好地隔离。 我假设webd组存在。 你可以检查它的存在:

root$ cat /etc/group | cut -d: -f1 | grep -E '^webd' 

如果组存在,这将打印webd 。 如果不是,请在下面的命令中用-U替换-g webd 。 先阅读useradd --help

 root$ useradd --home-dir /var/web --create-home --shell /bin/bash -g webd webd 

从官方回购安装pip和virtualenv 。

 root$ aptitude install python-pip python-virtualenv 

作为virtualenv帮手,你可以使用virtualenvwrapper ,但其deb版本是非常古老的,所以我宁愿使用pip来代替:

 root$ pip install virtualenvwrapper 

/var/web/.bashrc添加到/var/web/.bashrc

 source /usr/local/bin/virtualenvwrapper.sh 

让我们准备用gevent和django 1.5c1制作virtualenv。 您可能需要从debian repo安装一些开发包来点下面的一些 – 如果您有问题,请告诉我。

 root$ su - webd webd$ mkvirtualenv --no-site-packages production (production)webd$ pip install -U distribute (production)webd$ pip install gunicorn (production)webd$ pip install gevent (production)webd$ pip install https://www.djangoproject.com/download/1.5c1/tarball/ (production)webd$ pip install django-gevent-deploy (production)webd$ cd .virtualenvs/production/bin/ (production)webd$ ln -s django-admin.py django-admin (production)webd$ exit root$ su - webd webd$ workon production (production)webd$ python Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40) [GCC 4.4.5] on linux2 Type "help", "copyright", "credits" or "license" for more information >>> import django >>> django.VERSION (1, 5, 0, 'rc', 1) 

另外得到pytz和postgres的支持:

 (production)webd$ pip install pytz (production)webd$ pip install psycopg2 (production)webd$ pip install gevent-psycopg2 

如果你想离开生产venv使用deactivate 。 如果你想激活它使用workon production 。 让我们来创建django生命空间(我更喜欢单个主Django项目):

 (production)webd$ django-admin startproject myproject (production)webd$ mv myproject/manage.py ./ (production)webd$ chmod u+x manage.py (production)webd$ mv myproject/myproject/* myproject/ (production)webd$ rm -rf myproject/myproject/ (production)webd$ vim manage.py 

改成这样的东西:

 #!/usr/bin/env python import os import sys if __name__ == "__main__": if not '/var/web' in sys.path: sys.path.append('/var/web') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings") from django.core.management import execute_from_command_line execute_from_command_line(sys.argv) 

你需要自定义myproject/settings.py文件。

我想用最新的gunicorn 0.17.2,所以我把它安装在生产virtualenv由点。 但是我也想通过/etc/init.d/gunicorn像其他守护进程一样管理gunicorn守护进程,所以让我们从backports回购安装最新版本的0.14.5版本。

如上所述,您将需要一些debs – 一些来自官方回购,一些来自挤压backports。 如果您还没有使用backports,请将此行添加到您的/etc/apt/sources.list

 deb http://backports.debian.org/debian-backports squeeze-backports main 

更新您的资源并安装gunicorn:

 root$ aptitude update root$ aptitude -t squeeze-backports install gunicorn 

Gunicorn支持virtualenv的基础知识,但没有标准的方法来使用来自其他守护进程的启动脚本的专用gunicorn。 我决定在/usr/sbin/gunicorn-debian文件中硬编码这个特性。 找到Config.start(self)方法并将其第一行替换为:

 def start(self): gunicornpath = self['gunicornpath'] if 'gunicornpath' in self else '/usr/bin' daemon = { 'wsgi': gunicornpath + '/gunicorn', 'django': gunicornpath + '/gunicorn_django', 'paster': gunicornpath + '/gunicorn_paster', }[self['mode']] 

让我们配置gunicorn服务器。 创建/etc/gunicorn.d/web.py文件,并把(我没有尝试django模式呢):

 CONFIG = { 'mode': 'wsgi', 'user': 'webd', 'group': 'webd', 'working_dir': '/var/web', 'python': '/var/web/.virtualenvs/production/bin/python', 'pythonpath': '/var/web/.virtualenvs/production/lib/python2.6', 'gunicornpath': '/var/web/.virtualenvs/production/bin', 'args': ( '--bind=127.0.0.1:9090', '--workers=4', '--worker-class=egg:gunicorn#gevent', '--daemon', 'myproject.wsgi:application', ), } 

接下来安装新版本的nginx来自官方的repo(1.2.6-1〜dotdeb.0而不是1.2.1-2.2〜bpo60 + 1):

 root$ aptitude install nginx 

创建和编辑/etc/nginx/sites-available/myproject

 server { listen *:80; server_name mydomain.com; root /var/web/; location / { proxy_pass_header server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_connect_timeout 10; proxy_read_timeout 10; proxy_pass http://localhost:9090/; } error_page 500 502 503 504 /err50x.html; } 

请创建/var/web/err50x.html 。 请记住,在真正的服务器,你必须设置static网址和其他一些细节。 在/etc/nginx/nginx.conf添加如下的第一行:

 user webd webd 

而日志目录的chmod:

 root$ chown -R webd:webd /var/log/gunicorn/ && chmod g+s /var/log/gunicorn/ root$ chown -R webd:webd /var/log/nginx/ && chmod g+s /var/log/nginx/ 

应用更改并启动您的机器:

 root$ cd /etc/nginx/sites-enabled/ root$ ln -s ../sites-available/myproject 001-myproject root$ /etc/init.d/gunicorn restart root$ /etc/init.d/nginx restart 

用于django的项目外壳:

 (production)webd$ ~/manage.py shell 

要创建一个新的应用程序使用:

 (production)webd$ cd ~/myproject/ (production)webd$ ~/manage.py startapp myapp 

你有什么问题吗? 哪些事情可以做得更好?

uWSGI支持版本0.9.9的gevent,你可以按照教程来调整gevent插件:

http://projects.unbit.it/uwsgi/wiki/Gevent