用 Shell 腳本自動化 Nginx 設定 文章首圖

用 Shell 腳本自動化 Nginx 設定

用 Shell 腳本自動化 Nginx 設定

在 Linux 系統管理的世界裡,重複性的手動操作不僅效率低落,還容易因為人為疏失導致服務中斷。對於經常需要部署網站或微服務的開發者來說,利用 Shell 腳本自動化 Nginx 的設定流程,是提升运维效率的關鍵一環。這篇文章將帶領大家撰寫一個實用的 Shell 腳本,自動完成從安裝、建立站台目錄到生成 Nginx 設定檔的完整流程。

為什麼需要自動化腳本?

想像一下,如果你需要在一台全新的 Ubuntu 22.04 伺服器上部署一個新的專案,手動步驟通常包括:安裝 Nginx、建立網站根目錄、撰寫 server block 設定檔、建立 SSL 憑證(若使用 HTTPS)、重新載入服務,最後還要測試語法是否正確。這套流程每次執行至少需要 10 分鐘,且容易忘記某個細微的權限設定。

透過 Shell 腳本,我們可以將這些步驟封裝成一個指令。只要改變變數(例如網站域名或根目錄路徑),就能在幾秒鐘內完成相同的設定,並且確保每次的結果都是一致的。

實作自動化腳本

我們將建立一個名為 setup_nginx.sh 的腳本。這個腳本將具備以下功能:

  1. 檢查並安裝 Nginx。
  2. 接收兩個參數:域名(例如 example.com)與網站根目錄路徑。
  3. 自動建立目錄結構並賦予正確權限。
  4. 生成對應的 Nginx server block 設定檔。
  5. 啟用站台並重新載入 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" 錯誤 這通常是目錄權限設定錯誤所致。雖然腳本中已經包含了 chownchmod 指令,但如果手動修改過目錄,可能遺漏了 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 容器的整合。自動化不僅節省時間,更能讓你的伺服器環境更加穩定與可維護。現在,就試著將這段腳本應用到你的下一個專案中吧!