3

我找不到关于如何在 virtualenv 中运行 Nginx 作为反向代理、gevent 作为 http 服务器和 django 的好教程。

我找到了类似的教程,但是它适用于 uWSGI 而不是 gevent。任何有关如何使用 gevent 进行这项工作的指示将不胜感激。

谢谢

4

2 回答 2

4

对于像我这样从未尝试过 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为。-Uuseradd --help第一。

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

从官方仓库安装pipvirtualenv 。

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。请记住,在真实服务器中,您必须设置staticurl 和其他一些详细信息。添加以下作为第一行/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

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

于 2013-02-06T17:12:55.577 回答
1

uWSGI 从 0.9.9 版本开始支持 gevent,您可以按照教程为 gevent 插件调整它:

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

于 2011-09-09T08:38:21.653 回答