利用虛擬化機制包裹舊應用系統 – Postgres + Nginx + Php – Part-1

近期輔導台中某家 ERP 系統開發的單位,她們公司有個客戶服務系統,是使用大約10年前的開源 Bug Tracker 建置的,其基礎應用服務是使用 Postgres 8.4、Php 5.5.3 挺舊的版本與 早期版本的 Apache 在 Windows 環境所架設的。因為她們有計畫要採購更新的伺服器或 NAS,並希望舊有的客服系統能順利移轉,但又不希望整個伺服器系統環境被舊有的系統牽絆住,所以公司高層主管請教我怎樣的作法會比較妥當。

嗯,這雖不是我輔導的範疇,不過基本的系統移轉 (migration) 觀念還是有的,所以就順口回答道:「包起來!」呵,她們當然並不懂我這樣的意思是什麼,所以當然還是會稍作一些解釋,其實就是完整的把原來舊系統的環境,給整個移轉到新伺服器上,並建置在虛擬化的環境,如利用虛擬機 (Virtual Machine) 甚或 Docker 容器化更可以大幅降低系統耗費資源。這種就是屬於「包裹 (wrapper)」的觀念,不要動到原來舊系統的環境,這絕對是最保險的移轉方式。

結果解釋一番,對方還是不太懂 !^^,乾脆就花一些時間,我把她們舊系統的環境,同時利用 Hyper-V 虛擬機,以及透過 WSL 跑 Docker,提供兩種移轉方式讓她們參考。

利用 Hyper-V 虛擬機建置一個 Windows-based 的 OS (這裡我使用 Windows 10 LTSC),然後再安裝原來的應用伺服環境。配合當時的系統需求 (主要是 PHP 版本的考量),所以我找到 XAMPP win32-5.5.33-0-VC11 版本,以及 Postgres 8.4.5.1 版本 (有些意外,官網竟然已經下載不到老舊的版本) 一一安裝。

再來就是作一番設定,主要是 XAMPP 並沒有直接支援 Postgres 資料庫,所以當然爬文看先輩們的設定心得。參考這篇:「How to Integrate postgreSQL Database to XAMPP in Windows」,以及需要在 Apache 內啟用 PHP 的「Short Open Tag」:「How to Enable PHP Short Open Tag (short_open_tag)?」這類的 How-to 設定,然後再把所匯出來的 Postgres Schema + Data (乖乖,竟然有近 5Gb 容量) 再匯入進去,大概花了三、四個鐘頭時間,並不困難。

先利用 Postgres 自帶的 pgadmin 3 UI 工具登入並檢視匯入的資料庫與資料,確認匯入成功以及沒有中文亂碼。

閱讀全文 »

使用 Docker 建置多個網域的 WordPress 站台開發 (運行) 環境

問題 (Problem)

我想使用 Docker 容器的虛擬化技術,可以在本機端建立多個 WordPress 站台的開發環境,然後只透過一個 Nginx Web Server,負責接收多個網域 (multiple domain) 的 Http Request (例如 "blog1.localhost", "blog2.localhot"), 並自動將該網域的需求指向對應的 WordPress 站台,如此可以便於託管運行多站台或是方便本機端的開發。

如何有效設定 Docker 的虛擬開發環境,且不會影響到 Host 本機系統的干擾,如此可以方便方便移轉與部署開發環境至其它主機或對外運轉的系統上?

解決方案 (Solution)

  • 建置一個使用 Nginix Reverse Proxy Server Docker 專案。可以採用已建置完整反向代理設定自動化的 jwilder/nginx-proxy 的映像檔。
  • 建置一個完整的 WordPress 開發環境的 Docker 專案,內含 MySQL、phpmyadmin、Wordpress 等 Docker Image。

主要實作步驟

主要實作的方法參考這篇:「Host Multiple Websites On One VPS With Docker And Nginx」。當然對於 Docker 多個容器的配置檔 (docker-compose.yml) 設定,肯定要查找官方文件指引與其它網路設定分享文的。過程期間常要不斷地 Try-Error 才得以配置好 Docker 多個容器的開發環境。

在 WSL2 的 Docker 專案目錄結構參考如下:

首先需要先創建一個 Docker 網絡,如此得以將下列所有這些容器 (container) 橋接 (bridge) 在一起。打開終端機 (terminal),輸入下列指令:

$ docker network create nginx-proxy

接著就是可以參考上述的專案目錄結構,來創建兩個專案 (Nginx and WordPress),並為各自的資料夾編輯配置設定。

閱讀全文 »

{Blog 系統轉移} b2evolution migrate to wordpress import script.

從某一個應用系統 (或資料庫系統)要把資料轉移到另一個應用系統 (或資料庫系統),這個轉移的過程稱之為 “Migration” (相對地,若是同一系統的版本更新,則稱之為 Upgrade)。

上一個月,要從原來 b2evolution Blog 系統轉移 (migrate)到 wordpress 系統時,就如同當初我從 MT 轉移到 b2evolution 一樣,官方的系統均有提供 import (載入) 的 script 檔。 只是, MT 轉 b2evolution 時,當時因為資料結構比較單純,所以完全不用作任何修正,透過 import 工具程式一下子就轉好了;但是,這兩三年來, b2evolution 系統相當積極,版本更新極快,而每一次大版本的更新,必然會變動到 DB Schema,這使得 wordpress 所提供可以 import from b2evolution 的 script 檔,不可能不作修改就可以順利完成轉移作業。

wordpress 官方所提供對各大 Blog 系統的 import script 檔在此:Importing Content。 不過,我真的挺懶,想說若能找到無痛地可以從我現在 b2 1.10.3 版本 → wordpress 2.71 的網友加持修改版,那就更省事了。 結果呢,花了大半天的時間,是有找到啦,像這篇: Import From B2evolution(2.4.6) to WordPress (2.7)。 只是,要收費耶!! 含售後客服要價 50 USD。 其實啊,這價錢是算便宜的啦,當初我擔任某家公司的 Oracle DBA 時,幫企業客戶作轉檔的話,起碼是 10 數倍以上收費起跳的呢。

不過,想想還是乾脆又自己來動手 DIY 好了。 其實轉檔的原理相當簡單,就是把 Source Schema 對應 (mapping) 到 Target Schema 就對了。 b2evolution 有 31 個表格;wordpress 則只有 10 個 (非常欣賞它的結構簡潔)! 怎麼會差這麼多? 主因就是前者是被設計來服務多個部落格用戶的,而後者僅設定單一的部落格,所以前者儲存了非常多的統計數據,而這些,其實是不用轉移的。

轉移的核心會是什麼? 當然就是本文內容了。 本文就是包含 Post 內文 (content)與迴響 (comment),一篇內文會包含 0 到 多篇迴響,非常典型的 “Master-Detail” 表格結構,一般就是會有兩個表格個別儲存並以 Key (primary-key to foreign key)來關聯了。 所以只要找出含有 “_post” 字串的表格,大部份就是儲存 Post 內文的主表了。 再以此為中心,把一些如類別 (category)、帳號等額外資訊,給一一的加進來即可。

轉檔的寫法百百種,可以利用 stored-procedure、利用 C#/VB.NET、PHP、Perl 等機制來轉寫轉檔程序。 事實上,對資料結構與 SQL 語法精通的真正高手來說,只要寫個 SQL 陳述 (statement)甚至就可以轉移了。 嗯,我那個 partner Ringle 就是精通此道,他對資料庫的掌握度,我仍是沒有看到一個比他更強悍的。 可惜,他可不幫我作這種小事,而他收費可更是不便宜。 所以呢,我還是又繞回來,下載回來 wordpress 官方的 import script 程式,當然是利用 php 撰寫的,再以此作為轉移程式的 “骨架 (skeleton)”,然後慢慢地調整 SQL 陳述,修改表格與欄位、資料型態等。 呵呵,比想像得簡單,我採用漸進調整的方式作業,大概反覆轉移了有四、五次之多,至最終轉到我滿意正確的結果,大約也才耗上半天的時間而已。

閱讀全文 »

【筆記】MySQL 4.1.7 and PHP 4.3.x 搭配注意事項

系統環境:

  • MySQL 4.1.7 (官方正式推薦版本,支援 UTF-8 編碼)
  • PHP 4.3.9
  • phpMyAdmin 2.6.0-pl3

問題:

  • 當使用 phpmyadmin 2.6.0-p13 欲登入 MySQL 4.1.7 時,會出現如下錯誤訊息:
    #1251 – Client does not support authentication protocol requested by server; consider upgrading MySQL client

原因:

  • 因為 MySQL 4.1 以上版本為了提高安全性,使用了新的密碼驗證機制。如此,MySQL 的 Client Library 需要 4.0 版本以上。但目前在 Client 端所使用的 PHP 版本若為 5.0 以下(如 4.3.9),其內建的 MySQL Library 大都為 3.23,並不支援新版的密碼驗證機制。

解決方案(以下擇其一):

  • 將 PHP 升級為 5.0版以上(但許多應用伺服器,包括諸多 Blog 平台,尚未支援 PHP5)
  • 切換 PHP 4.3.9的 MySQL extension 為 MySqlLi (但是,在 Windows 的平台如何切換?我不知道…)
  • 在 MySQL console 下,更新密碼形式改為 OLD_PASSWORD() (設回原來舊版的密碼驗證機制)。
    mysql> UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd')
          -> WHERE Host = 'some_host' AND User = 'some_user';
    mysql> FLUSH PRIVILEGES;
    

參考文件:MySQL Manual | A.2.3 Client does not support authentication protocol

【安裝】PHP5 於 Windows+IIS 安裝備忘錄

1. PHP5 不要安裝 installer 版本,因為不容易具擴充性。將 ZIP 檔解壓縮後放入如 C:\PHP5 目錄。

2. Control Panel -> System 設定環境變數。
 1). 於 “PATH” 變數內新增 C:\PHP5
 2). 新增 “PHPRC” 環境變數,其值設定為 C:\PHP5

3. PHP的主要設定檔為 php.ini。將 C:\PHP5\php.ini-recommended Rename 為 php.ini,設定並修改儲存之。

4. IIS 內設定 PHP 最好使用 ISAPI,非 CGI。效能較好。

5. 所有額外的擴充模組位於 \PHP5\ext 內。PHP5 已將 MySQL Client 模組抽離,所以需要 enable 該 extension。

6. 主要修改 php.ini 的地方:
 extension_dir = “C:/PHP5/ext”
 extension=php_mysql.dll
 extension=php_mysqli.dll

7. 可以利用 phpinfo() 來測試 php.ini 的設定是否正確。
 (可下載該檔案儲存為 phpinfo.php 並置於 c:\Inetpub\www_root\ 下)

軟體思維顧問

專職軟體輔導與教育訓練的獨立顧問。輔導企業資訊單位如何有效組織系統開發與維護;輔導開發人員達成有效的專業分工。傳授如何把軟體作軟 (Keeping Software Soft)的技能,得以提昇系統的彈性/延展,並進而創造系統的再利用價值。

Personal