⚠️ 版本警示: 本文記錄的是 2009 年左右的歷史版本 (Apache 2.2.4、MySQL 5.0.77、PHP 5.2.8)。這些版本均已停止維護、存在已知安全漏洞,嚴禁用於生產環境。 現代部署請使用 AlmaLinux/Rocky Linux 9 + Apache 2.4 + MySQL 8.0/ MariaDB 10.6 + PHP 8.2+,並優先採用套件管理器 (dnf/apt) 或容器化 (Docker/Podman) 部署。
以下內容僅供學習源碼編譯原理、依賴關係管理與歷史技術棧理解參考。
gcc, gcc-c++, make, autoconf, libtool, pkgconfig--prefix 指定安裝路徑、--with-xxx 指定依賴路徑、--enable-xxx 啟用模組make && make installldconfig、PATH、PKG_CONFIG_PATH| 庫 | 版本 | 關鍵配置參數 | 常見坑點 |
|---|---|---|---|
| freetype | 2.3.5 | --prefix=/usr/local/phpsyslib/freetype-2.3.5 | PHP configure 需 --with-freetype-dir 指向此路徑 |
| libjpeg | 6b | --enable-shared (必須,否則無 .so) | 需手動建立 include/lib 目錄給 make install 用 |
| libpng | 1.2.23 | cp scripts/makefile.linux makefile | 舊版無 configure,需手動複製 Makefile |
| zlib | 1.2.3 | --prefix=... | OpenSSL、PHP 皆依賴 |
| OpenSSL | 0.9.8e | ./config shared zlib | 需 shared 產生 .so;安裝後需替換系統 /usr/bin/openssl 與 /usr/include/openssl 軟連結 |
| GD | 2.0.35 | 指定所有依賴 --with-jpeg/--with-png/--with-freetype/--with-zlib | 極易因路徑錯誤導致編譯失敗,需逐一驗證 |
| libxml2 | 2.6.16 | 系統通常預裝,--with-libxml-dir=/usr | PHP 5.2 需較舊版本,新版 libxml2 可能不相容 |
| cURL | 7.17.1 | --with-ssl 指向 OpenSSL 路徑 | 依賴 OpenSSL、zlib、libidn |
# 解壓
tar -zxvf httpd-2.2.4.tar.gz
cd httpd-2.2.4
# 配置:Worker MPM (多執行緒)、共享模組、SO 支援、Rewrite/Deflate/Vhost
./configure \
--prefix=/usr/local/apache2 \
--enable-so \
--enable-vhost-alias \
--enable-rewrite \
--enable-deflate \
--enable-mods-shared=all \
--with-mpm=worker
make && make install
注意:Apache 2.4 移除了 --with-mpm 參數,改為 --enable-mpms-shared=all 動態載入。
# 解壓並移動
tar -zxvf mysql-5.0.77-linux-i686-icc-glibc23.tar.gz
mv mysql-5.0.77-linux-i686-icc-glibc23 /usr/local/mysql
# 建立用戶組
groupadd mysql
useradd -r -g mysql -s /sbin/nologin mysql
# 權限設定
chown -R root:mysql /usr/local/mysql
chown -R mysql:mysql /usr/local/mysql/data
# 初始化資料庫 (5.0 版本指令)
/usr/local/mysql/scripts/mysql_install_db --user=mysql
# 啟動腳本註冊服務
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chkconfig --add mysql
service mysql start
# 安全初始化
/usr/local/mysql/bin/mysql_secure_installation
./configure \
--prefix=/usr/local/php5.2.8 \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-config-file-path=/etc \
--with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-pdo-mysql=/usr/local/mysql \
--with-libxml-dir=/usr \
--with-gd=/usr/local/phpsyslib/gd-2.0.35 \
--enable-gd-native-ttf \
--with-jpeg-dir=/usr/local/phpsyslib/jpeg-6b \
--with-png-dir=/usr/local/phpsyslib/png \
--with-freetype-dir=/usr/local/phpsyslib/freetype-2.3.5 \
--with-zlib-dir=/usr/local/phpsyslib/zlib-1.2.3 \
--with-openssl-dir=/usr/local/ssl \
--with-curl=/usr/local/phpsyslib/curl-7.17.1 \
--enable-mbstring \
--disable-ipv6 \
--enable-sockets \
--enable-bcmath \
--enable-zip \
--with-mhash \
--with-mcrypt
make && make install
cp php.ini-production /usr/local/php5.2.8/lib/php.ini
| 維度 | 源碼編譯 (傳統) | 套件管理器 / 容器 (現代) |
|---|---|---|
| 安全更新 | 手動重編、停機時間長 | dnf update / docker pull 分鐘級修補 |
| 依賴管理 | 手動解決 .so 路徑、版本衝突 | 自動解析相依、隔離環境 |
| 部署一致性 | 環境差異大、難以複現 | Dockerfile 宣告式、完全一致 |
| 編譯優化 | 可針對 CPU 指令集優化 (-march=native) | 通用優化足夠,瓶頸通常在 I/O/架構 |
| 運維成本 | 極高 (專業編譯知識、故障排查難) | 低 (標準化流程、社群支援) |
version: '3.8'
services:
web:
image: php:8.2-apache
ports: ["80:80", "443:443"]
volumes:
- ./src:/var/www/html
- ./apache/vhost.conf:/etc/apache2/sites-enabled/000-default.conf
depends_on: [db]
db:
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASS}
volumes:
- db_data:/var/lib/mysql
command: --innodb-buffer-pool-size=1G
volumes:
db_data:
結語: 理解源碼編譯原理有助於深入掌握軟體依賴鏈與底層運作,但生產環境請務必採用現代化、標準化、自動化的部署方式。安全合規、快速迭代、災難恢復能力是現代運維的核心指標,手工編譯已無法滿足這些需求。