多台服務器集群部署方案


擼了快 3 年的 Laravel 了,盡量這周分享本人使用的多台服務器集群部署方案
 

1、rsync+sersync 自動同步差異化文件
CentOS7 下使用 rsync+sersync 配置文件自動同步
2、docker 下安裝 gogs
使用 Docker 部署版本控制工具 Gogs

 

序言

大家看着圖個樂就行,這段純粹個人吐槽,可直接跳過
本人所在的公司,后端就我一個人,前端一名(原本 2 名,后來離職 1 名),設計兩名,策划 1 名。17 年進入這家公司,維護公司官網,最初就我一人,18 年下半年逐漸增加到 6 人,隊伍也不算小了,本人負責整個后端架構和服務器部署維護。
從 15 年出來工作到現在,陸陸續續也進過很多公司,最初的毛頭小子,技術小白,一步一步成長到現在,技術、經驗都有了很大的提升(自我感覺,請勿噴),從一開始的 echo "hello world";, 到現在的多語言版本 hello world,只想說一句話,生命不息,代碼不止!

最初的時候用的是 tp3.23,干外包,大家都懂,追求效率。干了 2 年外包后,進入了一家本土稍微大一點論壇,主要做一些小專題,小項目和維護論壇,比之前外包難度稍高,還好有個老技術可以帶(干外包的時候前期后端技術都跑了,就我一人,天天加班熬夜干活學習,自己一個人閉門造車),了解了很多項目流程,包括寫代碼需要注意的事項,代碼安全、運行效率,redis 隊列、應付並發等等。

之后跳槽就進入現在這家公司,主做維護,因為可以學到很多敲代碼除外的東西,最初的時候可以跟着領導全國出差,感謝領導,學到了很多很多,為人處世等等。

 

框架選型

剛進來的時候是接手外包做的網站,因為部門戰略方向修改,所以整個項目相當於要推倒重來,因為外包用 yii2 做的,我不是很喜歡這個框架,ci 和 tp 又不合適,遂直接用 laravel 開擼,前期真的是碰了很多很多壁,一度想放棄,但是還是堅持了下來。

 

版本控制

最初代碼使用 ftp 管理,后來跟換到 svn,再到現在的 git,自己 docker 環境下搭建的 gogs。服務器也從最初的 1 台,到現在多台,也部署了一台負載均衡器,同步代碼使用 git 提交觸發鈎子,然后 rsync+sersync 監聽文件變化,自動同步差異化文件,CDN 隱藏服務器真實域名。

 

API 編寫

接口最初使用 laravel + dingo API,到現在的 golang 的 gin 重寫,爬蟲項目也從最初的 php 的 guzzle 包到目前的 python 重寫。最終,得到一個結論!就是 想要快速進步,就要靠大量項目喂養

 

目標與現狀

  • 目前在的公司較為安逸,主做維護,所以有很多空余時間。荒廢時間對於技術人員是最可怕的,我們公司是存在編制的,不犯什么大錯誤基本可以干一輩子了,擔憂技術停滯不前甚至倒退。
  • 公司在三線城市(房價漲幅世界第一,不想吐槽),城市的 IT 技術相較於北上廣深差距太大,自己又買不起房,學歷只是大專,自考的遠程教育本科又沒有含金量,只能不斷學習逼迫自身,靠技術去一線城市博得一席之地。
  • 學無止境,百度雲存儲的內容估計這輩子都學不完了,從前端到后端到服務器到人工智能,內容太多了。經過長時間的思考,暫定以后端技術為主,前端不求精通,能做一些兼職即可,服務器方面目前在研究 docker+k8s, 公司服務器 gogs 就是搭建在 docker 環境下的。接下來深入研究 golang,微服務方面。

這周看看能不能寫服務器部署的一個分享出來,到時候請各位批評指正!

本文將從三個階段敘述,包含項目的架構、版本工具的選擇、代碼部署、到安全

 

正文

 

第一階段:剛接手項目

外包交付之前,是通過 ftp 的形式上傳文件。
交付后到公司戰略方向調整后,因為公司業務較多,全國有 20 多個營業點,每個營業點都有一名前端設計,公司后端只有我一人。前端需要制作頁面,供外網訪問。

 

需要解決的問題:

  1. 項目需要重新設計,選擇框架?服務器環境如何搭建?
  2. 代碼安全問題,不希望全國的營業點直接訪問到項目源碼,如何選型?
  3. 全國營業點中有技術較好的前端,如何給與部分網站修改權限?
  4. 網站是站群系統,域名需要泛解析,laravel 自帶的路由文檔無法提供解決方案
  5. 后台的選型,還有權限等功能的開發
 

解決方案

  1. 因為發現了 learnku 社區(前身 laravel-china.org), 學習了發布的教程,遂選擇了 laravel。服務器環境使用寶塔面板,定時備份網站和數據庫、設置阿里雲自動快照。
  2. 需要嚴格控制代碼權限,所以選擇了 svn,創建不同角色,給目錄增加對應權限。
  3. 借鑒 blade 模板和織夢的模板標簽,開發屬於 laravel 的自定義模板標簽。
  4. 改寫 route 路由,自己摸索泛解析匹配規則,輔以大量正則判斷,不斷試錯。
  5. 后台模板使用 ACE,手擼 RBAC 權限管理,這個實現較為簡單,業務邏輯。
 

不足之處

  1. git 比 svn 更好,但受限於技術,無法搭建。等自身實力達到后肯定要換掉。
  2. 對 svn 功能也不是很了解,區域經常上傳大文件,導致項目愈發臃腫。
  3. 自寫的泛解析站群路由正則太多,文件也較長,不利於后期維護和擴展。
  4. 后台功能較少,篩選、統計等新功能開發效率較低。
  5. 沒有應付高並發的方案、也沒有應對網絡惡意攻擊的解決手段。

服務器使用 CentOS,采用 LNMP,直接用寶塔部署,手動安裝 svn 版本控制工具,通過鈎子自動同步代碼,svn 提交后,線上可以直接看到效果,php+svn 就是這么暴力,因為條件受限和技術受限,就沒有部署測試環境,所見即所得。

安全方面,laravel 自身意見提供了一部分,包括 csrf防SQL注入端口IP限制,使用阿里雲 CDN 隱藏服務器真實 IP 等等,都是一些常見的。

 

第二階段

新項目的使用和內部項目迭代,還有個人經驗、技術的提升,此時產生了以下問題:

 

需要解決的問題:

  1. 不滿足於 svn 的局限,需要選型新的工具。
  2. 新項目選型,需要用到隊列和定時任務。
  3. 服務器訪問較大,需要購買多台服務器部署集群。
  4. 后台開發耗時較多(因為我們后台功能很多),如何解決?
 

解決方案

  1. 在服務器部署 git 私有管理器,實現版本控制,svn 和 git 同時存在。
  2. 學習 laravel 課程二,借鑒大佬代碼和閱讀文檔,實現隊列和定時任務。
  3. 購買阿里雲服務器,和負載均衡,使用 rsync+sersync 監聽文件變化,自動同步差異化文件。
  4. 使用 laravel-admin 擴展包,快速生成后台,加上自定義的接口,可以很輕松實現絕大部分業務功能。
 

不足之處

  1. 因為項目人員驟減,只限於辦公室的 6 個人,所以不需要對代碼進行權限控制,但總要限制,gitlab 可以實現,可惜技術不足,無法滿足需求。
  2. 服務器部署使用的寶塔面板,方便快捷(全部命令行太麻煩,效率也低),想全部容器化部署,使用 k8s,這也是目前能想到的解決方案,受限於技術原因無法實現。下一步學習方向就在此。
  3. 網站后台的 UI,同事不滿意,但自建后台,消耗的成本和時間會很大,目前只能這樣。

此間碰到過多起安全問題,網站運行受到大量的 CC 攻擊,期間最嚴重的一次,攻擊持續了 4 天,超過 CDN 負載,3 天訪問次數達 10 億次以上,QPS 峰值 5W 多,被阿里雲 CDN 拉入沙箱,整個業務完全終止外網訪問。

當時可以說人在公司呆了 4 天,基本天天熬夜到下半夜,受限於技術,通過 iftop 工具分析流量,只能采取最傻瓜的操作,就是服務器防火牆封鎖 IP,后因 IP 太多,直接封鎖 IP 段,但因為對方 IP 池太深,以失敗告終。

服務器方面,opcache 緩存開啟,php 調整進程數,nginx 限流開啟,數據庫增加連接數,數據庫讀取增加緩存,存入 redis,但也只是杯水車薪。

通過不斷的查閱資料,給服務器安裝了 fail2ban,仍然沒有解決問題,為此阿里雲還專門和我建立了一個釘釘討論組,他們給的建議就是,花錢上高防服務器,可惜的是因為價格太高,公司領導不允許。不過在不斷的分析 IP 來源中,發現了一個規律,就是流量來源 90% 以上都是國外的,因此和阿里雲技術溝通,看能否幫忙禁國外用戶訪問,答案是不能。

后來在其他部門同事的幫助下,我們更換了 CDN 服務提供商,使用百度雲 CDN,軟磨硬泡,拜托百度雲技術幫忙封鎖國外 IP,配合 CDN 限流和繼續封鎖 IP 段,正好在美國的領導通知我國外無法訪問網站,流量峰值不斷降低至正常狀態,此次危機才得以緩解,在次感謝百度雲 CDN 工作人員的幫助。

感謝 @MIsakas 提供的思路,可以在解析域名的時候把境外線路解析到虛假 IP 上,具體我還沒有試。

 

第三階段

因為部門方向再次變更,整個服務也需要大概,因為不斷閱讀社區優秀文章和教程,還有不斷的刷 github,愈發發現之前代碼寫的太垃圾,毅然決定重寫項目。

正好服務器到期,公司也要更換阿里雲賬號,所以從購買服務器開始,到網站部署,版本工具的選擇等等,算得上截止 19 年上半年學到的知識都用上了。

首先,服務器安全層面,棄用密碼登錄,采用 ssh 秘鑰,還有對應一系列的 ssh 配置,比如超時自動踢出登錄,密碼隔斷自動修改等等,這些阿里雲都會提示,對照着修改就好。

因為公司后端就我一個人,所以我是允許 root 登錄的,給端口設置 ip 限制就可以了。

 

服務器

服務器使用阿里雲負載均衡 + 雲 ecs

 

環境搭建

環境搭建方面,為了省事,我仍然采用的寶塔面板,限制面板登錄端口 IP 權限。推薦大家 linux 安裝 htop,友好性互動的進程查看器,比 top 命令好用多了。

 

版本控制

代碼版本控制,安裝 docker,使用 gogs 進行版本控制。因公司業務是所見即所得的,所以不需要測試環境,線下修改直接 push 推送,觸發 post-receive 鈎子,自動同步線上代碼。如果條件允許的話肯定要配置測試環境的,而且 git 分支也要嚴格控制權限,master 分支只允許核心人員推送,合並分支也是。修改 bug 可以使用 dev 分支,gogs 的 web 界面也需要設置 IP 訪問權限。

 

代碼同步

代碼同步方面,仍然使用 rsync+sersync,目前受於技術限制,沒有發現其他更方便的同步方式

 

數據庫

數據庫用的 mysql8+,多台服務器之間以內網通信,設置獨立的賬號,分配權限指定數據庫名。為了方便,管理員賬戶對外也指定了 IP,數據庫對外端口也限制了 IP。需要注意的是 mysql8.0 以上修改了密碼加密方式,連接不上的需要新建用戶或更換版本。

 

后台開發

使用 laravel-admin 包,功能很強大,為作者點贊。絕大部分需求的功能都有,加上自定義的接口,可以滿足日常后台開發的絕大部分需求。

 

緩存服務

數據緩存使用 redis,一樣的需要限制 IP 訪問。需要注意的是,redis 內網之間訪問,IP 設置不是 127.0.0.1,而是對應的內網 IP。至於 mysql 的優化,社區一堆文章,我這里不做贅述。

 

圖片等大文件存儲

圖片等大文件存儲到七牛雲或者阿里雲 OSS,技術達到的話可以自行搭建圖片服務器,記得使用 https 協議

 

使用 cdn 為網站加速

網站使用 cdn 加速,隱藏真實 IP,否則一旦暴露,ddos 攻擊小公司根本扛不住。

以上限制端口都可以通過 linux 防火牆進行設置。

如果並發壓力過高,記得開啟 php 的 opcache,業務需要的話可以使用 swoolePHP-FPM 運行模式可以切換為動態,計算好 php 的連接數。

上線項目前可以用 apache 的 ab 命令進行壓測,還可以使用第三方測試工具,比如 JMeter 等進行壓測,詳情見 L06 Laravel 教程 - 電商進階 (Laravel 5.8)

 

使用 supervisor 托管隊列

隊列使用 python 編寫的 supervisor 進行管理,還可以使用 Horizon 隊列管理工具,記得控制好權限

docker 環境搭建 gogs 和 rsync+sersync,我會分兩篇文章,本周六寫好發布。

 

API 開發

API 接口前期使用的是 dingoAPI,后來使用 golang 的 gin 框架重寫了,最近看 laravel6.x 自帶的 Resource,覺得可以不用 dingoAPI 了。

至於為什么使用 golang,因為個人很喜歡 go。我寫過 pythonphp,都是解釋性語言,想換一門編譯型的,c++ 怕短時間入不了門,java 又太重,所以選擇了 go。這里吐槽一下,php 的數組比 go 的 map 方便了 N 倍。
感謝 @下水道里有只貓,golang 帶我入門,我是看了他的博客源碼才能下手重寫項目的。

 

建議

最近學習了 laradock,發現是真的好用,docker-compose 都配置好了,啟動的時候選擇對應鏡像,方便快捷,一件試部署。

擼了快 3 年的 Laravel 了,盡量這周分享本人使用的多台服務器集群部署方案
 

 

不過有個坑,就是我習慣直接批量重啟容器,導致 nginx 容器連不上 php 容器

#我要運行2次,因為容器啟動順序沖突,還經常php容器連不上nginx docker start $(docker ps -a | awk '{print $1}' | tail -n +2)

最好在 laradock 目錄下執行

# 例:docker-compose up -d nginx mysql redis workspace php-worker docker-compose -d up 容器1 容器2 容器3 ...
 

后期學習計划

至於后期的學習計划,重心在容器化,docker+k8s,還有 go 的微服務方向。最近對數學起了興趣,准備明年買幾本高數書學習一下🤣。還有明年准備復習英語,這樣就可以參與社區的翻譯工作了。可惜自己基於 ss 協議搭建的梯子被封了,只能用電腦查閱文檔了。

生命不息,代碼不止


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM