技術 7 分鐘閱讀

Linux 伺服器基礎:接案工程師必備的部署技能

Linux 伺服器基礎:接案工程師必備的部署技能

前言

很多前後端工程師對 Linux 伺服器不太熟悉,部署的事通常交給 DevOps 處理。但身為接案工程師,你往往是唯一的開發者,伺服器管理的工作也落在你身上。這篇文章整理最基本且必要的 Linux 知識。

基本指令

檔案操作

# 列出檔案
ls -la

# 切換目錄
cd /var/www/html

# 建立目錄
mkdir -p /var/www/myproject

# 複製檔案
cp config.example config.php

# 移動/重新命名
mv old-name.txt new-name.txt

# 刪除檔案(小心使用)
rm file.txt
rm -rf directory/    # 遞迴刪除

# 查看檔案內容
cat config.php
less long-file.log    # 分頁瀏覽
tail -f storage/logs/laravel.log    # 即時追蹤 log

權限管理

# 查看權限
ls -la

# 修改權限
chmod 755 public/
chmod 644 .env
chmod -R 775 storage/ bootstrap/cache/

# 修改擁有者
chown -R www-data:www-data /var/www/myproject

權限數字的意義:

  • 7 = 讀(4) + 寫(2) + 執行(1)
  • 5 = 讀(4) + 執行(1)
  • 4 = 只讀

程序管理

# 查看正在執行的程序
ps aux | grep php

# 即時監控系統資源
htop

# 查看磁碟使用量
df -h

# 查看記憶體使用量
free -m

# 終止程序
kill -9 [PID]

SSH 連線

設定 SSH Key

# 在本機生成 SSH Key
ssh-keygen -t ed25519 -C "your@email.com"

# 複製公鑰到伺服器
ssh-copy-id user@your-server.com

# 之後就能免密碼連線
ssh user@your-server.com

SSH Config

在本機設定 ~/.ssh/config,簡化連線指令:

Host myserver
    HostName 123.456.789.0
    User deploy
    IdentityFile ~/.ssh/id_ed25519
    Port 22

之後只要輸入 ssh myserver 就能連線。

部署 Laravel 專案

安裝必要軟體

以 Ubuntu 22.04 為例:

# 更新系統
sudo apt update && sudo apt upgrade -y

# 安裝 Nginx
sudo apt install nginx -y

# 安裝 PHP 8.3
sudo add-apt-repository ppa:ondrej/php -y
sudo apt install php8.3-fpm php8.3-cli php8.3-mysql \
    php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip \
    php8.3-bcmath php8.3-gd php8.3-redis -y

# 安裝 Composer
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

# 安裝 Node.js
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install nodejs -y

# 安裝 MySQL
sudo apt install mysql-server -y
sudo mysql_secure_installation

Nginx 設定

# /etc/nginx/sites-available/myproject
server {
    listen 80;
    server_name myproject.com www.myproject.com;
    root /var/www/myproject/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
# 啟用站台設定
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

部署流程

# 1. 拉取最新程式碼
cd /var/www/myproject
git pull origin main

# 2. 安裝相依套件
composer install --no-dev --optimize-autoloader

# 3. 前端建置
npm ci
npm run build

# 4. 資料庫遷移
php artisan migrate --force

# 5. 清除並重建快取
php artisan config:cache
php artisan route:cache
php artisan view:cache

# 6. 重啟 Queue Worker
php artisan queue:restart

# 7. 設定權限
sudo chown -R www-data:www-data storage bootstrap/cache

自動化部署腳本

把上面的步驟寫成腳本:

#!/bin/bash
# deploy.sh
set -e

echo "開始部署..."

cd /var/www/myproject

echo "拉取最新程式碼..."
git pull origin main

echo "安裝 Composer 套件..."
composer install --no-dev --optimize-autoloader

echo "前端建置..."
npm ci && npm run build

echo "執行資料庫遷移..."
php artisan migrate --force

echo "清除快取..."
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan queue:restart

echo "設定權限..."
sudo chown -R www-data:www-data storage bootstrap/cache

echo "部署完成!"

SSL 憑證

使用 Let’s Encrypt 免費取得 SSL 憑證:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d myproject.com -d www.myproject.com

Certbot 會自動設定 Nginx 的 SSL 設定,並且每 90 天自動續約。

防火牆設定

# 啟用 UFW
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

# 查看防火牆狀態
sudo ufw status

基本監控

設定 Log Rotation

Laravel 的 log 檔案會越長越大,設定自動輪換:

// config/logging.php
'daily' => [
    'driver' => 'daily',
    'path' => storage_path('logs/laravel.log'),
    'level' => 'debug',
    'days' => 14,  // 保留 14 天
],

定時排程

# 設定 Cron Job
sudo crontab -e -u www-data

# 加入以下內容
* * * * * cd /var/www/myproject && php artisan schedule:run >> /dev/null 2>&1

結語

Linux 伺服器管理是一個很大的領域,這篇文章只涵蓋了最基本的部分。但對於接案工程師來說,掌握這些知識已經足以應付大部分的部署需求。隨著經驗累積,你可以慢慢學習 CI/CD、容器化部署等更進階的技術。

#Linux #伺服器 #部署 #DevOps
Thousand Lab

Thousand Lab