日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

golang应用部署

發布時間:2025/6/15 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang应用部署 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

程序開發完畢之后,我們現在要部署Web應用程序了,但是我們如何來部署這些應用程序呢?因為Go程序編譯之后是一個可執行文件,編寫過C程序的讀者一定知道采用daemon就可以完美的實現程序后臺持續運行,但是目前Go還無法完美的實現daemon,因此,針對Go的應用程序部署,我們可以利用第三方工具來管理,第三方的工具有很多,例如Supervisord、upstart、daemontools等,這小節我介紹目前自己系統中采用的工具Supervisord。

daemon

目前Go程序還不能實現daemon,詳細的見這個Go語言的bug:,大概的意思說很難從現有的使用的線程中fork一個出來,因為沒有一種簡單的方法來確保所有已經使用的線程的狀態一致性問題。

但是我們可以看到很多網上的一些實現daemon的方法,例如下面兩種方式:

  • MarGo的一個實現思路,使用Commond來執行自身的應用,如果真想實現,那么推薦這種方案
d := flag.Bool("d", false, "Whether or not to launch in the background(like a daemon)") if *d {cmd := exec.Command(os.Args[0],"-close-fds","-addr", *addr,"-call", *call,)serr, err := cmd.StderrPipe()if err != nil {log.Fatalln(err)}err = cmd.Start()if err != nil {log.Fatalln(err)}s, err := ioutil.ReadAll(serr)s = bytes.TrimSpace(s)if bytes.HasPrefix(s, []byte("addr: ")) {fmt.Println(string(s))cmd.Process.Release()} else {log.Printf("unexpected response from MarGo: `%s` error: `%v`\n", s, err)cmd.Process.Kill()} }
  • 另一種是利用syscall的方案,但是這個方案并不完善:
package mainimport ("log""os""syscall" )func daemon(nochdir, noclose int) int {var ret, ret2 uintptrvar err uintptrdarwin := syscall.OS == "darwin"// already a daemonif syscall.Getppid() == 1 {return 0}// fork off the parent processret, ret2, err = syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)if err != 0 {return -1}// failureif ret2 < 0 {os.Exit(-1)}// handle exception for darwinif darwin && ret2 == 1 {ret = 0}// if we got a good PID, then we call exit the parent process.if ret > 0 {os.Exit(0)}/* Change the file mode mask */_ = syscall.Umask(0)// create a new SID for the child processs_ret, s_errno := syscall.Setsid()if s_errno != 0 {log.Printf("Error: syscall.Setsid errno: %d", s_errno)}if s_ret < 0 {return -1}if nochdir == 0 {os.Chdir("/")}if noclose == 0 {f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)if e == nil {fd := f.Fd()syscall.Dup2(fd, os.Stdin.Fd())syscall.Dup2(fd, os.Stdout.Fd())syscall.Dup2(fd, os.Stderr.Fd())}}return 0 }

上面提出了兩種實現Go的daemon方案,但是我還是不推薦大家這樣去實現,因為官方還沒有正式的宣布支持daemon,當然第一種方案目前來看是比較可行的,而且目前開源庫skynet也在采用這個方案做daemon。

Supervisord

上面已經介紹了Go目前是有兩種方案來實現他的daemon,但是官方本身還不支持這一塊,所以還是建議大家采用第三方成熟工具來管理我們的應用程序,這里我給大家介紹一款目前使用比較廣泛的進程管理軟件:Supervisord。Supervisord是用Python實現的一款非常實用的進程管理工具。supervisord會幫你把管理的應用程序轉成daemon程序,而且可以方便的通過命令開啟、關閉、重啟等操作,而且它管理的進程一旦崩潰會自動重啟,這樣就可以保證程序執行中斷后的情況下有自我修復的功能。

我前面在應用中踩過一個坑,就是因為所有的應用程序都是由Supervisord父進程生出來的,那么當你修改了操作系統的文件描述符之后,別忘記重啟Supervisord,光重啟下面的應用程序沒用。當初我就是系統安裝好之后就先裝了Supervisord,然后開始部署程序,修改文件描述符,重啟程序,以為文件描述符已經是100000了,其實Supervisord這個時候還是默認的1024個,導致他管理的進程所有的描述符也是1024.開放之后壓力一上來系統就開始報文件描述符用光了,查了很久才找到這個坑。

Supervisord安裝

Supervisord可以通過sudo easy_install supervisor安裝,當然也可以通過Supervisord官網下載后解壓并轉到源碼所在的文件夾下執行setup.py install來安裝。

  • 使用easy_install必須安裝setuptools

    打開http://pypi.python.org/pypi/setuptools#files,根據你系統的python的版本下載相應的文件,然后執行sh setuptoolsxxxx.egg,這樣就可以使用easy_install命令來安裝Supervisord。

Supervisord配置

Supervisord默認的配置文件路徑為/etc/supervisord.conf,通過文本編輯器修改這個文件,下面是一個示例的配置文件:

;/etc/supervisord.conf [unix_http_server] file = /var/run/supervisord.sock chmod = 0777 chown= root:root[inet_http_server] # Web管理界面設定 port=9001 username = admin password = yourpassword[supervisorctl] ; 必須和'unix_http_server'里面的設定匹配 serverurl = unix:///var/run/supervisord.sock[supervisord] logfile=/var/log/supervisord/supervisord.log ; (main log file;default $CWD/supervisord.log) logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) logfile_backups=10 ; (num of main logfile rotation backups;default 10) loglevel=info ; (log level;default info; others: debug,warn,trace) pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) nodaemon=true ; (start in foreground if true;default false) minfds=1024 ; (min. avail startup file descriptors;default 1024) minprocs=200 ; (min. avail process descriptors;default 200) user=root ; (default is current user, required if root) childlogdir=/var/log/supervisord/ ; ('AUTO' child log dir, default $TEMP)[rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface; 管理的單個進程的配置,可以添加多個program [program:blogdemon] command=/data/blog/blogdemon autostart = true startsecs = 5 user = root redirect_stderr = true stdout_logfile = /var/log/supervisord/blogdemon.log

Supervisord管理

Supervisord安裝完成后有兩個可用的命令行supervisor和supervisorctl,命令使用解釋如下:

  • supervisord,初始啟動Supervisord,啟動、管理配置中設置的進程。
  • supervisorctl stop programxxx,停止某一個進程(programxxx),programxxx為[program:blogdemon]里配置的值,這個示例就是blogdemon。
  • supervisorctl start programxxx,啟動某個進程
  • supervisorctl restart programxxx,重啟某個進程
  • supervisorctl stop all,停止全部進程,注:start、restart、stop都不會載入最新的配置文件。
  • supervisorctl reload,載入最新的配置文件,并按新的配置啟動、管理所有進程。

總結

以上是生活随笔為你收集整理的golang应用部署的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美日韩一区免费 | 久久爱综合网 | 麻豆视频免费看 | 精品一区二区三区视频 | 久久视奸| 亚洲人妻电影一区 | 国产一区二区三区三州 | 探花精品 | 成人在线小视频 | 俄罗斯精品一区二区三区 | 一区在线观看视频 | 国产福利片一区二区 | 久久久香蕉视频 | 天堂网2014av | 一级片麻豆 | 色哟哟免费视频 | 男女做网站 | 日本一区二区三区免费看 | 欧美猛交xxx| 91精品国产色综合久久不卡蜜臀 | 日韩免费福利 | 中文字幕人成乱码熟女香港 | 在线午夜av | 久久精品综合网 | 精品久久久精品 | 欧美人妻精品一区二区三区 | 亚洲无卡 | 香蕉视频18 | 激情六月天婷婷 | 国产精品久久麻豆 | av中文字幕在线免费观看 | 中文字幕 成人 | 中文字幕无码人妻少妇免费 | 在线免费观看视频网站 | 亚洲理伦电影 | 最新91在线 | 色图综合 | 天天综合网久久综合网 | 国产 欧美 日本 | 视频久久精品 | av大片免费看 | 日本黄页网站 | 日韩美女国产精品 | 又黄又爽视频在线观看 | 国产不卡一区 | 欧美成人精品一区二区综合免费 | 中文字幕日韩欧美一区二区三区 | 天天操妹子 | 国产3p在线播放 | 最新中文字幕2019 | 亚洲性大片 | 午夜国产福利在线 | 国产精品免费在线 | 精品国产视频 | 久久在线视频免费观看 | 在线视频 日韩 | 欧美乱轮 | 欧美一级片在线 | 亚洲日本一区二区 | 91在线观看免费高清 | 少妇人妻一区二区 | 精品乱子伦一区二区 | 亚洲人成免费电影 | 久久精品二区 | 我要操av| 亚洲色图五月天 | 午夜影院在线观看18 | 亚洲精品 日韩无码 | 99国产精品无码 | 强睡邻居人妻中文字幕 | 免费成人深夜夜国外 | www.玖玖玖 | 国产伦精品一区二区三区高清 | 日韩性网站 | 亚洲第一福利网站 | 日韩亚洲欧美在线 | 51国产偷自视频区视频 | 老鸭窝av在线 | 综合国产精品 | 亚洲天堂影院 | 绿帽h啪肉np辣文 | 麻豆传媒在线观看 | 国产精品人人妻人人爽 | 国模av在线 | 人妻丰满熟妇av无码区 | 污污的视频在线观看 | 黄色免费在线看 | 黄色片在线观看视频 | 欧美性猛交xxxx乱大交3 | 日韩国产精品一区二区 | 蜜桃精品噜噜噜成人av | 日韩精品色 | 激情五月婷婷丁香 | 人妻无码一区二区三区久久 | 日韩毛片在线播放 | 国产精品4区 | 午夜电影天堂 | 日本色片网站 | 国产吞精囗交免费视频网站 |