Ubuntu VPS 設定:SSH、Nginx 與 HTTPS
在 Ubuntu 24.04 LTS 的 VPS 上使用 Nginx 與 HTTPS 發布小型靜態網站。本指南涵蓋獨立管理帳號、SSH 金鑰登入、憑證續期,以及重新啟動後的網站檢查。
VPSuntu・更新日期:・閱讀時間:約 7 分鐘
本篇目錄
準備伺服器、網域與復原管道
準備一台全新的 Ubuntu 24.04 VPS:公開 IPv4 位址、SSH 連接埠 22、具備 sudo 權限的初始帳號,以及你能管理的網域。建立伺服器前,先依下一節產生 SSH 金鑰。若空白伺服器已經建立,請透過現有可用的存取方式安裝金鑰。用戶端指令使用 Linux、macOS 或 WSL 的 Bash;伺服器指令則在 SSH 工作階段內執行。若範例路徑屬於既有部署,請先停止。
將所有 203.0.113.10 換成伺服器位址,所有 app.example.com 換成你的主機名稱;兩者都是文件範例。下文的初始使用者為 ubuntu,請依供應商提供的帳號替換。變更存取或防火牆前,先開啟復原主控台。使用下文的 UFW 分支前,確認供應商對該映像檔的防火牆說明;Oracle Cloud 的 Ubuntu 映像檔需要不同做法。
建立前先產生金鑰,或透過現有存取加入金鑰
在你的電腦上建立專用金鑰並設定通關密語。若檔名已存在,請另選名稱並一致替換。副檔名為 .pub 的檔案是公鑰;私鑰應留在你的電腦上。
mkdir -p ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/ubuntu_vps
cat ~/.ssh/ubuntu_vps.pub新建 VPS:現在建立 Ubuntu 24.04 伺服器,將這份公鑰填入供應商的 SSH 金鑰欄位。確認初始使用者名稱後,繼續下方的主機指紋驗證,略過既有伺服器的指令。
已建立但尚未部署的空白 VPS:保留可用的 SSH 工作階段。在電腦的另一個終端機中,使用目前有效的驗證方式複製新公鑰。將 existing_vps_key 換成現有私鑰的檔名。若原本以密碼或 SSH agent 登入,省略 -i ~/.ssh/existing_vps_key;不要變更伺服器的驗證原則。
scp -i ~/.ssh/existing_vps_key ~/.ssh/ubuntu_vps.pub ubuntu@203.0.113.10:ubuntu-vps-admin.pub在現有伺服器工作階段中驗證上傳的公鑰檔,並附加至初始帳號的 authorized_keys。附加操作會保留既有項目;額外的換行也能處理原檔最後一行沒有換行的情況。這些步驟用於你自己的初始帳號。若沒有任何可用存取方式,請先依供應商的復原程序恢復存取。
if ssh-keygen -lf ~/ubuntu-vps-admin.pub; then
mkdir -p ~/.ssh
chmod 700 ~/.ssh
printf '\n' >> ~/.ssh/authorized_keys
cat ~/ubuntu-vps-admin.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
fi無論使用哪條路徑,在接受第一次連線前,都要將主機金鑰指紋與可信任復原主控台中的相應主機公鑰比對。若使用 Ed25519 主機金鑰,請在該主控台執行:
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub在你的電腦上使用新金鑰建立新的連線。成功之前,保留原有存取方式。
ssh -i ~/.ssh/ubuntu_vps ubuntu@203.0.113.10在電腦的另一個終端機中,為下一節建立的獨立管理帳號複製公鑰。若既有伺服器路徑已上傳這份暫存公鑰,再次複製也可以。
scp -i ~/.ssh/ubuntu_vps ~/.ssh/ubuntu_vps.pub ubuntu@203.0.113.10:ubuntu-vps-admin.pub建立管理帳號並分別測試
先在伺服器執行 getent passwd deploy,正常情況下不應傳回帳號。若 deploy 已存在,請另選未使用的名稱,先替換全文中的帳號、家目錄與群組名稱,以免覆寫其他使用者的金鑰檔。
確認映像檔與資源、檢視更新,再建立管理帳號。為 sudo 密碼提示設定強密碼。install 指令會將金鑰檔的擁有權交給該帳號,並限制檔案權限。
cat /etc/os-release
free -h
df -h /
sudo apt update
sudo apt upgrade
sudo adduser deploy
sudo usermod -aG sudo deploy
sudo install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
sudo install -m 600 -o deploy -g deploy ~/ubuntu-vps-admin.pub /home/deploy/.ssh/authorized_keys在電腦開啟另一個終端機,以新管理帳號連線:
ssh -i ~/.ssh/ubuntu_vps deploy@203.0.113.10在新的伺服器工作階段執行 sudo,輸入 deploy 的密碼後應顯示 root。兩項測試成功後,在此繼續操作,並保留原有存取管道。
sudo whoami安裝 Nginx,使用映像檔支援的防火牆
先在伺服器安裝 Nginx。虛擬機器內的防火牆與供應商的網路防火牆都會影響存取;調整期間保留復原主控台及可用的 SSH 工作階段。
sudo apt install nginx
sudo systemctl enable --now nginx在供應商防火牆中,允許管理位置連入 TCP 22,並允許網站訪客使用 TCP 80/443。若 SSH 使用其他連接埠,請保留對應規則。僅設定網路規則,無法開放被虛擬機器防火牆封鎖的連接埠。
Oracle Cloud Ubuntu 映像檔:略過下方整段 UFW 指令。Oracle 提醒,UFW 可能干擾映像檔必要的防火牆規則,導致無法開機。保留隨附的 iptables 規則,包括保護 iSCSI 開機與區塊磁碟區的規則。使用 OCI 安全清單或網路安全群組,以及文件指定的虛擬機器防火牆規則開放 HTTP/HTTPS。不要清空既有規則,也不要替換映像檔的防火牆套件。
其他全新 Ubuntu 映像檔的 UFW 分支:只有供應商支援 UFW,且映像檔不需要其他受管理防火牆設定時,才執行以下指令。啟用前先允許實際使用的 SSH 連接埠;此範例假設為 22。
sudo apt install ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose完成任一防火牆路徑後,測試全新的 SSH 登入。已開啟的工作階段不能證明新連線可用。申請憑證前,下一節的外部 HTTP 檢查也必須成功。診斷問題期間保留既有登入方式。
在獨立的 Nginx 網站發布網頁
在伺服器建立新的網站根目錄與設定,並替換區塊內的主機名稱。保留加上引號的 EOF 標記,避免 shell 展開 $uri 等 Nginx 變數。
sudo install -d -m 755 /var/www/first-site
printf '%s\n' '<!doctype html><html lang="en"><title>First deployment</title><h1>Ubuntu VPS is serving this page</h1></html>' | sudo tee /var/www/first-site/index.html
sudo tee /etc/nginx/sites-available/first-site >/dev/null <<'EOF'
server {
listen 80;
listen [::]:80;
server_name app.example.com;
root /var/www/first-site;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/first-site /etc/nginx/sites-enabled/first-site
sudo nginx -t只有設定測試成功後,才在伺服器重新載入:
sudo systemctl reload nginx變更 DNS 前,先從電腦向伺服器位址請求這個主機名稱。應看到你設定的標題,而非 Nginx 預設歡迎頁。
curl --resolve app.example.com:80:203.0.113.10 http://app.example.com/設定 DNS 並取得 HTTPS 憑證
建立指向 VPS IPv4 位址的 DNS A 紀錄。只有這台伺服器的 IPv6 已正常運作,才發布 AAAA 紀錄。過期或錯誤的 AAAA 可能把訪客及憑證驗證導向其他位置。本範例假設 DNS 直接指向 VPS,未使用代理。
在電腦上不加 --resolve 請求 http://app.example.com/,確定傳回你的網頁後再繼續。在伺服器安裝 Ubuntu 套件庫中的 Certbot 及 Nginx 外掛。這些套件需要 Ubuntu 的 Universe 套件庫;若找不到套件,請先解決再往下操作。
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d app.example.com --redirect
sudo nginx -t
sudo certbot renew --dry-run
systemctl list-timers --all certbot.timer依提示填寫電子郵件並確認條款。Certbot 會修改該網站設定,啟用 HTTP 至 HTTPS 重新導向。確認續期計時器已排程;若未啟用,執行 sudo systemctl enable --now certbot.timer。保持連接埠 80 可連入,以進行 HTTP 憑證驗證與續期。
從外部及重新啟動後驗證
在你的電腦檢查重新導向、憑證與內容。HTTP 應導向 HTTPS;HTTPS 應成功並顯示你的標題。不要加入 curl 的 -k 選項,因為它會掩蓋憑證驗證失敗。
curl -I http://app.example.com/
curl -I https://app.example.com/
curl -fsS https://app.example.com/在部署仍屬測試階段時,於伺服器執行 sudo reboot。恢復後以 deploy 重新連線,檢查 systemctl is-active nginx,並再次從外部請求 HTTPS。重新啟動會主動中斷 SSH 工作階段;若主機未恢復,請使用主控台。
診斷失敗的檢查並保存部署資料
小螢幕可左右捲動表格,查看所有欄位。
| 症狀 | 優先檢查 |
|---|---|
| SSH 逾時 | 位址、供應商及虛擬機器防火牆、復原主控台 |
| Permission denied (publickey) | 使用者名稱、私鑰及 authorized_keys 權限 |
| 顯示 Nginx 預設頁 | DNS 目的地、server_name 及已啟用的網站 |
| 憑證驗證失敗 | 公開 A/AAAA 紀錄與連接埠 80 的可達性 |
| 變更後 Nginx 無法啟動 | sudo nginx -t 與 sudo journalctl -u nginx -n 50 --no-pager |
登入失敗時,依SSH 錯誤診斷區分網路、服務與金鑰問題,再調整存取設定。
將網站檔案、Nginx 設定、DNS 紀錄與重建步驟保存在 VPS 之外。在依賴這套程序前,先於另一台機器還原。若備份憑證私鑰,需保護儲存位置。設定可用性與憑證到期通知;一次檢查成功無法監控明天的續期。
可先進行靜態網頁及 Nginx 設定的檔案備份與還原演練,驗證獨立副本,同時保留運作中的網站。完整復原仍需其餘素材、憑證與服務設定。
這個部署提供靜態檔案。資料庫或應用程式執行環境需要各自的服務設定與備份方法。加入這些元件時,請參考資源量測指南。
常見問題
可以直接在現有網站執行這些指令嗎?
請先使用獨立測試 VPS。範例會建立檔案、啟用防火牆,並讓 Certbot 修改 Nginx;既有伺服器需先檢視網站、存取規則與復原程序。
這會安裝 WordPress、Node.js 或資料庫嗎?
不會,結果是靜態 HTTPS 網站。保留這個可用基礎,再加入應用程式執行環境,測試啟動、健康檢查與資料還原。