實現dnmp中多站點多版本php並存

天行侠發表於2024-10-17

實現dnmp中多站點多版本php並存

PHP多版本部署之docker方式

背景

搞了一段時間Python,這兩天又要開始做一些PHP相關的專案了,本地開發環境、測試環境、線上環境都需要重新弄了,為了開發方便還是決定用Docker方式來部署,自己又不想寫Dockfile和compose檔案啥的。於是找了下,發現了一個不錯的專案:https://github.com/Tinywan/dnmp (國內:https://gitee.com/Tinywan/dnmp) ,根據介紹完成安裝

發現問題

安裝結束後發現,nginx配置裡只有一個站點(A),於是在nginx容器的vhost目錄中配置另一個站點(B),想要的是 A站點用PHP8,B站點用PHP7.4。看介紹上說支援多版本PHP共存,可任意切換(PHP5.4、PHP5.6、PHP7.1、PHP7.2、PHP7.3、PHP7.4、PHP8.0)。但並不滿足我多站點用不通版本PHP共存的需求。

解決問題

解決思路

由於多個版本的PHP映象的埠對映9000:9000,會導致 Bind for 0.0.0.0:9000 failed: port is already allocated 錯誤,那麼就從修改埠容器埠入手。

解決步驟

  1. 修改docker-compose.yml檔案
    為了好記,就把php版本放到埠號裡,如php74,埠就為9074。

  2. 修改nginx子站點的配置(php版本和埠號)

  3. 修改php74容器
    檔案位置:/usr/local/etc/php-fpm.d/zz-docker.conf,將9000 改為 9074

重啟容器,進入到nginx容器裡訪問,site1.dev和site2.dev 都能顯示對應的php版本

新的問題和解決辦法

於是我修改本機hosts,將自定義域名指向對應的nginx容器IP, 但當我在瀏覽器輸入 site1.dev或site2.dev 並不可訪問, 輸入:localhost(與site1.dev一個站點)是可以的,就很奇怪。在宿主機ping不通nginx容器,看了下docker的network是bridge方式也沒問題,
突然想到這次用的windows電腦安裝docker時候選擇的是wsl方式(相容linux子系統),修改本機hosts 指向 wsl子系統應該就行了。

127.0.0.1 localhost
172.19.23.124 site1.dev #wsl子系統IP
172.19.23.124 site2.dev

相關文章