Ubuntu 環境初始化

系統

檢查當前運行的內核版本

uname -r

主機名稱

# 設定主機名稱
hostnamectl set-hostname "hostname"

防火牆設定 (使用 UFW 套件管理)

apt-get install -y ufw

ufw allow OpenSSH
ufw allow 80/tcp      # 允許 HTTP
ufw allow 443/tcp     # 允許 HTTPS

SSH 預設設定

# 禁用 root 用戶的登入功能
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config

# 啟用密碼驗證
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config

systemctl restart sshd

建立新用戶

adduser "username" --disabled-password
usermod -aG sudo "username"

# 自動生成強密碼
while true; do
    password=$(tr -dc 'A-Za-z0-9_!@#$%^&*' < /dev/urandom | head -c 12)
    if [[ ${#password} -ge 8 && "$password" =~ [0-9] && "$password" =~ [a-zA-Z] && "$password" =~ [\!\@\#\$\%\^\&\*] ]]; then
        echo "password: ${password}"
        break
    fi
done

套件安裝

基礎工具安裝

apt-get install -y \
    curl \
    vim \
    git \
    wget \
    ufw \
    build-essential \
    htop \
    net-tools \
    zip \
    unzip \
    expect \
    software-properties-common

安裝 Apache

apt-get install -y apache2
systemctl enable --now apache2

安裝 PHP 套件庫與 PHP 套件

apt-get install -y software-properties-common
add-apt-repository -y ppa:ondrej/php
apt-get update

apt-get install -y php8.3 php8.3-fpm libapache2-mod-php8.3 \
    php8.3-gd php8.3-mysql php8.3-cli php8.3-opcache \
    php8.3-xml php8.3-mbstring php8.3-curl php8.3-zip

systemctl restart apache2

安裝 Composer

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer

安裝 Node.js

# 較新的 18.x 版本
curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
# 若需 16.x 請改用以下行
# curl -fsSL https://deb.nodesource.com/setup_16.x | bash -

apt-get install -y nodejs

安裝 MariaDB

curl -o /etc/apt/trusted.gpg.d/mariadb_release_signing_key.asc 'https://mariadb.org/mariadb_release_signing_key.asc'

echo "deb [arch=amd64] https://mirror.rackspace.com/mariadb/repo/11.2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/mariadb.list

apt-get update
apt-get install -y mariadb-server
systemctl enable --now mariadb

MySQL 安全性設定

使用 mysql_secure_installation 互動式設定工具

安裝完 MariaDB/MySQL 後,建議執行以下指令進行安全性強化:

mysql_secure_installation

執行後的步驟說明如下:

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

Enter current password for root (enter for none):   # 初次安裝直接按 Enter

Set root password? [Y/n]:                           # 設定 root 密碼,輸入 Y
New password:                                       # 輸入新密碼
Re-enter new password:                              # 再次輸入密碼

Remove anonymous users? [Y/n]:                      # 移除匿名用戶,輸入 Y

Disallow root login remotely? [Y/n]:                # 禁止 root 遠端登入,輸入 Y

Remove test database and access to it? [Y/n]:       # 移除 test 資料庫,輸入 Y

Reload privilege tables now? [Y/n]:                 # 重新載入權限表,輸入 Y

完成以上步驟後,MySQL 基本的安全性即已加強。

手動設定方式

MYSQL_ROOT_PASSWORD="your_secure_password"

mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';"
mysql -u root -p"${MYSQL_ROOT_PASSWORD}" -e "DELETE FROM mysql.user WHERE User='';"
mysql -u root -p"${MYSQL_ROOT_PASSWORD}" -e "DROP USER IF EXISTS 'root'@'%';"
mysql -u root -p"${MYSQL_ROOT_PASSWORD}" -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;"
mysql -u root -p"${MYSQL_ROOT_PASSWORD}" -e "DROP DATABASE IF EXISTS test;"
mysql -u root -p"${MYSQL_ROOT_PASSWORD}" -e "FLUSH PRIVILEGES;"

echo "MySQL 安全配置已完成。"

安裝 phpMyAdmin

wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip
unzip phpMyAdmin-latest-all-languages.zip
mv phpMyAdmin-*-all-languages /var/www/html/phpmyadmin

cp /var/www/html/phpmyadmin/config.sample.inc.php /var/www/html/phpmyadmin/config.inc.php

BLOWFISH_SECRET=$(openssl rand -base64 32)
sed -i "s#\$cfg\['blowfish_secret'\] = '';#\$cfg\['blowfish_secret'\] = '$BLOWFISH_SECRET';#" /var/www/html/phpmyadmin/config.inc.php

chown -R www-data:www-data /var/www/html/phpmyadmin
chmod -R 755 /var/www/html/phpmyadmin

cat > /var/www/html/phpmyadmin/.htaccess <<EOF
RewriteEngine On
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from $(hostname -I | awk '{print $1}')
EOF

chmod 644 /var/www/html/phpmyadmin/.htaccess
systemctl restart apache2

確保 Apache 支援 .htaccess

請確認 /etc/apache2/apache2.conf 或虛擬主機設定中包含:

<Directory /var/www/html/phpmyadmin>
    AllowOverride All
</Directory>

時間校正

apt-get install -y chrony
systemctl enable --now chrony
timedatectl set-timezone Asia/Taipei
hwclock -w

Redis 與 Supervisor 安裝與設定

安裝 Redis

apt-get install -y redis-server

# 設定開機啟動與啟動服務
systemctl enable --now redis

# 測試 Redis 是否正常運作
redis-cli ping
# 預期回應:PONG

如有需求可修改 /etc/redis/redis.conf 中的:

  • supervised 改為 systemd
  • bind 127.0.0.1 ::1(若需允許外部連接,需再加防火牆規則與安全設定)

安裝 Supervisor

apt-get install -y supervisor

# 啟動並設定開機啟動
systemctl enable --now supervisor

Supervisor 設定 Laravel 任務隊列(Queue Worker)

建立 Supervisor 設定檔,設定一個背景執行的 Laravel 任務隊列 Worker:

cat > /etc/supervisor/conf.d/laravel-worker.conf <<EOF
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d   ; 設定 process 名稱格式,適用於多進程情境
command=php /var/www/html/artisan queue:work --sleep=60 --tries=3 --timeout=300
autostart=true                                    ; 開機自動啟動
autorestart=true                                  ; 當進程異常退出時自動重啟
user=www-data                                     ; 指定執行的使用者(Laravel 預設為 www-data)
numprocs=1                                        ; 啟動 1 個進程,可視需求調整為多進程
redirect_stderr=true                              ; 將 stderr 重導向至 stdout
stdout_logfile=/var/log/supervisor/laravel-worker.log  ; 日誌檔案路徑
EOF

啟用設定並啟動 worker:

supervisorctl reread        # 重新讀取所有設定檔
supervisorctl update        # 套用新設定
supervisorctl start laravel-worker:*    # 啟動 worker(:* 代表啟動所有對應進程)

⛳ 將 /var/www/html/ 替換為你的 Laravel 專案實際路徑。


Laravel queue:work 指令參數說明

php artisan queue:work --sleep=60 --tries=3 --timeout=300
參數 說明
--sleep=60 當佇列為空時,等待 60 秒後再次檢查是否有新任務。
--tries=3 任務失敗時最多重試 3 次,超過次數將標記為「失敗任務」。
--timeout=300 單一任務最多執行時間 300 秒,超過將被強制終止(適用長任務情境)。

多隊列/多優先級設定(可選)

可根據不同任務優先順序或來源隊列名稱建立多組設定:

[program:laravel-queue-high]
command=php /var/www/html/artisan queue:work redis --queue=high --sleep=60 --tries=3 --timeout=300
user=www-data
autostart=true
autorestart=true
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/supervisor/laravel-queue-high.log

[program:laravel-queue-low]
command=php /var/www/html/artisan queue:work redis --queue=low --sleep=60 --tries=3 --timeout=300
user=www-data
autostart=true
autorestart=true
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/supervisor/laravel-queue-low.log

🧠 建議依專案需求區分不同 queue 名稱,並在 .env 中設定:

QUEUE_CONNECTION=redis