February 25Feb 25 適用對象:Debian 13 (Trixie)、VPS規格 2 vCPU / 2 GB RAM、LNMP 論壇網站 Nginx 來源:官方套件庫(非 Debian 內建版本) -------- 前言 -------- 本教學適用Debian 13,假設系統尚未安裝Nginx,改用Nginx官方來源進行安裝與基本設定 為什麼選擇Nginx官方版本? Debian內建的nginx套件版本通常較舊,而官方版本提供: 最新穩定版:取得Nginx官方釋出的當下最新穩定版本 官方維護:由Nginx團隊直接維護與提供安全性更新 生產環境首選:適合需要快速獲得上游更新與修補的正式環境 ------------ 注意事項 ------------ 在開始之前,請先了解本教學的幾項核心設計決策: 目錄結構差異 Nginx 官方版預設不含 sites-available 與 sites-enabled 目錄,也不含 snippets/ 目錄與 fastcgi.conf,本教學將全部手動建立,使管理方式符合 Debian 習慣 使用者統一為 www-data 官方版預設以 nginx 使用者執行,Debian套件版則使用 www-data 為與 Debian 系統習慣一致,並避免日後與 PHP-FPM 產生權限衝突,本教學統一改為 www-data:www-data 本教學涵蓋範圍 安裝 Nginx 官方版並驗證 GPG 金鑰 更改系統主機名稱 建立 Debian 風格虛擬主機管理結構 手動建立 PHP FastCGI 設定檔 優化 nginx.conf(針對 2 vCPU / 2 GB RAM) 設定 logrotate 自動輪替日誌 開機啟動與服務驗證 ---------------------------------- 準備工作 ---------------------------------- 更新系統 apt update -y && apt upgrade -y 安裝必要工具 apt install -y curl vim wget gnupg gnupg2 dpkg apt-transport-https lsb-release ca-certificates 說明: gnupg / gnupg2:用於驗證 GPG 金鑰 lsb-release:提供 lsb_release -sc 指令,讓套件來源自動偵測 Debian 版本代號 ca-certificates:確保 HTTPS 憑證鏈完整,避免 curl 下載時出現憑證錯誤 apt-transport-https:允許 apt 透過 HTTPS 下載套件 下載並驗證 GPG 金鑰 這幾行一次貼上 curl -fsSL https://nginx.org/keys/nginx_signing.key \ | gpg --dearmor \ -o /usr/share/keyrings/nginx.gpg 設定金鑰檔案權限 chmod 644 /usr/share/keyrings/nginx.gpg 確認檔案存在 ls -lh /usr/share/keyrings/nginx.gpg 確認格式正確 file /usr/share/keyrings/nginx.gpg 驗證 GPG 金鑰指紋 gpg --show-keys --with-fingerprint /usr/share/keyrings/nginx.gpg 預期輸出: pub rsa4096 2024-05-29 [SC] 8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46 uid nginx signing key <signing-key-2@nginx.com> pub rsa2048 2011-08-19 [SC] [expires: 2027-05-24] 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62 uid nginx signing key <signing-key@nginx.com> pub rsa4096 2024-05-29 [SC] 9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3 uid nginx signing key <signing-key-3@nginx.com> 安全提醒:若指紋不符,請立即停止安裝 這可能代表金鑰遭竄改或下載來源異常 驗證金鑰是防範供應鏈攻擊 (Supply Chain Attack) 的關鍵步驟,切勿略過 加入 Nginx 官方套件來源 以下3行一次貼上 echo "deb [arch=amd64 signed-by=/usr/share/keyrings/nginx.gpg] \ https://nginx.org/packages/debian trixie nginx" \ > /etc/apt/sources.list.d/nginx.list 確認內容正確 cat /etc/apt/sources.list.d/nginx.list 預期輸出:deb [arch=amd64 signed-by=/usr/share/keyrings/nginx.gpg] https://nginx.org/packages/debian trixie nginx 說明: signed-by= 確保每次 apt update 都透過此金鑰驗證下載內容 使用 gpg --dearmor 轉換為 binary keyring 格式 避免新版 Debian / APT 無法正確辨識 ASCII armored key 更新套件清單 apt update -y 安裝Nginx apt install -y nginx 確認版本,預期顯示 nginx/1.30.2 nginx -v 補充:安裝完成後,Nginx 官方版會建立 /etc/nginx/conf.d/default.conf 作為預設頁面 稍後將其停用,改用 Debian 風格管理 ---------------------------------- 更改系統主機名稱 Hostname ---------------------------------- 若希望VPS主機名稱與域名一致,可執行 hostnamectl set-hostname 域名.com 登出 exit 登出再登入即可生效 應顯示 Linux 域名.com xxxxxxxxxxxxxxxx 已修改 SSH MOTD 的情況下,則應顯示 root@域名:~# 確認主機名稱已更改 hostname 預期顯示 域名.com ------------------------------ 同步更新 /etc/hosts ------------------------------ 更改主機名稱為純本機設定,與DNS解析無關,不影響網站對外存取 但若系統程式嘗試解析主機名稱時找不到對應記錄,可能出現 sudo: unable to resolve host 警告或短暫延遲。建議同步更新 /etc/hosts 編輯 vi /etc/hosts 找到原本的主機名稱那行 (通常格式為 127.0.1.1 舊主機名稱),將名稱改為新域名 127.0.1.1 域名.com 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter 說明:此設定可避免 sudo 或部分程式出現 unable to resolve host 警告,也能讓本機 curl 測試時正確解析主機名稱 -------------------------------------------------- 修改 Nginx 執行使用者為 www-data -------------------------------------------------- Nginx 官方版預設以 nginx 使用者執行,Debian 套件版則使用 www-data 若未修改,Nginx worker process 將以 nginx 使用者身份執行,而網站目錄擁有者為 www-data,兩者不符將導致 403 Forbidden 錯誤 編輯 vi /etc/nginx/nginx.conf 找到最頂端的 user nginx; (通常是第一行或第二行),將其改為 user www-data; 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter ------------------------------------------------- 建立 Debian 風格虛擬主機管理結構 ------------------------------------------------- Nginx 官方版不含 sites-available 目錄 與 sites-enabled 目錄,需手動建立 建立目錄 mkdir -p /etc/nginx/sites-available mkdir -p /etc/nginx/sites-enabled 說明:-p 參數允許建立多層目錄,若目錄已存在也不會報錯 -------------------------------------- 修改主設定檔,載入 sites-enabled -------------------------------------- 編輯 vi /etc/nginx/nginx.conf 在 http { ... } 區塊的結尾附近,可放在最後一個 } 之前,加入以下這行 include /etc/nginx/sites-enabled/*.conf; 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter 說明:請確認是加在 http { } 區塊內部,而非區塊外面 因為Nginx官方版不包含此設定,必須手動加入,否則虛擬主機設定檔不會被載入,網站將無法正常運作 ------------------------- 測試語法 ------------------------- 測試語法 nginx -t 應顯示 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful ------------------------- 建立預設頁面設定檔 ------------------------- 停用Nginx官方預設頁面 mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled 說明:使用 .disabled 副檔名而非直接刪除,保留備份以便參考 --------------------------------- 建立 Debian 風格預設頁面 --------------------------------- 編輯 vi /etc/nginx/sites-available/default.conf 貼上以下內容 # Debian default.conf 預設頁面,準備改為 phpMyAdmin 專用,要改 port,要限制IP才能連入 server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm; server_name _; # 禁止存取隱藏檔案(如 .htaccess、.git) location ~ /\. { deny all; access_log off; log_not_found off; } location / { try_files $uri $uri/ =404; } } 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter ------------------------------- 啟用 預設頁面 (建立軟連結) ------------------------------- ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf ------------------------------- 設定 預設頁面 目錄權限 ------------------------------- mkdir -p /var/www/html chown -R www-data:www-data /var/www/html chmod -R 755 /var/www/html 啟動 systemctl start nginx 確認看到 worker process 最左側 應顯示為 www-data ps aux | grep nginx | grep -v grep 如果看到 worker process 最左側 還是顯示為 nginx,試試重開機 重開機 reboot --------------------------------- 建立 虛擬主機 (Server Block) --------------------------------- 建立網站根目錄 mkdir -p /var/www/域名.com ----------------------- 建立 虛擬主機 設定檔 ----------------------- 建立 域名.com.conf vi /etc/nginx/sites-available/域名.com.conf 貼上以下內容 (請將 域名.com 替換為你的實際域名) server { listen 80; listen [::]:80; server_name 域名.com; root /var/www/域名.com; index index.html index.htm; location / { try_files $uri $uri/ =404; } } 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter 說明: access_log 與 error_log 雖非必要,但強烈建議加入,便於後續排查問題 若有多個網站,每個網站各自建立一個 .conf 檔案,清楚分離設定,方便維護與停用個別網站 -------------------------- 啟用網站 (建立軟連結) -------------------------- ln -s /etc/nginx/sites-available/域名.com.conf /etc/nginx/sites-enabled/域名.com.conf 說明:使用軟連結 (symlink) 的好處是,日後若要暫時關閉網站,只需刪除 sites-enabled 中的連結 設定檔仍會保留在 sites-available 中,方便日後重新啟用 日後若要暫時關閉網站,只需 rm 刪除 sites-enabled 中的連結 rm /etc/nginx/sites-enabled/域名.com.conf ------------------------------------------------------------- 修正 虛擬主機 目錄與權限 ------------------------------------------------------------- 將網站目錄與檔案擁有者改為 www-data (與 nginx.conf 的 user 設定一致) chown -R www-data:www-data /var/www/域名.com chmod -R 755 /var/www/域名.com 說明: 755:擁有者可讀寫執行,群組與其他人可讀執行,適合靜態網站的安全起始設定 若日後上傳 PHP 或有上傳功能的動態頁面 (如論壇附件目錄),僅對需要寫入的目錄設為 775 確認 nginx.conf 中的 user 已設為 www-data,否則即使目錄權限正確,Nginx 仍可能因使用者不符而產生 403 錯誤 ------------------------ 重啟 ------------------------ 重啟 systemctl reload nginx 確認看到 worker process 最左側 應顯示為 www-data ps aux | grep nginx | grep -v grep ------------------------- 建立 虛擬主機 測試頁面 ------------------------- 在網站目錄中,新增一個index.html vi /var/www/域名.com/index.html 貼上以下內容 <!DOCTYPE html> <html lang="zh-Hant"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>測試頁面</title> </head> <body> <h1>Nginx 運作正常</h1> <p>若你看到此頁面,代表 Nginx 已成功安裝並正確設定。</p> </body> </html> 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter ------------------------- 啟動 Nginx 並驗證 ------------------------- 每次修改設定後,務必先測試設定語法是否正確 測試語法 nginx -t 若顯示 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful 代表設定無誤,即可繼續 重新載入 systemctl reload nginx 說明: 請使用 reload (重新載入),而非 restart (重新啟動) reload不會中斷現有連線;restart會短暫中斷所有服務,在生產環境中應盡量避免 若 nginx -t 顯示錯誤,Nginx 會指出是哪個檔案的哪一行有問題,根據提示修正後再次執行 nginx -t 確認,通過後再 reload ----------------------------- 開機自動啟動 ----------------------------- 開機自動啟動 systemctl enable nginx 重啟 systemctl reload nginx 檢查服務狀態,正常應顯示 Active: active (running) systemctl status nginx 確認 worker process 使用者 (應顯示 www-data) ps aux | grep nginx | grep -v grep 若服務無法啟動,查看錯誤 journalctl -xeu nginx 確認 80 port 是否正常監聽 ss -tlnp | grep :80 -------------------------------- 設定 logrotate 自動輪替日誌 -------------------------------- 若不設定 logrotate,Nginx 的存取日誌與錯誤日誌會無限增長,最終耗盡硬碟空間 建立 vi /etc/logrotate.d/nginx 修改為以下內容 /var/log/nginx/*.log { daily missingok rotate 30 compress delaycompress notifempty create 640 www-data adm sharedscripts postrotate if [ -f /run/nginx.pid ]; then kill -USR1 `cat /run/nginx.pid` fi endscript } 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter 說明: daily:每天輪替一次 rotate 30:保留最近 30 天的日誌,更早的自動刪除 compress / delaycompress:壓縮舊日誌,delaycompress 讓最新一份先不壓縮 (避免當天仍有程式寫入) missingok:若日誌檔不存在,不報錯 notifempty:若日誌為空,不輪替 create 640 www-data adm:建立新日誌檔,擁有者為 www-data,群組為 adm,權限 640 (adm 群組可讀,其他人不可讀) kill -USR1:通知 Nginx 重新開啟日誌檔案 (graceful log reopen),不中斷服務 ---------------------------------- 手動模擬測試(不實際輪替) ---------------------------------- 手動測試 logrotate 設定正確 (不實際輪替,僅模擬) logrotate -d /etc/logrotate.d/nginx 若無報錯,表示設定正確 ------------------ 重開機驗證 ------------------ 安裝與設定完成後,建議重開機一次,確認所有服務在開機後能自動正常啟動 重開機 reboot 驗證服務狀態,應顯示 Active: active (running) systemctl status nginx 測試設定語法 nginx -t ---------------------------- 清除瀏覽器 HSTS 快取 ---------------------------- 若先前曾對同一域名設定過 HTTPS / HSTS,瀏覽器可能強制跳轉至 HTTPS,導致 HTTP 測試頁無法開啟 Chrome瀏覽器,在網址列輸入 chrome://net-internals/#hsts 在「Delete domain security policies」輸入域名並刪除 域名.com ------------------------------ 瀏覽器測試 ------------------------------ 開啟瀏覽器,輸入 http://域名.com/index.html 應可看到剛才建立的測試頁面 注意:現代瀏覽器 (Chrome、Edge) 對非 HTTPS 網站較為嚴格,可能自動跳轉或警告 若遇到此情況,建議使用伺服器端的 curl 測試,或改用 Firefox (私密視窗) 測試,避免瀏覽器快取或 HSTS 干擾 --------------------------- 驗證 預設頁面 是否正常 --------------------------- 開啟瀏覽器,輸入 http://VPS的IP/ 應可看到修改後的 Debian風格預設頁面 上面步驟對此 預設頁面 沒加入 index.html 此時應顯示 404 Not Found 在VPS本機用 curl 測試 (不依賴DNS解析) curl -I http://localhost/ curl -I http://IP/ 預期回傳 HTTP/1.1 403 Forbidden (預設頁面 沒設定 index.html) curl -I http://域名.com/ 預期回傳 HTTP/1.1 200 OK (虛擬主機,有設定 index.html) ------------- 補充 ------------- sites-enabled 載入 官方版 Nginx 預設不載入,務必手動加入 include www-data 權限 若未設定目錄擁有者,容易出現 403 Forbidden nginx -t 每次修改設定後都應測試,避免設定錯誤導致服務中斷 reload vs restart 生產環境應使用 reload 保留現有連線 防火牆雙層檢查 系統 + 雲端防火牆都要開放 80/443 Port被佔用 查找 ss -tlnp | grep :80 Hash Bucket Size:若你的域名非常長,啟動Nginx時可能會報錯 server_names_hash_bucket_size 此時需在 nginx.conf 的 http 區塊中取消該行註解並調大數值 (如 64) 編輯 nginx.conf vi /etc/nginx/nginx.conf 在 http {} 區塊裡面加入或取消註解 http { ......... server_names_hash_bucket_size 64; ......... } 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter 注意: 必須放在 http {} 區塊中 不可以放在 server {} 裡面 不要重複定義多次 一般網站 建議數值 64 長子網域 建議數值 128 大量 vhost 建議數值 128 ~ 256 不建議無限放大,因為這會增加記憶體使用量 Edited June 3Jun 3 by Jack
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.