2011-09-09 33 views
3

我無法找到一個關於如何運行Nginx作爲反向代理的良好教程,gev作爲virtualenv中的http服務器和django。如何運行nginx,gevent,virtualenv和django

我發現類似tutorial,但它的uWSGI而不是gevent。任何關於如何使這與gevent工作的指針,將不勝感激。

謝謝

+0

試試這個:https://bitbucket.org/denis/gevent/src/0464753331d3/examples/webchat – qubird

+0

美味,可悲的是沒有回答 – kbec

回答

4

它可以是複雜的對像我這樣誰沒有嘗試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如果組存在。如果不是,請在以下命令中將-g webd替換爲-U。首先閱讀useradd --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安裝一些開發包來點下面的一些內容 - 如果您有問題,請告訴我。如果你想離開生產VENV使用deactivate

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

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支持。如果你想激活它使用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文件propably。

我想用最新的gunicorn 0.17。2,所以我用pip把它安裝在virtualenv上。但我想通過/etc/init.d/gunicorn管理gunicorn守護像其他後臺程序太多,所以讓我們從反向移植回購安裝最新的可能,但過時的0.14.5版本。

正如上面提到的,你需要幾個德布斯 - 一些來自官方的回購,以及一些從擠壓反向移植。如果你不使用反向移植的是,這一行添加到您的/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文件,並把(我不tryed 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的這是較新的版本來自官方的回購(〜的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 

你有什麼問題嗎?哪些事情可以做得更好?

+0

欣賞你花時間寫出答案。我希望你在一年前回答。我正在學習所有這些東西,一切都很混亂,不得不通過閱讀大量的東西和試驗+錯誤來學習。 – miki725