by Rain Chu | 3 月 5, 2026 | MIS, Nvidia
在使用 nvidia spark 或 NVIDIA Jetson 類型的 AI 開發平台時,很多開發者會希望能夠遠端操作設備,而不是每次都連接螢幕、鍵盤與滑鼠。這時候 VNC(Virtual Network Computing) 就是一個非常方便的遠端桌面解決方案。
透過 vino VNC Server 與 RealVNC Viewer,你可以在 Windows、macOS 或 Linux 上遠端連線到 NVIDIA Spark 的桌面環境,像是直接操作本機一樣。VNC 可以透過網路傳輸桌面畫面與輸入操作,因此非常適合 AI 開發、邊緣設備管理與遠端維護。
本文將介紹如何在 nvidia spark / Ubuntu 系統 中啟用 VNC Server(vino),並透過 RealVNC Viewer 進行遠端連線。
為什麼 NVIDIA Spark 建議使用 VNC
在 AI 或嵌入式開發場景中,遠端桌面有幾個重要用途:
- 遠端查看 GPU 程式的 GUI
- 遠端操作桌面應用程式
- headless(無螢幕)設備管理
- 在不同電腦之間共享桌面
VNC 允許使用者透過網路存取 Linux 圖形桌面,而不需要實際連接顯示器。
NVIDIA Spark 啟用 VNC(vino)教學
以下步驟適用於 Ubuntu / GNOME 環境的 nvidia spark。
1 安裝 VNC Server(vino)
首先在 NVIDIA Spark 中安裝 vino:
sudo apt update
sudo apt install vino
vino 是 GNOME 桌面內建的 VNC Server,常用於 Ubuntu 遠端桌面。
2 啟用 VNC Server 自動啟動
建立 symbolic link,讓 vino 在登入後自動啟動:
cd /usr/lib/systemd/user/graphical-session.target.wants
sudo ln -s ../vino-server.service ./
這樣每次登入桌面時,VNC 服務就會自動啟動。
3 設定 VNC Server
關閉安全提示與加密:
gsettings set org.gnome.Vino prompt-enabled false
gsettings set org.gnome.Vino require-encryption false
這些設定可以避免某些 VNC Viewer 無法連線的問題。
4 設定 VNC 密碼
設定遠端登入密碼:
gsettings set org.gnome.Vino authentication-methods "['vnc']"
gsettings set org.gnome.Vino vnc-password $(echo -n 'yourpassword' | base64)
請將 yourpassword 替換為自己的密碼。
5 重新啟動系統
sudo reboot
重新啟動後,VNC Server 設定就會生效。
使用 RealVNC Viewer 連線 NVIDIA Spark
在另一台電腦安裝 RealVNC Viewer。
接著:
- 查詢 NVIDIA Spark IP
ifconfig
或
ip a
- 開啟 RealVNC Viewer
- 輸入 IP 地址
例如:
192.168.1.50
- 輸入剛剛設定的 VNC 密碼
即可成功遠端操作 NVIDIA Spark 桌面。
VNC 常見問題
1 VNC 無法連線
可能原因:
- vino 沒有啟動
- GNOME 沒有登入
- 防火牆阻擋
確認服務:
ps aux | grep vino
2 VNC 黑畫面
可能是:
可設定 自動登入(Auto Login) 解決。
VNC、RealVNC、vino 的差異
| 工具 | 功能 |
|---|
| vino | Linux GNOME VNC Server |
| VNC | 遠端桌面協定 |
| RealVNC Viewer | 常用 VNC 客戶端 |
通常搭配方式:
vino server + RealVNC viewer
結論
透過 VNC + vino + RealVNC,可以快速讓 nvidia spark 具備遠端桌面能力,對於 AI 開發、遠端管理或 headless 系統來說非常方便。
只需要簡單幾個步驟:
- 安裝 vino
- 啟用 VNC server
- 設定密碼
- 使用 RealVNC 連線
就能輕鬆遠端控制 NVIDIA Spark。
相關資料
https://developer.nvidia.com/embedded/learn/tutorials/vnc-setup
by Rain Chu | 3 月 3, 2026 | wordpress
當你的 WordPress 網站發展到多站點規模時,伺服器硬碟空間與流量往往成為瓶頸,我們透過 wp-content/uploads 遷移到 Google Cloud Storage (GCS) 並搭配 Cloud CDN,不僅能節省主機成本,還能大幅提升全球存取速度。
一、 為什麼選擇 GCS + CDN 而非 Filestore?
在 GCP 上有兩種主流方案:
- Filestore (NFS):適合需要完全同步
wp-content(含外掛與主題)的架構,但成本較高(1TB 起跳約 $160/月)。
- GCS + Cloud CDN:按量計費,且能透過邊緣節點加速圖片,是多數 WordPress 站長的性價比首選。
二、 核心架構建立:GCS 與權限設定
1. 建立儲存桶與開放權限
在 GCS 建立儲存桶後,務必處理 CORS 與公開存取問題,否則圖片會出現 AccessDenied。
- 公開讀取:在儲存桶權限中加入
allUsers 為「儲存空間物件檢視者」。
- 解決字體 CORS 報錯:若使用 Elementor,必須透過
gcloud 指令設定 CORS 規則,允許您的網域存取字體檔 (.woff2)。
2. 服務帳戶 (IAM) 設定
為您的 WordPress 建立專屬服務帳戶,並指派 「儲存空間管理員 (Storage Admin)」 角色。這能確保 WP-Stateless 等外掛有權限執行同步與驗證儲存桶狀態。
三、 WordPress 插件配置:WP-Stateless
為了讓多站點井然有序,建議在 WP-Stateless 設定中自定義路徑:
- Mode:選擇
Stateless(上傳後刪除本地檔案,釋放 VM 空間)。
- Folder:手動輸入站點名稱,例如
demo-1/%date_year/date_month%。
- Service Account JSON:貼入從 GCP 下載的 JSON 金鑰以完成對接。
四、 Nginx 層級的自動化重定向
為了確保舊文章不破圖,且能自動導向 GCS,我們在 Nginx 加入了變數化的重定向規則。
最佳實踐:排除 Elementor 以避開錯誤
Elementor 的 CSS 與字體檔案若放在 GCS 容易產生 CORS 阻擋或 404,建議將其留在本地 SSD:
Nginx
# 1. 優先處理 Elementor (留在本地)
location ^~ /xxx/wp-content/uploads/elementor/ {
include /etc/nginx/sites-available/gcp_web_pool.conf;
}
# 2. 其他媒體檔案重定向至 GCS
location ~* ^/xxx/wp-content/uploads/(.*)$ {
add_header 'Access-Control-Allow-Origin' 'https://yourdomain.com' always;
return 301 https://storage.googleapis.com/your-bucket/sites-name/$1;
}
注意:將重定向規則放在單獨的 location 塊中,可以有效避免嵌套導致的 504 Gateway Timeout。
五、 舊檔案遷移與同步
對於已經存在 VM 上的數 GB 舊圖片,使用 gcloud storage rsync 是最快的方法:
Bash
# 同步指令 (遞迴處理所有子目錄)
gcloud storage rsync /var/www/html/wp-content/uploads gs://your-bucket/demo-1 -r
傳輸完成後,別忘了使用 WP-CLI 批次取代資料庫中的網址:
Bash
# 加入 --skip-plugins 避免 cron 相關的 PHP Fatal error
wp search-replace 'https://old-url.com/uploads' 'https://storage.googleapis.com/bucket/demo-1' --all-tables --skip-plugins --skip-themes
WordPress 多站點環境設計的同步教學:
1. 基本同步指令
如果您要將 VM 上的 uploads 資料夾同步到 GCS,請執行:
Bash
gcloud storage rsync /var/www/html/wp-content/uploads gs://[您的儲存桶名稱]/[站點目錄] --recursive
- 參數說明:
/var/www/...:來源路徑(本地 VM)。
gs://...:目標路徑(GCS 儲存桶)。
--recursive (或 -r):遞迴處理所有子目錄。
2. 進階同步技巧
A. 鏡像同步(刪除 GCS 上多餘的檔案)
如果您希望 GCS 的內容與本地完全一致(本地刪除,雲端也跟著刪除),請加上 --delete-unmatched-destination-objects:
Bash
gcloud storage rsync [來源] [目標] -r --delete-unmatched-destination-objects
警告:此操作不可逆,請確認目標路徑無誤再執行。
B. 僅同步特定類型的檔案
如果您只想同步圖片,排除備份檔(如 .zip 或 .sql):
Bash
gcloud storage rsync [來源] [目標] -r --include-regex=".*\\.(jpg|jpeg|png|gif)$"
C. 大量檔案平行加速
當您有數萬張圖片需要同步時,使用多執行緒可以大幅縮短時間:
Bash
gcloud storage rsync [來源] [目標] -r --parallel
3. 多站點組織化同步建議
既然您有多個站點(如 demo-1, blaupunkt),建議分別執行同步以保持目錄整潔:
- 同步站點 A:
gcloud storage rsync /mnt/webs/demo-1/wp-content/uploads gs://ai-websites-uploads/demo-1 -r
- 同步站點 B:
gcloud storage rsync /mnt/webs/blaupunkt/wp-content/uploads gs://ai-websites-uploads/blaupunkt -r
4. 權限排錯
如果您在同步時遇到「Permission Denied」,請檢查以下兩點:
- IAM 角色:確保服務帳戶擁有 「儲存空間物件管理員 (Storage Object Admin)」 角色。
- VM 存取範圍:確認 VM 的 Cloud API access scopes 已設定為「Allow full access to all Cloud APIs」。
下一步驗證
同步完成後,您可以執行以下指令查看 GCS 上的檔案數量,確保與本地一致:
Bash
gcloud storage ls -r gs://[您的儲存桶]/[站點目錄] | wc -l
七、 常見疑難排解 (FAQ)
- Q: 出現 403 Forbidden? A: 檢查 IAM 角色是否為
Storage Admin,並確認儲存桶是否已加入 allUsers。
- Q: Nginx 出現 504 Timeout? A: 檢查是否有嵌套迴圈。建議將
301 return 移出 include 所在的區塊。
- Q: 字體無法載入? A: 這是 CORS 問題。請檢查 GCS 儲存桶是否已套用包含您的網域的 JSON CORS 設定檔。
by Rain Chu | 2 月 11, 2026 | PHP, 程式
最近我的伺服器突然出現網站 502 錯誤,檢查後發現 php8.2-fpm 服務竟然被系統強制終止。透過一系列排查,最終確認是 Linux OOM Killer(Out Of Memory) 觸發導致。
這篇文章整理完整排查過程與解決方案,提供給遇到相同問題的人參考。
📌 問題現象
使用 systemctl status php8.2-fpm 發現:
Active: failed (Result: oom-kill)
進一步檢查 kernel log:
Out of memory: Killed process 7057 (php-fpm8.2)
anon-rss:283560kB
shmem-rss:119848kB
代表:
- 系統記憶體耗盡
- Linux 啟動 OOM Killer
- 強制殺掉 php-fpm worker
🔍 進一步分析
查看當時 PHP worker 記憶體使用情況:
ps -o pid,rss,etime,cmd -C php-fpm8.2 --sort=-rss | head -n 20
當時結果顯示:
RSS 約 250MB ~ 325MB/每個 worker
而之前狀態顯示:
Processes active: 80
idle: 0
🔥 問題核心
如果每個 worker 約 300MB:
但機器只有:
👉 記憶體一定會爆。
🧠 伺服器環境
這代表:
- 沒有 swap 作為緩衝
- 一旦瞬間記憶體尖峰,直接 OOM
🛠 解決方案
✅ 1️⃣ 建立 8GB Swap(防止再次 OOM)
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
確認:
結果:
建議調整 swappiness
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl -p /etc/sysctl.d/99-swappiness.conf
✅ 2️⃣ 調整 PHP-FPM 設定(關鍵)
編輯:
/etc/php/8.2/fpm/pool.d/www.conf
修改為:
pm = dynamic
pm.max_children = 25
pm.start_servers = 6
pm.min_spare_servers = 4
pm.max_spare_servers = 10
pm.max_requests = 500
為什麼設 25?
假設每個 worker 約 150MB:
在 15GB RAM 環境下非常安全。
✅ 3️⃣ 開啟 Slow Log(抓出慢請求)
在 www.conf 加入:
request_slowlog_timeout = 10s
slowlog = /var/log/php8.2-fpm/www-slow.log
request_terminate_timeout = 60s
建立目錄:
sudo mkdir -p /var/log/php8.2-fpm
sudo chown -R www-data:www-data /var/log/php8.2-fpm
sudo systemctl restart php8.2-fpm
查看慢請求:
sudo tail -f /var/log/php8.2-fpm/www-slow.log
📊 調整後效果
重啟後查看:
ps -o pid,rss,etime,cmd -C php-fpm8.2 --sort=-rss | head -n 20
結果:
RSS 約 100MB ~ 170MB
ELAPSED 僅 20 秒左右
✔ 不再出現 300MB 以上肥 worker
✔ 不再出現 active 80
✔ 系統穩定運作
🎯 問題總結
本次 OOM 原因:
pm.max_children 設定過高
- 每個 worker 記憶體使用偏高
- 沒有 swap 緩衝
- 慢請求導致 worker 堆積
最終解法:
- 限制 max_children
- 建立 swap
- 開 slowlog 抓慢請求
- 設定 max_requests 避免 memory leak
🚀 建議最佳實務
| 設定 | 建議 |
|---|
| Swap | 一定要有(至少 4GB) |
| max_children | 用 RAM / worker RSS 計算 |
| max_requests | 300~1000 |
| slowlog | 必開 |
| request_terminate_timeout | 必設 |
📌 結論
OOM Killer 不是錯誤,它是保護機制。
真正的問題通常是:
- PHP-FPM 設定不合理
- 慢請求堆積
- 記憶體容量與負載不匹配
只要正確限制 worker 數量並建立 swap,伺服器穩定度會大幅提升。
如果你也遇到 php-fpm 被 OOM kill 的問題,希望這篇實戰紀錄能幫助你快速排查與解決。
相關資訊
by Rain Chu | 12 月 31, 2025 | wordpress
目前正在處理的 request
編輯 php-fpm pool(www)
啟用下面的這幾行
重啟服務
檢查服務
curl 127.0.0.1/fpm-status?full
會看到的資訊
慢查詢-外掛定位
查詢
tail -f /var/log/php-fpm/slow.log
# 或是
tail -n 50 /var/log/php-fpm/slow.log
針對慢查詢,精準的找出問題
慢站點 Top:
sudo awk -F'= ' '/^script_filename/ {print $2}' /var/log/www-slow.log \
| awk -F'/' '{print $4}' | sort | uniq -c | sort -nr | head -20
入口 Top:
sudo awk -F'= ' '/^script_filename/ {print $2}' /var/log/www-slow.log \
| awk -F'/' '{print $NF}' | sort | uniq -c | sort -nr | head -20
外掛 Top:
多站的正確架構
每站一個 pool:
Nginx 的對應:
by Rain Chu | 12 月 25, 2025 | AI, Chat, 程式開發
以前建立一個網站往往代表著學寫程式、研究版型、反覆修改設計,對許多人來說門檻相當高。但現在,隨著 AI 技術成熟,網站製作正快速走向「對話化」。
Lumi AI 主打一個簡單卻強大的理念:你只需要與 AI 聊天,就能將腦中的想法,變成一個優雅且可行的網站。
什麼是 Lumi AI?
Lumi AI 是一款 AI 驅動的網站建立工具,使用者不需要任何設計或程式背景,只要透過對話方式,描述你的想法,例如:
- 「我想要一個新創公司形象網站」
- 「幫我做一個產品介紹頁,有現代感與科技風」
- 「我需要一個個人作品集網站」
Lumi 會根據你的描述,即時產生網站結構、版型與內容,讓「想法 → 網站」的距離縮短到幾分鐘。
Lumi AI 的核心特色
1️⃣ 與 AI 聊天,就能建立網站
Lumi 最大的特色在於對話式體驗。你不需要面對複雜的後台設定,只要像聊天一樣說出需求,AI 就會一步步幫你完成網站雛形。
2️⃣ 將創意快速轉化為可行網站
從概念、版型到內容呈現,Lumi AI 會自動整合設計與結構,產生一個真正可以使用的網站,而不是只有概念草稿。
3️⃣ 優雅、現代的視覺設計
Lumi 預設產出的網站風格簡潔、現代,特別適合新創團隊、產品頁面、個人品牌與展示型網站。
4️⃣ No-Code,任何人都能上手
不論你是設計師、創業者、行銷人員,甚至是 Data Analyst,只要能清楚描述需求,就能用 Lumi AI 建立網站,完全不需要寫程式。
Lumi AI 與 Data AI、Data Analyst 的關聯
你可能會好奇,Lumi AI 和 Data AI、Data Analyst 有什麼關係?
實際上,Lumi AI 非常適合用來:
- 建立 資料分析成果展示網站
- 製作 Data Analyst 個人作品集(Portfolio)
- 快速生成 數據產品或 AI 專案的介紹頁
對 Data Analyst 而言,Lumi AI 能大幅降低「展示分析成果」的門檻,讓重點回到資料洞察本身,而非網站技術細節。
Lumi AI 適合哪些人使用?
- 🚀 新創團隊:快速驗證想法,建立產品或服務頁
- 🎨 設計與行銷人員:用對話完成網站初稿
- 📊 Data Analyst / Data AI 專案負責人:展示分析成果與案例
- 🧑💻 個人品牌經營者:建立個人網站或作品集
官方網站
👉 https://lumi.new/zh-TW
近期留言