雖然現代 Linux 發行版提供套件管理器(apt/yum)可快速部署 LAMP 環境,但原始碼編譯安裝能讓你精確控制版本、模組與優化參數,適合生產環境定製化部署、效能調校或學習底層運作機制。本文記錄在 Ubuntu 12.04 上編譯安裝 Apache 2.4.2、MySQL 5.1.62、PHP 5.3.11 的完整流程、關鍵參數與避坑指南。
sudo apt-get update
sudo apt-get install build-essential libxml2-dev libssl-dev libcurl4-openssl-dev \
libjpeg-dev libpng-dev libfreetype6-dev libmcrypt-dev libreadline-dev \
libbz2-dev zlib1g-dev libgmp-dev libncurses5-dev libxslt1-dev
關鍵提示:Apache 2.4 需較新的 `libxml2`,Ubuntu 12.04 預設版本可能過舊,建議手動編譯安裝新版 `libxml2` 或啟用 backports 軟體源。
wget https://archive.apache.org/dist/httpd/httpd-2.4.2.tar.gz
tar -xzf httpd-2.4.2.tar.gz
cd httpd-2.4.2
./configure \
--prefix=/usr/local/apache \
--with-libxml2=/usr/local/libxml2 \ # 指定新版 libxml2 路徑
--enable-modules=most \
--enable-mods-shared=all
--prefix:安裝根目錄,便於管理多版本共存。--with-libxml2:指定 libxml2 路徑,解決版本相依問題。--enable-mods-shared=all:將所有模組編譯為動態共享物件(DSO),啟用/停用靈活。make
sudo make install
# 測試啟動
sudo /usr/local/apache/bin/apachectl start
# 瀏覽器訪問 https://127.0.0.1 應顯示 "It works!"
cd mysql-5.1.62
sudo ./configure \
--prefix=/usr/local/mysql \
--with-mysqld-user=mysql \
--with-extra-charsets=all \
--enable-thread-safe-client
注意:`./configure` 階段需仔細閱讀輸出訊息,缺少依賴庫會導致後續編譯失敗。若提示缺少庫,安裝對應 `-dev` 套件後重新 configure。
make
sudo make install
# 複製設定檔
sudo cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
# 編輯 /etc/my.cnf 關鍵設定
[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
user=mysql
[client]
default-character-set=utf8
# 建立 mysql 使用者(若不存在)
sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql
# 資料目錄權限
sudo chown -R mysql:mysql /usr/local/mysql
# 初始化資料庫
sudo /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 啟動服務
sudo /usr/local/mysql/bin/mysqld_safe --user=mysql &
# 驗證
ps aux | grep mysqld
# 應看到 /usr/local/mysql/bin/mysqld 進程
cd php-5.3.11
./configure \
--prefix=/usr/local/php \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-mysql=/usr/local/mysql \
--with-mysql-sock=/tmp/mysql.sock \
--with-pdo-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--enable-mbstring=all \
--enable-zend-multibyte \
--with-gd=shared \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--enable-gd-native-ttf \
--with-curl \
--with-zlib \
--with-bz2 \
--enable-ftp \
--enable-sockets \
--enable-bcmath \
--enable-calendar \
--enable-exif \
--enable-soap \
--enable-zip \
--with-xmlrpc \
--with-xsl \
--with-gettext \
--with-gmp \
--enable-pcntl \
--enable-shmop \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-wddx \
--with-mcrypt \
--with-openssl \
--enable-fpm \ # 若需 PHP-FPM(建議生產環境)
--with-config-file-path=/usr/local/php/etc
| 錯誤提示 | 解決方案 |
|---|---|
| 缺少 libxml2 | 安裝 `libxml2-dev` 或指定 `--with-libxml2-dir` |
| 缺少 bz2 | `sudo apt-get install libbz2-dev` |
| 缺少 zlib | `sudo apt-get install zlib1g-dev` |
| 缺少 ncurses | `sudo apt-get install libncurses5-dev` |
| 缺少 GD 依賴 | 安裝 `libjpeg-dev libpng-dev libfreetype6-dev` |
| 缺少 OpenSSL | `sudo apt-get install libssl-dev` |
關鍵技巧:`configure` 失敗時,查看 `config.log` 尋找具體錯誤;補裝依賴後必須重新執行 configure。
make
# make test # 可選,耗時較長,若報錯視情況決定是否繼續
sudo make install
# 複製生產環境建議的 php.ini
sudo cp php.ini-production /usr/local/php/etc/php.ini
# 確保已載入 PHP 模組(make install 通常自動添加)
LoadModule php5_module modules/libphp5.so
# 新增 PHP 檔案類型關聯
AddType application/x-httpd-php .php .html
AddType application/x-httpd-php-source .phps
# 設定預設首頁
DirectoryIndex index.php index.html
# 設定 DocumentRoot(根據實際專案路徑調整)
DocumentRoot "/var/www/html"
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
error_log = /usr/local/php/php_error.log
date.timezone = "Asia/Shanghai"
session.save_path = "/tmp"
display_errors = Off
log_errors = On
max_execution_time = 30
memory_limit = 128M
post_max_size = 8M
upload_max_filesize = 2M
# 重啟 Apache
sudo /usr/local/apache/bin/apachectl restart
# 建立測試檔
echo '' | sudo tee /var/www/html/info.php
# 瀏覽器訪問 https://127.0.0.1/info.php
# 應顯示 PHP 5.3.11 資訊,且載入 mysql、gd、curl、mbstring 等模組
原始碼編譯安裝雖能極致客製化,但維護成本高(安全性更新需手動重編)。現代部署建議:
這份實戰紀錄不僅是安裝手冊,更是理解 LAMP 底層依賴關係、編譯鏈路與排錯思維的完整案例。願它能助你在伺服器部署之路上更從容!