阿里雲部署Django專案(超詳細圖文教程) —— Part2. 使用Nginx, Gunicorn, virtualenv, supervisor 部署Django應用

馬志峰的程式設計筆記發表於2015-11-14

阿里雲部署Django專案(超詳細圖文教程)

Part2. 使用Nginx, Gunicorn, virtualenv, supervisor 部署Django應用

前言:

花了一個月的空閒時間,終於成功把Django網站部署到了阿里雲ECS上,包含以下功能:

  • 不使用任何第三方工具,直接用網頁連線阿里雲ECS
  • 使用GIT進行原始碼控制和上傳到伺服器
  • 使用git hooks實現自動部署
  • 用的是時下比較流行的一套部署方案——Nginx, Gunicorn, virtualenv, supervisor and PostgreSQL
  • 可以在同一臺伺服器上部署兩個、甚至多個網站

光說不練假把式,建議大家邊看邊操作!

軟體介紹

nginx: 反向代理伺服器,處理靜態資源,負載均衡等。
gunicorn: Python WSGI HTTP Server for UNIX。
virtualenv: 建立獨立的 python 環境。
supervisor: 基於linux作業系統的一款伺服器管理工具,用以監控伺服器的執行,發現問題能立即自動預警及自動重啟等功能。

1.系統更新和軟體安裝

依次在遠端管理終端下執行以下步驟,進行伺服器系統更新和依賴軟體安裝:
* 更新系統

 sudo aptitude update
 sudo aptitude upgrade

* 安裝資料庫PostgreSQL

 sudo aptitude install postgresql postgresql-contrib
 sudo aptitude install libpq-dev python-dev

* 安裝virtualenv

 sudo aptitude install python-virtualenv

* 安裝Supervisor

 sudo aptitude install supervisor

* 安裝Nginx

 sudo aptitude install nginx

PS: 可以使用右上角的“複製命令輸入”將命令貼上進來
這裡寫圖片描述
過程中會提示需要多少的磁碟空間,如果空間夠用的話選擇 yes 就可以繼續了,耐心等待更新包安裝
這裡寫圖片描述

對比文章標題,大家會發現Gunicorn還沒有安裝,稍後我們會在建立出的python環境中安裝Gunicorn

2. 建立一個許可權組來管理應用

出於安全和方便管理的目的,使用專門的使用者組來操作web應用

  • 新增使用者組
sudo groupadd --system webapps

命令解釋:
groupadd 新增使用者組
–system 指定將要新增的使用者組是系統級別的
webapps 使用者組的名字,也可以叫djangoapps等,起名字最好有一定的意義
* 新增使用者

 sudo useradd --system --gid webapps --shell /bin/bash --home /webapps/hello_django user_hello_django

命令解釋:
useradd 新增使用者
–gid 指定使用者所屬的組,後面緊跟的webapps就指定了使用者屬於webapps組
–shell 使用者使用shell的路徑,即/bin/bash
–home 使用者home資料夾位置,即/webapps/hello_django,這個目錄將是web應用的根目錄
user_hello_django 使用者名稱(起名字要有辨識度,最好能自解釋)

  • 為使用者設定密碼

    sudo passwd user_hello_django

  • 給使用者新增執行sudo命令的許可權

    vim /etc/sudoers

    在root ALL=(ALL:ALL) ALL 下面新增一行:

    user_hello_django ALL=(ALL:ALL) ALL

  • 建立目錄並授權

     sudo mkdir -p /webapps/hello_django/
     sudo chown user_hello_django /webapps/hello_django/

命令解釋:
mkdir 建立資料夾
chown 改變檔案或資料夾的所有者
這幾條命令都是linux的基礎命令,有疑問可以百度之。

3.建立獨立的python執行環境

  • 切換使用者

    sudo su - user_hello_django

    注意命令提示符字首的變化。

  • 進入應用目錄

    cd /webapps/hello_django/

  • 建立環境
    virtualenv -p /usr/bin/python3.4 .

這裡寫圖片描述
命令解釋:
- p /usr/bin/python3.4 表示建立python3.4的執行環境,也可以通過改變引數建立其他python版本的環境
- . 表示當前目錄,也可以指定完整路徑,如/webapps/hello_django/
* 啟用環境
source bin/activate

4.安裝Django和Gunicorn

  • 安裝
 pip install django
 pip install gunicorn
 pip install psycopg2

這裡寫圖片描述

  • 建立一個Django專案,名稱為hello
    django-admin.py startproject hello
  • 驗證Django是否正常工作
    cd hello
    python manage.py runserver 112.74.123.69:8000
    命令解釋:
    112.74.123.69 為伺服器的IP地址,注意替換為自己的

在瀏覽器中輸入112.74.123.69:8000並跳轉,看到如下頁面表示成功:

5.建立Gunicorn的啟動指令碼

  • 建立檔案/webapps/hello_django/bin/gunicorn_start
cd /webapps/hello_django/bin/
vim gunicorn_start
  • 在vim中編輯檔案
    輸入i進入編輯模式
    貼上文字內容
    :w 儲存修改
    :q 退出
(...)
NAME="hello_app"                                  # Django應用的名稱
DJANGODIR=/webapps/hello_django/hello             # Django 專案的目錄
SOCKFILE=/webapps/hello_django/run/gunicorn.sock  
USER=user_hello_django                                        # 使用者名稱
GROUP=webapps                                     # 使用者組
NUM_WORKERS=3                                     # 一般是伺服器使用CPU的個數X2+1,所以一個CPU的話,worker就是3
DJANGO_SETTINGS_MODULE=hello.settings             # Django應用使用的settings檔案
DJANGO_WSGI_MODULE=hello.wsgi                     # WSGI 模組名稱
(...)

給檔案新增可執行許可權
sudo chmod u+x bin/gunicorn_start

6.建立Supervisor配置檔案

在/etc/supervisor/conf.d目錄下建立檔案hello.conf
內容如下:

[program:hello]
command = /webapps/hello_django/bin/gunicorn_start                    #指定啟動Django app的命令,也是剛才建立的gunicorn指令碼
user = user_hello_django                                                          #使用者名稱
stdout_logfile = /webapps/hello_django/logs/gunicorn_supervisor.log   #執行日誌存放位置
redirect_stderr = true                                                #把stderr日誌也放在剛才的檔案裡

注意到日誌檔案還沒有建立,我們來建立一下:

 mkdir -p /webapps/hello_django/logs/
 touch /webapps/hello_django/logs/gunicorn_supervisor.log 

可以使用下面的命令控制元件Supervisor

sudo supervisorctl reread #修改配置檔案後需要使用
sudo supervisorctl update #更新狀態,會啟動剛配置的應用
sudo supervisorctl status hello #檢視應用狀態
sudo supervisorctl stop hello #停止應用
sudo supervisorctl start hello #啟動應用
sudo supervisorctl restart hello #重啟應用

7. 建立Nginx虛擬伺服器

在目錄/etc/nginx/sites-available下建立hello檔案

upstream hello_app_server {
  server unix:/webapps/hello_django/run/gunicorn.sock fail_timeout=0;
}

server {
    listen   80;
    server_name hello.test;

client_max_body_size 4G;

access_log /webapps/hello_django/logs/nginx-access.log;
error_log /webapps/hello_django/logs/nginx-error.log;

location /static/ {
    alias   /webapps/hello_django/static/;
}

location /media/ {
    alias   /webapps/hello_django/media/;
}

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    if (!-f $request_filename) {
        proxy_pass http://hello_app_server;
        break;
    }
}

執行命令進行檔案連結
sudo ln -s /etc/nginx/sites-available/hello /etc/nginx/sites-enabled/hello
sudo service nginx restart

命令解釋:
ln -s 建立兩個檔案之間的同步連結,這時/etc/nginx/sites-available/hello和/etc/nginx/sites-enabled/hello的內容將會完全相同,以後要修改的話也只需要修改/sites-available/hello的內容,會自動同步

如果nginx restart 顯示 fail, 可以使用sudo nginx -t命令檢視失敗原因

注意在Django的settings檔案中INSTALLED_APPS加入gunicorn

修改內容後:

sudo service nginx restart
sudo supervisorctl restart hello     

參考文章:
Setting up Django with Nginx, Gunicorn, virtualenv, supervisor and PostgreSQL
本文主要是由該文章翻譯整理而來,向大神致敬。

相關文章