運行在阿里雲ECS上的PHP-FPM+Nginx
2023-03-31 16:30:25
貨櫃碼頭出現後,貨櫃技術在網際網路領域得到空前的普及。無論是大公司還是釣市初創公司,農民基本上都會在各種技術社區或各種演講會上學習相關技術。作為一個跳樓創業公司,我們也不例外。去年,我們做了一些關於Docker.Solution的事情,一年前測試了一些程序,今天我總結了在踐踏坑的過程中遇到的坑和一些想法,希望能給認識Docker並渴望嘗試的人一些啟示。當然,在這方面有豐富經驗的學生更歡迎提出一些建議或建議。
我們項目的標準PHP技術棧:PHP-FPM+Nginx運行在阿里雲的ECS上,資料庫也是阿里雲的服務。
從理論上講,對於一般的刁絲創投公司的刁絲項目來說,沒有必要使用過於複雜的技術,對新技術的約束也是大農的職業道德。在項目上線以來遇到的各種問題中,如上一篇文章中提到的laravel的性能問題,而HHVM或PHP7,這些新技術都提到性能,所有的突然切換風險都太大,因此可以使用Container運行一些服務測試;例如,以前有一個BUG,一個接口問題佔用了太多的內存,導致系統響應超時;例如,在看過其他人在各種技術會議上共享的經驗之後,我真的很想自己嘗試一下。
根據Docker的哲學,每個容器都是一個獨立的服務,服務通過接口相互協作,採用的方案是PHP-FPM和Nginx分別在不同的容器中運行,PHP-FPM容器將埠暴露給Nginx容器。
容器之間的網絡通信最初使用Docker自己的連結。雖然連結很簡單,但它不是很有用。Link是通過在啟動容器時修改/ETC/HOST文件來實現的。當時遇到的一個問題是,容器的IP在通過連結重新啟動之後發生了變化,但是容器中沒有連結。還有一個問題是,當同一個服務需要打開多個容器時,當然,如果它以集群方式運行,則更加困難,因此連結只能在本地開發、本地開發中發揮作用。領事做服務發現。領事不在這裡介紹。感興趣的學生可以閱讀這篇文章:使用領事和註冊官為碼頭貨櫃服務發現(https:www.livewyer.comblog201502service-discovery-docker-containers-u)。
然後放在主機,和代碼的目錄是安裝在容器啟動。根據所使用的接口方案,接口分為幾個不同的容器中運行,和資源隔離的應力進行了測試。符合預期,很滿意。然後,我們選擇了兩個容器運行hhvm測試和性能真的提高了很多。整體結構如下圖所示:
這可以正常使用,然後處理日誌。首先,主機上安裝了一個目錄來存儲日誌,但這與Docker的想法不太一致。所以我們得到了一個LogStash容器,並把各種容器的日誌寫入LogSTASH容器中。
然後我們監控貨櫃。我們使用ONAPM服務,這並不壞。還有其他開源工具可供選擇,但使用ONAPM服務更方便。
一個完整的技術堆棧已經建立,運行幾天沒有問題。當然,作為搜索者,有更高的要求。後來,我想到了一個問題:Docker的想法是容器是一個完整的服務,但是我們使用的是在容器中運行PHP-FPM,代碼不在容器中,而是通過目錄安裝來實現這一點。追求完美:完美之路
事實上,把代碼放入容器不僅僅是為了思想的完美,而且為了另一個目的:基於DOCKER的CI。基本的想法是每一個版本都建立了一個新的圖像版本。在編譯過程中,代碼需要更新到最新版本,然後安裝依賴的第三方庫和其他與業務相關的預處理。構建完成後,推到註冊表,然後在每個節點下拉,重新啟動容器。整個過程
怎麼樣這是完美的。如果現實是如此完美,但現實總是會有各種各樣的坑等待著你!
首先,在使用這個機制之前,發布代碼、合併分支只需幾秒鐘,然後在每個節點下拉代碼。但是在使用DOCKER之後,合併分支需要建立一個鏡像,建立一個推送寄存器,然後把鏡面拉到每個節點,更不用說說了。它還需要幾分鐘。此時,一些學生可能會說DOCKER鏡像的原理不是層機制。是的,是層。每個構建只需要更新需要更新的層,但是仍然沒有辦法只更新那些像Git之類的文件,至少更新整個項目的代碼目錄。
其次,我們之前只需要更新代碼,但現在我們需要重新啟動容器。最初,重新啟動容器非常快,但是PHP-FPM在容器中運行非常慢。我猜它會發送一個SigTalk的信號到貨櫃的過程中,當DOCKER停止執行。PHP-FPM在處理SIGTERM信號時會做一些清理工作,節點至少有幾十個容器,每個容器都會重新啟動,這很耗時。
在使用完美機制之後,這種簡單的發布需要幾分鐘。儘管整個過程是完全自動的,但是沒有必要在完美理念上妥協。
此外,還有一個非常奇怪的問題:當容器升級到1.10時,在容器啟動後經常會遇到埠不可通行。此時,如果您進入容器發起一個網絡請求,如IP低於ping時,埠將恢復正常。長期使用各種工具進行調試,仍然沒有發現問題所在,DiaosiPioneer公司也沒有精力研究這樣一個深奧的探索。萊姆,不得不暫時擱置一段時間。
雖然沒有理想的完美解決方案,但是也使整個框架更加方便擴展,比如在交通高峰期快速上架的節點。由於近年來雲計算的發展,這個問題也更容易解決。ODE放置在主機目錄中,所以基本上每個主機只需要三個條件就可以上網:
在購買ECS之後,完成上述操作以生成系統映像,當新節點需要聯機時,該系統映像可以直接用於配置伺服器。已被領事提及。
DOCKER群將用於未來的集群管理。當對調度的需求很大時,可以嘗試使用Mesos或Kubernetes。然而,貨櫃的生態鏈發展很快,在需要時可能有更好的解決方案。
簡單地概括整個感知過程,從體系結構的角度來看,永遠不會有完美的體系結構,只有最適合自己的體系結構。團隊對各種技術的理解以及技術選擇的複雜性。不要看幾個牛分享他們的技術架構,而是急於嘗試他們自己的項目。最後,即使他們做不到,也會給其他人留下一團糟去清理。最後,在迭代過程中保持項目簡單的能力始終是衡量代碼農民技術水平的一個重要標準。