器部署與免費(fèi)云資源實(shí)踐)
看到“新平臺上線免費(fèi)容器云、免費(fèi)云服務(wù)器、免費(fèi)虛擬主機(jī)等你來拿我們不玩虛的”這類宣傳文案時最容易踩的坑不是“要不要注冊”而是“注冊完之后不知道拿它做什么”。免費(fèi)資源只有在能承載完整實(shí)驗(yàn)鏈路時才有價值你至少要把一臺 Linux 服務(wù)器從開通、登錄、部署到對外訪問整個跑通再理解虛擬化、容器和云資源之間是什么關(guān)系才算真正用上了這些關(guān)鍵詞。這篇文章把所有“免費(fèi)”宣傳先放在一邊從最基礎(chǔ)也最有用的角度切入先區(qū)分服務(wù)器、虛擬主機(jī)、云服務(wù)器和容器云的差別然后在本地用 KVM 創(chuàng)建一臺帶 SSH 的 Linux 虛擬機(jī)再把它平移到云廠商的合規(guī)免費(fèi)額度上做一次公網(wǎng)部署最后用 Docker 把部署過程容器化。讀完以后你會得到一套可以在學(xué)習(xí)環(huán)境反復(fù)使用、也能遷移到生產(chǎn)環(huán)境的操作主線。1. 先厘清四個概念物理服務(wù)器、虛擬主機(jī)、云服務(wù)器和容器云1.1 它們是同一類東西的“不同交付粒度”很多初學(xué)開發(fā)者會把“服務(wù)器”“虛擬主機(jī)”“云服務(wù)器”“容器云”混著用。從使用者的視角看它們都是遠(yuǎn)端運(yùn)行的計算機(jī)但實(shí)際拿到的控制權(quán)完全不同。物理服務(wù)器是最原始的形態(tài)一臺真實(shí)機(jī)器有真實(shí) CPU、內(nèi)存、磁盤和網(wǎng)卡操作系統(tǒng)直接運(yùn)行在硬件上。自己對硬件和系統(tǒng)完全可控。傳統(tǒng)虛擬主機(jī)解決的是資源復(fù)用問題多個用戶共享同一臺服務(wù)進(jìn)程通常只支持網(wǎng)站發(fā)布和管理后臺使用者拿到的是“站點(diǎn)目錄 FTP 賬號”無法執(zhí)行自由命令也無法安裝自己的軟件。云服務(wù)器通常指基于虛擬化技術(shù)提供的完整云虛擬機(jī)。用戶拿到一臺擁有獨(dú)立操作系統(tǒng)、獨(dú)立磁盤、獨(dú)立網(wǎng)絡(luò)的 Linux 或 Windows 實(shí)例可以像使用本機(jī)一樣執(zhí)行apt install、修改內(nèi)核參數(shù)、部署各種服務(wù)。這也是為什么當(dāng)大家說“買一臺服務(wù)器”時通常指的就是云服務(wù)器。容器云則把抽象層級再往上提。容器云本身不一定提供完整虛擬機(jī)而是提供容器運(yùn)行環(huán)境和容器編排能力。應(yīng)用先被打包成鏡像再通過調(diào)度組件運(yùn)行在若干節(jié)點(diǎn)上平臺負(fù)責(zé)重啟、擴(kuò)展和流量分發(fā)。把這幾個概念放在一張表里區(qū)別會清晰很多交付形態(tài)你實(shí)際拿到的東西權(quán)限層級適合場景不適合場景物理服務(wù)器整臺真實(shí)硬件BIOS、OS、硬件全控制高性能計算、特殊硬件需求日常 Web 應(yīng)用資源浪費(fèi)大傳統(tǒng)虛擬主機(jī)FTP 和站點(diǎn)目錄僅站點(diǎn)和數(shù)據(jù)庫操作簡單靜態(tài)站、入門建站需要安裝依賴、自定義運(yùn)行時的應(yīng)用云服務(wù)器完整操作系統(tǒng)和獨(dú)立資源root / administrator部署后端、數(shù)據(jù)庫、爬蟲、測試環(huán)境需要秒級擴(kuò)展、精細(xì)編排的場景容器云容器鏡像和編排接口容器內(nèi)進(jìn)程和自定義資源請求微服務(wù)、多實(shí)例部署、CI/CD對內(nèi)核參數(shù)和底層設(shè)備有強(qiáng)依賴的場景1.2 為什么一提到“服務(wù)器”就默認(rèn)是 Linux 服務(wù)器在運(yùn)維和開發(fā)環(huán)境里“服務(wù)器”這個詞幾乎默認(rèn)指向 Linux。原因是 Linux 無桌面遠(yuǎn)程管理生態(tài)成熟SSH 協(xié)議可以在極低帶寬下完成操作幾乎所有開發(fā)運(yùn)行時都提供 Linux 版本而且大多數(shù)容器基礎(chǔ)鏡像都基于 Linux。使用云服務(wù)器時默認(rèn)選擇通常會是 Ubuntu Server、Debian、CentOS Stream 或 Rocky Linux 這類發(fā)行版。如果你從前只用過 Windows 桌面系統(tǒng)第一次面對純字符界面的遠(yuǎn)程終端可能會不習(xí)慣但請相信這樣的操作方式非常穩(wěn)定。實(shí)際項目中你通過 SSH 連接一臺 Linux 服務(wù)器學(xué)會的排查思路可以原樣復(fù)用到容器云、虛擬主機(jī)和其他各類服務(wù)器上?!胺?wù)器 Linux”不是說 Windows 不能做服務(wù)器而是指如果你想把網(wǎng)上各種部署教程、排查文章、工具腳本直接復(fù)用到自己的機(jī)器上Linux 的學(xué)習(xí)成本最低踩坑資料也最完整。1.3 免費(fèi)資源適合干什么、不適合干什么回到“免費(fèi)”這個關(guān)鍵詞。試用額度、免費(fèi)實(shí)例、免費(fèi)容器空間這類資源的典型適用場景包括學(xué)習(xí) Linux 基礎(chǔ)命令和 SSH 遠(yuǎn)程管理部署一個臨時 Web 服務(wù)或 API 給朋友測試練習(xí) Docker 鏡像打包和容器編排跑一次定時任務(wù)或爬蟲實(shí)驗(yàn)驗(yàn)證云廠商控制臺的操作流程。不適合做的事情也非常明確不要直接承載沒有備份的真實(shí)業(yè)務(wù)數(shù)據(jù)免費(fèi)額度大多沒有 SLA 承諾不要跑需要連續(xù)可用性的生產(chǎn)環(huán)境平臺活動結(jié)束后資源可能被回收不要在上面綁卡后忘記關(guān)閉自動續(xù)費(fèi)免費(fèi)額度很容易變成真實(shí)賬單不要存放敏感數(shù)據(jù)或未加密的私鑰免費(fèi)資源和活動環(huán)境隔離性需要自行驗(yàn)證。理解邊界后下面的每一個實(shí)驗(yàn)才安全。2. 在本地用虛擬化先搭一臺“服務(wù)器”2.1 為什么先從本地 KVM 開始而不是直接買云主機(jī)當(dāng)你想理解云服務(wù)器是怎么工作的最有價值的做法不是只會在控制臺點(diǎn)“創(chuàng)建”而是先在本地把虛擬化技術(shù)跑一遍。云平臺通常使用虛擬化技術(shù)把一臺高性能物理機(jī)切成多個獨(dú)立實(shí)例。你在本地使用 KVM/QEMU 也可以完成同樣的事情先準(zhǔn)備一臺 Linux 宿主機(jī)再在其中運(yùn)行一臺完整的客戶機(jī)。這樣你能直觀看到鏡像、CPU 虛擬化、磁盤文件、虛擬網(wǎng)卡這些抽象概念。使用本地方案有三個好處成本為 0不需要綁定支付方式可以反復(fù)快照、回滾適合練習(xí) Linux 安裝和系統(tǒng)配置不依賴網(wǎng)絡(luò)環(huán)境操作失敗不影響任何線上服務(wù)。可能有人會覺得“用 VirtualBox 或 VMware 不也一樣嗎”。從學(xué)習(xí)虛擬化概念的角度確實(shí)一樣但 KVM 是很多云平臺底層用到的虛擬化技術(shù)方案掌握之后再看云主機(jī)文檔會更容易讀懂磁盤格式、vCPU、橋接網(wǎng)絡(luò)這些術(shù)語。2.2 檢查宿主機(jī) CPU 虛擬化支持并安裝必要組件KVM 的名字含義是“基于內(nèi)核的虛擬機(jī)”依賴 CPU 的硬件輔助虛擬化能力。安裝之前先確認(rèn)宿主機(jī) CPU 是否支持vmxIntel或svmAMD。grep -E (vmx|svm) /proc/cpuinfo有輸出說明硬件支持。如果沒有輸出但你確認(rèn)是在自己電腦上操作需要去 BIOS/UEFI 中打開 VT-x 或 SVM如果你本人也在一臺云主機(jī)里做嵌套虛擬化則要確認(rèn)云實(shí)例是否開放了嵌套虛擬化開關(guān)。在 Ubuntu/Debian 宿主機(jī)上安裝 KVM 組件sudo apt update sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients virtinst bridge-utils sudo systemctl enable --now libvirtd sudo usermod -aG libvirt $USER最后一句操作完成后當(dāng)前用戶需要注銷并重新登錄才能使用virsh等命令而不需要sudo。重新登錄后可以通過virsh version或vitr list --all確認(rèn)服務(wù)狀態(tài)。如果執(zhí)行virsh報“connecting to socket failed”通常說明當(dāng)前用戶還沒有加入libvirt組或者守護(hù)進(jìn)程沒有啟動。2.3 用 virt-install 創(chuàng)建第一臺 Linux 虛擬機(jī)創(chuàng)建虛擬機(jī)最直接的方式是下載一個 Linux 安裝 ISO然后通過virt-install指令創(chuàng)建磁盤并開始安裝。下面的命令示例使用一份本地 Ubuntu Server ISOwget -c https://releases.ubuntu.com/24.04/ubuntu-24.04.2-live-server-amd64.iso sudo qemu-img create -f qcow2 /var/lib/libvirt/images/ubuntu-server-test.qcow2 20G sudo virt-install \ --name ubuntu-server-test \ --memory 2048 \ --vcpus 2 \ --disk path/var/lib/libvirt/images/ubuntu-server-test.qcow2,formatqcow2,size20 \ --cdrom /home/user/Downloads/ubuntu-24.04.2-live-server-amd64.iso \ --os-variant ubuntu24.04 \ --network networkdefault \ --graphics none --console pty,target_typeserial這里逐個解釋參數(shù)--name給虛擬機(jī)起一個唯一名字--memory和--vcpus指定內(nèi)存和 CPU 數(shù)量學(xué)習(xí)環(huán)境不用太大--disk指定磁盤文件size20表示如果磁盤文件不存在則創(chuàng)建 20GB--cdrom指定安裝介質(zhì)--os-variant讓 libvirt 選擇適合該操作系統(tǒng)的設(shè)備模型和驅(qū)動參數(shù)--network networkdefault使用默認(rèn) NAT 網(wǎng)絡(luò)虛擬機(jī)可以訪問外網(wǎng)外部默認(rèn)訪問不到虛擬機(jī)--graphics none配合串口控制臺表示不用圖形窗口在純文本終端完成安裝。注意某些發(fā)行版的 ISO 安裝器不一定支持串口控制臺。如果你是在帶桌面的機(jī)器上練習(xí)可以去掉--graphics none使用默認(rèn)虛擬顯示或者安裝virt-manager用圖形窗口完成安裝。安裝完成重啟后用virsh list查看虛擬機(jī)狀態(tài)。記下虛擬機(jī)內(nèi)分配的 IP 后從宿主機(jī)執(zhí)行下面的命令測試virsh console ubuntu-server-test這種“先進(jìn)入控制臺再配置網(wǎng)絡(luò)以后都用 SSH”的過程就是真實(shí)服務(wù)器運(yùn)維中反復(fù)出現(xiàn)的工作流。2.4 給虛擬機(jī)固定 IP形成最小“服務(wù)器”環(huán)境NAT 網(wǎng)絡(luò)下虛擬機(jī)默認(rèn)通過 DHCP 獲取 IP。對實(shí)驗(yàn)環(huán)境來說這不算大問題但如果想把它當(dāng)成長期使用的內(nèi)部服務(wù)器最好配置固定 IP避免重啟后地址變化。在 Ubuntu 系統(tǒng)里查看網(wǎng)絡(luò)配置文件ip addr如果使用 Netplan可以在/etc/netplan/下找到類似01-network-config.yaml的文件并修改。示例配置如下network: version: 2 ethernets: enp1s0: dhcp4: no addresses: - 192.168.122.50/24 routes: - to: default via: 192.168.122.1 nameservers: addresses: - 223.5.5.5 - 8.8.8.8應(yīng)用網(wǎng)絡(luò)配置sudo netplan apply ip addr show enp1s0配置完成后在宿主機(jī)執(zhí)行ssh user192.168.122.50如果 SSH 連接失敗先確認(rèn)虛擬機(jī)內(nèi)是否安裝了 openssh-serversudo apt install -y openssh-server sudo systemctl enable --now ssh到這里你已經(jīng)擁有了第一臺可以遠(yuǎn)程登錄的“本地服務(wù)器”。這臺機(jī)器只是你本機(jī)虛擬出來的但它背后包含的虛擬化流程和云主機(jī)高度一致。2.5 KVM 實(shí)驗(yàn)中最容易踩的坑第一個坑是磁盤空間算不清楚。創(chuàng)建虛擬機(jī)時指定的 20GB 是磁盤虛擬大小實(shí)際文件會隨著數(shù)據(jù)增長慢慢變大。查看真實(shí)占用要用du -h /var/lib/libvirt/images/xxx.qcow2不能只看virsh vol-list里的分配大小。第二個坑是 NAT 網(wǎng)絡(luò)下外網(wǎng)無法直接訪問虛擬機(jī)服務(wù)。想在宿主機(jī)其他設(shè)備上訪問虛擬機(jī)里的 Web 服務(wù)需要配置端口轉(zhuǎn)發(fā)或使用橋接網(wǎng)絡(luò)。學(xué)習(xí)階段先分清這兩個網(wǎng)絡(luò)模式不然會誤判成防火墻問題。第三個坑是重啟后 libvirtd 沒有自動啟動。雖然前面執(zhí)行了systemctl enable --now libvirtd但如果你用的是不支持 systemd 的發(fā)行版需要改成service libvirtd start和update-rc.d libvirtd enable。每次重啟后先執(zhí)行virsh list確認(rèn)服務(wù)狀態(tài)是一個值得保持的習(xí)慣。3. 把實(shí)驗(yàn)搬到云用合規(guī)免費(fèi)額度做一次真實(shí)公網(wǎng)部署3.1 先從官方文檔確認(rèn)配額和規(guī)則不要憑廣告詞判斷現(xiàn)在回到云端。很多云廠商會提供新用戶試用、免費(fèi)實(shí)例、免費(fèi)容器空間等機(jī)制這部分機(jī)制本身是正常的營銷活動但規(guī)則差異極大。不同活動之間的差異包括是體驗(yàn)套餐還是長期免費(fèi)額度免費(fèi)范圍包含帶寬、存儲、公網(wǎng) IP 還是僅計算資源是否需要實(shí)名認(rèn)證或新人首單超出配額后是否自動按量計費(fèi)到期后數(shù)據(jù)是自動釋放還是需要主動遷移。正確的做法是打開云廠商官網(wǎng)的產(chǎn)品文檔進(jìn)入“產(chǎn)品定價”或“免費(fèi)額度”頁面找到與你要創(chuàng)建資源類型一致的表格。如果頁面上寫了“新用戶 1 個月免費(fèi)”就按 1 個月規(guī)劃實(shí)驗(yàn)周期。不要把頁面宣傳中的“免費(fèi)”直接等同于“永久免費(fèi)”更不要在免費(fèi)額度上運(yùn)行正式數(shù)據(jù)。風(fēng)險提示在使用任何云服務(wù)前不要在未讀清欠費(fèi)規(guī)則的情況下綁定銀行卡或開通自動續(xù)費(fèi)。建議用一個充值金額極小的賬戶做實(shí)驗(yàn)或者優(yōu)先選擇提供免費(fèi)額度的產(chǎn)品。3.2 最小云服務(wù)器部署流程鏡像、登錄、安全組假設(shè)你已經(jīng)通過云廠商控制臺創(chuàng)建了一臺 Linux 云服務(wù)器創(chuàng)建時需要注意三項選擇。第一項是操作系統(tǒng)鏡像。建議選擇 Ubuntu 24.04 LTS 或你熟悉的發(fā)行版 LTS 版本因?yàn)殚L期支持版本的安全更新周期長社區(qū)資料多。第二項是登錄方式。優(yōu)先選擇密鑰登錄而不是密碼。在本地生成密鑰對ssh-keygen -t ed25519 -C cloud-server-test cat ~/.ssh/cloud_server_test.pub把公鑰內(nèi)容粘貼到云控制臺創(chuàng)建實(shí)例時的“SSH 密鑰”字段或者創(chuàng)建后使用“導(dǎo)入密鑰”功能。第三項是安全組。安全組是云平臺的虛擬防火墻決定允許哪些來源 IP 訪問實(shí)例端口。初始狀態(tài)建議只保留自己公網(wǎng) IP 的訪問權(quán)限方向協(xié)議端口來源說明入方向TCP22你的家庭/辦公公網(wǎng) IPSSH 管理入方向TCP800.0.0.0/0HTTP 對外訪問入方向TCP4430.0.0.0/0HTTPS按需添加創(chuàng)建后通過控制臺拿到公網(wǎng) IP然后從本地連接ssh -i ~/.ssh/cloud_server_test ubuntu公網(wǎng)IP登錄成功后可以先做基礎(chǔ)更新sudo apt update sudo apt upgrade -y sudo timedatectl set-timezone Asia/Shanghai3.3 部署一個靜態(tài)頁面并驗(yàn)證公網(wǎng)訪問為了驗(yàn)證整條鏈路是否通選擇最簡單的方式安裝 Nginxsudo apt install -y nginx sudo systemctl enable --now nginx curl http://127.0.0.1能看到 Nginx 默認(rèn)頁面說明服務(wù)已在本機(jī)運(yùn)行。再用本地瀏覽器訪問http://云服務(wù)器公網(wǎng)IP能看到頁面說明安全組、進(jìn)程監(jiān)聽、公網(wǎng)鏈路都正常。如果訪問失敗不要先懷疑云廠商按這個順序排查在云服務(wù)器內(nèi)執(zhí)行curl http://127.0.0.1確認(rèn)服務(wù)本身是否啟動執(zhí)行ss -lntp | grep 80確認(rèn) Nginx 是否監(jiān)聽在所有網(wǎng)卡上回到控制臺查看安全組是否放行 80 端口檢查云服務(wù)器自身防火墻Ubuntu 默認(rèn)ufw通常是關(guān)閉的但如果之前手動開啟過要放行端口。這個排查鏈路對任何服務(wù)器問題都適用先看本地進(jìn)程再看系統(tǒng)端口最后看外圍防火墻。3.4 云實(shí)驗(yàn)與本地實(shí)驗(yàn)的資源差異同樣是在 Linux 上部署服務(wù)云服務(wù)器和本地虛擬機(jī)有幾處關(guān)鍵差異值得注意。維度本地 KVM 虛擬機(jī)云服務(wù)器IP 與公網(wǎng)NAT 下默認(rèn)不可被外網(wǎng)訪問分配公網(wǎng) IP默認(rèn)受安全組約束磁盤退化快照放在本機(jī)磁盤可回滾依賴云盤快照能力強(qiáng)密登錄不強(qiáng)制通常默認(rèn)支持密鑰并要求配置費(fèi)用只消耗宿主機(jī)資源活動期也可能有額外流量費(fèi)備份可用鏡像直接復(fù)制需要結(jié)合快照或鏡像系統(tǒng)如果你的目標(biāo)只是把實(shí)驗(yàn)跑通在本地做開發(fā)和功能驗(yàn)證在云上做一次公網(wǎng)連通性確認(rèn)就足夠形成閉環(huán)了。不要一開始就把所有服務(wù)都放進(jìn)免費(fèi)云服務(wù)器。4. 把部署方式升級成容器云用 Docker 跑通一次容器化部署4.1 容器云解決的是“換環(huán)境就崩潰”的問題傳統(tǒng)部署方式中你在一臺機(jī)器上手動安裝依賴等服務(wù)可以訪問后這臺機(jī)器就成了“不可變資產(chǎn)”。換一臺機(jī)器重新部署時經(jīng)常出現(xiàn)“我這臺機(jī)器上能跑拿到服務(wù)器就不行”的情況因?yàn)橄到y(tǒng)版本、環(huán)境變量、持久化數(shù)據(jù)、軟件源都可能存在差異。容器化的核心是把應(yīng)用和它運(yùn)行所需的最小操作系統(tǒng)內(nèi)容一起打進(jìn)鏡像。鏡像一旦生成在任何裝有容器運(yùn)行時的機(jī)器上都應(yīng)表現(xiàn)出相同行為。容器云在此基礎(chǔ)上增加了多節(jié)點(diǎn)調(diào)度、健康檢查和自動伸縮能力但從用戶角度感受最直接的還是“同一份鏡像可以在多個環(huán)境運(yùn)行”。下面的實(shí)驗(yàn)會把你剛部署的靜態(tài)站變成可打包容器鏡像先在本機(jī)驗(yàn)證一次再按容器云的思路交給編排系統(tǒng)運(yùn)行。4.2 用 Dockerfile 打包一個 Nginx 靜態(tài)站進(jìn)入工作目錄mkdir -p server-web/static cd server-web echo h1Container Server Demo/h1 static/index.html編寫 DockerfileFROM nginx:1.27-alpine COPY static/index.html /usr/share/nginx/html/index.html EXPOSE 80構(gòu)建鏡像并運(yùn)行docker build -t server-web:v1 . docker run -d --name server-web-demo -p 8080:80 server-web:v1 curl http://127.0.0.1:8080輸出h1Container Server Demo/h1說明容器運(yùn)行成功。這里用8080:80是為了避免與宿主機(jī)上可能已經(jīng)存在的 Nginx 實(shí)例沖突。后面你只需要把請求從公網(wǎng) 80 端口代理到容器映射端口即可。容器云環(huán)境里排障手段略有不同。進(jìn)入容器內(nèi)部查看docker exec -it server-web-demo sh curl http://localhost如果容器端口暴露方式不對用戶能訪問宿主機(jī)但訪問不到服務(wù)。docker ps -a可以看容器狀態(tài)docker logs server-web-demo可以看 Nginx 日志。這套思維和排查云服務(wù)器時先確認(rèn)進(jìn)程再確認(rèn)監(jiān)聽邏輯是相通的。4.3 用 docker compose 模擬“多服務(wù)編排”的最小形態(tài)單容器鏡像只能展示“環(huán)境一致”這一層。容器云還包含另一個重要概念調(diào)度和編排。用 Docker Compose 就能模擬編排的最小形態(tài)把 Web 容器和反向代理容器組合起來。先創(chuàng)建一個docker-compose.ymlservices: web: build: . image: server-web:v1 restart: unless-stopped networks: - webnet proxy: image: nginx:1.27-alpine volumes: - ./proxy.conf:/etc/nginx/conf.d/default.conf:ro ports: - 8081:80 depends_on: - web restart: unless-stopped networks: - webnet networks: webnet:再創(chuàng)建proxy.conf把收到請求轉(zhuǎn)發(fā)給內(nèi)部服務(wù)webserver { listen 80; server_name _; location / { proxy_pass http://web:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }執(zhí)行docker compose up -d --build curl http://127.0.0.1:8081這里面有兩個容器云最核心的思路值得掌握。第一容器之間通過服務(wù)名而不是 IP 通信。proxy_pass http://web:80;里的web來自 Compose 網(wǎng)絡(luò)自動生成的服務(wù)名容器啟動順序和 IP 變化都不需要你關(guān)心。第二反向代理是容器云入口流量管理的起點(diǎn)。正式容器云里承擔(dān)入口職責(zé)的通常是 Ingress Controller 或 API 網(wǎng)關(guān)本節(jié)的自定義 Nginx 代理能讓你看懂它的工作過程。4.4 容器鏡像發(fā)布前要檢查的清單鏡像不是“能啟動”就是好的。真正要推送到容器云或鏡像倉庫之前建議按照下面的清單檢查一遍。檢查項要求錯誤示例基礎(chǔ)鏡像大小優(yōu)先選alpine或精簡的正式鏡像在沒有必要依賴時使用完整 Ubuntu進(jìn)程運(yùn)行用戶避免使用 rootDockerfile 中把user切換為普通用戶時區(qū)通過環(huán)境變量或鏡像層面就位應(yīng)用代碼輸出 UTC日志與 Nginx 時間不一致日志輸出寫到 stdout/stderr便于 docker logs 收集寫入固定文件容器重啟后日志丟失持久化數(shù)據(jù)庫或上傳文件需要掛載卷寫入容器可寫層容器銷毀數(shù)據(jù)丟失環(huán)境變量密碼、密鑰不走鏡像參數(shù)把密鑰寫死在 Dockerfile 中容器云環(huán)境比單機(jī) Docker 多了平臺側(cè)的資源限制和調(diào)度但鏡像層面的衛(wèi)生習(xí)慣在任何場景都有效。5. 服務(wù)器上線后最常遇到的幾類問題排查5.1 SSH 連接失敗先按鏈路分層定位SSH 是管理 Linux 服務(wù)器最常用的入口連接失敗時先從現(xiàn)象判斷是哪一層出了問題??赡艿膱?zhí)行命令ssh -v userserver_ip nc -vz server_ip 22 ping server_ip排查順序ping不通先看網(wǎng)絡(luò)層可能是 IP 寫錯、本地不在同一網(wǎng)絡(luò)或云機(jī)房屏蔽 ICMP網(wǎng)絡(luò)通但nc不通看系統(tǒng)防火墻和安全組nc通但 SSH 登錄報錯看密鑰權(quán)限、用戶名、服務(wù)狀態(tài)。密碼登錄常見錯誤是Permission denied, please try again檢查是否使用了正確用戶是否開啟了密碼認(rèn)證。密鑰登錄常見錯誤是Permissions 0777 for key are too open需要把私鑰權(quán)限改小chmod 600 ~/.ssh/cloud_server_test如果之前的連接請求沒有報錯只是一直卡住無輸出很可能是 SSH 反向解析慢或網(wǎng)絡(luò)質(zhì)量差可以加-o ConnectTimeout10快速定位。5.2 端口不通不要一上來就關(guān)防火墻部署一個 Web 服務(wù)后最??吹降膱箦e是“無法訪問此網(wǎng)站”或“拒絕連接”。這時候先不要急著systemctl stop firewalld按下面的流程排查。先在本機(jī)確認(rèn)進(jìn)程監(jiān)聽ss -lntp | grep 8080沒有輸出說明進(jìn)程沒啟動或端口配置錯誤。有輸出但沒有顯示0.0.0.0:8080而是只監(jiān)聽127.0.0.1:8080說明服務(wù)只對本機(jī)開放外網(wǎng)請求進(jìn)不來。sudo netstat -lntp | grep 8080如果監(jiān)聽地址正確再離開服務(wù)器從本地執(zhí)行nc -vz server_ip 8080連接成功說明系統(tǒng)防火墻和安全組都是放行的。如果連接失敗優(yōu)先去云廠商控制臺查看安全組規(guī)則。不要把安全組和系統(tǒng)防火墻混為一談前者是云平臺虛擬交換機(jī)上的規(guī)則后者是操作系統(tǒng)內(nèi)核里的防火墻兩者是疊加關(guān)系。5.3 服務(wù)器時間不對定時任務(wù)和 HTTPS 會連環(huán)出問題服務(wù)器時間錯誤是隱藏問題出現(xiàn)時不會像端口不通那樣容易被發(fā)現(xiàn)。表現(xiàn)通常是日志時間錯亂、定時任務(wù)在錯誤時間執(zhí)行、HTTPS 證書提示有效期異常。在 Linux 上查看時間狀態(tài)timedatectl status timedatectl list-timezones | grep Shanghai sudo timedatectl set-timezone Asia/Shanghai sudo timedatectl set-ntp true時間同步依賴網(wǎng)絡(luò)時間協(xié)議。如果需要部署一臺局域網(wǎng)時間服務(wù)器在受控網(wǎng)絡(luò)中安裝 chrony 并作為客戶端同步源即可。服務(wù)器或容器里如果看不到正確的時間優(yōu)先確認(rèn)兩個配置宿主機(jī)時區(qū)是否已設(shè)置正確容器是否掛載了/etc/localtime或通過環(huán)境變量指定了時區(qū)。建議無論是云服務(wù)器還是本地虛擬機(jī)創(chuàng)建后第一件事就是設(shè)置時區(qū)并開啟 NTP。這個動作的成本幾乎為零卻能避免后續(xù)日志對齊時踩坑。5.4 日志分散后先用 rsyslog 做集中收集服務(wù)多起來之后登錄每一臺機(jī)器查看日志會非常低效。局域網(wǎng)內(nèi)可以通過 rsyslog 把多臺服務(wù)器的日志轉(zhuǎn)發(fā)到一個日志服務(wù)器。在一臺服務(wù)器上開啟接收配置編輯/etc/rsyslog.conf找到類似module(loadimudp)和module(loadimtcp)的配置并取消注釋module(loadimudp) input(typeimudp port514) $template RemoteLogs,/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log *.* ?RemoteLogs stop客戶端服務(wù)器上編輯/etc/rsyslog.d/50-remote.conf*.* 192.168.1.100:514重啟 rsyslogsudo systemctl restart rsyslog這是一個最樸素的日志集中方案適合學(xué)習(xí)日志路由和排障順序。生產(chǎn)環(huán)境建議在此基礎(chǔ)上加入日志輪轉(zhuǎn)、傳輸加密和監(jiān)控告警。不要把 rsyslog 暴露到公網(wǎng)它默認(rèn)不內(nèi)置復(fù)雜認(rèn)證暴露公網(wǎng)可能成為日志偽造或拒絕服務(wù)入口。5.5 備份不是可選項先做一個最樸素的定時備份RAID 磁盤陣列可以解決單塊磁盤損壞導(dǎo)致服務(wù)不可用的問題但 RAID 不是備份誤刪文件、邏輯損壞和勒索軟件都可能讓陣列中的多份數(shù)據(jù)同時失效。最基礎(chǔ)的備份方案是定時把數(shù)據(jù)和數(shù)據(jù)庫導(dǎo)出到另外一臺機(jī)器或 NAS。數(shù)據(jù)庫樣本備份命令pg_dump -U app_user app_db /backup/app_db_$(date %F).sql find /backup -name app_db_*.sql -mtime 7 -delete目錄同步到遠(yuǎn)端 NAS 的示例rsync -avz /srv/app_data/ backup-usernas:/volume1/backups/app_data --delete配合 crontab 定時執(zhí)行0 2 * * * /opt/scripts/backup-web-server.sh /dev/null 21備份是否有效取決于你是否演練過“從備份恢復(fù)”。只把數(shù)據(jù)復(fù)制到 NAS 卻從不測試還原遇到故障時仍然可能手忙腳亂。正確的判斷標(biāo)準(zhǔn)是恢復(fù)時間不是備份文件大小。6. 實(shí)驗(yàn)環(huán)境與生產(chǎn)環(huán)境之間還要補(bǔ)齊這些工程習(xí)慣6.1 學(xué)習(xí)環(huán)境可以“怎么快怎么來”生產(chǎn)環(huán)境必須考慮容錯整篇文章雖然從“免費(fèi)”和“實(shí)驗(yàn)”講起但最終目的是幫助你在真實(shí)項目里不掉坑。學(xué)習(xí)環(huán)境和生產(chǎn)環(huán)境的差異不是“要不要花錢”而是“系統(tǒng)故障后能容忍多久恢復(fù)”。維度學(xué)習(xí)實(shí)驗(yàn)環(huán)境生產(chǎn)環(huán)境賬號安全密碼可接受強(qiáng)制密鑰、內(nèi)網(wǎng)跳板、細(xì)粒度權(quán)限數(shù)據(jù)可靠性可隨意刪除重建有備份、有恢復(fù)演練日志手動查看統(tǒng)一收集、日志輪轉(zhuǎn)、告警通知監(jiān)控可沒有CPU、內(nèi)存、磁盤、端口、證書到期都要監(jiān)控部署發(fā)布手動命令鏡像化、回滾腳本、灰度策略變更管理隨意改配置配置外置、可審計、可回滾網(wǎng)絡(luò)開放盡量少放行最小化暴露關(guān)閉不必要端口資源成本按需創(chuàng)建評估容量和費(fèi)用上限6.2 值得長期堅持的運(yùn)維檢查清單下面這份清單可以直接打印出來在任何一臺服務(wù)器或容器環(huán)境交付前逐項確認(rèn)。是否修改默認(rèn)口令或使用密鑰登錄是否只放行了必要端口和來源 IP是否設(shè)置了正確的時區(qū)并開啟時間同步系統(tǒng)軟件和安全補(bǔ)丁是否已更新到最新穩(wěn)定狀態(tài)重要數(shù)據(jù)是否有自動備份備份是否有恢復(fù)驗(yàn)證服務(wù)日志是否輸出到標(biāo)準(zhǔn)位置并設(shè)置輪轉(zhuǎn)是否配置了磁盤空間告警應(yīng)用是否以非 root 用戶運(yùn)行是否記錄服務(wù)啟動命令和依賴版本方便復(fù)現(xiàn)是否有回滾上線前版本的方案。對初學(xué)者而言一次能做到其中四五項已經(jīng)很不錯。關(guān)鍵是形成把每一項變成“檢查清單”而不是“想一想就行”的習(xí)慣。6.3 一條不容易走偏的學(xué)習(xí)路線如果你之前沒有系統(tǒng)接觸過服務(wù)器建議按下面的路線推進(jìn)。第一階段完整搭建一臺本地 Linux 虛擬機(jī)并使用 SSH 管理。學(xué)會文件操作、用戶權(quán)限、systemd 服務(wù)熟悉journalctl -u和tail查看日志。這一步解決的問題是“服務(wù)器不是黑盒”。第二階段在一個云廠商可控的免費(fèi)額度實(shí)例上完成公網(wǎng)部署。重點(diǎn)理解安全組和密鑰登錄體驗(yàn)本地實(shí)驗(yàn)與云端差異。第三階段把應(yīng)用容器化用 Docker Compose 在本地模擬多服務(wù)部署。理解鏡像、容器、網(wǎng)絡(luò)、數(shù)據(jù)卷和日志。第四階段再去看 Kubernetes 或云廠商的托管容器服務(wù)。此時你已經(jīng)理解容器底座編排層只是把剛才手動完成的“啟動、擴(kuò)容、重啟、發(fā)現(xiàn)”交給平臺自動化。不要一開始就學(xué) K8s。沒有容器和 Linux 基礎(chǔ)直接學(xué)編排調(diào)度會很容易記住概念但無法排查問題。6.4 如何判斷“免費(fèi)資源”宣傳是否值得相信回到文章開頭那句宣傳語。真正判斷一個平臺有沒有技術(shù)價值要看下面幾個問題。第一它有沒有公開正式的產(chǎn)品文檔。只有廣告詞沒有文檔說明產(chǎn)品設(shè)計和運(yùn)維支持還不成熟。第二免費(fèi)額度是否在控制臺中有清晰展示。能看到的免費(fèi)額度比“客服說免費(fèi)”可靠得多。第三是否有明確的產(chǎn)品生命周期說明。試用結(jié)束、配額耗盡、數(shù)據(jù)下線這些場景必須提前告知。第四導(dǎo)出數(shù)據(jù)是否容易。如果一個平臺進(jìn)來容易、出去麻煩那再便宜的成本都可能被遷移成本抵消。免費(fèi)不是不能用而是要把免費(fèi)當(dāng)成“學(xué)習(xí)和驗(yàn)證”的杠桿而不是“生產(chǎn)資源”的來源。你真正留存下來的資產(chǎn)不是那臺臨時服務(wù)器而是你在上面熟練的操作能力、排障思路和對自己系統(tǒng)狀態(tài)的理解。