February 25Feb 25 Debian 13 安裝Nginx官方版本、更改主機名稱、虛擬主機設定 -------- 前言 -------- 本教學適用Debian 13,假設系統尚未安裝Nginx,改用Nginx官方來源進行安裝與基本設定 為什麼選擇Nginx官方版本? Debian內建的nginx套件版本通常較舊,而官方版本提供: 最新穩定版:取得Nginx官方釋出的當下最新穩定版本 官方維護:由Nginx團隊直接維護與提供安全性更新 生產環境首選:適合需要快速獲得上游更新與修補的正式環境 ------------ 注意事項 ------------ 目錄結構差異 官方版與Debian版在目錄結構上略有不同。官方版預設沒有 sites-available 與 sites-enabled 這兩個用於管理虛擬主機的目錄 本教學將手動建立並整合它們,讓管理方式更直覺 使用者與群組變更 為符合Debian系統習慣與相容性,所有Nginx程序與目錄權限將統一使用 www-data:www-data (Debian預設的Web使用者) ---------------------------------- 準備工作 (更新系統、安裝工具) ---------------------------------- 安裝必要工具 apt update apt install -y curl vim wget gnupg gnupg2 dpkg apt-transport-https lsb-release ca-certificates 下載Nginx官方GPG金鑰 curl -sSLo /usr/share/keyrings/nginx.gpg https://nginx.org/keys/nginx_signing.key 驗證 GPG 金鑰指紋 gpg --show-keys --with-fingerprint /usr/share/keyrings/nginx.gpg 預期輸出: pub xxxxxxxxxxxx uid xxxxxxxxxxxx 安全提醒: 若指紋不符,請立即停止安裝 這可能代表金鑰遭竄改或下載來源異常 驗證金鑰是防範供應鏈攻擊的重要步驟,切勿略過 加入Nginx官方套件來源 echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/nginx.gpg] https://nginx.org/packages/debian/ $(lsb_release -sc) 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 更新套件清單 apt update 建議使用 full-upgrade 以確保依賴關係完整更新 apt full-upgrade -y 安裝nginx apt install -y nginx 安裝完成後,確認版本 nginx -v 應顯示 nginx version: nginx/1.28.x 類似訊息 ---------------------------------- 更改系統主機名稱 (Hostname) ---------------------------------- 若希望主機名稱與網站域名一致,可執行 hostnamectl set-hostname 域名.com 登出再登入即可生效 登出SSH exit 重新登入SSH 應顯示 Linux 域名.com 6.12.73+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.73-1 (2026-02-17) x86_64 確認主機名稱已更改 hostname ----------------------- 同步更新 /etc/hosts ----------------------- 更改主機名稱為純本機設定,與DNS解析無關,不影響網站是否可以對外存取 若系統同時使用 /etc/hosts,建議也同步更新其中的對應設定 編輯 vi /etc/hosts 找到原本的主機名稱那行 (通常格式為 127.0.1.1 舊主機名稱),將名稱改為新域名 127.0.1.1 域名.com 這樣可避免部分程式無法解析主機名稱的警告 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter -------------------------------------------------- 修改Nginx執行使用者為 www-data -------------------------------------------------- Nginx官方版預設以 nginx 使用者執行,Debian套件則使用 www-data 為與Debian習慣一致,並避免日後與PHP-FPM等服務的權限衝突,建議統一改為 www-data 編輯 vi /etc/nginx/nginx.conf 找到最頂端的 user nginx; (通常是第一行或第二行),將其改為 user www-data; 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter 儲存後測試 nginx -t 說明: 若未修改此設定,Nginx worker process 將以 nginx 使用者身份執行 而網站目錄擁有者為 www-data,兩者不符將導致 403 Forbidden 錯誤 ------------------------------------------------- 建立 Nginx 虛擬主機 (Server Block) 管理結構 ------------------------------------------------- Nginx官方版不含 Debian風格的虛擬主機管理目錄 (sites-available / sites-enabled),需手動建立 --------------------------------------------- 建立 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官方 預設頁面 /etc/nginx/conf.d/default.conf 改為放在 Debian風格 預設頁面 /etc/nginx/sites-available/default.conf ---------------------------------------------------------------------------- 停用官方 預設頁面 mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled 改放在 Debian風格 預設頁面 /etc/nginx/sites-available/default.conf 編輯 vi /etc/nginx/sites-available/default.conf 複製貼上以下內容 # Debian default.conf 預設頁面,準備改為 phpMyAdmin 專用,要改 port,要限制IP才能連入 # Default server configuration # server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.php; server_name _; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } } 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter --------------------------- 啟用 預設頁面 (建立軟連結) --------------------------- ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf ----------------------------------------------------------- 修正 預設頁面 網站目錄與檔案權限 (避免 403 Forbidden) ----------------------------------------------------------- 建立 預設頁面 根目錄 mkdir -p /var/www/html chown -R www-data:www-data /var/www/html chmod -R 755 /var/www/html 啟動 systemctl start nginx 確認 ps aux | grep nginx | grep -v grep 應看到 worker process 的左側顯示為 www-data 如果看到 worker process 的左側還是顯示為 nginx 試試重開機 reboot ----------------------------- 建立 虛擬主機 網站根目錄 ----------------------------- 建立網站根目錄 mkdir -p /var/www/域名.com ----------------------- 建立 虛擬主機 設定檔 ----------------------- 建立 域名.com.conf vi /etc/nginx/sites-available/域名.com.conf 貼上以下內容 (請將 域名.com 替換為你的實際域名) server { listen 80; server_name 域名.com; root /var/www/域名.com; index index.html index.htm; location / { try_files $uri $uri/ =404; } # 記錄存取與錯誤日誌 (便於除錯) access_log /var/log/nginx/域名.com.access.log; error_log /var/log/nginx/域名.com.error.log; } 儲存檔案並離開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 ------------------------------------------------------------- 修正 虛擬主機 網站目錄與檔案權限 (避免 403 Forbidden) ------------------------------------------------------------- 將網站目錄與檔案擁有者改為 www-data (與 nginx.conf 的 user 設定一致) chown -R www-data:www-data /var/www/域名.com chmod -R 755 /var/www/域名.com 啟動 systemctl start nginx 確認 ps aux | grep nginx | grep -v grep 應看到 worker process 的左側顯示為 www-data 說明: 如果未來上傳PHP或其他動態網站,可能需要根據實際需求調整權限 (例如將某些目錄設為 775) 755 是一個安全且通用的起始設定 確認 nginx.conf 中的 user 已設為 www-data,否則即使目錄權限正確,Nginx仍可能因使用者不符而產生 403 錯誤 ------------------------- 測試與重新載入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 ------------------------- 建立 虛擬主機 測試頁面 ------------------------- 在網站目錄中,新增一個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 ----------------------------------- 防火牆設定 (開放 80 / 443 Port) ----------------------------------- 之前的步驟已啟用iptables防火牆,需開放 HTTP 80 與 HTTPS 443 連接埠 編輯防火牆腳本 vi /usr/local/bin/firewall.sh # 3. 允許對內連線的 TCP 通訊埠(支援來源 IP 限制與反向排除) IN_TCP_PORTALLOWED="22,你的管理員IPv4 80 443" 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter 重新套用防火牆規則 bash /usr/local/bin/firewall.sh 檢查規則是否生效 iptables -L INPUT -n --line-numbers | grep -E "80|443" 應顯示為 29 WEB_ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ctstate NEW 30 WEB_ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 ctstate NEW 重要: 若使用雲端服務商 (如 GCP、AWS、Azure),除了系統內的 iptables,還需在雲端控制台的「安全性群組」或「防火牆規則」中開放 80/443 連接埠,兩者都需要設定,缺一不可 日後若要安裝SSL憑證,443 連接埠必須事先開放,否則申請憑證的驗證流程會失敗 ----------------------- 開機啟動與檢查狀態 ----------------------- 開機自動啟動 systemctl enable nginx 重新啟動Nginx systemctl restart nginx 檢查服務狀態 systemctl status nginx 正常應顯示 Active: active (running) 若服務無法啟動,查看錯誤 journalctl -xeu nginx 常見問題:設定檔語法錯誤、連接埠被其他服務佔用 (可用 ss -tlnp | grep :80 確認) ------------------------------ 驗證 虛擬主機 網站是否正常 ------------------------------ 開啟瀏覽器,輸入 http://域名.com/index.html 應可看到剛才建立的測試頁面 現代瀏覽器較嚴格,非 https 的頁面可能無法進入,當發現是這原因時,換個瀏覽器試試,或者使用SSH在伺服器本機測試 curl -I http://域名.com/ --------------------------- 驗證 預設頁面 是否正常 --------------------------- 開啟瀏覽器,輸入 http://伺服器IP/ 應可看到修改後的 Debian風格 預設頁面 上面步驟對此 預設頁面 沒加入 index.html 此時應顯示 404 Not Found 在伺服器本機用 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) ------------------------------------------------- 設定 logrotate 自動輪替日誌 (避免日誌爆滿) ------------------------------------------------- 為避免 Nginx 的存取日誌 (access log) 和錯誤日誌 (error log) 無限增長,耗盡硬碟空間,需設定 logrotate 自動管理 建立一個新的設定檔 vi /etc/logrotate.d/nginx 貼上以下內容 /var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 640 www-data adm sharedscripts postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript } 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter 說明: 這會讓系統每天輪替一次日誌,保留 14 天的紀錄,並壓縮舊檔 手動測試 logrotate 是否設定正確 (不實際輪替,僅模擬) logrotate -d /etc/logrotate.d/nginx ------------------ 重開機再次驗證 ------------------ 重開機 reboot 重開機再次驗證 服務狀態 systemctl status nginx 正常應顯示 Active: active (running) 測試設定語法是否正確 nginx -t ------------- 補充 ------------- 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 March 16Mar 16 by Jack
Create an account or sign in to comment