VPS 安裝 Nginx 與 PHP 教學:打造 LEMP 高效網頁伺服器

從無到有帶你在 VPS 上建立 Nginx + PHP + MySQL 的 LEMP 環境,理解 server block、PHP-FPM 與效能調校,遇到 502 或白頁時知道怎麼排錯。

VPSNginxPHPLEMPWeb Server教學安裝網站伺服器LNMP性能優化PHP-FPMSSLLet's Encryptserver blockGzip

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

  1. 更新套件清單並安裝 Nginx:

    apt update
    apt install nginx -y
    
  2. 啟動並設定開機自動啟動:

    systemctl start nginx
    systemctl enable nginx
    
  3. 開放防火牆:

    ufw allow 80/tcp
    ufw allow 443/tcp
    
  4. 在瀏覽器輸入您的 VPS IP,看到 Nginx 歡迎頁面即表示安裝成功。

安裝 PHP 8.3

  1. 安裝 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
    
  2. 確認 PHP 版本:

    php -v
    
  3. 確認 PHP-FPM 正在運行:

    systemctl status php8.3-fpm
    

安裝 MySQL

  1. 安裝 MySQL Server:

    apt install mysql-server -y
    

    若偏好 MariaDB,可改用:

    apt install mariadb-server -y
    
  2. 執行安全性設定精靈:

    mysql_secure_installation
    

    建議設定 root 密碼、移除匿名帳號、禁止遠端 root 登入、刪除測試資料庫。

設定 Nginx 虛擬主機

  1. 建立網站目錄:

    mkdir -p /var/www/example.com
    chown -R www-data:www-data /var/www/example.com
    
  2. 建立 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";
        }
    }
    
  3. 啟用網站並測試設定:

    ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
    nginx -t
    systemctl reload nginx
    

測試 PHP 是否正常運作

  1. 建立測試檔案:

    echo "<?php phpinfo();" > /var/www/example.com/info.php
    
  2. 在瀏覽器開啟 http://您的VPS_IP/info.php,看到 PHP 資訊頁面表示設定成功。

  3. 測試完成後請立即刪除此檔案(避免洩漏伺服器資訊):

    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 nginxsystemctl status php8.3-fpm 確認服務都在 running。
  • 重新開機後確認所有服務會自動啟動。

這一題最常踩的坑

  • Nginx 設定看起來正常,但 PHP-FPM 根本沒起來。
  • 網站根目錄和權限設錯,頁面只會回 403 或空白。
  • 還沒確認本機可通就先接 Cloudflare,排錯複雜度會更高。
  • client_max_body_size 沒調,上傳大檔案會被擋。
  • PHP 模組沒裝齊,網站功能斷斷續續。

如果你要往下一步走

做完後如果要正式上線,通常會接著處理 網域指向 VPS 主機教學。想進一步強化安全性,參考 Fail2Ban 防護教學。如果你準備開始自己架服務,可以直接對照侃瑞的 VPS 方案與價格 選環境。

需要主機來實作?

侃瑞科技提供 cPanel 虛擬主機與 VPS,教學裡的操作開箱即用。

查看方案 →
LINE 諮詢