天天看點

阿裡雲Ubuntu伺服器通過uWSGI和Nginx部署Django項目

uWSGI+Nginx+Django工作原理

nginx作為伺服器前端,接受用戶端所有的請求,統一來管理。Nginx把所有的靜态請求自己處理(靜态檔案處理是nginx的強項),然後把所有非靜态請求通過uwsgi傳遞給Django,由Django來處理,進而完成一次web請求。

部署環境

阿裡雲伺服器Ubuntu 16.04版 (Linux),Python 3.X。如果你是首次購買阿裡雲伺服器,你應該做如下事情:

  1. 配置安全組
  2. 設定遠端連接配接密碼 - 重新開機伺服器
  3. 本地安裝FileZilla通過SSH連接配接伺服器 (相當于FTP,以便于上傳和檢視檔案。

同時你還需要知道購買伺服器的公網IP,便于後續通過網際網路直接檢視項目是否已經部署成功。

第一步 更新Python和PIP

剛購買的ubuntu 16.04伺服器自帶Python還是2.7版的, pip版本為8,需要先使用如下指令更新Python和PIP版本。

sudo apt-get install python3.5 # 安裝python

sudo apt-get install python3-pip # 安裝python 3-pip

sudo rm /usr/bin/python # 删除python 2.7版本

sudo ln -s /usr/bin/python3.5 /usr/bin/python # 将python連結到最新3.5版的

pip3 install upgrade – pip # 更新pip

pip3 – version #檢視pip版本

第二步 建立使用者

阿裡雲給你的預設登入使用者是root,而且是沒密碼的。建議先建立個人使用者,我們這裡以enka為例。建立好後,你會發現/home/目錄裡多一個enka檔案夾。注意剛建立的enka使用者沒有sudo權限,你必需先賦予它sudo權限才便于執行後面指令。

• 建立使用者: adduser enka, 連續輸入密碼兩次。

•賦予sudo權限: sudo vim /etc/sudoers或visudo , 追加一行enka ALL=NOPASSWD: ALL。按ESC切入指令行,這裡要用:wq!來寫入儲存

•切換使用者到enka: su – enka

第三步 建立虛拟環境

每個獨立項目都有自己的依耐性。在建立一個Django項目前,我們應該建立一個虛拟環境,把django安裝在虛拟環境裡。這不是建議,還是必需。連續輸入以下項目指令後,你會發現/home/enka/目錄下多了一個子目錄Env,專門用于存放虛拟環境資訊。

•sudo pip install virtualenv virtualenvwrapper

•echo"export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3" >> ~/.bashrc

•echo"export WORKON_HOME=~/Env" >> ~/.bashrc

•echo"source /usr/local/bin/virtualenvwrapper.sh">> ~/.bashrc

•source ~/.bashrc

本例中我們不僅安裝了virtualenv,還安裝了virtualenvwrapper,并将配置資訊輸入到.bashrc檔案裡了。這裡.bashrc隐藏檔案是用來存儲并加載你的終端配置和環境變量的。現在你可以使用如下指令建立,終止和切換虛拟環境了,這樣比使用virtualenv的source /bin/venv/activate等指令來激活和管理一個虛拟環境友善多了。

•mkvirtualenv myproject #建立一個myproject的虛拟環境

•deactivate #退出虛拟環境

•workon myproject1 #切換到myproject1的虛拟環境

第四步 安裝Django

使用mkvirtualenv myproject指令建立一個叫myproject的虛拟環境後,你就可以把Django安裝在這個虛拟環境裡了。

• pip install django #安裝django

Django安裝好後,cd進入/home/enka目錄使用sudo mkdir myproject指令建立一個叫myproject的檔案夾(建議與虛拟環境名保持一緻,與本地Django項目名保持一緻)。這個項目檔案夾位址是/home/enka/myproject, 裡面将存放django代碼,此時可以通過git clone線上擷取項目代碼,也可以通過FileZilla将本地項目代碼上傳到這裡。(注: 如果你沒有現成項目代碼,你還可以通過使用django-admin.py startproject myproject線上建立一個項目。)

項目代碼到位後,連續輸入以下指令,然後通路公網ip位址:8080,你應該就可以看到你的django項目已經上線啦。

• pip install -r requirements.txt #安裝依賴檔案

• python manage.py createsuperuser #建立超級使用者

• python manage.py makemigrations

• python manage.py migrate #生産資料表

• python manage.py collectstatic #搜集靜态檔案

• python manage.py runserver 0.0.0.0:8080

注意, 運作項目前請確定你已經在settings.py裡設定STATIC_ROOT= os.path.join(BASE_DIR, “static/”)和ALLOWED_HOSTS= [‘your_server_domain_or_IP’]。

第五步 安裝uWSGI,并将其加入系統服務

第四步中我們還是使用django的runserver指令來運作伺服器的,我們現在來安裝uWSGI并使其做伺服器。使用deactivate指令退出虛拟環境後,使用pip安裝uwsgi。随後再使用workon myproject指令進入虛拟環境,在虛拟環境中再安裝uwsgi一遍,并測試uwsgi是否安裝成功。(注: uwsgi需要安裝兩遍哦.)

• pip install uwsgi # 安裝uwsgi

• uwsgi – version # 檢視版本

uWSGI安裝成功後,你可以使用如下指令啟動Django項目myproject,退出時可以使用Ctrl+C退出。

• uwsgi --http :8080 --home /home/enka/Env/myproject --chdir /home/enak/myproject -w myproject.wsgi

這個指令太長,很難記住。一個更好的方法是配置uwsgi,并将其加入系統服務。這樣每次啟動uwsgi服務時,自動調用配置檔案的設定。在終端連續輸入以下指令,建立myproject.ini檔案,存放uwsgi配置資訊。

• sudomkdir -p /etc/uwsgi/sites

• cd /etc/uwsgi/sites

• sudo nano myproject.ini

myproject.ini

檔案配置内容如下,這個設定是可以複用的。如果你要複用,你隻需要修改project名和base即可。

[uwsgi]

project = myproject # 項目名
uid = www-data # nginx 預設使用者名
gid = www-data # nginx預設使用者組

base = /home/enka # 根目錄
chdir = %(base)/%(project)  #項目目錄
home = %(base)/Env/%(project) #虛拟環境目錄
module = %(project).wsgi:application #對應wsgi檔案
master = true  #主程序
processes = 2 #同時程序數
socket = /run/uwsgi/%(project).sock #對應sock檔案名
chown-socket = %(uid):www-data #指定socket使用者與使用者組
chmod-socket = 660 #指定socket使用者讀寫執行權限
vacuum = true #每次重新開機是否清理
           

現在我們需要把uwsgi加入到系統服務,這樣我們就可以通過使用sudo systemctl start uwsgi 來啟動uwsgi服務了。

•sudo nano /etc/systemd/system/uwsgi.service

uwsgi.service

檔案内容如下,采用的是Emperor模式。

[Unit]

Description=uWSGIEmperor service

[Service]

ExecStartPre=/bin/bash -c 'mkdir-p /run/uwsgi; chownwww-data:www-data /run/uwsgi'

ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites

Restart=always

KillSignal=SIGQUIT

Type=notify

NotifyAccess=all

[Install]

WantedBy=multi-user.target
           

第六步 安裝與設定Nginx

使用如下指令安裝Nginx,并建立配置檔案。

•sudo apt-get install nginx # 安裝nginx

•sudo nano /etc/nginx/sites-available/myproject #建立myproject配置資訊

配置檔案如下所示,标紅部分需要換成你自己的項目資訊。

server {
	listen 80;
	server_name your_ip_or_your_domain;

	location = /favicon.ico { access_log off; log_not_found off; }             
	location /static/  {
		root /home/enka/myproject/;
	} #設定靜态檔案根目錄

	location /media/  {
		root /home/enka/myproject/;
	}  #設定媒體檔案根目錄

	location / {
		include uwsgi_params;                               
		uwsgi_pass     unix:/run/uwsgi/myproject.sock;
	}  #如果非靜态或媒體檔案,交由uwsgi處理
}

           

設定好配置檔案後,連續使用如下4個指令,通路公網IP你就應該能看到你的項目能成功運作啦。

• sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled # 建立連結

• sudo nginx –t #檢查nginx文法

• sudo systemctl restart nginx #重新開機nginx服務

• sudo systemctl restart uwsgi #重新開機uwsgi服務

參考資料

https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-uwsgi-and-nginx-on-ubuntu-16-04

小結

本文介紹了如何在阿裡雲Ubuntu伺服器上通過uWSGI和Nginx部署Django項目,并分享了可以複用的uwsgi和nginx配置資訊。然而我們并沒有介紹如何使項目在生産環境中更安全,比如關閉DEBUG,把SECRET_KEY和資料庫的密碼變為環境變量,而不是簡單放在settings.py檔案裡。