搭建高性能的 Django 服務器棧

http://logic0.blog.163.com/blog/static/18892814620136258532112/html


搭建高性能的 Django 服務器棧  

2013-07-25 23:00:22|  分類: Django學習 |  標籤:django  服務器配置  服務器搭建  環境配置  網站   |舉報 |字號 訂閱 node

對不起各位,我有點稍微標題黨了。
本文針對裸機 Linux 搭建 Django 的服務器棧,可直接應用在Linode,阿里雲等VPS上。
Linux:Ubuntu 12.04 + ,其餘版本相似
說明:
# 以#開頭表示註釋,
$ 這裏是須要執行的命令 <尖括號包含須要你本身定義的內容>

○、鏈接VPS或者服務器python

      很少說,putty就是個不錯的工具,若是你本地有mac或者linux就更好了mysql

1、升級軟件包,打補丁linux

# 更新本地包的索引,這個必須作
$ sudo apt-get update

# 升級全部軟件包
$ sudo apt-get dist-upgrade

# 刪除不須要的軟件包
$ sudo apt-get autoremove

# 重啓系統,大多數時候不須要,但少數須要重啓,以防萬一仍是重啓下的好
$ sudo reboot
2、安裝Python,及Python包安裝工具

首先是Python 包 和 Python 開發包
$ sudo apt-get install build-essential python-dev

安裝 distribute 和 pipnginx

# 下載 distribute 安裝文件, curl 不可用也能夠用 wget http://python-distribute.org/distribute_setup.py
$ curl -O http://python-distribute.org/distribute_setup.py

# 安裝distribute
$ sudo python distribute_setup.py

# 安裝文件能夠刪除了
$ rm distribute*

# 用 distribute 安裝 pip
$ sudo easy_install pip
3、安裝virtualenv,提供虛擬環境執行支持


# 安裝 virtualenv 和 virtualenvwrapper
$ sudo pip install virtualenv virtualenvwrapper

# 編輯用戶的bash配置文件
$ vim .bashrc
# 在文件末尾增長下邊這一行,讓 virtualenvwrapper.sh 能自動執行,給shell添加命令
source /usr/local/bin/virtualenvwrapper.sh
# 保存文件退出

# 可使用exit 推出從新登陸,使 virtualenvwrapper 生效,也可使用source 使之生效
$ exit
怎麼使用 virtualenv

# 建立一個虛擬運行環境,通常使用 VIRTUALENV_NAME=你的project名字就好。<>包含的是須要你本身指定的東西,如下再也不說明 
$ mkvirtualenv <VIRTUALENV_NAME>

# 建立完後會自動啓動虛擬環境,使用 deactivate 可退出
$ deactivate

# 激活特定的虛擬環境 或者 更改到另外一個虛擬環境,執行下邊的命令
$ workon <VIRTUALENV_NAME>
經過下邊的命令你能夠看到 系統環境 和 虛擬環境 的不一樣
# 退出虛擬環境,若是你在虛擬環境內的話
$ deactivate
$ pip freeze                  # pip freeze 能夠查看都安裝了哪些軟件包及其版本
$ workon <VIRTUALENV_NAME>    # 切換到虛擬環境
$ pip freeze                  # 查看虛擬環境內的軟件包及版本,就能夠發現不一樣
================= 如下操做均在虛擬環境內進行,再也不說明 ==================

4、安裝Django
# 安裝最新版的Django,須要特定版本請查看 pip 指定版本的方法
$ pip install django

# 安裝 docutils, Django 的 admin 會用到這個
$ pip install docutils

# 測試 Django 是否安裝成功
$ django-admin.py startproject <APP_NAME>
$ cd <APP_NAME>
# 給 manage.py 運行權限
$ chmod +x manage.py
# 測試服務器,若是隻是在本機測試則不須要指定 0.0.0.0
$ ./manage.py runserver 0.0.0.0:8000
5、安裝 PIL/PILLOW,提供圖形支持
python 圖形庫,例如驗證碼、二維碼之類的會用到。
# 給系統添加相應的圖形軟件包支持,這步要在最早執行,由於PIL 須要編譯,若是沒有jpeg就沒法支持.jpg圖片
$ sudo apt-get install libjpeg8-dev libfreetype6-dev zlib1g-dev

# 如下兩個任選一個,有人說 PIL 偶爾會有問題,若是你也不肯定,那就選 Pillow 吧
$ pip install pillow
$ pip install pil
6、安裝數據庫
選擇MySQL,怪我不才,只對MySQL熟悉一些,你選別的也能夠
# 安裝 MySQL
$ sudo apt-get install mysql-server libmysqlclient-dev
# 安裝 MySQL 的 Python 鏈接器
$ pip install MySQL-Python 
7、安裝South,加強scheme管理
這個不是強制的,但確是極推薦的。Django 自帶的 Scheme 管理器不能對 表結構變動起效,當你改變Model 的時候,必須手工的更改數據庫表結構,何其蛋疼,何其容易出錯。
$ pip install south

# 將 south 加到你的 Django 工程的配置文件裏
$ vim <YOUR_APP>/settings.py
INSTALLED_APPS = 
    ...
    'south',
    ...
8、安裝 memcached,提供cache
KV cache,減小數據庫查詢數量 和 加強性能
# 安裝 memcached 和 開發包
$ sudo apt-get install memcached libmemcached-dev

# 安裝 memcached 的 Python 鏈接器,有不少同類型的鏈接器,推薦pylibmc
$ pip install pylibmc

# 修改 Django project 的配置文件settings.py,添加 cache 支持
$ vim <YOUR_APP>/settings.py
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': '127.0.0.1:11211',
    }
}
9、安裝 RabbitMQ 和 celery ,提供異步執行支持
RabbitMQ,安裝完必需要 建立用戶 並 賦權
$ sudo apt-get install rabbitmq-server
$ sudo rabbitmqctl add_user <RABBIT_USER> <RABBIT_PASSWORD>
$ sudo rabbitmqctl add_vhost <RABBIT_VHOST>
$ sudo rabbitmqctl set_permissions -p <RABBIT_VHOST> <RABBIT_USER> ".*" ".*" ".*"
celery ,安裝很簡單,可是要對 Django project 的 settings.py 進行配置
# 經過pip 安裝
$ pip install django-celery

$ vim <YOUR_APP>/settings.py

# 將 djcelery 應用安裝到當前的 project
INSTALLED_APPS = 
    ...
    'djcelery',
    ...

# 亂七八糟的配置,甭管具體是啥了,加上就是了,注意修改須要自定義的部分
BROKER_URL = "amqp://<RABBIT_USER>:<RABBIT_PASSWORD>@localhost:5672/<RABBIT_VHOST>"
CELERY_RESULT_BACKEND = "database"
CELERY_RESULT_DBURI = "mysql://<DB_USER>:<DB_PASSWORD>@localhost/<DB_NAME>"

# 把這兩行放到 settings.py 文件尾
import djcelery
djcelery.setup_loader()
10、安裝 Gunicorn 提供網站服務器
apache + mod_wsgi,uWSGI 都是不錯的選擇,可是看你我的的愛好了。gunicorn 不須要多少配置就能工做得不錯,仍是值得用的。
# pip 安裝 Gunicorn
$ pip install gunicorn

# 將 Gunicorn 添加到你的 Django project 中
$ vim <YOUR_APP>/settings.py
INSTALLED_APPS =
    ...
    'gunicorn',
    ...
Gunicorn 有好多的命令參數,你能夠看 Gunicorn document ,通常用4個worker ,同時支持gevent 就行了
測試Gunicorn
$ ./manage.py run_gunicorn -w 4 -k gevent

# Ctrl+C 能夠退出 Gunicorn,PS:若是它成功運行的話
11、安裝 Supervisor,提供自啓動支持
經過 apt-get 安裝的 server 是當即啓動,並開機自啓動的,可是 celery 和 gunicorn 是經過 pip 安裝的,不能自啓動。而supervisor 是經過 apt-get 安裝的,是能夠自啓動的。
Supervisor 同時也提供任務監控的功能,若是 Gunicorn 忽然因爲某個異常掛了,Supervisor 會重啓它,而不須要你干預。你能夠想下你的站凌晨三點由於一個偶爾出現的異常掛掉,你卻沒有Supervisor 是什麼感受。不過這個功能也只是用來對付偶然,若是你的關鍵服務掛了致使 Gunicorn 掛掉,重啓多少遍都是沒用的。
# apt-get 安裝 Supervisor
$ sudo apt-get install supervisor
# 配置文件必須放在 /etc/supervisor/conf.d/ 目錄下,並且必須以 .conf 後綴結尾 # celery 配置文件 /etc/supervisor/conf.d/celeryd.conf # 告訴 Supervisor 這個程序叫什麼名字 [program:celeryd] # 啓動命令,你能夠注意到這裏的python 是用的 virtualenv 下的 python command = /home/<USERNAME>/.virtualenvs/<VIRTUALENV_NAME>/bin/python /home/<USERNAME>/<APP_NAME>/manage.py celeryd -B -E # 服務運行時處在哪一個目錄 directory = /home/<USERNAME>/<APP_NAME> # 以哪一個用戶的身份運行 user = <USERNAME> # 是否隨系統自動啓動 autostart = true # 掛掉後是否自動重啓 autorestart = true # 標準輸出和錯誤信息log文件 stdout_logfile = /var/log/supervisor/celeryd.log stderr_logfile = /var/log/supervisor/celeryd_err.log
# celery 監控進程配置文件 /etc/supervisor/conf.d/celerycam.conf
[program:celerycam]
command = /home/<USERNAME>/.virtualenvs/<VIRTUALENV_NAME>/bin/python /home/<USERNAME>/<APP_NAME>/manage.py celerycam
directory = /home/<USERNAME>/<APP_NAME>
user = <USERNAME>
autostart = true
autorestart = true
stdout_logfile = /var/log/supervisor/celerycam.log
stderr_logfile = /var/log/supervisor/celerycam_err.log
# Gunicorn 的配置文件 /etc/supervisor/conf.d/gunicorn.conf
[program:gunicorn]
command = /home/<USERNAME>/.virtualenvs/<VIRTUALENV_NAME>/bin/python /home/<USERNAME>/<APP_NAME>/manage.py run_gunicorn -w 4 -k gevent
directory = /home/<USERNAME>/<APP_NAME>
user = <USERNAME>
autostart = true
autorestart = true
stdout_logfile = /var/log/supervisor/gunicorn.log
stderr_logfile = /var/log/supervisor/gunicorn_err.log
Supervisor 管理命令,上邊配置文件完成後,須要重啓Supervisor,以便於發現新的配置

# 重啓 Supervisor
$ sudo service supervisor restart

# restart/stop/start Supervisor 管理的全部服務
$ sudo supervisorctl restart all
$ sudo supervisorctl stop all
$ sudo supervisorctl start all

# 只重啓 celeryd,這個名字,就是在配置文件裏告訴 Supervisor的那個
$ sudo supervisorctl restart celeryd

# 只啓動 Gunicorn
$ sudo supervisorctl start gunicorn
12、安裝Nginx,添加靜態文件支持

Django 的靜態文件分爲 static 和 media ,二者都是靜態文件,只是前者由你產生,後者是用戶上傳的文件
PS:Django 的 DEBUG=True 模式支持靜態文件調試,可是 DEBUG=False 後就不支持了
# 建立文件目錄 static 、 media
sudo mkdir /var/www
sudo mkdir /var/www/static
sudo mkdir /var/www/media

# 賦權
sudo chown -R <USERNAME>:www-data /var/www

$ vim <YOUR_APP>/settings.py

# 修改 Django project 配置
MEDIA_ROOT = '/var/www/media/'
MEDIA_URL = '/media/'
STATIC_ROOT = '/var/www/static/'
STATIC_URL = '/static/'

# 每次static 文件發生變動,要運行下邊的命令
$ ./manage.py collectstatic
nginx 安裝
# 安裝 nginx
$ sudo apt-get install nginx
nginx 配置
nginx 配置有兩個目錄,/etc/nginx/sites-available/ 和 /etc/nginx/sites-enabled/,前者是可用的站點配置目錄,後者是起做用的站點配置目錄
# 刪除默認
$ sudo rm /etc/nginx/sites-enabled/default

# 空白配置文件,並創建一個鏈接到 sites-enabled 使其生效
$ sudo touch /etc/nginx/sites-available/<你的應用>
$ cd /etc/nginx/sites-enabled
$ sudo ln -s ../sites-available/<你的應用>

# 編輯配置文件
$ vim /etc/nginx/sites-available/<你的應用>
配置文件樣例:

# 配置一個 upstream server ,起個名字叫 gunicorn,監聽 8000 端口
upstream gunicorn {
    server localhost:8000;
}

# 配置 nginx 服務器
server {
    # 監聽 80 端口
    listen 80;

    # 綁定對這些域名的請求
    server_name <你的域名>.com www.<你的域名>.com;

    # 在這個目錄下查找文件
    root /var/www/;

    # log文件
    access_log /var/log/nginx/<你的應用>.access.log;
    error_log /var/log/nginx/<你的應用>.error.log;

    # 這個選項來指定用戶能夠上傳大文件
    # 具體見 http://wiki.nginx.org/HttpCoreModule#client_max_body_size
    # 不知道放到哪兒好,寫了兩次,正常運行
    client_max_body_size 0;

    # 這行比較重要
    # 嘗試以靜態文件方式處理當前請求
    # 若是找不到知足條件的靜態文件,就把鏈接傳給 Gunicorn 
    try_files $uri @gunicorn;

    # 配置 Gunicorn 信息
    location @gunicorn {
        # 再寫一次,以防萬一
        client_max_body_size 0;

        # 轉發給上邊配置的 upstream server
        proxy_pass http://gunicorn;

        # 確保 URL 不轉到 http://gunicorn 
        proxy_redirect off;

        # Gunicorn 在5 minutes 內沒有迴應就放棄
        # 這個時間能夠隨意改,本身看着辦
        proxy_read_timeout 5m;

        # 肯定這些 HTTP headers 配置是正確的
        proxy_set_header Host            $host;
        proxy_set_header X-Real-IP       $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

重啓Nginx,搞定!你能夠運行你的Django 應用了。sql

# 重啓 nginx
$ sudo service nginx restart


轉載請註明地址:http://logic0.blog.163.com/blog/static/18892814620136258532112/
相關文章
相關標籤/搜索