Golang項目部署

文章來源:https://goframe.org/deploymen...css

1、獨立部署

使用GF開發的應用程序能夠獨立地部署到服務器上,設置爲後臺守護進程運行便可。這種模式經常使用在簡單的API服務項目中。前端

服務器咱們推薦使用*nix服務器系列(包括:Linux, MacOS, *BSD),如下使用Ubuntu系統爲例,介紹如何部署使用GF框架開發的項目。linux

1. nohup

咱們可使用簡單的nohup命令來運行應用程序,使其做爲後臺守護進程運行,即便遠程鏈接的SSH斷開也不會影響程序的執行。在流行的Linux發行版中每每都默認安裝好了nohup命令工具。
命令以下:nginx

nohup ./gf-app &

2. tmux

tmux是一款Linux下的終端複用工具,能夠開啓不一樣的終端窗口來將應用程序做爲後臺守護進程執行,即便遠程鏈接的SSH斷開也不會影響程序的執行。
ubuntu系統下直接使用sudo apt-get install tmux安裝便可。使用如下步驟將應用程序後臺運行。git

  1. tmux new -s gf-app
  2. 在新終端窗口中執行./gf-app便可;
  3. 使用crt + B & D快捷鍵能夠退出當前終端窗口;
  4. 使用tmux attach -t gf-app可進入到以前的終端窗口;

3. supervisor

supervisor是用Python開發的一套通用的進程管理程序,能將一個普通的命令行進程變爲後臺daemon,並監控進程狀態,異常退出時能自動重啓。官方網站:http://supervisord.org/
常見配置以下:github

[program:gf-app]
user=root
command=/var/www/main
stdout_logfile=/var/log/gf-app-stdout.log
stderr_logfile=/var/log/gf-app-stderr.log
autostart=true
autorestart=true

使用步驟以下:golang

  1. 使用sudo service supervisor start啓動supervisor服務;
  2. 建立應用配置文件/etc/supervisor/conf.d/gf-app.conf, 內容如上;
  3. 使用sudo supervisorctl進入supervisor管理終端;
  4. 使用reload從新讀取配置文件並重啓當前supoervisor管理的全部進程;
  5. 也可使用update從新加載配置(默認不重啓),隨後使用start gf-app啓動指定的應用程序;
  6. 隨後可使用status指令查看當前supervisor管理的進程狀態;

2、代理部署

代理部署即前置一層第三方的WebServer服務器處理全部的請求,將部分請求(每每是動態處理請求)有選擇性地轉交給後端的Golang應用程序執行,後端部署的Golang應用程序能夠配置有多個。這種模式經常使用在複雜的WebServer配置中,常見的場景例如:須要靜態文件分離、須要配置多個域名及證書、須要自建負載均衡層,等等。docker

雖然 Golang實現的 WebServer也可以處理靜態文件,可是相比較於專業性的 WebServernginx/ apache來講比較簡單,性能也較弱。所以不推薦使用 Golang WebServer做爲前端服務直接處理靜態文件請求。

Nginx

咱們推薦使用Nginx做爲反向代理的前端接入層,有兩種配置方式實現動靜態請求的拆分。apache

靜態文件後綴

這種方式經過文件名後綴區分,將指定的靜態文件轉交給nginx處理,其餘的請求轉交給golang應用。
配置示例以下:ubuntu

server {
    listen       80;
    server_name  goframe.org;

    access_log   /var/log/gf-app-access.log;
    error_log    /var/log/gf-app-error.log;

    location ~ .*\.(gif|jpg|jpeg|png|js|css|eot|ttf|woff|svg|otf)$ {
        access_log off;
        expires    1d;
        root       /var/www/gf-app/public;
        try_files  $uri @backend;
    }

    location / {
        try_files $uri @backend;
    }

    location @backend {
        proxy_pass                 http://127.0.0.1:8199;
        proxy_redirect             off;
        proxy_set_header           Host             $host;
        proxy_set_header           X-Real-IP        $remote_addr;
        proxy_set_header           X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

其中,8199爲本地的golang應用WebServer監聽端口。

例如,在該配置下,咱們能夠經過http://goframe.org/my.png訪問到指定的靜態文件。

靜態文件目錄

這種方式經過文件目錄區分,將指定目錄的訪問請求轉交給nginx處理,其餘的請求轉交給golang應用。
配置示例以下:

server {
    listen       80;
    server_name  goframe.org;

    access_log   /var/log/gf-app-access.log;
    error_log    /var/log/gf-app-error.log;

    location ^~ /public {
        access_log off;
        expires    1d;
        root       /var/www/gf-app;
        try_files  $uri @backend;
    }

    location / {
        try_files $uri @backend;
    }

    location @backend {
        proxy_pass                 http://127.0.0.1:8199;
        proxy_redirect             off;
        proxy_set_header           Host             $host;
        proxy_set_header           X-Real-IP        $remote_addr;
        proxy_set_header           X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

其中,8199爲本地的golang應用WebServer監聽端口。

例如,在該配置下,咱們能夠經過http://goframe.org/piblic/my.png訪問靜態文件。

3、容器部署

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

1. 編譯程序

跨平臺交叉編譯是golang的特色之一,能夠很是方便地編譯出咱們須要的目標服務器平臺的版本,並且是靜態編譯,很是方便地解決了運行依賴問題。
使用如下方式靜態編譯Linux平臺amd64架構的可執行文件:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o gf-app main.go

這樣便編譯出來一個gf-app的可執行文件。

2. 編譯鏡像

咱們須要將該可執行文件gf-app編譯生成docker鏡像,以便於分發及部署。Golang的運行環境推薦使用alpine基礎系統鏡像,編譯出的容器鏡像約爲20MB左右。

一個參考的Dockerfile文件以下( 能夠參考gf-home項目的Dcokerfile: https://github.com/gogf/gf-home ):

FROM loads/alpine:3.8

LABEL maintainer="john@johng.cn"

###############################################################################
#                                INSTALLATION
###############################################################################

ADD ./gf-app /bin/main
RUN chmod +x /bin/main

###############################################################################
#                                   START
###############################################################################

CMD main

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

隨後使用 docker build gf-app . 命令編譯生成名爲gf-appdocker鏡像。

3. 運行鏡像

使用如下命令運行鏡像:

docker run gf-app

4. 鏡像分發

容器的分發可使用docker官方的平臺:https://hub.docker.com/ ,國內也能夠考慮使用阿里雲:https://www.aliyun.com/produc...

5. 容器編排

在企業級生產環境中,docker容器每每須要結合kubernetes或者docker swarm容器編排工具一塊兒使用。
容器編排涉及到的內容比較多,感興趣的同窗能夠參考如下資料:

相關文章
相關標籤/搜索