Jump to content
View in the app

A better way to browse. Learn more.

PHP论坛人

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Debian 13 安裝Nginx官方版本、更改主機名稱、虛擬主機設定

Featured Replies

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 by Jack

Create an account or sign in to comment

Account

Navigation

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.