那时候刚好下着雨,柏油路面湿冷冷的,还闪烁着青、黄、红颜色的灯火。



Golang学习之配制服务器环境


Golang学习之配制服务器环境

学习Golang也有一段时间了,并且已经有几个项目已经在线上跑着了,虽然项目本身并不大,但无论怎样还是有那么一点点的小成就的。从php到python再到lua,最后到golang外加一个ReactJs,这一路走来或多或少都有一收获吧。

前言

好久没有更新文章了,以前说好的周更,这回可真算是变成了月更啊...

年底没有更新文章确实是因为太忙了,年后没有更新也是因为刚回北京有很多事情还得忙。从工和到生活都有各种各样的事情堵着,但话又说回来,似乎还有些享受着这种忙碌的感觉呢。

安装 Golang

各个系统的安装方式都大同小异,具体的安装方请以官方的文档为准,建议安装最新的版本,听说最新的1.8版本性能比过java的性能了...不知道是真是假。

Ubuntu, CentOS, MacOS

官网GoLang下载地址: https://golang.org/dl/

苹果下载的是.pkg文件,所以直接双击打开一步一步安装就行了,比较无脑,也应该是最简单的了。

若下载的是linux版本

  1. 解压软件包 $ tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz
  2. 设置环境变量
$ export PATH=$PATH:/usr/local/go/bin
  1. 试试是否是go命令
$ go version

若有版本信息显示,那就表示安装成功了。

输出一个hello world

  1. 创建一个目录
  2. 设置go的环境变量
  3. 创建一个go文件
  4. 获取第三方资源, 咱们以gin-gonic框架为例
  5. 创建自己的目录
  6. 创建main.go文件
  7. 键入go代码
$ cd $HOME
$ mkdir hello
$ cd hello
$ export GOPATH=$HOME/hello
$ go get gopkg.in/gin-gonic   // 可能需要翻墙,若下载不下来 自己想办法
$ mkdir -p src/lualu.co
$ cd src/lualu.co
$ touch main.go
$ vim main.go

main.go

package main

import "gopkg.in/gin-gonic/gin.v1"

func main() {
    router := gin.Default()
    router.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "hello": "world",
        })
    })
    router.Run()
}

router.Run() 默认监听的是8080端口,可以修改为其他端口例如: router.Run(":9090")

保存文件

$ go run main.go

若有类似以下信息显示 就表示启动功能了。

打开浏览器输入 http://localhost:8080 应该会输出一串json

开发工具

jetbrains版的正式版本"Goland IDE"发布之前,我们暂且使用phpstorm进行开发,只需要安装一个插件就可以愉快的写go代码了,还是非常强大的。

cmd + , 打开设置,找到Plugins选项目,并搜索"go"关键字,在如下图这个插件,安装好重启phpstorm就好了。

使用phpstorm打开项目,需要设置一个go sdk

同样使用cmd + ,打开设置,进行"Languages & Frameworks"项,选择"Go"下面的"Go SDK"

路径(Path)选择你的go所安装的目录就好啦。

Go SDK 设置好后,还需要设置 Go的 Libraries,也就是你所使用的其他包的位置。

同样 cmd + , 打开设置 找到"Languages & Frameworks" 下的 "Go" 下的 "Go Libraries"

里面有两种模式第一种是"Global Libraries",这个表示局的库的位置,第二种是当前项目的库的位置,这个根据需求自己去设置。

保存后ide就自动索引了。

然后我们就可以愉快的写go程序了。

生成可执行文件

编译语言的好处就是可以不依赖环境,只要咱们把它编译成二进制文件后理论上应该在其他平台也是可以直接执行的。

go 提供了几个命令

  • go install
  • go build

我比较喜欢使用 go build

回到刚刚的程序,咱们把程序build一下, 我们先创建一个bin目录,一会把可执行文件build到bin目录下去。

$ mkdir bin
$ go build -o ../bin/main_http_server

若build成功了,../bin目录下应该会有一个main_http_server的可执行文件,咱们进去bin目录

$ cd ../bin
$ ./main_http_server

应该就启动了。

让go程序常驻后台

让go常驻所台的方式有很多,比较常用的是使用Supervisor, 所以这里咱们不以Supervisor来进行简单的配制吧。

Supervisor 安装与配制

  • 版本: 3.x+
yum install supervisor

// 若只有 /etc/supervisor.conf 并没有包含 conf.d 的话 则只在 supervisor.conf 末尾加入就行了

touch /etc/supervisor/conf.d/golang_http_server.conf
vim /etc/supervisor/conf.d/golang_http_server.conf

然后输入以下代码:

[program:golang-http-server]
command=/home/lualu.co/hello/src/lualu.co/bin/main_http_server
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/golang-http-server.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/golang-http-server.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
  • command: 启动命令的路径
  • autostart: 是否自动启动
  • autorestart: 是否自动重新启动
  • startsecs: 每隔10秒检测一次进程是否挂掉

启动服务:

$ /usr/bin/supervisord -c /etc/conf.d/golang_http_server.conf

查看supervisor运行状态:

$ supervisorctl
$ ps -ef | grep supervisord
$ ps -ef | grep main_http_server

Nginx 代理到 go

这个就比较简单了, 通过nginx代理转发,若有多台go的server 那么可以在 upstream goServer下设置多台服务器,比如:

upstream goServer {
   server 192.168.56.101:8080;
   server 192.168.56.102:8080;
   server 192.168.56.103:8080;
   server 192.168.56.104:8080;
}

**ngx 配制: **

http {

    # 部份默认参考略...

    upstream goServer {
        server 127.0.0.1:8080;
    }
  
    server {
        listen       80;
        server_name  lualu.co;

        charset utf-8;

        access_log  logs/lualu.co.access.log;
        error_log logs/lualu.co.error.log;

        location / {
            proxy_pass http://goServer;

            proxy_connect_timeout 300s;
            proxy_send_timeout 300s;
            proxy_read_timeout 300s;
            proxy_buffer_size 64k;
            proxy_buffers 4 64k;
            proxy_busy_buffers_size 64k;
            proxy_temp_file_write_size 64k;
            proxy_headers_hash_max_size 51200;
            proxy_headers_hash_bucket_size 6400;

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header X-XSRF-TOKEN;
        }
    }
}

上面配制就是把所以的请求来源全部转发到 http://goServer 也就是 upstream 上面所设置的那些机器中的某一台,若只有本机可以直接写成 http://127.0.0.1:8080 那么就全部转发到本机的8080 端口了。

尾巴

从开发到部署,一整套流程就算是完成了。

差体来说还是比较简单,相对于php、nodejs、java 等语言来说。具体有多少坑,我还在学习、尝试,希望未来有更多有关go方面的知道分享给大家。

每学习一门新的语言都需要付出一定的时间、精力。当然技多不压身,如何运用这些技术的特性,把它用在最合适它的地方还是需要一些尝试的。

最近我想把整站换成go,有时间慢慢弄吧,毕竟东西还不少。

大家加油!


 标签 , TAG , 啦啦