發布日期: 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 |
*如果這篇文章對你有幫助,歡迎留言分享你的架設心得!*

