我找不到关于如何在 virtualenv 中运行 Nginx 作为反向代理、gevent 作为 http 服务器和 django 的好教程。
我找到了类似的教程,但是它适用于 uWSGI 而不是 gevent。任何有关如何使用 gevent 进行这项工作的指示将不胜感激。
谢谢
我找不到关于如何在 virtualenv 中运行 Nginx 作为反向代理、gevent 作为 http 服务器和 django 的好教程。
我找到了类似的教程,但是它适用于 uWSGI 而不是 gevent。任何有关如何使用 gevent 进行这项工作的指示将不胜感激。
谢谢
对于像我这样从未尝试过 nginx、gunicorn 和 gevent 的人来说,这可能会很复杂。我正在使用 Debian Squeeze 并且更喜欢 virtualenv 中的 pip 而不是 deb 包,因为 stable 中的一些包已经过时,但当然它们只是稳定的。有时 debs 可以帮助管理(视频 gunicorn 解决方案)。我不想要chroot,但这很容易 - 我只是相信这对我来说是不必要的。
首先,您必须创建一个名为 webd 的用户,以便更好地隔离。我假设存在 webd 组。您可以通过以下方式检查其存在:
root$ cat /etc/group | cut -d: -f1 | grep -E '^webd'
webd
如果组存在,则打印。如果没有,请在以下命令中替换-g webd
为。-U
读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
:
source /usr/local/bin/virtualenvwrapper.sh
让我们使用 gevent 和 django 1.5c1 为生产环境准备 virtualenv。您可能需要从 debian repo 安装一些开发包来 pip 以下一些 - 如果您有问题,请告诉我。
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,所以我通过 pip 将它安装在生产 virtualenv 中。但我也想像其他守护进程一样管理 gunicorn 守护进程/etc/init.d/gunicorn
,所以让我们从 backports repo 安装最新的可能但过时的 0.14.5 版本。
如上所述,您将需要很少的 deb - 一些来自官方回购,一些来自挤压反向移植。如果您还没有使用反向移植,请将此行添加到您的/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',
),
}
接下来安装来自官方 repo 的较新版本的 nginx(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
url 和其他一些详细信息。添加以下作为第一行/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 的项目 shell:
(production)webd$ ~/manage.py shell
要创建一个新的应用程序,请使用:
(production)webd$ cd ~/myproject/
(production)webd$ ~/manage.py startapp myapp
你有什么问题吗?哪些事情可以做得更好?
uWSGI 从 0.9.9 版本开始支持 gevent,您可以按照教程为 gevent 插件调整它: