Django線上部署教程:騰訊雲+Ubuntu+Django+Uwsgi
- 2019 年 10 月 8 日
- 筆記
終於將Django成功部署到了騰訊雲上,也實現了HTTPS的功能。現將步驟方法,部署環境一一列舉如下,方便日後查看。
網站源碼已經在github開源:https://github.com/mxdshr/DjangoEast,歡迎克隆使用,並給個star~
1.部署環境與工具
- 騰訊雲
- Ubuntu Server 16.04.1 LTS 64位
- Django2.0.8
- python3.6.7
- Git
- Nginx1.10.3
- Uwsgi
- Filezilla 其中Filezilla是用來向伺服器上傳文件的,之前我一直嘗試給Ubuntu安裝vsftpd,以為得搭建ftp才能傳文件,其實不然,用Filezilla登錄root賬戶也能進行傳文件,埠是22。
2.部署步驟
在進行部署前,請保證你的Ubuntu是剛剛裝好的,純凈的!也要確保系統的登錄用戶是root,如果不是root,使用下面的命令切換到root即可。
sudo su
2.1 安裝python3.6
由於Ubuntu自帶python2.7和python3.5,但這並不是我所需要的版本,因此需要額外安裝python3.6,如果你用的是其他的版本,方法是一樣的。命令如下:
apt-get install software-properties-common add-apt-repository ppa:jonathonf/python-3.6 apt-get update apt-get install python3.6
安裝完之後,在終端輸入python使用的還是2.7的版本,因此我們需要做下面的更改,使終端默認打開我們安裝的python3.6:
cd /usr/bin rm python3 ln -s python3.6 python3
2.2安裝pip3
pip的作用不用多說了,主要是用來管理安裝Python的各種包,安裝方法如下:
apt-get install python3-pip
安裝完還只是第一步,與Python一樣,我們在終端輸入pip,使用的還是系統自帶的版本。我們需要做一下更改,原理與上面的python是一樣的。
cd /usr/bin rm pip3 ln -s pip3.6 pip3
重新登錄可生效,然後就可以用pip3裝庫了
pip3 install --upgrade pip
不知道是什麼原因,這樣操作之後不會立馬生效,需要你重新登錄一下伺服器才行。好,假設你現在重新登錄了,在終端輸入pip3也是我們所要的了,現在需要給pip做一下升級。
pip3 install --upgrade pip
2.3安裝並配置虛擬環境virtualenv
建議大家在一個獨立的Python虛擬環境中對網站進行操作,安裝命令如下:
pip3 install virtualenv
進入一個你想要存放虛擬環境的目錄,這裡我選擇/home,虛擬環境名我取為django,然後創建並激活虛擬環境:
virtualenv django source /home/django/bin/activate
以後大家在進行操作的時候,一定要記得先激活虛擬環境,在django的環境下安裝python包或者操作django的manage.py文件。
2.4 安裝git,下載網站
使用Git可以很方便的與github進行交互操作,幫我們更新網站源碼文件,安裝方式如下:
apt-get install git
安裝完之後需要選擇一個存放網站程式的目錄,這裡我選擇/home/mysite,mysite目錄默認是沒有的,需要你創建,然後進入到此目錄中,用Git將網站pull下來,這裡我以我的已經開源到github上的Django部落格為例,下載網站程式的方法如下:
git init git remote add origin https://github.com/mxdshr/DjangoEast.git git pull origin master
好了,現在我們已經獲取了網站的程式,接下來我們安裝Django程式所需python包
2.5安裝網站運行環境
進行此操作前,請保證你現在已經處於Django這個虛擬環境中:
pip install -r requirements.txt
這個時候,Django程式運行所需要的所有python包,都已經裝入到你的環境中了,現在網站還不能運行,我們需要安裝資料庫。
2.6安裝資料庫MySQL
這裡我選擇的是MySQL5.8版本,安裝步驟如下:
cd /home wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb dpkg -i mysql-apt-config_0.8.12-1_all.deb *選擇8.0即可* apt-get update apt-get install mysql-server
安裝的過程中會提示你輸入密碼,一定要記好哈!安裝完之後需要創建資料庫,創建用戶並授權:
mysql -uroot -p CREATE DATABASE `資料庫名` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER '用戶名'@'%' IDENTIFIED BY '密碼'; GRANT ALL PRIVILEGES ON *.* TO '用戶名'@'%'; FLUSH PRIVILEGES;
這個時候資料庫的配置我們就弄完了,接下來,請先修改網站程式中djangoblog/settings.py中的資料庫配置,修改完之後的操作分為兩種情況: – 如果你想用之前的資料庫,請用MySQL客戶端(如Navicat)對其進行數據導入。 – 如果你沒有資料庫,請在網站根目錄下運行下面的命令,創建數據表。
python manage.py makemigrations python manage.py migrate
好了,Django程式和資料庫已經配置好了。我們可以簡單地運行一下網站了,先切換到網站根目錄下,然後執行:
python manage.py runserver 0.0.0.0:80
0.0.0.0:80表示任意ip可訪問,這樣設置你就可以使用伺服器ip地址訪問你的網站了。但是僅使用python自帶的runserver工具運行網站程式是遠遠不夠的。我們還需要nginx或Apache等伺服器管理軟體來更好的運行我們的網站,另外我們還需要安裝uwsgi。
2.7安裝uwsgi
安裝uwsgi之前我們需要安裝python開發包:
apt-get install python3.6-dev
然後再安裝uwsgi,安裝之前請先退出django這個虛擬環境,我們在公共環境中安裝它.
pip3 install uwsgi
安裝完之後,我們就可以用uwsgi來測試網站是否能成功運行了,使用下面的命令:
uwsgi --http :8888 --chdir /home/mysite --home /home/django --module djangoblog.wsgi:application
–http :用於指定埠,這裡我指定8888,請先在騰訊雲安全組中開放此埠 –chdir:用於指定網站根目錄 –home:用於指定虛擬環境地址 –module:用於指定你的Django項目地址 然後我們在瀏覽器地址中輸入http://你的伺服器ip地址:8888,就可以看到沒有css樣式的頁面了。之所以看不到樣式,是因為uwsgi只能提供動態鏈接服務,要是訪問靜態文件需要安裝nginx:
2.8安裝nginx
apt-get install nginx
安裝完之後我們需要對nginx進行一些配置,不過首先我們需要知道nginx的配置文件都有哪些:
主配置文件:/etc/nginx/nginx.conf一般不用動 可用配置文件:/etc/nginx/sites-available我們一般更改這裡的配置文件 已用配置文件:/etc/nginx/sites-enabled,已經啟用的配置文件 我們在可用配置文件目錄,新建一個mysite.conf此文件用於配置我們的項目。
cd /etc/nginx/sites-available vim mysite.conf
然後在文件中寫入下面的配置:
upstream django { server 127.0.0.1:8888; # for a web port socket (we'll use this first) } server{ listen 80; server_name mysite; charset utf-8; client_max_body_size 75M; #上傳文件大小限制 # 網站靜態文件所在目錄 location /static{ alias /home/mysite/static; } # 上傳文件所在目錄 location /media{ alias /home/mysite/media; } # 動態文件交給uwsgi處理 location / { uwsgi_pass 127.0.0.1:8888; include /etc/nginx/uwsgi_params; } }
然後將此文件再sites-enabled中創建一個軟連接,表示此配置文件已經啟用:
ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf
另外我們還需要將啟動nginx的用戶改為root,要不然會出現403 forbidden的錯誤。打開/etc/nginx/nginx.conf文件,將第一行中user後面的用戶改為root即可。
2.9配置uwsgi
之前我們只是簡單的測試了一下uwsgi,但是還沒有對它進行配置。現在需要進行配置,首先在/home目錄下創建一個mysite_uwsgi目錄,然後在目錄中創建一個mysite.ini文件用於保存uwsgi的配置選項。
cd /home mkdir mysite_uwsgi cd mysite_uwsgi vim mysite.ini
寫入下面的內容
[uwsgi] chdir = /home/mysite home = /home/django module = djangoblog.wsgi:application master = True processes = 4 max-requests = 5000 harakiri = 60 socket = 127.0.0.1:8888 uid = root gid = root pidfile = /home/mysite_uwsgi/master.pid daemonize = /home/mysite_uwsgi/mysite.log vacuum = True
好了,現在nginx配置完了,uwsgi也配置完了,我們就可以測試網站是否能夠成功了,於是用mysite.ini文件打開uwsgi。
uwsgi --ini /home/mysite_uwsgi/mysite.ini
檢查uwsgi是否啟動成功的命令:
ps -aux | grep uwsgi
如果結果中有多個進程,我們就可以看到它啟動成功了。
2.10 配置HTTPS
現在的網站基本都標配HTTPS,如果不是的話瀏覽器會提示你的網站不安全。也會影響搜索引擎收錄,因此我們需要將網站升級到HTTPS。
我用的是騰訊雲,騰訊雲可以免費申請一個TrustAsia TLS RSA CA證書,該SSL證書可用一年,申請之後你就可以得到兩個文件一個.crt,一個是.key。我們需要將這兩個文件用Filezilla傳到/etc/nginx/目錄下。
然後在/etc/nginx/nginx.conf文件里的http模組中寫入下面的配置文件,這個內容是將http請求轉到https請求,網站域名改成你自己的:
server{ listen 80; server_name eastnotes.com www.eastnotes.com; rewrite ^(.*) https://$host$1 permanent; }
然後打開/etc/nginx/sites-available/mysite.conf在裡面填入一下內容:
listen 443 ssl http2; server_name www.eastnotes.com,eastnotes.com; ssl_certificate 1_www.eastnotes.com_bundle.crt; ssl_certificate_key 2_www.eastnotes.com.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on;
重啟nginx
nginx -t service nginx restart
好了,現在打開網站應該就看到https的前綴了,但是還不夠,我們需要將所有的不帶www的連接進行301重定向到帶www的連接,在/etc/nginx/sites-available的location裡面添加如下程式碼:
if ($host != 'www.eastnotes.com' ) { rewrite ^/(.*)$ https://www.eastnotes.com/$1 permanent; }
至此,Django的線上部署全部完成……真TM費勁啊!!!
3.常用命令
# 檢查nginx配置文件是夠有錯誤 nginx -t # 重啟nginx service nginx restart # 查看uwsgi進程 ps -aux | grep uwsgi # 正常關閉uwsgi進程 uwsgi --stop /home/mysite_uwsgi/master.pid # 強制關閉全部uwsgi進程 ps -aux | grep uwsgi |awk '{print $2}'|xargs kill -9 # 重新載入uwsgi uwsgi --reload /home/mysite_uwsgi/master.pid x lsof -i:9000 #查看埠佔用狀態 netstat -lnp| grep 9000 #查看埠佔用狀態 kill -9 +PID號