套件管理器 (apt/yum) 版本滯後、編譯參數固定。源碼編譯可:**自訂模組、優化效能、啟用實驗功能、精確控制版本、學習底層依賴關係**。本文以 Ubuntu (適用 Debian 系) 為例,完整記錄 Apache 2.2、PHP 5.4、MySQL 5.6 手動編譯安裝、配置整合、權限管理、服務啟動的全流程。
sudo apt-get update sudo apt-get install build-essential cmake libncurses5-dev bison
wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.51.tar.gz
tar zxvf mysql-5.6.51.tar.gz && cd mysql-5.6.51
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci
make -j$(nproc) && sudo make install
sudo groupadd mysql && sudo useradd -r -g mysql -s /bin/false mysql sudo chown -R mysql:mysql /usr/local/mysql cd /usr/local/mysql sudo scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data sudo cp support-files/mysql.server /etc/init.d/mysql sudo update-rc.d mysql defaults sudo service mysql start # 設定 root 密碼 /usr/local/mysql/bin/mysqladmin -u root password 'new_password'
編輯 /etc/mysql/my.cnf (或 /usr/local/mysql/my.cnf):
[mysqld] bind-address = 0.0.0.0 # 註釋預設 127.0.0.1 skip-name-resolve
重啟:sudo service mysql restart。建立遠程用戶:GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'pass'; FLUSH PRIVILEGES;
sudo apt-get install libpcre3-dev libexpat1-dev libssl-dev
wget https://archive.apache.org/dist/httpd/httpd-2.2.34.tar.gz
tar zxvf httpd-2.2.34.tar.gz && cd httpd-2.2.34
./configure --prefix=/usr/local/apache2 \
--enable-module=so \
--enable-rewrite=shared \
--enable-ssl=shared \
--with-mpm=prefork
make -j$(nproc) && sudo make install
sudo vim /usr/local/apache2/conf/httpd.conf # 修改 ServerName localhost:80 # Listen 80 (預設) # 載入 PHP 模組 (稍後添加) # DirectoryIndex index.php index.html
sudo /usr/local/apache2/bin/apachectl start # 瀏覽 https://localhost 應見 "It Works!"
sudo apt-get install libxml2-dev libcurl4-openssl-dev libjpeg-dev libpng-dev libfreetype6-dev libmcrypt-dev libreadline-dev libedit-dev
wget https://www.php.net/distributions/php-5.4.45.tar.gz
tar zxvf php-5.4.45.tar.gz && cd php-5.4.45
./configure --prefix=/usr/local/php5 \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-pdo-mysql=/usr/local/mysql \
--with-gd --with-freetype-dir --with-jpeg-dir --with-png-dir \
--with-curl --with-zlib --with-openssl \
--enable-mbstring --enable-sockets --enable-bcmath \
--enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data \
--with-pear --with-libxml-dir
make -j$(nproc) && sudo make install
sudo cp php.ini-production /usr/local/php5/lib/php.ini # 編輯關鍵項 date.timezone = Asia/Taipei display_errors = Off log_errors = On error_log = /var/log/php_errors.log cgi.fix_pathinfo = 0 # 擴展 extension= mysqli.so extension= pdo_mysql.so extension= gd.so extension= curl.so extension= mbstring.so
編輯 /usr/local/apache2/conf/httpd.conf:
# 確認已自動添加 LoadModule php5_module modules/libphp5.so # 添加 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps # 修改 DirectoryIndexDirectoryIndex index.php index.html # 指定 php.ini 路徑 (可選) PHPIniDir /usr/local/php5/lib
sudo /usr/local/apache2/bin/apachectl restart echo '' | sudo tee /usr/local/apache2/htdocs/info.php # 瀏覽 https://localhost/info.php
| 現象 | 原因 | 解決 |
|---|---|---|
| configure: error: xml2-config not found | 缺 libxml2-dev | apt-get install libxml2-dev |
| apxs not found | Apache 未安裝或路徑錯誤 | find / -name apxs 確認路徑 |
| mysql.h not found | MySQL 開發頭文件缺失 | --with-mysql=/usr/local/mysql (安裝前綴) |
| PHP 模組未載入 | httpd.conf 無 LoadModule | 檢查 modules/libphp5.so 存在、LoadModule 行未註釋 |
| 權限拒絕寫入日誌 | 目錄擁有者非 www-data | chown -R www-data:www-data /var/log/apache2 /usr/local/apache2/logs |
event 或 worker (需 PHP-FPM),預設 prefork 適合 mod_php。--enable-fpm,Nginx/Apache (proxy_fcgi) 連接 Unix Socket,效能優於 mod_php。opcache.enable=1、opcache.memory_consumption=256。expose_php=Off、disable_functions=exec,passthru,shell_exec,system,proc_open,popen、目錄權限最小化。logrotate 管理 Apache/PHP/MySQL 日誌。完成源碼編譯安裝,不僅獲得最新版本與自訂功能,更能深入理解 LAMP 棧各層依賴與配置關係。生產環境建議:**資料庫分離 (RDS/獨立實例)、Web 服務器改用 Nginx + PHP-FPM、靜態資源走 CDN、配置自動化部署 (Ansible/Docker)、**。手動編譯是學習與特殊需求的最佳途徑,標準化部署請轉向容器化與基礎設施即代碼。