我們的相冊雖然還有不完善的地方,但是沒關系,越早把它部署到互聯網上,才能越早發現線上特有的問題,讓產品在迭代中成長。
注意:以下流程經過筆者驗證,能夠保證順利部署項目。如果你不知道每一步都是干嘛的,那么請嚴格按照文章的流程順序操作。
配置服務器
要架設網站,首先你要有一臺連接到互聯網的服務器。國內比較出名的云服務器有阿里云、騰訊云、百度云,三家各有優劣,大家自行了解比較,并選擇自己適合的購買。
和前章一樣,筆者用的是阿里云全家桶,所以教程會以阿里云ECS作為例子講解。新用戶通過此阿里云ECS推廣鏈接注冊有折扣和現金券;學生有優惠服務器每月9.5元,很劃算。
阿里云服務器購買頁面變動頻繁,如果圖中展示的步驟和你購買時的不一樣也沒關系,核心步驟都是差不多,稍微找一下就OK了。
首先進入阿里云ECS的購買頁面:


圖片字很小,看不清楚的同學將就一下放大看吧。
挑重點說一下:
- 實例從入門級里選一款便宜的(比如2核2G的),以后流量高了再升級也不遲(土豪請無視這條)。
- 鏡像選擇 Ubuntu 。其他 Linux 版本也是可以的,根據你的使用習慣確定。
- 系統盤先選個 20G,夠你用一陣了。數據盤暫時用不上,不用勾選。
點擊下一步,來到網絡和安全組頁面:


這頁默認就行了,公網帶寬選最低的 1M ,初期夠用了。
如果有詢問是否購買公網 IP 的選項,記得勾上。沒公網 IP 就沒辦法連接到互聯網了。
點擊下一步,到系統配置頁面:


為了后面遠程連接服務器更簡單,這里勾選自定義密碼,也就是輸入用戶/密碼的認證方式了。實際上秘鑰對的認證方式更安全些,以后摸熟了再改回來吧。
點擊下一步,到分組設置頁面。這個頁面全部默認設置就好了。點擊下一步,確認訂單無誤后,就可以付款啦。
付款成功后,通過控制臺就可以看到已購買的云服務器了:


這里有時候會有黃字提醒你服務器的網絡端口沒開,點擊黃字鏈接進入安全組規則選項卡開通一下:


把 22(遠程連接端口)、443(HTTPS端口)、80(HTTP端口)都打開,3389端口順便也開了。
這一步很重要,如果不打開后續會始終連接不上站點。如果沒有黃字提醒,那就一定要到安全組中確認端口已打開。
至此服務器的購買、配置就完成啦。稍等幾分鐘后等待初始化完成,就可以得到服務器的公網 IP 地址,筆者的是 47.104.227.185 ,后面會用到。
準備工作
在正式部署前,還有些準備工作需要做。
修改后端配置
首先 Django 的配置要更改為線上狀態:
# /album/settings.py
...
# 修改項。關閉調試模式
# 關閉后 django 不再處理靜態資源
# 也不再提供錯誤提示頁面
DEBUG = False
# 修改項。允許所有的IP訪問網絡服務
ALLOWED_HOSTS = ['*']
# 新增項。靜態文件收集目錄
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')
然后在虛擬環境中執行:
(env)> pip freeze > requirements.txt
將后端所有的依賴庫記錄到 requirements.txt 中。
代碼上傳Github
將項目代碼拷貝到云服務器的方式有幾種。比較方便的是上傳到 Github ,再由 Github 將項目代碼下載到服務器。因此你需要把項目上傳到 Github。
Github 經常會速度很慢或無法登錄。這時候你也可以嘗試用國內的 Gitee,或者直接點對點本地上傳服務器。
如何上傳這里就不細講了,請自行學習 Git 相關知識,注冊 Github 賬號等。
需要提醒的是,所有依賴的庫都不需要上傳,比如 env 目錄,它們可以在服務器中很方便地安裝。
這就是前面生成的 requirements.txt 的作用。
接下來就是正式部署了。
遠程連接
部署的第一步就是想辦法連接到云服務器上去,否則一切都免談。鑒于項目是在 Windows 環境開發的,推薦用 XShell 來作為遠程連接的工具。XShell 有學校及家庭版本,填一下姓名和郵箱就可以免費使用了。
XShell 怎么使用就不贅述了,以讀者的聰明才智,稍微查閱一下就明白了。
使用相當簡單,基本就是把主機 IP、端口號(22)以及登錄驗證填好就能連接了。
連接成功后,就能在 XShell 窗口中看到阿里云的歡迎字樣了:
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-77-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Welcome to Alibaba Cloud Elastic Compute Service !
root@dusai:~$
root@dusai:~$是命令提示符(root 是用戶名,dusai 是主機名),輸入命令時不需要你輸入這個。
本文后面把 root@dusai:字符省略掉,方便大家閱讀。
安裝項目及依賴
接下來的部署指令均在服務器中執行,也就是在 XShell 中操作,別搞混了。
首先更新系統庫:
~$ apt-get update
~$ apt-get upgrade
部署到正式環境時,后端服務器就不能用 Django 自帶的開發服務器了(性能低下),而是改用 Nginx + Gunicorn + Django 配合提供網絡服務:
- 客戶端發來 http 請求,Nginx 作為直接對外的接口,對 http 請求進行分析;
- 如果是靜態資源請求,則由Nginx自己處理(效率極高);
- 如果是動態資源請求,則把它轉發給 Gunicorn 進行預處理后,再轉發給 Django,最終完成資源的返回。
除此之外,還要確保 Python3 、Git 和 virtualenv 也都正確安裝。
順序執行以下指令:
~$ apt-get install nginx
~$ apt-get install python3.8
~$ apt-get install python3-pip
~$ apt-get install git
~$ pip3 install virtualenv
均成功后,創建并跳轉到項目目錄:
~$ mkdir -p /home/sites/album
~$ cd /home/sites/album
# 進入的路徑如下所示
/home/sites/album$
接下來就可以從 Github 下載項目了:
# 以教程倉庫為例 django-vue-tutorial
../album$ git clone https://github.com/stacklens/django-album-tutorial.git
這里就以教程的倉庫為例,讀者用自己項目時一定要注意路徑名稱正確。
如果你是從非公開項目下載,用戶名密碼的認證方式 Github 已經準備廢棄了。如遇報錯請以密鑰認證的形式下載。
下載好項目后,在同級路徑創建并進入虛擬環境:
../album$ virtualenv --python=3.8 venv
../album$ source venv/bin/activate
# 看到 (venv) 開頭就對了
(venv) ../album$
進入項目目錄,安裝依賴、收集靜態資源并遷移數據庫:
# 這里的 django-album-tutorial 路徑是從 Github 拉取下來的項目路徑
# 記得改成你自己的
(venv) ../album$ cd django-album-tutorial
(venv) ../django-album-tutorial$ pip3 install -r requirements.txt
(venv) ../django-album-tutorial$ python3 manage.py collectstatic
(venv) ../django-album-tutorial$ python3 manage.py migrate
最后啟動 nginx:
# 為了閱讀方便,后續命令行均省略 $ 前面的路徑部分
(venv) ~$ service nginx start
在瀏覽器中訪問你的云服務器的公網 IP ,看看效果:


看到 Nginx 的歡迎頁面則成功一半了。繼續。
配置nginx
Nginx 歡迎界面這個默認配置顯然是不能用的,所以需要重新寫 Nginx 的配置文件。
/etc/nginx/sites-available 目錄是定義 Nginx 可用配置的地方。輸入指令創建配置文件 myblog 并打開 vim 編輯器:
(venv) ~$ vim /etc/nginx/sites-available/album
關于 vim 編輯器如何使用也不多說了,這里只說兩個最基本的操作:
- 按 i 鍵切換到編輯模式,這時候才可以進行輸入、刪除、修改等操作
- 按 Ctrl + c 退回到命令模式,然后輸入 :wq + Enter 保存文件修改并退回到服務器命令行
回到正題,用 vim 在 album 文件中寫入:
server {
charset utf-8;
listen 80;
server_name 47.104.227.185; # 改成你的 IP
location /static {
# 這里的 django-album-tutorial 路徑是從 Github 拉取下來的項目路徑
# 記得改成你自己的
alias /home/sites/album/django-album-tutorial/collected_static;
}
location /media {
# 這里的 django-album-tutorial 路徑是從 Github 拉取下來的項目路徑
# 記得改成你自己的
alias /home/sites/album/django-album-tutorial/media;
}
location / {
proxy_set_header Host $host;
proxy_pass http://unix:/tmp/47.104.227.185.socket; # 改成你的 IP
}
}
此配置會監聽 80 端口(通常 http 請求的端口),監聽的 IP 地址寫你自己的服務器公網 IP。
配置中有兩個核心規則:
- 如果請求靜態資源,則直接轉發到對應目錄中尋找
- 其他請求則轉發給 Gunicorn(再轉交給 Django)
如果你已經申請好域名了,就把配置中有 IP 的地方都修改為域名,比如:server_name www.dusaiphoto.com。
寫好后就退出 vim 編輯器,回到命令行。因為我們寫的只是 Nginx 的可用配置,所以還需要把這個配置文件鏈接到在用配置上去:
(venv) ~$ ln -s /etc/nginx/sites-available/album /etc/nginx/sites-enabled
測試下 nginx 配置是否正常:
(venv) ~$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
至此 Nginx 就配置好了,接下來搞定 Gunicorn。
有的讀者無論怎么配置都只能看到 Nginx 歡迎頁面,有可能是 sites-enabled 目錄中的 default 文件覆蓋了你寫的配置。將 default 文件刪掉就可以正常代理自己的配置文件了。
Gunicorn及測試
Nginx 搞定后就只剩 Gunicorn 了。
下面的三條命令分別是安裝 Gunicorn 、 重啟 Nginx 和 啟動 Gunicorn:
(venv) ~$ pip3 install gunicorn
(venv) ~$ service nginx restart
# 將 IP 改為你的公網 IP
# .wsgi 前面為 Django 配置文件所在的目錄名
(venv) ~$ gunicorn --bind unix:/tmp/47.104.227.185.socket album.wsgi:application
# Gunicorn 成功啟動后命令行提示如下
[2021-07-29 15:09:22 +0800] [11945] [INFO] Starting gunicorn 20.1.0
[2021-07-29 15:09:22 +0800] [11945] [INFO] Listening at: unix:/tmp/47.104.227.185.socket (11945)
[2021-07-29 15:09:22 +0800] [11945] [INFO] Using worker: sync
[2021-07-29 15:09:22 +0800] [11947] [INFO] Booting worker with pid: 11947
Gunicorn 就啟動成功了。(注意啟動時命令行所在的路徑)
接下來用瀏覽器訪問試試:


大功告成,撒花慶祝!
此時你就可以對比本地存儲和 OSS 存儲的巨大鴻溝了。
收尾工作
后期運維
你的網站是需要不斷更新優化代碼的。每次修改代碼后,更新到服務器上也很簡單。在虛擬環境中并進入項目目錄,依次(collectstatic 和 migrate 是可選的)執行以下命令:
git pull
python3 manage.py collectstatic
python3 manage.py migrate
# 重啟 gunicorn
pkill gunicorn
gunicorn --bind unix:/tmp/47.104.227.185.socket my_blog.wsgi:application
加上 cd 更改目錄的指令,部署過程有十幾條指令,手動輸入也太麻煩了。簡單粗暴的辦法是利用 XShell 的宏,把部署指令寫成順序執行的腳本,點幾個按鈕就完成了,非常方便。
更高級的做法是在服務器上編寫自動化部署的腳本,這個就讀者以后慢慢研究吧。
如果你更改了 Nginx 的配置文件,還需要重啟 Nginx 服務:
service nginx restart
域名及優化
相對部署來說,域名配置就很容易了,各家云服務商都有此業務。
有了域名之后要改的地方:
- Nginx 中與 IP/域名 有關的位置
- Gunicorn 中與 IP/域名 有關的位置
域名搞定之后,接著就可以著手考慮把網站升級為 https 版本了。
最后,在開發時我們往 settings.py 中寫入如 SECRET_KEY 、郵箱密碼等各種敏感信息,部署時千萬不要直接上傳到公開倉庫,而是把這些信息寫到服務器本地,然后在 settings.py 中讀取。
進程托管
部署過程中還有個新手經常碰到的問題,就是當 SSH 終端一關閉,Web 服務也一起被關閉了,導致網站無法連接。這個問題在 @frostming 的文章 《Web 服務的進程托管》 中用了三種常見方法解決了,并且還實現了異常重啟和開機自啟動。有類似疑惑的同學可以前往圍觀。
總結
部署可以說是入門者最大的難關了,也是檢驗成果、獲取成就感的關鍵一步。
多查資料,要相信你遇到的問題別人早就遇到過了。
路漫漫其修遠兮,吾將上下而求索。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。