Ubuntu Server 自動執行 HTTP Server

要在 Ubuntu Server 重新開機後自動執行指令,最簡單且標準的做法是使用 systemd 建立一個服務。這比舊式的 crontab 更穩定,還能在程式當掉時自動重啟。

建立 Service 檔案

請使用 sudo 權限建立一個新的設定檔,檔名可以自訂,這裡假設為 http-server.service:

sudo nano /etc/systemd/system/http-server.service

編輯服務內容

將以下內容貼進檔案中。請注意,ExecStart 必須使用完整的絕對路徑。你可以先在終端機輸入 which npx 找出路徑,通常是 /usr/bin/npx:

[Unit]

Description=HTTP Server Instance

After=network.target

[Service]

Type=simple

User=你的使用者名稱

WorkingDirectory=/你想提供檔案的資料夾路徑

ExecStart=/usr/bin/npx -y http-server -p 8080 -c-1

Restart=always

[Install]

WantedBy=multi-user.target

啟動並設定開機執行

存檔離開後,執行以下指令讓系統偵測到新服務,並設定為開機自動啟動:

sudo systemctl daemon-reload

sudo systemctl enable http-server.service

sudo systemctl start http-server.service

確認狀態

你可以透過以下指令檢查服務是否正常跑起來:

sudo systemctl status http-server.service

這樣設定完成後,即便伺服器重啟,該 HTTP 服務也會自動在背景運作。如果你需要查看該程式輸出的 log,可以使用 journalctl -u http-server.service 指令。


這是一個可以幫你自動完成所有設定的 Bash 腳本。你可以直接將這段程式碼複製並存成 setup-server.sh,或者直接在終端機貼上執行。

#!/bin/bash

# 取得目前使用者的名稱與家目錄路徑
CURRENT_USER=$(whoami)
WORK_DIR=$(pwd)
NPX_PATH=$(which npx)

# 檢查是否有安裝 npx
if [ -z "$NPX_PATH" ]; then
    echo "錯誤:找不到 npx,請先安裝 Node.js 與 npm。"
    exit 1
fi

# 建立 systemd service 檔案
sudo bash -c "cat <<EOM > /etc/systemd/system/http-server.service
[Unit]
Description=HTTP Server Instance
After=network.target

[Service]
Type=simple
User=$CURRENT_USER
WorkingDirectory=$WORK_DIR
ExecStart=$NPX_PATH -y http-server -p 8080 -c-1
Restart=always

[Install]
WantedBy=multi-user.target
EOM"

# 重新載入設定並啟動服務
sudo systemctl daemon-reload
sudo systemctl enable http-server.service
sudo systemctl start http-server.service

echo "服務已建立並啟動,現在會隨開機自動執行。"
sudo systemctl status http-server.service --no-pager

使用說明

這個腳本會以你執行腳本當下的資料夾作為伺服器的根目錄。如果你想要更改目錄,可以手動修改腳本中的 WORK_DIR 變數。執行前記得給予執行權限:

chmod +x setup-server.sh

./setup-server.sh

未來如果想要停止這個服務,可以使用 sudo systemctl stop http-server.service。


如果要在一台伺服器上跑多個服務,最好的做法是將服務名稱參數化,這樣你就能針對不同的資料夾與連接埠建立多個獨立的服務設定檔。

多服務自動化腳本

你可以修改腳本,讓它接受「服務名稱」、「連接埠」和「目錄」三個參數:

#!/bin/bash

# 檢查參數數量
if [ "$#" -ne 3 ]; then
    echo "使用方式: $0 [服務名稱] [連接埠] [目錄路徑]"
    echo "範例: $0 web-docs 8081 /var/www/docs"
    exit 1
fi

SERVICE_NAME=$1
PORT=$2
TARGET_DIR=$3
CURRENT_USER=$(whoami)
NPX_PATH=$(which npx)

# 檢查目錄是否存在
if [ ! -d "$TARGET_DIR" ]; then
    echo "錯誤:目錄 $TARGET_DIR 不存在。"
    exit 1
fi

# 建立獨立的 service 檔案
SERVICE_FILE="/etc/systemd/system/http-server-${SERVICE_NAME}.service"

sudo bash -c "cat <<EOM > $SERVICE_FILE
[Unit]
Description=HTTP Server - $SERVICE_NAME
After=network.target

[Service]
Type=simple
User=$CURRENT_USER
WorkingDirectory=$TARGET_DIR
ExecStart=$NPX_PATH -y http-server -p $PORT -c-1
Restart=always

[Install]
WantedBy=multi-user.target
EOM"

# 啟動新服務
sudo systemctl daemon-reload
sudo systemctl enable "http-server-${SERVICE_NAME}.service"
sudo systemctl start "http-server-${SERVICE_NAME}.service"

echo "服務 $SERVICE_NAME 已在連接埠 $PORT 啟動,目錄為 $TARGET_DIR"

如何使用此腳本

將上述內容存成 add-server.sh 並加上執行權限。你可以重複執行它來建立多個服務:

chmod +x add-server.sh

# 建立第一個服務 (連接埠 8081)
./add-server.sh project-a 8081 /home/user/project-a

# 建立第二個服務 (連接埠 8082)
./add-server.sh project-b 8082 /home/user/project-b

管理多個服務

當你建立多個服務後,管理方式如下:

  • 查看所有服務狀態systemctl list-units "http-server-*"
  • 停止特定服務sudo systemctl stop http-server-project-a
  • 查看特定服務日誌journalctl -u http-server-project-a -f

創建第一個服務:

./add-server.sh clear-nano 8081 /home/max/ClearNano

啟動服務:

sudo systemctl start http-server-clear-nano

檢查狀態:

sudo systemctl status http-server-clear-nano

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *