當我有一臺雲伺服器時,我做了些什麼

shanyue發表於2019-03-20

本文地址 山月的部落格

前端調研

剛開始調研伺服器渲染寫了一個 demo,正好對詩詞感興趣,就做了一個關於詩詞的站點,越寫越大,demo 變成了 DEMO,總的來說還是特別簡單。隨手掛到了伺服器下。

技術棧 ? Next.js + React + ApolloClient + Docker + Docker Compose

網址如下 ? 詩詞絃歌

後來又把自己的部落格掛了上去 ? 山月的部落格

後端支援

有了前端自然需要伺服器端支援,遵循著簡單方便好用易於上手的原則,在 parse-server 與 graphql 直接做抉擇,最後選了 graphql。並做了一個半成品的腳手架。支援以下功能

半成品腳手架掛到了github github.com/shfshanyue/…

  • N+1 query
  • 對資料庫欄位的按需載入
  • 對特定 field 快取的中介軟體
  • 接入 Sentry
  • 接入 Consul kev/value store
  • jwt 做身份認證
  • 結構化錯誤資訊,並使用 sentry 報警
  • 結構化日誌資訊,方便 elk 分析
  • Docker 與 Docker Compose
  • Traefik 做負載均衡(並沒有)與反向代理

這個腳手架在這裡有一個活的示例 todos.xiange.tech/playground 你需要先使用 shanyue/shanyue 做賬號密碼登入,登入的 mutation 是 createUserToken

那時候順手寫了一個前端的半半半半半成品腳手架,shfshanyu/react-apollo-starter,不知道現在還能不能跑得起來......

技術棧 ? Graphql + ApolloServer + Sequelize + Docker + JWT + (Traefik + Sentry + Consul)

graphql

Docker

部署的時候使用 docker + docker-compose,拉程式碼重啟解決。也經常在上邊做一些 docker 的測試

資料庫

後端依賴於資料,於是又用 docker 部署了 redis 與 postgres

當你接入監控後你會發現 postgres 從剛開始到使用所佔記憶體越來越大,這是有一部分資料從磁碟走到了記憶體。

VPN

資料庫放在公網訪問有點危險,於是又用docker建了vpn在本地開發訪問。使用了以下映象

github.com/kylemanna/d…

雖然配好了,但還是很懵逼,目前只控制了某個 cidr 段走 vpn

配置服務

後端需要配置服務,用 docker 部署了 consul,只用它的 key-value 儲存,它的服務發現功能就這麼被浪費掉了

直接裸機安裝下載

consul agent -data-dir=/consul/data -config-dir=/consul/config -server -data-dir=/consul/data -advertise 172.17.68.39 -bootstrap-expect=1 -node=consul-server -bind=0.0.0.0 -client=0.0.0.0 -ui
複製程式碼

錯誤收集系統

無論前端還是後端都需要一個錯誤收集系統,於是又用 docker 部署了 sentry

sentry 依賴於 redis,postgres,我直接把依賴指向了與我的站點公用的 redis 和 postgres。一來以後遷移是一個問題,二來錯誤日誌過多甚至有可能把資料庫給弄爆掉。不過不管了,我的站點也就我一個使用者,沒有人用就沒有錯誤,沒有錯誤就沒有問題。

反向代理

前後端需要做一個反向代理,偶然選擇的 traefik,至少比 nginx 多個漂亮的介面,更方便的服務配置,還可以做服務發現,缺點就是文件少

traefik 也直接在裸機安裝,docker 起的直接配置 label,代理埠號直接使用 file。後來寫了篇文章簡單介紹了它

Traefik 入手及簡單配置

traefik

至於圖上為什麼有這麼多請求,那是因為 gitlab runner 每秒請求一次 gitlab。

日誌系統

搭建了 elk。但鑑於目前訪問最多的三個小夥伴分別是谷歌小蜘蛛,百度小蜘蛛以及我自己,自從搭建起來就沒有使用過

參考搭建: github.com/deviantony/…

有可能還需要一個 file beats,但是還沒弄過

程式碼倉庫

一些個人程式碼,學習記錄,以及自己一些關於山水花草的筆記需要一個地方放,搭了一個 gitlab,不過 gitlab 吃了我兩個多G的記憶體...

注意關掉 gitlab 的 prometheus 等依賴,不然會吃很多記憶體

CI

搭建了 gitlab 以後,為了配套 gitlab,後又搭建了 gitlab-runner,做 CI/CD。

不過目前只有部落格接入了 CI,因為只有部落格是 CI 之後才搭建的,感覺最先開始的前後端專案要廢掉...

DNS server

有了這麼多的服務,但有的東西不好放在公網,如 consul,redis,postgres以及gitlab,又記不住埠號,所以又搭了一個 dns server,方便在本地訪問

yum install dnsmasq
複製程式碼

檔案編輯與視窗管理

vim 和 tmux 在linux上是標配,提高在伺服器的工作效率,建議使用原始碼編譯安裝。yum即使配置了epel,裝的包版本也過低,且缺少很多功能。如 vim 開啟檔案目錄。以下是我自己 vim 和 tmux 的配置

tmux

自動化運維

初期折騰伺服器的時候經常需要重灌系統,並且我有兩臺伺服器,自動化運維是必不可少的了。一般我用 ansible 做一些伺服器的預配置,一些必備工具如 docker,git,vim,tmux,jq,auto-jump 的安裝。

由於我的伺服器都是 centos,playbook 寫的有點糟糕。

不過伺服器裡大部分服務通過 docker-compose 管理,小部分工具通過 ansible role 管理,實在沒有再自己寫 ansible-playbook。

當你有了一臺新伺服器時,你可以遵循以下步驟

  1. 使用 ansible-role 預配置環境
  2. 如果沒有 ansible-role,則自己寫 ansible-playbook
  3. 對於一些服務使用 docker 進行安裝
  4. 如果以上都無法解決,手動安裝

監控

使用 prometheus + node-exporter + cadvisor 監控主機以及容器,使用 grafana 做視覺化

當你需要監控主機,容器或者資料庫時,可以採用以下步驟

  1. 在 grafana 找一個 star 多的 Dashboard
  2. 根據需要微改一下

grafana

自從用上了時序資料庫,我的磁碟空間也日漸縮小

總結

簡而言之,伺服器還是以測試,學習和實踐居多,後續應該會加入 k8s。

相關文章