文章來源:https://goframe.org/deploymen...
一、獨立部署
使用GF
開發的應用程序可以獨立地部署到服務器上,設置為后台守護進程運行即可。這種模式常用在簡單的API服務項目中。
服務器我們推薦使用*nix
服務器系列(包括:Linux
, MacOS
, *BSD
),以下使用Ubuntu
系統為例,介紹如何部署使用GF
框架開發的項目。
1. nohup
我們可以使用簡單的nohup
命令來運行應用程序,使其作為后台守護進程運行,即使遠程連接的SSH斷開也不會影響程序的執行。在流行的Linux發行版中往往都默認安裝好了nohup
命令工具。
命令如下:
nohup ./gf-app &
2. tmux
tmux
是一款Linux下的終端復用工具,可以開啟不同的終端窗口來將應用程序作為后台守護進程執行,即使遠程連接的SSH斷開也不會影響程序的執行。
在ubuntu
系統下直接使用sudo apt-get install tmux
安裝即可。使用以下步驟將應用程序后台運行。
-
tmux new -s gf-app
; - 在新終端窗口中執行
./gf-app
即可; - 使用
crt
+B & D
快捷鍵可以退出當前終端窗口; - 使用
tmux attach -t gf-app
可進入到之前的終端窗口;
3. supervisor
supervisor
是用Python
開發的一套通用的進程管理程序,能將一個普通的命令行進程變為后台daemon
,並監控進程狀態,異常退出時能自動重啟。官方網站:http://supervisord.org/
常見配置如下:
[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
使用步驟如下:
- 使用
sudo service supervisor start
啟動supervisor
服務; - 創建應用配置文件
/etc/supervisor/conf.d/gf-app.conf
, 內容如上; - 使用
sudo supervisorctl
進入supervisor
管理終端; - 使用
reload
重新讀取配置文件並重啟當前supoervisor
管理的所有進程; - 也可以使用
update
重新加載配置(默認不重啟),隨后使用start gf-app
啟動指定的應用程序; - 隨后可以使用
status
指令查看當前supervisor
管理的進程狀態;
二、代理部署
代理部署即前置一層第三方的WebServer
服務器處理所有的請求,將部分請求(往往是動態處理請求)有選擇性地轉交給后端的Golang
應用程序執行,后端部署的Golang
應用程序可以配置有多個。這種模式常用在復雜的WebServer
配置中,常見的場景例如:需要靜態文件分離、需要配置多個域名及證書、需要自建負載均衡層,等等。
雖然Golang
實現的WebServer
也能夠處理靜態文件,但是相比較於專業性的WebServer
如nginx
/apache
來說比較簡單,性能也較弱。因此不推薦使用Golang WebServer
作為前端服務直接處理靜態文件請求。
Nginx
我們推薦使用Nginx
作為反向代理的前端接入層,有兩種配置方式實現動靜態請求的拆分。
靜態文件后綴
這種方式通過文件名后綴區分,將指定的靜態文件轉交給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 ~ .*\.(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
訪問靜態文件。
三、容器部署
容器部署即使用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-app
的docker
鏡像。
3. 運行鏡像
使用以下命令運行鏡像:
docker run gf-app
4. 鏡像分發
容器的分發可以使用docker
官方的平台:https://hub.docker.com/ ,國內也可以考慮使用阿里雲:https://www.aliyun.com/produc... 。
5. 容器編排
在企業級生產環境中,docker
容器往往需要結合kubernetes
或者docker swarm
容器編排工具一起使用。
容器編排涉及到的內容比較多,感興趣的同學可以參考以下資料: