Web總結:部署和安全

JerryCheese發表於2019-03-01

我的原文:www.hijerry.cn/p/46865.htm…

前言

這一次的總結內容範圍比較廣,主要對程式碼管理到系統釋出、系統維護和其中中可能會出現的一些安全問題進行總結。

程式碼管理

工具和程式碼託管平臺

在一個專案開始之前,首先要選擇一款程式碼管理工具,目前流行是 GITSVN ,如果沒有歷史問題,建議都使用 GIT 進行程式碼管理。

選好了管理工具後,需要選擇託管平臺,目前國內有 碼雲Coding.net 等,國外有 GitHubGitLab 。需要注意的是程式碼倉庫的私有性, GitHub 的私有專案是需要收費的。我個人喜歡把私有專案託管在 碼雲,把公開專案託管在 GitHub

分支管理

新建一個倉庫後,我往往喜歡新建一個 dev 分支作為開發, docs 分支用於存放文件、設計圖,並把 master 分支空出來。在 dev 分支上完成一次版本開發後,再合併到 master 分支上去。所以 master 分支上存放的一直是可用的、穩定的版本。

在進行二次開發時,我喜歡從 dev 拉出新分支,用作二次開發,完成後再考慮合併回去。

一般什麼情況下需要拉分支呢?

  • 從需求的角度,版本次號不同,需要拉新分支。這是為了影響目前版本的系統。
  • 子系統拆分。比如後臺管理、Web門戶、手機端平臺是三個不同小組負責的,所以拉三個分支。
  • 需要緊急修復的bug,拉一個bugfix分支。這是臨時分支。

一次完整版本的釋出,都需要儲存為一個分支,用於進行回退操作。

提交原則

什麼時候進行一次 git commit ?其實什麼時候都可以,但是為了更好的管理,更方便回退操作,一次提交滿足以下幾點是比較好的:

  • 區分度高。要麼是完成了新功能開發,要麼是修復了某一個bug,不能又完成了功能又修復了bug。
  • 儘量完整。在完成新功能時,必須完成測試才進行提交,不提交半成品,修復bug也是如此。

在一次 commit 中,必須註明本次commit做了什麼工作。

系統釋出

目前雲伺服器盛行,騰訊雲、阿里雲都有學生機,一般都是1核 1G 1M + 40G雲硬碟的配置。這樣的配置下,儘量選擇 linux 作為作業系統,可以榨到比較好的效能。

系統的釋出步驟是:部署軟體環境、部署程式碼、部署資料庫、部署指令碼檔案、除錯。

環境部署

如果是在實機上部署,那需要檢查以下幾點:

  • 軟體版本是否符合
  • 軟體所需要的支援庫是否安裝
  • 系統是否相容(win開發,釋出在linux下會有些相容問題,比如換行字元、系統分隔符)

具體來說,需要使用作業系統自帶命令如 yumapt-get 安裝符合Web網站的軟體如 phpnginxmysql 等,並檢查這些軟體的擴充套件功能是否開啟。

如果是在虛機部署(比如使用Docker),則只需要部署好容器即可完成上述操作了。

程式碼部署

如果是託管在程式碼倉庫裡的,可以用 gitsvn 命令進行部署。

如果沒有託管,則需要壓縮原始碼,使用 rzscp 等命令上傳到伺服器。

這裡需要注意的是, npm 包、composer 包不要打包上去,而是在伺服器上使用 npm installcomposer install 命令進行安裝。因為這些檔案往往很多很大,使用命令安裝比較快。

使用者上傳的資源也不要打包部署到伺服器上。因為釋出操作儘量部署純淨的原始碼檔案,儘量少一些資料檔案。

資料庫部署

使用 mysqldump 匯出資料庫表結構 ,資料不匯出的原因是為了保持釋出的網站的純淨性,所以本地的測試資料就不要部署到線上系統了。

指令碼檔案部署

一些自己編寫的系統輔助工具,比如用於檢測伺服器狀態的指令碼、用於轉碼視訊檔案的指令碼服務,需要一起部署上去。

除錯

先進行冒煙測試,再進行單元測試即可。

伺服器安全

首先是隱藏錯誤資訊,線上環境下產生的異常資訊,一定不能顯露給使用者看到,並且需要把錯誤資訊記錄到日誌中方便查閱。PHP中設定 error_reporting(0) 即可隱藏所有錯誤。

以下是一些經驗性原則:

  • 限制埠。只開放Web埠 80443 和 ssh對應的埠。
  • 儘量禁用root遠端登入。
  • sshmysqlredis 等軟體儘量不使用預設埠 2233066379 等。
  • 伺服器的所有使用者均分配獨立賬號,並根據分工建立不同的使用者組。

以下是針對mysql的一些原則:

  • mysql 資料庫的root禁止遠端登入。
  • mysql 開啟bin log日誌,用於恢復資料庫。(也就是開啟備份)
  • 不同的應用建立不同的mysql賬號。
  • 只給mysql賬號以 selectupdatedeleteinsert 許可權。
  • 定期備份資料庫到其他地方。

相關文章