用 Shell 腳本自動化 Nginx 設定
在 Linux 系統管理的世界裡,重複性的手動操作不僅效率低落,還容易因為人為疏失導致服務中斷。對於經常需要部署網站或微服務的開發者來說,利用 Shell 腳本自動化 Nginx 的設定流程,是提升运维效率的關鍵一環。這篇文章將帶領大家撰寫一個實用的 Shell 腳本,自動完成從安裝、建立站台目錄到生成 Nginx 設定檔的完整流程。
為什麼需要自動化腳本?
想像一下,如果你需要在一台全新的 Ubuntu 22.04 伺服器上部署一個新的專案,手動步驟通常包括:安裝 Nginx、建立網站根目錄、撰寫 server block 設定檔、建立 SSL 憑證(若使用 HTTPS)、重新載入服務,最後還要測試語法是否正確。這套流程每次執行至少需要 10 分鐘,且容易忘記某個細微的權限設定。
透過 Shell 腳本,我們可以將這些步驟封裝成一個指令。只要改變變數(例如網站域名或根目錄路徑),就能在幾秒鐘內完成相同的設定,並且確保每次的結果都是一致的。
實作自動化腳本
我們將建立一個名為 setup_nginx.sh 的腳本。這個腳本將具備以下功能:
- 檢查並安裝 Nginx。
- 接收兩個參數:域名(例如
example.com)與網站根目錄路徑。 - 自動建立目錄結構並賦予正確權限。
- 生成對應的 Nginx
server block設定檔。 - 啟用站台並重新載入 Nginx 服務。
以下是完整的腳本程式碼:
#!/bin/bash
# 設定顏色變數,讓輸出更直觀
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# 檢查是否以 root 權限執行
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}請使用 sudo 或 root 權限執行此腳本${NC}"
exit 1
fi
# 檢查參數數量
if [ $# -ne 2 ]; then
echo "使用方法: sudo $0 <域名> <網站根目錄路徑>"
echo "範例: sudo $0 example.com /var/www/example"
exit 1
fi
DOMAIN=$1
ROOT_DIR=$2
echo -e "${GREEN}開始設定 Nginx 站台: ${DOMAIN}${NC}"
# 1. 安裝 Nginx (若尚未安裝)
if ! command -v nginx &> /dev/null; then
echo "正在安裝 Nginx..."
apt-get update
apt-get install -y nginx
else
echo "Nginx 已安裝,跳過安裝步驟。"
fi
# 2. 建立網站根目錄與預設頁面
echo "正在建立目錄結構: ${ROOT_DIR}"
mkdir -p ${ROOT_DIR}
# 建立一個簡單的測試頁面
cat > ${ROOT_DIR}/index.html <<EOF
<!DOCTYPE html>
<html>
<head>
<title>Welcome to ${DOMAIN}</title>
</head>
<body>
<h1>恭喜!${DOMAIN} 設定成功</h1>
<p>這是自動生成的測試頁面。</p>
</body>
</html>
EOF
# 3. 設定目錄權限
# 將擁有者設為 www-data (Nginx 預設使用者)
chown -R www-data:www-data ${ROOT_DIR}
chmod -R 755 ${ROOT_DIR}
# 4. 生成 Nginx Server Block 設定檔
CONF_FILE="/etc/nginx/sites-available/${DOMAIN}"
LINK_FILE="/etc/nginx/sites-enabled/${DOMAIN}"
echo "正在生成設定檔: ${CONF_FILE}"
cat > ${CONF_FILE} <<EOF
server {
listen 80;
listen [::]:80;
root ${ROOT_DIR};
index index.html index.htm index.nginx-debian.html;
server_name ${DOMAIN} www.${DOMAIN};
location / {
try_files \$uri \$uri/ =404;
}
# 日誌設定
access_log /var/log/nginx/${DOMAIN}.access.log;
error_log /var/log/nginx/${DOMAIN}.error.log;
}
EOF
# 5. 啟用站台並移除預設站台 (可選,視需求而定)
# 為了避免衝突,先移除 default 設定
if [ -L /etc/nginx/sites-enabled/default ]; then
rm /etc/nginx/sites-enabled/default
echo "已移除預設站台設定以避免衝突。"
fi
# 建立符號連結以啟用站台
ln -s ${CONF_FILE} ${LINK_FILE}
# 6. 測試 Nginx 設定並重新載入
echo "正在測試 Nginx 設定..."
nginx -t
if [ $? -eq 0 ]; then
systemctl reload nginx
echo -e "${GREEN}設定完成!請在瀏覽器訪問 http://${DOMAIN} 查看結果。${NC}"
else
echo -e "${RED}Nginx 設定測試失敗,請檢查設定檔內容。${NC}"
exit 1
fi
如何執行腳本
將上述程式碼儲存為 setup_nginx.sh,並給予執行權限:
chmod +x setup_nginx.sh
sudo ./setup_nginx.sh example.com /var/www/example
執行後,腳本會自動處理所有複雜的步驟。若一切順利,你將看到綠色的成功訊息。此時,你的瀏覽器訪問 http://example.com(需確保 DNS 已解析至伺服器 IP)即可看到測試頁面。
常見問題與解決方案
1. 執行腳本時出現 "Permission denied" 錯誤
這通常是因為腳本沒有執行權限,或者你沒有使用 sudo 執行。Nginx 的設定檔位於 /etc/nginx/,該目錄僅允許 root 使用者修改。請務必使用 sudo 執行腳本,並確認腳本本身擁有執行權限(chmod +x)。
2. 訪問網站時出現 "403 Forbidden" 錯誤
這通常是目錄權限設定錯誤所致。雖然腳本中已經包含了 chown 和 chmod 指令,但如果手動修改過目錄,可能遺漏了 www-data 使用者的擁有權。請檢查網站根目錄的權限:
ls -ld /var/www/example
輸出應顯示擁有者為 www-data,且權限至少包含 755。若無,請手動執行 sudo chown -R www-data:www-data /var/www/example。
小結
透過這段 Shell 腳本,我們不僅自動化了 Nginx 的基礎設定,更建立了可重複使用的部署模板。隨著經驗增加,你可以進一步擴充這個腳本,例如加入 Let's Encrypt 的自動憑證申請、防火牆規則設定,或是 Docker 容器的整合。自動化不僅節省時間,更能讓你的伺服器環境更加穩定與可維護。現在,就試著將這段腳本應用到你的下一個專案中吧!