
Nginx 與 Apache 差在哪?怎麼選
兩者的架構差異
| Nginx | Apache | |
|---|---|---|
| 連線處理 | 事件驅動、非同步 | 以行程或執行緒處理(依 MPM) |
| 高並發表現 | 記憶體用量穩定 | 視 MPM 設定而定 |
| 靜態檔案 | 效率高 | 正常 |
| 目錄層級設定 | 不支援 | 支援 .htaccess |
| 模組載入 | 多需編譯時決定 | 可動態載入 |
| 設定語法 | 簡潔、階層式 | 指令式、較冗長 |
最實際的差別是 .htaccess。 Apache 允許在各目錄放置設定檔,不需重載服務即可生效;Nginx 沒有這個機制,所有設定都要寫在主設定中並重載。
.htaccess 的取捨
優點
- 不需要主機管理權限就能調整轉址與存取控制
- 共享主機環境下,使用者可自行設定
- 許多開源套件預設附帶 .htaccess
缺點
- 每次請求都要逐層讀取目錄中的 .htaccess,有效能成本
- 設定分散,不易追蹤
- 寫錯可能造成整站 500 錯誤
如果有主機的完整控制權,Apache 也建議把規則寫進 vhost 設定並關閉 AllowOverride,可減少檔案系統的查找。
常見的三種部署方式
一、純 Nginx + PHP-FPM
目前常見的組合。Nginx 處理連線與靜態檔案,PHP 交給 FPM 處理。
- 優點——資源效率好、設定集中
- 注意——原本依賴 .htaccess 的套件需改寫規則
二、純 Apache + mod_php 或 PHP-FPM
相容性最好,套件的預設設定通常可直接使用。
- 建議搭配 event MPM 與 PHP-FPM,而非傳統的 prefork + mod_php
三、Nginx 反向代理 Apache
Nginx 在前端處理連線與靜態檔案,動態請求轉給後端的 Apache。
- 優點——保留 .htaccess 相容性,同時取得前端的連線處理效率
- 注意——需正確傳遞真實來源位址,否則後端記錄到的都是代理的位址
反向代理時的來源位址
# Nginx 端 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host;
後端 Apache 需啟用 mod_remoteip 並設定信任的代理來源,否則存取紀錄與應用程式取得的來源位址會全部是代理伺服器。
怎麼選
- 新建、且有完整控制權——Nginx + PHP-FPM
- 既有系統依賴 .htaccess,且不想改寫——Apache,或 Nginx 反代 Apache
- 共享主機——通常沒得選,依主機商提供的環境
- 需要動態載入特定模組——Apache 較有彈性
就一般企業網站的流量規模而言,兩者的效能差異通常不是瓶頸——真正的瓶頸多半在應用層與資料庫。效能問題的排查順序見網站慢的常見原因。
設定檔的位置與結構
Nginx
/etc/nginx/nginx.conf # 主設定 /etc/nginx/conf.d/*.conf # 常見的分割位置 /etc/nginx/sites-available/ # Debian 系 /etc/nginx/sites-enabled/ # 以符號連結啟用
Apache
/etc/apache2/apache2.conf # Debian 系主設定 /etc/httpd/conf/httpd.conf # RHEL 系主設定 /etc/apache2/sites-available/ # 站台設定 /etc/apache2/mods-available/ # 模組設定
路徑因發行版而異,可用 nginx -t 或 apachectl -S 確認實際載入的設定檔。
修改設定的標準流程
- 備份原設定檔
- 修改
- 測試語法——Nginx 用
nginx -t,Apache 用apachectl configtest - 重載而非重啟——
systemctl reload nginx或apachectl graceful,可避免中斷既有連線 - 驗證實際效果
第三步不要省略。 語法錯誤時直接重啟會導致服務無法啟動,網站整個下線。
本文的設定範例以常見的環境為例,實際的路徑、模組名稱與指令可能因作業系統、版本與安裝方式而異。套用前請先在測試環境驗證,並確實備份原設定檔。