Skip 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 (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 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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

Account

Navigation

Search

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.