跳转到帖子
在手机APP中查看

一个更好的浏览方法。了解更多

PHP论坛人

主屏幕上的全屏APP,带有推送通知、徽章等。

在iOS和iPadOS上安装此APP
  1. 在Safari中轻敲分享图标
  2. 滚动菜单并轻敲添加到主屏幕
  3. 轻敲右上角的添加按钮。
在安卓上安装此APP
  1. 轻敲浏览器右上角的三个点菜单 (⋮) 。
  2. 轻敲添加到主屏幕安装APP
  3. 轻敲安装进行确认。

Debian 13 安裝 Nginx 官方版、設定虛擬主機

精选回复


適用對象: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 full-upgrade -y



說明:full-upgrade 會處理套件依賴關係變更,比 upgrade 更徹底,適合系統初始化時使用




安裝必要工具
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

不建議無限放大,因為這會增加記憶體使用量

本帖最后于,由Jack编辑

创建帐户或登录后发表意见

帐户

导航

搜索

搜索

配置浏览器推送通知

Chrome (安卓)
  1. 轻敲地址栏旁的锁形图标。
  2. 轻敲权限 → 通知。
  3. 调整你的偏好。
Chrome (台式电脑)
  1. 点击地址栏中的挂锁图标。
  2. 选择网站设置。
  3. 找到通知选项并调整你的偏好。