gpt4 book ai didi

django - 如何运行 nginx、gevent、virtualenv 和 django

转载 作者:行者123 更新时间:2023-12-04 04:52:43 24 4
gpt4 key购买 nike

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

我找到了类似的 tutorial ,但是它用于 uWSGI 而不是 gevent。任何有关如何使用 gevent 进行这项工作的建议都将不胜感激。

谢谢

最佳答案

对于像我这样从未尝试过 nginx、gunicorn 和 gevent 的人来说,这可能会很复杂。我正在使用 Debian Squeeze 并且更喜欢 virtualenv 中的 pip 而不是 deb 包,因为稳定版中的一些包已经过时,但当然它们只是稳定的。有时 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

安装 pipvirtualenv来自官方 repo 。

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

如果你想离开生产环境,请使用deactivate。如果您想激活它,请使用 workon production。让我们创建 django lifespace(我更喜欢单主 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 中安装了它。但我也想通过 /etc/init.d/gunicorn 像其他守护进程一样管理 gunicorn 守护进程,所以让我们从 backports 仓库安装最新的可能但已过时的 0.14.5 版本。

正如上面提到的,您将需要一些 debs - 一些来自官方 repo,一些来自 squeeze-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',
),
}

接下来安装来自官方 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

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

关于django - 如何运行 nginx、gevent、virtualenv 和 django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7356576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com