Golang Gin實踐 連載十七 用 Nginx 部署 Go 應用

來源:互聯網
上載者:User

Golang Gin實踐 連載十七 用 Nginx 部署 Go 應用

原文地址:Golang Gin實踐 連載十七 用 Nginx 部署 Go 應用

前言

如果已經看過前面 “十六部連載,兩部番外”,相信您的能力已經有所提升

那麼,現在今天來說說簡單部署後端服務的事兒

做什麼

在本章節,我們將簡單介紹 Nginx 以及使用 Nginx 來完成對 go-gin-example 的部署,會實現反向 Proxy和簡單負載平衡的功能

Nginx

是什麼

Nginx 是一個 Web Server,可以用作反向 Proxy、負載平衡、郵件代理、TCP / UDP、HTTP 伺服器等等,它擁有很多迷人的特性,例如:

  • 以較低的記憶體佔用率處理 10,000 多個並發串連(每10k非活動HTTP保持活動串連約2.5 MB )
  • 靜態伺服器(處理靜態檔案)
  • 正向、反向 Proxy
  • 負載平衡
  • 通過OpenSSL 對 TLS / SSL 與 SNI 和 OCSP 支援
  • FastCGI、SCGI、uWSGI 的支援
  • WebSockets、HTTP/1.1 的支援
  • Nginx + Lua

安裝

請右拐Google或百度,安裝好 Nginx 以備接下來的使用

簡單講解

常用命令

  • nginx:啟動 Nginx
  • nginx -s stop:立刻停止 Nginx 服務
  • nginx -s reload:重新載入設定檔
  • nginx -s quit:平滑停止 Nginx 服務
  • nginx -t:測試組態檔案是否正確
  • nginx -v:顯示 Nginx 版本資訊
  • nginx -V:顯示 Nginx 版本資訊、編譯器和配置參數的資訊

涉及配置

1、 proxy_pass:配置反向 Proxy的路徑。需要注意的是如果 proxy_pass 的 url 最後為
/,則表示絕對路徑。否則(不含變數下)表示相對路徑,所有的路徑都會被代理過去

2、 upstream:配置負載平衡,upstream 預設是以輪詢的方式進行負載,另外還支援四種模式,分別是:

(1)weight:權重,指定輪詢的機率,weight 與訪問機率成正比

(2)ip_hash:按照訪問 IP 的 hash 結果值分配

(3)fair:按後端伺服器回應時間進行分配,回應時間越短優先順序別越高

(4)url_hash:按照存取 URL 的 hash 結果值分配

部署

在這裡需要對 nginx.conf 進行配置,如果你不知道對應的設定檔是哪個,可執行 nginx -t 看一下

$ nginx -tnginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is oknginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

顯然,我的設定檔在 /usr/local/etc/nginx/ 目錄下,並且測試通過

反向 Proxy

反向 Proxy是指以Proxy 伺服器來接受網路上的串連請求,然後將請求轉寄給內部網路上的伺服器,並將從伺服器上得到的結果返回給請求串連的用戶端,此時Proxy 伺服器對外就表現為一個反向 Proxy伺服器。(來自百科)

配置 hosts

由於需要用本機作為示範,因此先把映射配上去,開啟 /etc/hosts,增加內容:

127.0.0.1       api.blog.com

配置 nginx.conf

開啟 nginx 的設定檔 nginx.conf(我的是 /usr/local/etc/nginx/nginx.conf),我們做了如下事情:

增加 server 片段的內容,設定 server_name 為 api.blog.com 並且監聽 8081 連接埠,將所有路徑轉寄到 http://127.0.0.1:8000/

worker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    server {        listen       8081;        server_name  api.blog.com;        location / {            proxy_pass http://127.0.0.1:8000/;        }    }}

驗證

啟動 go-gin-example

回到 go-gin-example 的項目下,執行 make,再運行 ./go-gin-exmaple

$ makegithub.com/EDDYCJY/go-gin-example$ lsLICENSE        README.md      conf           go-gin-example middleware     pkg            runtime        vendorMakefile       README_ZH.md   docs           main.go        models         routers        service$ ./go-gin-example ...[GIN-debug] DELETE /api/v1/articles/:id      --> github.com/EDDYCJY/go-gin-example/routers/api/v1.DeleteArticle (4 handlers)[GIN-debug] POST   /api/v1/articles/poster/generate --> github.com/EDDYCJY/go-gin-example/routers/api/v1.GenerateArticlePoster (4 handlers)Actual pid is 14672
重啟 nginx
$ nginx -tnginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is oknginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful$ nginx -s reload
提供者

如此,就實現了一個簡單的反向 Proxy了,是不是很簡單呢

負載平衡

負載平衡,英文名稱為Load Balance(常稱 LB),其意思就是分攤到多個操作單元上進行執行(來自百科)

你能從營運口中經常聽見,XXX 負載怎麼突然那麼高。 那麼它到底是什麼呢?

其背後一般有多台 server,系統會根據配置的策略(例如 Nginx 有提供四種選擇)來進行動態調整,儘可能的達到各節點均衡,從而提高系統整體的輸送量和快速響應

如何示範

前提條件為多個後端服務,那麼勢必需要多個 go-gin-example,為了示範我們可以啟動多個連接埠,達到類比的效果

為了便於示範,分別在啟動前將 conf/app.ini 的應用連接埠修改為 8001 和 8002(也可以做成傳入參數的模式),達到啟動 2 個監聽 8001 和 8002 的後端服務

配置 nginx.conf

回到 nginx.conf 的老地方,增加負載平衡所需的配置。新增 upstream-節點,設定其對應的 2 個後端服務,最後修改了 proxy_pass 指向(格式為 http:// + upstream 的節點名稱)

worker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    upstream api.blog.com {        server 127.0.0.1:8001;        server 127.0.0.1:8002;    }    server {        listen       8081;        server_name  api.blog.com;        location / {            proxy_pass http://api.blog.com/;        }    }}
重啟 nginx
$ nginx -tnginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is oknginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful$ nginx -s reload

驗證

再重複訪問 http://api.blog.com:8081/auth?username={USER_NAME}}&password={PASSWORD},多訪問幾次便於查看效果

目前 Nginx 沒有進行特殊配置,那麼它是輪詢策略,而 go-gin-example 預設開著 debug 模式,看看請求 log 就明白了

總結

在本章節,希望您能夠簡單習得日常使用的 Web Server 背後都是一些什麼邏輯,Nginx 是什嗎?反向 Proxy?負載平衡?

怎麼簡單部署,知道了吧。

參考

本系列範例程式碼

  • go-gin-example
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.