我的原文:www.hijerry.cn/p/46865.htm…
前言
這一次的總結內容範圍比較廣,主要對程式碼管理到系統釋出、系統維護和其中中可能會出現的一些安全問題進行總結。
程式碼管理
工具和程式碼託管平臺
在一個專案開始之前,首先要選擇一款程式碼管理工具,目前流行是 GIT
和 SVN
,如果沒有歷史問題,建議都使用 GIT
進行程式碼管理。
選好了管理工具後,需要選擇託管平臺,目前國內有 碼雲
、Coding.net
等,國外有 GitHub
、GitLab
。需要注意的是程式碼倉庫的私有性, 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下會有些相容問題,比如換行字元、系統分隔符)
具體來說,需要使用作業系統自帶命令如 yum
、 apt-get
安裝符合Web網站的軟體如 php
、 nginx
、mysql
等,並檢查這些軟體的擴充套件功能是否開啟。
如果是在虛機部署(比如使用Docker),則只需要部署好容器即可完成上述操作了。
程式碼部署
如果是託管在程式碼倉庫裡的,可以用 git
和 svn
命令進行部署。
如果沒有託管,則需要壓縮原始碼,使用 rz
或 scp
等命令上傳到伺服器。
這裡需要注意的是, npm
包、composer
包不要打包上去,而是在伺服器上使用 npm install
和 composer install
命令進行安裝。因為這些檔案往往很多很大,使用命令安裝比較快。
使用者上傳的資源也不要打包部署到伺服器上。因為釋出操作儘量部署純淨的原始碼檔案,儘量少一些資料檔案。
資料庫部署
使用 mysqldump
匯出資料庫表結構
,資料不匯出的原因是為了保持釋出的網站的純淨性,所以本地的測試資料就不要部署到線上系統了。
指令碼檔案部署
一些自己編寫的系統輔助工具,比如用於檢測伺服器狀態的指令碼、用於轉碼視訊檔案的指令碼服務,需要一起部署上去。
除錯
先進行冒煙測試,再進行單元測試即可。
伺服器安全
首先是隱藏錯誤資訊,線上環境下產生的異常資訊,一定不能顯露給使用者看到,並且需要把錯誤資訊記錄到日誌中方便查閱。PHP中設定 error_reporting(0)
即可隱藏所有錯誤。
以下是一些經驗性原則:
- 限制埠。只開放Web埠
80
、443
和 ssh對應的埠。 - 儘量禁用root遠端登入。
ssh
、mysql
、redis
等軟體儘量不使用預設埠22
、3306
、6379
等。- 伺服器的所有使用者均分配獨立賬號,並根據分工建立不同的使用者組。
以下是針對mysql的一些原則:
mysql
資料庫的root禁止遠端登入。mysql
開啟bin log日誌,用於恢復資料庫。(也就是開啟備份)- 不同的應用建立不同的mysql賬號。
- 只給mysql賬號以
select
、update
、delete
、insert
許可權。 - 定期備份資料庫到其他地方。