利用systemd部署golang项目的实现方法
简介
-CentOS7继承了RHEL7的新的特性,例如强大的systemd,而systemd的使用也使得以往系统服务的/etc/init.d的启动脚本的方式就此改变,也大幅提高了系统服务的运行效率。但服务的配置和以往也发生了极大的不同,同时变的简单而易用了许多。
-CentOS7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统system和用户user之分,即:/usr/lib/systemd/system和/usr/lib/systemd/user
配置文件
-这里我们先要说明一下unit的文件位置,一般主要有三个目录:
/lib/systemd/system /run/systemd/system /etc/systemd/system
-这三个目录的配置文件优先级依次从低到高,如果同一选项三个地方都配置了,优先级高的会覆盖优先级低的。系统安装时,默认会将unit文件放在/lib/systemd/system目录。如果我们想要修改系统默认的配置,比如nginx.service,一般有两种方法:
-在/etc/systemd/system目录下创建nginx.service文件,里面写上我们自己的配置。
-在/etc/systemd/system下面创建nginx.service.d目录,在这个目录里面新建任何以.conf结尾的文件,然后写入我们自己的配置。推荐这种做法。
-/run/systemd/system这个目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时,即Session级别的,才在这里做修改。
服务配置
-每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install],就以nginx为例吧,具体内容如下:
[Unit] Description=nginx-highperformancewebserver Documentation=http://nginx.org/en/docs/ After=network.targetremote-fs.targetnss-lookup.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx-t-c/usr/local/nginx/conf/nginx.conf ExecStart=/usr/local/nginx/sbin/nginx-c/usr/local/nginx/conf/nginx.conf ExecReload=/bin/kill-sHUP$MAINPID ExecStop=/bin/kill-sQUIT$MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
配置项说明
-下面分别解释下着三部分的含义
[Unit]
-Description:服务的简单描述
-Documentation:服务文档
-After=:依赖,仅当依赖的服务启动之后再启动自定义的服务单元
[Service]
-Type:启动类型simple、forking、oneshot、notify、dbus
- -Type=simple(默认值):systemd认为该服务将立即启动,服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型
- -Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程。
- -Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置RemainAfterExit=yes使得systemd在服务进程退出之后仍然认为服务处于激活状态。
- -Type=notify:与Type=simple相同,但约定服务会在就绪后向systemd发送一个信号,这一通知的实现由libsystemd-daemon.so提供
- -Type=dbus:若以此方式启动,当指定的BusName出现在DBus系统总线上时,systemd认为服务就绪。
-PIDFile:pid文件路径
-Environment:环境变量(可以添加多个)eg:Environment=REPO_REF=dev
-ExecStartPre:启动前要做什么,上文中是测试配置文件-t
-ExecStart:启动
-ExecReload:重载
-ExecStop:停止
-PrivateTmp:True表示给服务分配独立的临时空间
[Install]
-WantedBy:服务安装的用户模式,从字面上看,就是想要使用这个服务的有是谁?上文中使用的是:multi-user.target,就是指想要使用这个服务的目录是多用户。
操作示例
-每一个.target实际上是链接到我们单位文件的集合,当我们执行
systemctlenablenginx.service
-就会在/etc/systemd/system/multi-user.target.wants/目录下新建一个/usr/lib/systemd/system/nginx.service文件的链接。
常用的service操作
#自启动 systemctlenablenginx.service #禁止自启动 systemctldisablenginx.service #启动服务 systemctlstartnginx.service #停止服务 systemctlstopnginx.service #重启服务 systemctlrestartnginx.service #查看Unit定义文件 systemctlcatnginx.service #编辑Unit定义文件 systemctleditnginx.service #重新加载Unit定义文件 systemctlreloadnginx.service #列出已启动的所有unit,就是已经被加载到内存中 systemctllist-units #列出系统已经安装的所有unit,包括那些没有被加载到内存中的unit systemctllist-unit-files #查看服务的日志 journalctl-unginx.service#还可以配合`-b`一起使用,只查看自本次系统启动以来的日志 #查看所有target下的unit systemctllist-unit-files--type=target #查看默认target,即默认的运行级别。对应于旧的`runlevel`命令 systemctlget-default #设置默认的target systemctlset-defaultmulti-user.target #查看某一target下的unit systemctllist-dependenciesmulti-user.target #切换target,不属于新target的unit都会被停止 systemctlisolatemulti-user.target systemctlpoweroff#关机 systemctlreboot#重启 systemctlrescue#进入rescue模式
Systemd+GolangDemo
-下面例子通过Systemd部署一个最简单的GolangWebServer
packagemain import( "flag" "fmt" "log" "net/http" ) funcmain(){ varaddressstring flag.StringVar(&address,"address","5353","listenaddress") flag.Parse() http.HandleFunc("/",func(whttp.ResponseWriter,r*http.Request){ fmt.Fprintf(w,"Hello,Thisisatestforsystemd!\n") })//设置访问路由 log.Printf("Startingserveron%s\n",address) log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s",address),nil)) }
-编译代码,并将可执行文件同步到远程服务器上
CGO_ENABLED=0GOOS=linuxGOARCH=amd64gobuild-osystemd-testmain.go rsync-zP./systemd-testroot@gp-aliyun:/usr/local/bin/
-在远程服务器上编写服务配置,放在/etc/systemd/system/中
[Unit] Description=SystemdTest After=network.target [Service] User=nobody #Execute`systemctldaemon-reload`afterExecStart=ischanged. ExecStart=/usr/local/bin/systemd-test-address"6060" [Install] WantedBy=multi-user.target
-通过systemctl启动服务
#每一次修改ExecStart都需执行 systemctldaemon-reload #启动 systemctlstartsystemd-test.service #查看状态 systemctlstatussystemd-test.service
-状态如下
-可以通过curl进行测试:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。