LEMP 教學最怕只剩下安裝指令列表,結果你做完也不知道網站為什麼能跑、設定檔為什麼要改在那裡。這篇會用站長實際部署的角度,把 Nginx 和 PHP 之間的關係講清楚。
你如果不想每次都只是照著別人的畫面一步一步跟著按,卻不知道自己到底改了什麼,這篇會比較適合你。重點不是讓你背流程,而是讓你下次遇到類似情況時,還知道該怎麼自己判斷。
你會學到什麼
- 完成 Nginx 與 PHP 安裝並理解服務分工。
- 知道網站根目錄、server block 與 PHP-FPM 在哪裡串起來。
- 遇到 502、白頁或權限問題時,有基本排查方向。
- 學會基礎效能調校與安全加固。
什麼情況最適合先看這篇
- 第一次自己管理 Linux 主機,想把操作做穩而不是只會貼指令的人
- 你現在正要處理「VPS 安裝 Nginx 與 PHP」這類操作
- 你希望做完之後不只功能能用,連驗證與排錯也有概念
開始前先確認
- 先更新系統並確認網域或測試 IP。
- 決定網站要放在哪個目錄。
- 如果已有舊網站,先不要直接覆蓋正式設定。
先提醒你一件事
VPS 最怕的不是不會下指令,而是你不知道指令會影響到哪個服務、哪個設定檔、哪個對外連線。
詳細教學與操作步驟
本文以 Ubuntu 24.04 為例,說明如何安裝 LEMP(Linux + Nginx + MySQL + PHP)環境,讓您的 VPS 成為一台完整的 Web Server。
安裝 Nginx
-
更新套件清單並安裝 Nginx:
apt update apt install nginx -y -
啟動並設定開機自動啟動:
systemctl start nginx systemctl enable nginx -
開放防火牆:
ufw allow 80/tcp ufw allow 443/tcp -
在瀏覽器輸入您的 VPS IP,看到 Nginx 歡迎頁面即表示安裝成功。
安裝 PHP 8.3
-
安裝 PHP-FPM 及常用擴充模組:
apt install php8.3-fpm php8.3-mysql php8.3-curl php8.3-mbstring \ php8.3-xml php8.3-zip php8.3-gd php8.3-intl -y -
確認 PHP 版本:
php -v -
確認 PHP-FPM 正在運行:
systemctl status php8.3-fpm
安裝 MySQL
-
安裝 MySQL Server:
apt install mysql-server -y若偏好 MariaDB,可改用:
apt install mariadb-server -y -
執行安全性設定精靈:
mysql_secure_installation建議設定 root 密碼、移除匿名帳號、禁止遠端 root 登入、刪除測試資料庫。
設定 Nginx 虛擬主機
-
建立網站目錄:
mkdir -p /var/www/example.com chown -R www-data:www-data /var/www/example.com -
建立 Nginx 設定檔:
nano /etc/nginx/sites-available/example.com寫入以下內容(請將
example.com替換為您的網域):server { listen 80; server_name example.com www.example.com; root /var/www/example.com; index index.php index.html; # 安全性標頭 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; } location ~ /\.ht { deny all; } # 靜態檔案快取 location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ { expires 30d; add_header Cache-Control "public, immutable"; } } -
啟用網站並測試設定:
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ nginx -t systemctl reload nginx
測試 PHP 是否正常運作
-
建立測試檔案:
echo "<?php phpinfo();" > /var/www/example.com/info.php -
在瀏覽器開啟
http://您的VPS_IP/info.php,看到 PHP 資訊頁面表示設定成功。 -
測試完成後請立即刪除此檔案(避免洩漏伺服器資訊):
rm /var/www/example.com/info.php
安裝 SSL 憑證(Let's Encrypt)
使用 Certbot 取得免費 SSL 憑證:
apt install certbot python3-certbot-nginx -y
certbot --nginx -d example.com -d www.example.com
Certbot 會自動修改 Nginx 設定並啟用 HTTPS。憑證每 90 天自動續約,可用以下指令測試續約:
certbot renew --dry-run
Nginx 效能調校
編輯 /etc/nginx/nginx.conf:
# worker 數量設為 CPU 核心數
worker_processes auto;
events {
# 每個 worker 的最大連線數
worker_connections 1024;
multi_accept on;
}
http {
# 啟用 Gzip 壓縮
gzip on;
gzip_vary on;
gzip_min_length 256;
gzip_types
text/plain
text/css
text/xml
application/json
application/javascript
application/xml
image/svg+xml;
# 檔案傳輸優化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 連線逾時設定
keepalive_timeout 65;
client_max_body_size 64M;
# 隱藏 Nginx 版本號
server_tokens off;
}
調整後記得測試並重載:
nginx -t && systemctl reload nginx
PHP-FPM 調校
編輯 /etc/php/8.3/fpm/pool.d/www.conf,根據你的 VPS 記憶體調整:
# 2GB RAM 的建議設定
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
# 4GB RAM 的建議設定
; pm.max_children = 25
; pm.start_servers = 5
; pm.min_spare_servers = 3
; pm.max_spare_servers = 10
調整 PHP 上傳與記憶體限制,編輯 /etc/php/8.3/fpm/php.ini:
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 300
重啟 PHP-FPM:
systemctl restart php8.3-fpm
常見錯誤排查
502 Bad Gateway:
# 檢查 PHP-FPM 是否在跑
systemctl status php8.3-fpm
# 確認 socket 檔案存在
ls -la /run/php/php8.3-fpm.sock
# 查看 PHP-FPM 日誌
tail -20 /var/log/php8.3-fpm.log
403 Forbidden:
# 檢查目錄權限
ls -la /var/www/example.com/
# 修正權限
chown -R www-data:www-data /var/www/example.com/
find /var/www/example.com/ -type d -exec chmod 755 {} \;
find /var/www/example.com/ -type f -exec chmod 644 {} \;
白頁(500 Internal Server Error):
# 開啟 PHP 錯誤顯示(僅限除錯,正式環境要關)
# 在 php.ini 設定
display_errors = On
# 查看 Nginx 錯誤日誌
tail -50 /var/log/nginx/error.log
常見問題
Q:為什麼選 Nginx 不選 Apache? Nginx 在處理高併發與靜態檔案時效能更好,記憶體使用量也更低。對於 VPS 資源有限的環境,Nginx 是更划算的選擇。
Q:可以同時跑多個 PHP 版本嗎?
可以。每個 PHP 版本會有自己的 FPM pool,在 Nginx 的 server block 中指定不同的 fastcgi_pass socket 即可。
做完後怎麼確認自己真的有設對
- 在瀏覽器輸入你的域名或 IP,確認能看到頁面。
- 用
nginx -t確認設定檔語法正確。 - 用
systemctl status nginx和systemctl status php8.3-fpm確認服務都在 running。 - 重新開機後確認所有服務會自動啟動。
這一題最常踩的坑
- Nginx 設定看起來正常,但 PHP-FPM 根本沒起來。
- 網站根目錄和權限設錯,頁面只會回 403 或空白。
- 還沒確認本機可通就先接 Cloudflare,排錯複雜度會更高。
client_max_body_size沒調,上傳大檔案會被擋。- PHP 模組沒裝齊,網站功能斷斷續續。
如果你要往下一步走
做完後如果要正式上線,通常會接著處理 網域指向 VPS 主機教學。想進一步強化安全性,參考 Fail2Ban 防護教學。如果你準備開始自己架服務,可以直接對照侃瑞的 VPS 方案與價格 選環境。