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號