iT邦幫忙

1

【Windows】安裝 Apache Web Server(含多版本PHP並存)

ronrun 2022-04-14 16:19:1212892 瀏覽

前言
架設php最簡單的方法,大概是用xampp。但是有時候專案會用到不同php版本,需要切換。就算用xampp也是要用切換的方式,而不是並存。同一時間只能存在一種版本。因此後來自己的電腦也沒使用xampp了。而且我架 Web Server 都是用免安裝。所以換電腦重裝 Windows ,資料都能重用。MySql 資料庫也都還在。只要下個指令把 apache 跟 mysql 重新註冊到 Windows 的服務。

資料夾結構

D:\Servers\
    httpd\
        httpd-2.4.53-win64-VS16\
    php\
        php-5.6.40-Win32-VC11-x64\
        php-7.4.28-Win32-vc15-x64\
        php-8.1.5-nts-Win32-vs16-x64\
    mysql\
        mariadb-10.6.7-winx64\
        
D:\Web\abc.com
    htdocs\
    專案摘要.txt
    
D:\Web\xyz.com
    htdocs\
    專案摘要.txt

安裝資料庫 MariaDB
以前 MySQL 就是 MySQL。後來被甲骨文收購,大家怕它可能將來會收費,所以原開發者脫離原團隊,另外做了 MariaDB。號稱完全移植原來的 MySQL。而現在甲骨文的 MySQL 也還是有免費版可以用。大概4這樣。但是不管是 MySQL,還是 MariaDB,安裝方式、寫法都差不多。在新的功能略有差別,本文不詳細說明。

免安裝版
我自己是習慣用免安裝版。這樣之後重裝作業系統比較方便。
下載 mariadb https://downloads.mariadb.org/mariadb/
目前的版本是 mariadb-10.6.7-winx64.zip
解壓縮後放到自己喜歡的地方。例如 D:\Servers\mysql\mariadb-10.6.7-winx64

以前比較舊的版本,要將這個檔案:
my-medium.ini
複製成:
my.ini

然後修改 my.ini

[client]
...
default-character-set = utf8mb4

[mysqld]
...
max_allowed_packet = 128M
...
# 設定 MariaDB 安裝的位置
basedir = C:/Servers/mysql/mariadb-10.3.14-winx64
# 設定 MariaDB 的資料庫檔所存放的位置
datadir = C:/Servers/mysql/mariadb-10.3.14-winx64/data
# 設定 MySQL 預設字元集
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init-connect='SET NAMES utf8mb4;'

[mysql]
...
# 設定 MySQL 預設字元集
default-character-set = utf8mb4

但是現在新版在解壓縮之後沒有這種 ini 檔。
在 Windows CMD 視窗執行
mysql_install_db
會自動在 data 資料夾產生 my.ini。也不用去改它。除非特殊需要。
(多新版呢?我也不知道。至少現在mariadb-10.6.7-winx64是這樣)

然後註冊到 Windows 服務就。
D:\Servers\mysql\mariadb-10.6.7-winx64\bin\mysqld --install
此指令會把 MariaDB 註冊成 'MySQL'
開啟 Windows 的【服務】,找到 MySQL, 在上面按右鍵,啟動

執行升級
今天發生怪事
https://ithelp.ithome.com.tw/upload/images/20220526/20148098UROe1cVH1H.jpg
上網查到執行一個 upgrade 真的解決了。
D:\Servers\mysql\mariadb-10.6.7-winx64\bin\mysql_upgrade -u root -p
如果重新安裝,或許可以順便執行一下。

root 預設沒有密碼。開啟資料庫工具,例如 Heidi SQL(可合法免費使用),或是 Navicat 要付費。
連線資料:
主機:localhost
帳號:root
密碼:(空白)

執行 SQL 指令

--設定密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
--立即生效
flush privileges;
--如果要從遠端連線
CREATE USER 'root'@'%' IDENTIFIED BY '123456'; 
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

刪除 SQL 服務
C:\> sc delete "MySQL"

安裝 PHP
下載位址: http://windows.php.net/download/
Windows 上的 apache, 選擇 Thread Safe,縮寫 TS。
現在該頁面最上面最新的是 PHP 8.1 (8.1.5),最下面最舊的是 7.4.28
如果要更舊的 5.x 版, 這裡有 https://windows.php.net/downloads/releases/archives/
https://ithelp.ithome.com.tw/upload/images/20220414/20148098sgyQtpived.jpg

下載
php-8.1.5-Win32-vs16-x64
php-7.4.28-Win32-vc15-x64
php-5.6.40-Win32-VC11-x64

如果現在在看這篇文章,剛入門,應該不需要用到 5.6 了。

設定 php.ini
將檔案 php.ini-development 複製成為 php.ini,並做適當修改。具體字串可能因版本會有所不同。
例如 php_bz2 這個延伸套件,5.6 以前的版本是這樣寫
extension=php_bz2.dll
7.4以後的版本
extension=bz2
這個要注意一下,php.ini 不要隨便複製。

大概改下面幾個地方:

extension_dir = "ext"
...
extension=bz2
extension=curl
;extension=ffi
;extension=ftp
extension=fileinfo
extension=gd2
extension=gettext
;extension=gmp
;extension=intl
;extension=imap
;extension=ldap
extension=mbstring
extension=exif      ; Must be after mbstring as it depends on it
extension=mysqli
extension=oci8_12c  ; Use with Oracle Database 12c Instant Client
extension=odbc
extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
;extension=pdo_pgsql
;extension=pdo_sqlite
;extension=pgsql
;extension=shmop
...
date.timezone = "Asia/Taipei"
...
;上傳檔案大小限制
post_max_size = 50M
upload_max_filesize = 50M
;暫存資料夾
sys_temp_dir = "C:\windows\Temp"
upload_tmp_dir = "C:\windows\Temp"

有時候需要在 CMD 視窗執行 php xxx.php,或是設定 Windows 工作排程。就必須去設定 Windows $PATH 系統變數。而且只能擇一設定。
Windows 系統內容 > 進階 > 環境變數
找到 Path,在最後面新增指定的 php 路徑,例如
D:\Servers\php\php-7.4.28-Win32-vc15-x64

但我為了多版本並存,所以我不是用這個方法。而是自己建一個 php.bat 批次檔。看哪裡會用到,就複製到哪裡。每個專案都要弄一份。這個檔案複製一下就好,不礙事。

例如
D:\Web\abc.com\htdocs\php.bat

@D:\Servers\php\php-8.1.5-Win32-vs16-x64\php.exe %*

連線 Oracle 資料庫
如果要連線 Oracle 資料庫,除了要啟用 php_oci 相關模組,還要另外安裝 Oracle Instant Client。這個要注意。到 Oracle 官網下載就可以。如果沒有安裝這個,啟動 httpd 的時候不會報錯,但是比如在 Laravel 使用 composer 指令的時候就會報錯,說找不到 ext\php_oci 模組,但是在該目錄下又明明存在 php_oci.dll。當時我剛開始使用 Oracle,查了好久。

安裝 Apache
下載 apache: http://www.apachelounge.com/download/
解壓縮到喜歡的地方,例如 D:\Servers\httpd\httpd-2.4.53-win64-VS16
這裡通常只放新的。httpd有什麼新的就用,通常沒影響。

下載 mod_fcgid.so
一樣是這裡 http://www.apachelounge.com/download/
搜尋 mod_fcgid,注意版本要符合。
https://ithelp.ithome.com.tw/upload/images/20220414/20148098J5AapSifBG.jpg

解壓縮之後,把 mod_fcgid.so 放到 Apache 的 modules 裡面
將 apache 註冊成 Windows 服務
D:\Servers\httpd\httpd-2.4.53-win64-VS16\Apache24\bin\httpd -k install

刪除服務
sc delete Apache2.4

註:在 CMD 視窗用 sc delete,如果是 PowerShell,要用
D:\Servers\httpd\httpd-2.4.53-win64-VS16\Apache24\bin\httpd -k uninstall

安裝 Visual C++
這個套件若沒裝好,很可能導致 apache 無法讀取 php modules,因而無法啟動。
VS16,要安裝 Microsoft Visual C++ 2015-2019 Redistributable
vc11,要安裝 Microsoft Visual C++ Studio 2012

編輯 Apache24\conf\httpd.conf

  1. 將所有預設的 c:/Apache24 改成正確的路徑。
    例如 D:/Servers/httpd-2.4.53-win64-VS16/Apache24
  2. 視情況修改 #ServerName www.example.com:80 。若使用 httpd-vhosts.conf ,應該是不用改。

解除下面兩行的註解符號 #

LoadModule rewrite_module modules/mod_rewrite.so
...
Include conf/extra/httpd-vhosts.conf

其它 module 之後視情況再修改。

修改 DirectoryIndex

#DirectoryIndex index.html
DirectoryIndex index.php index.html

修改 SRVROOT 常數

#Define SRVROOT "c:/Apache24"
Define SRVROOT "D:/Servers/httpd/httpd-2.4.53-win64-VS16/Apache24"

新增測試網站
新增資料夾
D:\Web\php8x\htdocs
D:\Web\php7x\htdocs
D:\Web\php5x\htdocs

在裡面各新增一個檔案 phpinfo.php
<?php phpinfo(); ?>

修改 apache 的 httpd-vhosts.conf
D:\M\Servers\httpd\httpd-2.4.53-win64-VS16\Apache24\conf\extra\httpd-vhosts.conf
共建四個站。第1個是localhost,這個最好保留。第一個不管 ServerName 設成什麼,都會被localhost讀取

LoadModule fcgid_module modules/mod_fcgid.so
AddHandler fcgid-script .fcgi .php
AddType application/x-httpd-php php

#預設執行環境
FcgidInitialEnv PHPRC "C:/Servers/php/php-7.4.28-Win32-vc15-x64"
FcgidWrapper "D:/Servers/php/php-7.4.28-Win32-vc15-x64/php-cgi.exe" .php
FcgidMaxRequestLen 50000000

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "D:/Web/localhost"
    ServerName localhost
    ErrorLog "logs/localhost-error.log"
    CustomLog "logs/localhost-access.log" common
   
    FcgidInitialEnv PHPRC "D:/Servers/php/php-7.4.28-Win32-vc15-x64"
    FcgidWrapper "D:/Servers/php/php-7.4.28-Win32-vc15-x64/php-cgi.exe" .php
    FcgidMaxRequestLen 50000000
   
    <Directory "D:/Web/localhost">
        Options FollowSymLinks ExecCGI
        # All => 讓 .htaccess 可以運作
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>


<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "D:/Web/php8x"
    ServerName www.php8x.local
    ServerAlias php8x.local
    ErrorLog "logs/php8x.local-error.log"
    CustomLog "logs/php8x.local-access.log" common
   
    FcgidInitialEnv PHPRC "D:/Servers/php/php-8.1.5-Win32-vs16-x64"
    FcgidWrapper "D:/Servers/php/php-8.1.5-Win32-vs16-x64/php-cgi.exe" .php
    FcgidMaxRequestLen 50000000
   
    <Directory "D:/Web/php8x">
        Options FollowSymLinks ExecCGI
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>


<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "D:/Web/php7x"
    ServerName www.php7x.local
    ServerAlias php7x.local
    ErrorLog "logs/php7x.local-error.log"
    CustomLog "logs/php7x.local-access.log" common
   
    FcgidInitialEnv PHPRC "D:/Servers/php/php-7.4.28-Win32-vc15-x64"
    FcgidWrapper "D:/Servers/php/php-7.4.28-Win32-vc15-x64/php-cgi.exe" .php
    FcgidMaxRequestLen 50000000
   
    <Directory "D:/Web/php7x">
        Options FollowSymLinks ExecCGI
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>


<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "D:/Web/php5x"
    ServerName www.php5x.local
    ServerAlias php5x.local
    ErrorLog "logs/php5x.local-error.log"
    CustomLog "logs/php5x.local-access.log" common
   
    FcgidInitialEnv PHPRC "D:/Servers/php/php-5.6.40-Win32-VC11-x64"
    FcgidWrapper "D:/Servers/php/php-5.6.40-Win32-VC11-x64/php-cgi.exe" .php
    FcgidMaxRequestLen 50000000
   
    <Directory "D:/Web/php5x">
        Options FollowSymLinks ExecCGI
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

以上我用的都是正斜線 /,比較不會出錯。

為什麼這叫正斜線呢?英文叫 forward slash,人在往前行走或跑步的時候,身體會向前傾。而文字由左至右,所以向右傾斜的就是向前 forward。相反的就是反斜線 bask slash。

修改 Windows hosts檔
C:\Windows\System32\drivers\etc\hosts

127.0.0.1      php8x.local
127.0.0.1      php7x.local
127.0.0.1      php5x.local

執行網頁
https://ithelp.ithome.com.tw/upload/images/20220414/20148098U8QPL4xG7J.jpg

第一次執行網頁時,如果沒有在開頭加 www,例如只寫 php8x.local/phpinfo.php,可能會被google當成是在搜尋這個字串。要加上 http:// ,例如 http://php8x.local/phpinfo.php 第二次就沒問題了。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言