2019-07-18

Windows 下 Apache 跑 php-fpm (Fastcgi) - 使用 VirtualHost

因為工作需求…有些案子會需要用頗舊的 php 版本來跑,但我又不想在系統資源有限的測試機 (本機 windows 10 電腦,還不是server) 安裝一堆配合 php 的 apache 版本,然後又在那邊糾結 x86/x64 的,所以想到在 linux 上在用 nginx 時好像都是用 php-fpm 在跑 php ,而不是跟 apache 那樣在 loadmodule (難怪 nginx 比較輕量級),而且 loadmodule 會使用固定的 module name ,像 php7 是 php7_module, php5 是 php5_module …不同版本之間是還行,但同一個大版本之後想分載各個小版本會因為都是用同一個 module name 的關係會有衝突而載入失敗,所以最後在想比較簡單的方式…那就是讓 apache 也走類似 php-fpm 的 fastcgi 方式。
(為什麼說類似,因為好像 php-fpm 沒有 windows 版,而且好像 windows 的 php 中的 php-cgi.exe 就是為了讓 windows 有 php-fpm 而用的)

所以接下來有幾個重點,主要是要讓 apache 2.4.39 x64 在使用 VirtualHost 的情況下,讓走 80 port 跑 php 7.3.7 x64 ,而 8080 port 跑 php 5.2.17 x86

前置作業說明:

  1. apache 2.4.39 x64 + php 7.3.7 x64 我是用 xampp ,然後再去 php 網站找到 5.2.17 x86 回來放進 xampp 資料夾中
  2. 我不特別講 apache vhost 的設定,反正這個 google 一下資料就很多,所以下面的「操作」我是以 vhost 已經分別可以讓 80, 8080 的網頁服務執行成功的情況下來講的
  3. 因為我是分 80, 8080 來跑 vhost ,所以記得 httpd.conf 的 listen 要加 80, 8080

操作:
  1. 請將
    LoadModule fcgid_module modules/mod_fcgid.so
    FcgidInitialEnv PHPRC "{path}\\xampp\\{php}"
    AddHandler fcgid-script .php
    FcgidWrapper "{path}/xampp/{php}/php-cgi.exe" .php

    放進 vhost 80, 8080 設定中
  2. 因為 xampp 會在 apache/conf/extra/httpd-xampp.conf 中宣告 PHPRC 的環境變數,所以我會建議把此檔中宣告環境變量的部份也貼到 vhost 中,然後把 httpd-xampp.conf 宣告環境變量的部份用 # 註解起來…或者也可以刪掉;不過複制到各 vhost 底下後,記得要把 PHPRC 也用 # 註解起來,因為有可能跟 FcgidInitialEnv PHPRC 衝突
  3. 如果以上兩個都正常的話,原則上在啟動 xampp-control 的 apache service 時應該不會失敗,然後會看到 bind 80, 8080 兩個 port …執行 php 應該會正常,建議可以在各別的 documentroot 下各放有 phpinfo() 的 php 檔來看結果,若設定成功的話,就可以在 80 看到 php 7.3.6 ,而 8080 看到 php 5.2.17 …
註1:請留意 {path} 指的是 xampp 所在的路徑,放在 c 槽下, {path} = c:\\ ;而 {php} 就是 php.exe 的所在地的資料夾名…像上面我有提到我有兩個版本的 php 要跑 cgi ,因為 php7 我是用 xampp 的,所以它的所在資料夾名就是 php ,然後我把下載的 php5.2.17 我下載解壓後放在 xampp/php5.2.17 中,所以在 8080 port 的 vhost 我 PHPRC 的 {php} 就是 php5.2.17

註2:如果 php 5.2.17 在啟用 extension 下或者會發現執行 500 錯誤,這時可以到 php.ini 中看一下 extension_dir 有沒有指定正確的位置,如果 php 是從 php 官網載的,我記得 extension_dir 會是指定 "./" ,只要修改成 "{path}\xampp\{php}\ext" 後,再重啟 xampp apache service ,應該再看 php 執行結果就不會是 500 error 了;但如果還是有問題,可以把 display_errors, display_startup_errors 都設為 On ,應該可以有其他提示,再逐一解決即可

註3:理論上應該可以把這種方式改成不同的 Directory 下的 php 走不同的 php-cgi version 才對,應該不一定要用 vhost 來達成,因為這樣不費浪費 port…找時間再來試

註4:xampp 在 apache/conf/extra/httpd-xampp.conf 會有不少的設定,我建議是全搬到你主要要用的 php 版本的那個 vhost 下放,例如我主要要使用的環境是 localhost:80 php7 的這個 vhost ,所以我就把 httpd-xampp.conf 中的設定都搬到 localhost:80 php7 這個 vhost 中…不過我自己也不是這樣搬,而是把 httpd-xampp.conf 中的設定都加上 # 註解,然後把會用到的再搬進 localhost:80 php7 這個 vhost 中,像我搬了 env_module 中的東西,然後把 PHPRC, PHP_PEAR_SYSCONF_DIR 給 # 起來、然後把 alias_module 中 phpmyadmin 的部分給搬進來,但記住,因為 php 的執行已經改成 php-cgi 的方式了,所以 alias 中的 directory 要給與「Options ExecCGI」的設定,不然 phpmyadmin 會一直出現 403

以上
(在 windows 用以上方式來跑 php fastcgi 唯一的問題是,php-cgi.exe 很常會執行完後不會自己結束,會覺得不舒服的就自行用工作管理員將之停止執行)

沒有留言: