【Go语言】shell,golang 和nginx

本文涉及到一些看起来很高大上的东西,恩,每天搞这个自己感觉也高大上起来了呢

首先我们一切的一切都需要Linux环境作支撑,当然这是工作所需并不是我在故弄玄虚。有两种方法可以解决Linux的问题:双系统或者虚拟机。区别用一句话来说就是你能不能同时在机子上出现两个系统:如果不能,那么就是单独的系统,如果可以那就是虚拟机。两种方式的优劣不想做过多的探究。不管哪一种方式能有Linux环境就能开始工作了,很不幸有些奇葩就两种都有。比如我。Ubuntu和CentOS都是可选的系统。在自己机子上安装虚拟机的话需要一个软件VMware。其实这个东西已经不仅仅是一个软件了,很大程度上,虚拟机,就指的是这货。具体使用我不像过多探究,总之这个东西在加上Linux系统的iso系统安装包就可以在自己机子上出现一个Linux。

现在假设你的机子上已经出现了Linux系统了。如果说在Linux下面还使用图形界面的话,那么真的就是属于暴殄天物了。打开命令行的方式不同的系统有不同方式,而最常见的就是ctrl+alt+f2 –f7。怎么理解这个呢?Linux是多用户的系统,每当你打开一个命令行的时候你就是一个新的用户,于是你现在可以按不同的 f 键打开不同的窗口。而 f 1 是返回到图形界面。默认的用户是系统登录用户,不是root ,怎么快速的分辨出是不是root用户只需要看每一行光标前面是 $ 还是 # :如果是root 用户最前面应该是 # 。su 命令可以切换root 用户。一般都是会让你填写root用户的密码的。

这是我这几天工作时候电脑的画面

我们来简单总结一下我用过的Linux shell 指令吧:
su  转换root  用户
exit  退出当前用户、退出
who am i    查看自己是哪个用户
who :查看一共都有哪几个用户
which  XXX   查看某程序的路径

ifconfig  查看ip
netstat -an  查看网络连接状况
ping XXX    ping某一个网址
cd  打开文件夹
dir  列出文件夹所有文件

vim filename   打开Vim编辑器编辑文件
cat filename    查看某一个文件
yum install  XXX  安装某一个软件
wget XXX  访问某一网络地址

我用到的暂时就这么几个,或者说还有的我没记得很清楚,shell  有一个很强大的体系,一个优秀的程序员必定是一个shell 很熟悉的程序员。慢慢学,不着急。

在虚拟机和自己的系统使用当中经常会不知道鼠标究竟是在哪一个系统上,VMware 的快捷键是ctrl + alt 可以从虚拟机中出来,用鼠标点虚拟机屏幕则可以进去。
你觉得频繁的转换很麻烦的话当然会有解决方式:远程登陆。既然是一个系统,那么那就是一台电脑,虽然是虚拟的。于是便有了一个软件:PuTTY。我用的是这一个,当然还有很多很多这种远程连接的软件,Linux 的世界远远比我们想象中广阔的多。这个软件允许远程连接一台电脑,不管是什么系统。于是我用这个软件就可以再windows下面控制一台Linux 机器了是不是很爽呢!其实一点都不爽,这个东西只能命令行。不过高手都是用命令行控制机器的。恩恩。

既然是做Golang的项目,那么就是说首先要在Linux下面安装好Golang 的环境,让go跑起来。具体安装方法可以借鉴以下一篇博客。主要步骤就是  yum install golang ,然后就自己去安装了。噢噢对了你想这么方便的用yum这种方式直接安装软件你必须要有一个代码库,如果没有这个的话很多安装就找不到路径了。
主要的步骤就是:
1、下载golang
2、 配置环境
3、检验测试
如下图:

原谅我直接截图,因为我觉着这样子看起来很不错。对提供帮助的博客们致敬!

安装golang 以后应该可以在命令行输入 go 然后就会有很多东西输出。如果想查看版本则需要输入 go -V ,大写,小写的v会有其他效果。 主要配置的东西就是环境变量了,你要记得有两个很重要:$GOPATH 和$GOROOT 。$GOPATH是golang代码位置,$GOROOT是golang 安装的那个bin目录。这两个配置好一般是不会有什么请问题的。

当你的机子上可以跑起来Go的时候那么很多工作已经做完了。
让我们来写一个最简单的hello world 吧。
vim hello.go
你会看到一个编辑框,这个东西叫vim,传说中最性感的编辑器,Linux 必备利器。然后你就要写代码了。写好后保存退出。命令是 【esc :wq 】即先按退出,然后冒号,然后wq 就可保存退出。然后你可以cat hello.go 查看这个文件内容,如果有错还可以用vim去编辑。文件无误的情况下你就可以编译运行了。go run hello.go  然后等几秒钟你就可以看到运行结果。是不会很简单呢?当然这一切都是建立在你是 root 用户的基础上。如果你没有转换用户,你无法编辑文件。怎么转换,以及怎么判断自己是什么用户,前面已经说明了。

关于nginx ,其实我一直不知道这个东西是做啥的,感觉和apache 是一样的啊,不过我对apache也没有很深研究。我要做的事情是搭建好nginx 然后去访问nginx status这个东西,它是查看nginx状态的一个东西。我要做的事情是原来这是一个shell脚本,我需要重新用golang写一遍,然后达到同样的效果。方法有两种,第一种是直接在golang中区调用shell ,用上一篇博客的方法去处理;第二种是用golang自己的方法去处理。我从上周四接触到这个任务,到今天应该是有4天了,第一天装系统,第二天看源码,第三天实现golang调用shell,然后今天发现原来直接用golang去处理竟然会如此简单!恩,走错的路到底应不应该继续走下去我是不好说,但是如果写程序不懂得变通那么永远都不会进步。于是我发现我三天的工作其实2个小时就搞定的时候其实是很兴奋的。下面来讲讲我都做了一些什么事情。

网上有很多很多nginx_status的配置解释等等东西,大家感兴趣的话可以去看看。我要说的事情是怎么去处理这个请求。假设你的电脑上安装好了nginx,并且都配置好了,那么你打开浏览器输入 ip+nginx_status 应该是能看到一些东西的。类似下图:

他们具体代表什么意思?,看下图:

咦?怎么不小心这个图片上还有nginx配置方法……
我要做的事情就是用golang去获取这个网页然后去分析这些东西,并且将相关的数值分隔出来,做成如下的样子:

首先讲讲我的思路吧。用golang 去获取这个界面然后得到了一个byte数组,我要用空格和换行符将相关的数据取出来,例如:Active_connections 和后面的 1,保存下来,然后再取出Reading 和后面的 0 ,保存下来,等等。我是这样做的:首先定位特殊字符,这里特殊字符就是空格和换行,将这些序号做好记录,然后利用golang中很牛逼的slice 切片去处理这个byte数组,逐个输出,最后将key 和value 保存在map中,一切就大功告成。
那么我们就上代码吧:

package main

import (
“fmt”
“io/ioutil”
“log”
“net/http”

)

func getURL(url string) []byte {

res, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
robots, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
log.Fatal(err)
}
//fmt.Printf(“%s”, robots)
return robots

}

var index = []int{}
var status = make(map[string][]byte)

func process(arrByte []byte) []string {
for k, v := range arrByte {

if v == 10 {
index = append(index, k)
//fmt.Println(“###换行###”, k)
//fmt.Println(index)
}
if v == 32 {
index = append(index, k)
//fmt.Println(“***空格****”, k)
//fmt.Println(index)
}

}
fmt.Println(index)
fmt.Println(“***********************************”)

Active_connections_key := arrByte[:index[1]]
Active_connections_vaule := arrByte[index[1]:index[2]]

server_requests_key := arrByte[index[3]:index[4]]
server_requests_value := arrByte[index[8]:index[9]]

accepts_requests_key := arrByte[index[4]:index[5]]
accepts_requests_value := arrByte[index[9]:index[10]]

handled_requests_key := arrByte[index[5]:index[6]]
handled_requests_value := arrByte[index[10]:index[11]]

Reading_key := arrByte[index[12]:index[13]]
Reading_value := arrByte[index[13]:index[14]]

Writing_key := arrByte[index[14]:index[15]]
Writing_value := arrByte[index[15]:index[16]]

Waiting_key := arrByte[index[16]:index[17]]
Waiting_value := arrByte[index[17]:index[18]]

fmt.Printf(“%s”, Active_connections_key)
fmt.Printf(“%s”, Active_connections_vaule)

fmt.Printf(“%s”, server_requests_key)
fmt.Printf(“%s”, server_requests_value)

fmt.Printf(“%s”, accepts_requests_key)
fmt.Printf(“%s”, accepts_requests_value)

fmt.Printf(“%s”, handled_requests_key)
fmt.Printf(“%s”, handled_requests_value)

fmt.Printf(“%s”, Reading_key)
fmt.Printf(“%s”, Reading_value)

fmt.Printf(“%s”, Writing_key)
fmt.Printf(“%s”, Writing_value)

fmt.Printf(“%s”, Waiting_key)
fmt.Printf(“%sn”, Waiting_value)

fmt.Println(“***********************************”)

status["Active_connections"] = Active_connections_vaule
status["server_requests"] = server_requests_value
status["accepts_requests"] = accepts_requests_value
status["handled_requests"] = handled_requests_value
status["Reading"] = Reading_value
status["Writing"] = Writing_value
status["Waiting"] = Waiting_value

for k, v := range status {
fmt.Printf(“%s%sn”, k, v)
}
return nil
}

func main() {

status := getURL(“http://192.168.16.172/nginx_status”)

fmt.Printf(“%s”, status)
process(status)

}

上面的代码在Linux 和Windows 下面都能运行,你要在最后面改一下你的IP,如果nginx的配置正常,那么应该不会有什么问题。最后运行的结果如下:

恩,这篇博客写了两天,我觉得写得很值得,如果每一篇博客都能有这样的感觉,那么C2P的崛起指日可待!

刘凯宁@C2P
2014年7月15日

 

 

 

Share

【Go语言】shell,golang 和nginx》上有 3 条评论

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*


*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>