天天看點

Golang項目部署

2|0一、獨立部署

使用<code>GF</code>開發的應用程式可以獨立地部署到伺服器上,設定為背景守護程序運作即可。這種模式常用在簡單的API服務項目中。

伺服器我們推薦使用<code>*nix</code>伺服器系列(包括:<code>Linux</code>, <code>MacOS</code>, <code>*BSD</code>),以下使用<code>Ubuntu</code>系統為例,介紹如何部署使用<code>GF</code>架構開發的項目。

我們可以使用簡單的<code>nohup</code>指令來運作應用程式,使其作為背景守護程序運作,即使遠端連接配接的SSH斷開也不會影響程式的執行。在流行的Linux發行版中往往都預設安裝好了<code>nohup</code>指令工具。

指令如下:

<code>tmux</code>是一款Linux下的終端複用工具,可以開啟不同的終端視窗來将應用程式作為背景守護程序執行,即使遠端連接配接的SSH斷開也不會影響程式的執行。

在<code>ubuntu</code>系統下直接使用<code>sudo apt-get install tmux</code>安裝即可。使用以下步驟将應用程式背景運作。

<code>tmux new -s gf-app</code>;

在新終端視窗中執行<code>./gf-app</code>即可;

使用<code>crt</code> + <code>B &amp; D</code>快捷鍵可以退出目前終端視窗;

使用<code>tmux attach -t gf-app</code>可進入到之前的終端視窗;

<code>supervisor</code>是用<code>Python</code>開發的一套通用的程序管理程式,能将一個普通的指令行程序變為背景<code>daemon</code>,并監控程序狀态,異常退出時能自動重新開機。官方網站:http://supervisord.org/

常見配置如下:

使用步驟如下:

使用<code>sudo service supervisor start</code>啟動<code>supervisor</code>服務;

建立應用配置檔案<code>/etc/supervisor/conf.d/gf-app.conf</code>, 内容如上;

使用<code>sudo supervisorctl</code>進入<code>supervisor</code>管理終端;

使用<code>reload</code>重新讀取配置檔案并重新開機目前<code>supoervisor</code>管理的所有程序;

也可以使用<code>update</code>重新加載配置(預設不重新開機),随後使用<code>start gf-app</code>啟動指定的應用程式;

随後可以使用<code>status</code>指令檢視目前<code>supervisor</code>管理的程序狀态;

2|0二、代理部署

代理部署即前置一層第三方的<code>WebServer</code>伺服器處理所有的請求,将部分請求(往往是動态處理請求)有選擇性地轉交給後端的<code>Golang</code>應用程式執行,後端部署的<code>Golang</code>應用程式可以配置有多個。這種模式常用在複雜的<code>WebServer</code>配置中,常見的場景例如:需要靜态檔案分離、需要配置多個域名及證書、需要自建負載均衡層,等等。

雖然<code>Golang</code>實作的<code>WebServer</code>也能夠處理靜态檔案,但是相比較于專業性的<code>WebServer</code>如<code>nginx</code>/<code>apache</code>來說比較簡單,性能也較弱。是以不推薦使用<code>Golang WebServer</code>作為前端服務直接處理靜态檔案請求。

我們推薦使用<code>Nginx</code>作為反向代理的前端接入層,有兩種配置方式實作動靜态請求的拆分。

這種方式通過檔案名字尾區分,将指定的靜态檔案轉交給<code>nginx</code>處理,其他的請求轉交給<code>golang</code>應用。

配置示例如下:

其中,<code>8199</code>為本地的<code>golang</code>應用<code>WebServer</code>監聽端口。

例如,在該配置下,我們可以通過<code>http://goframe.org/my.png</code>通路到指定的靜态檔案。

這種方式通過檔案目錄區分,将指定目錄的通路請求轉交給<code>nginx</code>處理,其他的請求轉交給<code>golang</code>應用。

例如,在該配置下,我們可以通過<code>http://goframe.org/piblic/my.png</code>通路靜态檔案。

3|0三、容器部署

容器部署即使用<code>docker</code>化部署<code>golang</code>應用程式,這是在雲服務時代最流行的部署方式,也是最推薦的部署方式。

跨平台交叉編譯是<code>golang</code>的特點之一,可以非常友善地編譯出我們需要的目标伺服器平台的版本,而且是靜态編譯,非常友善地解決了運作依賴問題。

使用以下方式靜态編譯<code>Linux</code>平台<code>amd64</code>架構的可執行檔案:

這樣便編譯出來一個<code>gf-app</code>的可執行檔案。

我們需要将該可執行檔案<code>gf-app</code>編譯生成<code>docker</code>鏡像,以便于分發及部署。<code>Golang</code>的運作環境推薦使用<code>alpine</code>基礎系統鏡像,編譯出的容器鏡像約為20MB左右。

一個參考的<code>Dockerfile</code>檔案如下( 可以參考<code>gf-home</code>項目的<code>Dcokerfile</code>: https://github.com/gogf/gf-home ):

其中,我們的基礎鏡像使用了<code>loads/alpine:3.8</code>這個鏡像,基礎鏡像的<code>Dockerfile</code>位址:https://github.com/johngcn/do... ,倉庫位址:https://hub.docker.com/u/loads

随後使用 <code>docker build gf-app .</code> 指令編譯生成名為<code>gf-app</code>的<code>docker</code>鏡像。

使用以下指令運作鏡像:

容器的分發可以使用<code>docker</code>官方的平台:https://hub.docker.com/ ,國内也可以考慮使用阿裡雲:https://www.aliyun.com/produc... 。

在企業級生産環境中,<code>docker</code>容器往往需要結合<code>kubernetes</code>或者<code>docker swarm</code>容器編排工具一起使用。

容器編排涉及到的内容比較多,感興趣的同學可以參考以下資料:

https://kubernetes.io/

https://docs.docker.com/swarm/