在 Proxmox VE 上用 LXC Container 架設 Laravel 部落格網站

發布日期: 2026年6月27日
難度: 中級
所需時間: 約 30–60 分鐘


前言

你有一台 Proxmox VE 伺服器,想在上面架一個屬於自己的 Laravel 部落格嗎?這篇文章會帶你從零開始,用 LXC Container(CT)建立一個輕量的環境,安裝完整的 LNMP 架構(Linux + Nginx + MySQL + PHP),並部署 Laravel 11 個人部落格,最後透過 Nginx Proxy Manager 對外公開並搭配 HTTPS。


架構總覽

[網際網路] → bloglee.work (HTTPS)
      ↓
[Nginx Proxy Manager] — 負責 SSL 憑證 & 反向代理
      ↓
[Proxmox CT 102:192.168.1.200:80]
  ├─ Nginx       — 接收請求、處理靜態檔案
  ├─ PHP 8.2 FPM — 執行 Laravel 應用程式
  └─ MySQL 8.0   — 儲存文章、用戶資料

使用 LXC Container 而非 VM 的好處:資源消耗更少、啟動更快,2GB RAM 就能流暢運行一個 Laravel 網站。


環境需求

  • Proxmox VE 8.x(本文使用 8.2.2)
  • 已下載的 Ubuntu 22.04 LXC 模板(ubuntu-22.04-standard_22.04-1_amd64.tar.zst
  • Nginx Proxy Manager 已在區網內運行(處理對外公開與 SSL)
  • 一個已設定好的網域(本文使用 bloglee.work

第一步:建立 LXC Container

在 Proxmox 主機上用 SSH 連線後,執行以下指令建立 CT:

pct create 102 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
  --hostname ubuntu22-ip200 \
  --storage H700-1 \
  --rootfs H700-1:8 \
  --memory 2048 \
  --cores 2 \
  --net0 name=eth0,bridge=vmbr0,ip=192.168.1.200/24,gw=192.168.1.1 \
  --password 你的密碼 \
  --unprivileged 1 \
  --features nesting=1 \
  --start 1

參數說明:

參數 說明
102 CT 的 VMID(用 pvesh get /cluster/nextid 取得下一個可用 ID)
--storage H700-1 使用 H700-1 ZFS Pool 儲存
--rootfs H700-1:8 根磁碟 8GB
--memory 2048 2GB RAM
--unprivileged 1 非特權容器,更安全
--features nesting=1 允許容器內執行 Docker 等巢狀功能

第二步:安裝 LNMP 基礎環境

進入 CT 後(可透過 pct exec 102 -- bash 或直接 SSH 到 192.168.1.200),依序安裝:

2-1. 更新套件與安裝 Nginx、MySQL、PHP 8.1(基礎)

apt-get update -y
apt-get install -y nginx mysql-server \
  php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-xml \
  php8.1-curl php8.1-zip php8.1-bcmath php8.1-gd \
  curl unzip git

2-2. 升級到 PHP 8.2(Laravel 11 必要)

Laravel 11 要求 PHP >= 8.2,Ubuntu 22.04 預設只有 8.1,需加入 Ondřej 的 PPA:

apt-get install -y software-properties-common
add-apt-repository -y ppa:ondrej/php
apt-get update -y
apt-get install -y php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml \
  php8.2-curl php8.2-zip php8.2-bcmath php8.2-gd php8.2-intl php8.2-cli

2-3. 安裝 Composer

curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

2-4. 安裝 Node.js 20(編譯前端資源用)

curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs

第三步:設定 MySQL 資料庫

service mysql start

mysql -u root -e "
CREATE DATABASE laravel_blog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'laraveluser'@'localhost' IDENTIFIED BY '你的密碼';
GRANT ALL PRIVILEGES ON laravel_blog.* TO 'laraveluser'@'localhost';
FLUSH PRIVILEGES;
"

第四步:建立 Laravel 11 專案

cd /var/www
export COMPOSER_ALLOW_SUPERUSER=1
php8.2 /usr/local/bin/composer create-project laravel/laravel bloglee --prefer-dist --no-audit

注意: --no-audit 是繞過 Composer 安全性稽核(某些版本可能有警告)。建議在生產環境上使用 composer audit 確認安全性。


第五步:設定 .env 環境變數

編輯 /var/www/bloglee/.env,設定以下關鍵項目:

APP_NAME=BlogLee
APP_ENV=production
APP_DEBUG=false
APP_URL=https://stillbuilding.life

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_blog
DB_USERNAME=laraveluser
DB_PASSWORD=你的密碼

SESSION_DRIVER=database
SESSION_DOMAIN=bloglee.work
TRUSTED_PROXIES=*

⚠️ 重要:TRUSTED_PROXIES=*
因為流量經過 Nginx Proxy Manager 反向代理,Laravel 必須信任代理才能正確識別 HTTPS 請求。少了這個設定會導致 419 CSRF 錯誤


第六步:設定信任代理 Middleware

在 Laravel 11 中,透過 bootstrap/app.php 設定:

// bootstrap/app.php
use Illuminate\Http\Request;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(...)
    ->withMiddleware(function (Middleware $middleware): void {
        $middleware->trustProxies(at: '*', headers:
            Request::HEADER_X_FORWARDED_FOR |
            Request::HEADER_X_FORWARDED_HOST |
            Request::HEADER_X_FORWARDED_PORT |
            Request::HEADER_X_FORWARDED_PROTO
        );
    })
    ->withExceptions(...)
    ->create();

第七步:執行 Migration 並設定權限

cd /var/www/bloglee
service mysql start
php8.2 artisan migrate --force

chown -R www-data:www-data /var/www/bloglee
chmod -R 775 storage bootstrap/cache

第八步:安裝 Laravel Breeze(登入系統)

export COMPOSER_ALLOW_SUPERUSER=1
php8.2 /usr/local/bin/composer require laravel/breeze --dev --no-audit
php8.2 artisan breeze:install blade --no-interaction

npm install
npm run build

php8.2 artisan migrate --force

安裝完後,需將 Breeze 所有 Auth Controller 中的 route('dashboard') 改為你的路由名稱(本文為 route('posts.dashboard')),否則會出現 500 錯誤

# 批次修正所有 Auth Controller
grep -l "route.*dashboard" app/Http/Controllers/Auth/*.php | while read f; do
    sed -i "s|route('dashboard')|route('posts.dashboard')|g" "$f"
    sed -i "s|route('dashboard', absolute: false)|route('posts.dashboard', absolute: false)|g" "$f"
done

第九步:設定 Nginx

建立 /etc/nginx/sites-available/bloglee

server {
    listen 80;
    server_name bloglee.work www.bloglee.work _;
    root /var/www/bloglee/public;
    index index.php index.html;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    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:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_hide_header X-Powered-By;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
ln -sf /etc/nginx/sites-available/bloglee /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
service php8.2-fpm start
service nginx start
nginx -t && service nginx reload

第十步:設定 Nginx Proxy Manager

在 Nginx Proxy Manager 中新增一條 Proxy Host:

設定項目
Domain Names bloglee.work
Scheme http
Forward Hostname/IP 192.168.1.200
Forward Port 80
SSL Certificate Let’s Encrypt(啟用 Force SSL)

NPM 會自動申請並更新 Let’s Encrypt 憑證,CT 上的 Nginx 只需監聽 HTTP port 80 即可。


⚠️ 常見錯誤與解法

問題 1:419 Page Expired(CSRF 錯誤)

原因: 透過反向代理後,Laravel 無法正確讀取 session 解法:.env 加入 TRUSTED_PROXIES=* 並設定 SESSION_DOMAIN,同時在 bootstrap/app.php 啟用 trustProxies


問題 2:500 Error 於註冊頁

原因: Breeze 預設重導向 route('dashboard'),但自定路由名稱為 posts.dashboard 解法: 批次修正所有 app/Http/Controllers/Auth/ 下的 Controller


問題 3:404 於 /posts/create

原因: 路由定義順序錯誤,/posts/{post:slug} 先比對到 “create” 解法: 將具體路由(/posts/create)定義在動態路由(/posts/{slug}之前


問題 4:500 於首頁(分頁錯誤)

原因: $posts->links("vendor.pagination.simple") 使用了不存在的視圖名稱 解法: 執行 php8.2 artisan vendor:publish --tag=laravel-pagination 發布分頁視圖,或建立自訂分頁視圖


問題 5:composer create-project 被安全性稽核阻擋

原因: Composer 偵測到套件有安全性公告 解法: 加上 --no-audit 旗標,並在部署後手動執行 composer audit 確認


最終成果

架設完成後,你的部落格擁有:

  • 對外 HTTPS 訪問(透過 Nginx Proxy Manager + Let’s Encrypt)
  • 用戶註冊 / 登入系統(Laravel Breeze)
  • 文章新增 / 編輯 / 刪除(完整 CRUD)
  • 前台文章列表 + 分頁
  • 文章詳情頁
  • 管理後台

技術棧總結

元件 版本
Proxmox VE 8.2.2
Ubuntu LXC 22.04 LTS
Nginx 1.18
PHP 8.2.x
MySQL 8.0
Laravel 11.x
Laravel Breeze 2.x
Node.js 20.x
Composer 2.x

*如果這篇文章對你有幫助,歡迎留言分享你的架設心得!*

發佈留言

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

返回頂端