<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文以部署 Go Web 程式為例,介紹了在 CentOS7 伺服器上部署 Go 語言程式的若干方法。
Go 語言支援跨平臺交叉編譯,也就是說我們可以在 Windows 或 Mac 平臺下編寫程式碼,並且將程式碼編譯成能夠在 Linux amd64 伺服器上執行的程式。
對於簡單的專案,通常我們只需要將編譯後的二進位制檔案拷貝到伺服器上,然後設定為後臺守護行程執行即可。
編譯可以通過以下命令或編寫 makefile 來操作。
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./bin/bluebell
下面假設我們將本地編譯好的 bluebell 二進位制檔案、組態檔和靜態檔案等上傳到伺服器的/data/app/bluebell
目錄下。
補充一點,如果嫌棄編譯後的二進位制檔案太大,可以在編譯的時候加上-ldflags "-s -w"
引數去掉符號表和偵錯資訊,一般能減小20%的大小。
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o ./bin/bluebell
如果還是嫌大的話可以繼續使用 upx 工具對二進位制可執行檔案進行壓縮。
我們編譯好 bluebell 專案後,相關必要檔案的目錄結構如下:
├── bin │ └── bluebell ├── conf │ └── config.yaml ├── static │ ├── css │ │ └── app.0afe9dae.css │ ├── favicon.ico │ ├── img │ │ ├── avatar.7b0a9835.png │ │ ├── iconfont.cdbe38a0.svg │ │ ├── logo.da56125f.png │ │ └── search.8e85063d.png │ └── js │ ├── app.9f3efa6d.js │ ├── app.9f3efa6d.js.map │ ├── chunk-vendors.57f9e9d6.js │ └── chunk-vendors.57f9e9d6.js.map └── templates └── index.html
nohup 用於在系統後臺不結束通話地執行命令,不結束通話指的是退出執行命令的終端也不會影響程式的執行。
我們可以使用 nohup 命令來執行應用程式,使其作為後臺守護行程執行。由於在主流的 Linux 發行版中都會預設安裝 nohup 命令工具,我們可以直接輸入以下命令來啟動我們的專案:
sudo nohup ./bin/bluebell conf/config.yaml > nohup_bluebell.log 2>&1 &
其中:
./bluebell conf/config.yaml是我們應用程式的啟動命令
nohup ... &表示在後臺不結束通話的執行上述應用程式的啟動命令
> nohup_bluebell.log表示將命令的標準輸出重定向到 nohup_bluebell.log 檔案
2>&1表示將標準錯誤輸出也重定向到標準輸出中,結合上一條就是把執行命令的輸出都定向到 nohup_bluebell.log 檔案
上面的命令執行後會返回程序 id
[1] 6338
當然我們也可以通過以下命令檢視 bluebell 相關活動程序:
ps -ef | grep bluebell
輸出:
root 6338 4048 0 08:43 pts/0 00:00:00 ./bin/bluebell conf/config.yaml root 6376 4048 0 08:43 pts/0 00:00:00 grep --color=auto bluebell
此時就可以開啟瀏覽器輸入http://伺服器公網ip:埠
檢視應用程式的展示效果了。
Supervisor 是業界流行的一個通用的程序管理程式,它能將一個普通的命令列程序變為後臺守護行程,並監控該程序的執行狀態,當該程序異常退出時能將其自動重啟。
首先使用 yum 來安裝 supervisor:
如果你還沒有安裝過 EPEL,可以通過執行下面的命令來完成安裝,如果已安裝則跳過此步驟:
sudo yum install epel-release
安裝 supervisor
sudo yum install supervisor
Supervisor 的組態檔為:/etc/supervisord.conf ,Supervisor 所管理的應用的組態檔放在 /etc/supervisord.d/ 目錄中,這個目錄可以在 supervisord.conf 中的include
設定。
[include] files = /etc/supervisord.d/*.conf
啟動supervisor服務:
sudo supervisord -c /etc/supervisord.conf
我們在/etc/supervisord.d
目錄下建立一個名為bluebell.conf
的組態檔,具體內容如下。
[program:bluebell] ;程式名稱 user=root ;執行程式的使用者 command=/data/app/bluebell/bin/bluebell /data/app/bluebell/conf/config.yaml ;啟動檔案路徑 專案組態檔路徑 directory=/data/app/bluebell/ ;命令執行的目錄 stopsignal=TERM ;重啟時傳送的訊號 autostart=true ;是否自動啟動 autorestart=true ;是否自動重啟 stdout_logfile=/var/log/bluebell-stdout.log ;標準輸出紀錄檔位置 stderr_logfile=/var/log/bluebell-stderr.log ;標準錯誤紀錄檔位置
建立好組態檔之後,重啟supervisor服務
sudo supervisorctl update # 更新組態檔並重啟相關的程式 sudo supervisorctl status bluebell # 檢視bluebell的執行狀態: sudo supervisorctl restart bluebell # 重啟 sudo supervisorctl start bluebell # 啟動
輸出:
bluebell RUNNING pid 10918, uptime 0:05:46
最後補充一下常用的supervisr管理命令:
supervisorctl status # 檢視所有任務狀態 supervisorctl shutdown # 關閉所有任務 supervisorctl start 程式名 # 啟動任務 supervisorctl stop 程式名 # 關閉任務 supervisorctl reload # 重啟supervisor
接下來就是開啟瀏覽器檢視網站是否正常了。
在需要靜態檔案分離、需要設定多個域名及證書、需要自建負載均衡層等稍複雜的場景下,我們一般需要搭配第三方的web伺服器(Nginx、Apache)來部署我們的程式。
正向代理可以簡單理解為使用者端的代理,你存取牆外的網站用的那個屬於正向代理。
反向代理可以簡單理解為伺服器的代理,通常說的 Nginx 和 Apache 就屬於反向代理。
Nginx 是一個免費的、開源的、高效能的 HTTP 和反向代理服務,主要負責負載一些存取量比較大的站點。Nginx 可以作為一個獨立的 Web 服務,也可以用來給 Apache 或是其他的 Web 服務做反向代理。相比於 Apache,Nginx 可以處理更多的並行連線,而且每個連線的記憶體佔用的非常小。
EPEL 倉庫中有 Nginx 的安裝包。如果你還沒有安裝過 EPEL,可以通過執行下面的命令來完成安裝:
sudo yum install epel-release
安裝nginx
sudo yum install nginx
安裝完成後,執行下面的命令設定Nginx開機啟動:
sudo systemctl enable nginx
啟動Nginx
sudo systemctl start nginx
檢視Nginx執行狀態:
sudo systemctl status nginx
通過上面的方法安裝的 nginx,所有相關的組態檔都在 /etc/nginx/
目錄中。Nginx 的主組態檔是 /etc/nginx/nginx.conf
。
預設還有一個nginx.conf.default
的組態檔範例,可以作為參考。你可以為多個服務建立不同的組態檔(建議為每個服務(域名)建立一個單獨的組態檔),每一個獨立的 Nginx 服務組態檔都必須以 .conf
結尾,並儲存在 /etc/nginx/conf.d
目錄中。
補充幾個 Nginx 常用命令。
nginx -s stop # 停止 Nginx 服務 nginx -s reload # 重新載入組態檔 nginx -s quit # 平滑停止 Nginx 服務 nginx -t # 測試組態檔是否正確
我們推薦使用 nginx 作為反向代理來部署我們的程式,按下面的內容修改 nginx 的組態檔。
worker_processes 1; # 工作程序 events { worker_connections 1024; # 連線數 } http { include mime.types; # 預設設定 default_type application/octet-stream; # 預設設定 sendfile on; keepalive_timeout 65; # 超時時間 server { # server組 listen 80; # nginx監聽埠 server_name localhost; # 服務的域名 access_log /var/log/bluebell-access.log; # 存取紀錄檔 error_log /var/log/bluebell-error.log; # 錯誤紀錄檔 location / { # 存取 / 根下的所有路徑,反向代理從80轉到8084 proxy_pass http://127.0.0.1:8084; 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; } } }
執行下面的命令檢查組態檔語法:
nginx -t
執行下面的命令重新載入組態檔:
nginx -s reload
接下來就是開啟瀏覽器檢視網站是否正常了。
當然我們還可以使用 nginx 的 upstream 設定來新增多個伺服器地址實現負載均衡。
worker_processes 1; # 工作程序 events { worker_connections 1024; # 連線數 } http { include mime.types; # 預設設定 default_type application/octet-stream; # 預設設定 sendfile on; keepalive_timeout 65; # 超時時間 # 負載均衡backend為組名 upstream backend { server 127.0.0.1:8084; # 這裡需要填真實可用的地址,預設輪詢 #server backend1.example.com; #server backend2.example.com; } server { # server組 listen 80; # nginx監聽埠 server_name localhost; # 服務的域名 access_log /var/log/bluebell-access.log; # 存取紀錄檔 error_log /var/log/bluebell-error.log; # 錯誤紀錄檔 location / { # 存取 / 根下的所有路徑,反向代理從80轉到8084 proxy_pass http://backend/; # 負載均衡組名 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; } } }
上面的設定是簡單的使用 nginx 作為反向代理處理所有的請求並轉發給我們的 Go 程式處理,其實我們還可以有選擇的將靜態檔案部分的請求直接使用 nginx 處理,而將 API 介面類的動態處理請求轉發給後端的 Go 程式來處理。
下面繼續修改我們的 nginx 的組態檔來實現上述功能。
指定靜態檔案所在路徑,防止前端拼接的介面,後端沒有。重新整理後404情況
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name bluebell; access_log /var/log/bluebell-access.log; error_log /var/log/bluebell-error.log; # 靜態檔案請求,以下面這些結尾的請求 location ~ .*.(gif|jpg|jpeg|png|js|css|eot|ttf|woff|svg|otf)$ { access_log off; expires 1d; root /data/app/bluebell; # 指定靜態檔案所在路徑,防止前端拼接的介面,後端沒有。重新整理後404情況 } # index.html頁面請求 # 因為是單頁面應用這裡使用 try_files 處理一下,避免重新整理頁面時出現404的問題 location / { root /data/app/bluebell/templates; # 指定index.html前端檔案所在路徑 index index.html; try_files $uri $uri/ /index.html; # 所有的請求最後指向index.html } # API請求 location /api { proxy_pass http://127.0.0.1:8084; 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; } } }
前後端的程式碼沒必要都部署到相同的伺服器上,也可以分開部署到不同的伺服器上,下圖是前端服務將 API 請求轉發至後端服務的方案。
上面的部署方案中,所有瀏覽器的請求都是直接存取前端服務,而如果是瀏覽器直接存取後端API服務的部署模式下,如下圖。
此時前端和後端通常不在同一個域下,我們還需要在後端程式碼中新增跨域支援。
這裡使用github.com/gin-contrib/cors庫來支援跨域請求。
最簡單的允許跨域的設定是使用cors.Default()
,它預設允許所有跨域請求。
func main() { router := gin.Default() // same as // config := cors.DefaultConfig() // config.AllowAllOrigins = true // router.Use(cors.New(config)) router.Use(cors.Default()) router.Run() }
此外,還可以使用cors.Config
自定義具體的跨域請求相關設定項:
package main import ( "time" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() // CORS for https://foo.com and https://github.com origins, allowing: // - PUT and PATCH methods // - Origin header // - Credentials share // - Preflight requests cached for 12 hours router.Use(cors.New(cors.Config{ AllowOrigins: []string{"https://foo.com"}, AllowMethods: []string{"PUT", "PATCH"}, AllowHeaders: []string{"Origin"}, ExposeHeaders: []string{"Content-Length"}, AllowCredentials: true, AllowOriginFunc: func(origin string) bool { return origin == "https://github.com" }, MaxAge: 12 * time.Hour, })) router.Run() }
以上就是Golang專案搭配nginx部署反向代理負載均衡講解的詳細內容,更多關於Golang nginx反向代理部署負載均衡的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45