易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
using NGINX or not?

using NGINX or not?

有人在stackoverflow上面提问:

I am writing some webservices returning JSON data, which have lots of users.
Would you recommend to use NGINX as a webserver or it is good enough to use the standard http server of Go?

于是有人就回答了:

It depends.

Out of the box, putting nginx in front as a reverse proxy is going to give you:

Access logs
Error logs
Easy SSL termination
SPDY support
gzip support
Easy ways to set HTTP headers for certain routes in a couple of lines
Very fast static asset serving (if you're serving off S3/etc. though, this isn't that relevant)
The Go HTTP server is very good, but you will need to reinvent the wheel to do some of these things (which is fine: it's not meant to be everything to everyone).

I've always found it easier to put nginx in front—which is what it is good at—and let it do the "web server" stuff. My Go application does the application stuff, and only the bare minimum of headers/etc. that it needs to. Don't look at putting nginx in front as a "bad" thing.

还有人回答:

The standard http server of Go is fine. If your application mostly/only are "dynamic" requests/responses, then it's really the best way.

You could use nginx to serve static assets, but most likely the standard Go one is fine for that, too. If you need higher performance you should just use a CDN or cache as much as you can with Varnish (for example).

If you need to serve different applications off the same IP address, nginx is a fine choice for a proxy to distribute requests between the different applications; though I'd more often get Varnish or HAProxy out of the toolbox for that sort of thing.

这回你觉得呢?你还会用nginx吗?还是只用go做http server/???

上海首届GO聚会开始了

上海首届GO聚会开始了

不要犹豫了,上海首届golang聚会就这样悄悄的开始了。Think2Go戈登营(Think技术社区Go语言Camp)首期,再晚你就可能没有机会参加首届聚会了,这次只有30个人,是在一个小小的咖啡馆里举行的。

话题主要由3位达人进行分享:

《开场》 Think社区

《Go语言在CDN下载系统中的应用》谢孟军 盛大云 高级研究员

《Go在微博数据分析中的应用》邵天宇 Buzzreader 高级工程师

《golang与高强度在线服务》韩拓,七牛云 CTO

《OpenTalk》所有参与者

是不是觉得很心动?参加地点其实也不算远(对上海的朋友来说),地方很好找。点评网上也有介绍:http://www.dianping.com/shop/6630958,直接点过去看看就OK了。详细地址在:上海市卢湾区蒙自东路63号(近马当路地铁站3号口)

费用不算太高,98元,应该是都能够承受的价格了。毕竟占用了咖啡店30个座位,别人也要做生意的。。。

上传一张成功的订座票。处女票,值得收藏。。。可惜没有实体的

时隔N久,不再使用量子统计了

时隔N久,不再使用量子统计了

量子统计应该算是我用的时间最长的一个统计程序了吧?看看量子统计上是怎么写的:

名称:飞天小肥猪的简单人生
地址:http://neatstudio.com
类型:电脑科技
开始统计时间:2008-06-25
已统计时间:1897天

之所以不用它。一来它的统计其实并没有那么的精确,二来也经常被人挂马,三来,这么多年来几乎是不思进取。四来,用了腾讯的统计后,发现速度、效果等都远超它了。

于是,今天正式停用量子统计,转用腾讯的统计程序。

go获取当前的公网IP

go获取当前的公网IP

获取公网IP的方法其实很简单,最简单的就是利用dnspod的服务,echo `nc ns1.dnspod.net 6666`,立刻就出来了。于是hugozhu的一段代码就是这样写的:

func GetLocalPublicIpUseDnspod() (string, error) {
timeout := time.Nanosecond * 30
conn, err := net.DialTimeout("tcp", "ns1.dnspod.net:6666", timeout*time.Second)
defer func() {
if x := recover(); x != nil {
log.Println("Can't get public ip", x)
}
if conn != nil {
conn.Close()
}
}()
if err == nil {
var bytes []byte
deadline := time.Now().Add(timeout * time.Second)
err = conn.SetDeadline(deadline)
if err != nil {
return "", err
}
bytes, err = ioutil.ReadAll(conn)
if err == nil {
return string(bytes), nil
}
}
return "", err
}

上面的原始代码在:http://hugozhu.myalert.info/2013/02/26/dynamic-dns-script.html,原文的代码中其实是不能运行的。因为:timeout是个未定义的变量。

OK,不说这个。我在现实中不能使用上面的代码,因为nc ns1.dnspod.net取出来的结果不正确。为什么?因为我用的是铁通,好象会经过一层代理。但是我访问ip138又是可以取到真实的公网IP,所以我使用了如下代码 :

func GetLocalPublicIp() (string, error) {
// `nc ns1.dnspod.cn 6666`
res, err := http.Get("http://iframe.ip138.com/ic.asp")
if err != nil {
return "", err
}
defer res.Body.Close()
result, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
reg := regexp.MustCompile(`\d+\.\d+\.\d+\.\d+`)
return reg.FindString(string(result)), nil
}

上面我用的正则十分简单。就这样写写算了。因为这个页面里就这么一个符合的地方。OK,现在就一切正常了

wget post数据

wget post数据

一直以为wget只是下载点东西的工具。看到一篇网上的文章,才注意到wget原来还可以post数据。

为什么我想用wget来post数据呢?是因为。。。busybox不带curl,而bash版的ddns更新(dnspod的域名更新)是使用curl的。既然curl不支持,我就google了一下:wget能够post数据吗?
果然,第一篇就是:
这段时间需要用wget做一些事情,主要是抓取网页的数据工作,发现wget还是很强大的。下面是一些应用场景:
1. 简单页面的抓取
wget的最基本用法
wget http://domain.com/path/simple_page.html
2. 添加自己的head
有些网站或者页面,需要额外的认证,所以需要添加额外的HTTP Header,使用方法:
wget --header="MyHeader: head_value" http://domain.com/path/page/need_header.php
3. 伪装成浏览器
有些网站,例如facebook,会检测请求方式是否是浏览器,如果不是正常的浏览器,那么会redirect到一个"incompatible browser"的错误页面。这时候需要wget伪装成一个浏览器(我是Mozilla Firefox!):
wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)" http://domain.com/path/page/check_user_agent.php
4. post数据到某个页面
wget不光可以用get方式请求网页,还可以post data的,那样就可以实现自动注册、自动登录了(有验证码的页面除外。。。。)
wget --post-data="user=user1&pass=pass1&submit=Login" http://domain.com/login.php
5. 访问需要登录的页面
有些页面的访问需要登录,访问的时候需要传递cookie,这时候就需要和上面提到的post方式结合。一般过程是:post用户名和密码登录、保存cookie,然后访问页面时附带上cookie。
wget --post-data="user=user1&pass=pass1&submit=Login" --save-cookies=cookie.txt --keep-session-cookies http://domain.com/login.php
wget --load-cookies=cookie.txt http://domain.com/path/page_need_login.php
暂时就探索到这些,以后有什么新的用法,继续补充。
不过,可惜的是,我运行下来之后,还有一个小问题:
https://dnsapi.cn/Record.Ddns: HTTPS support not compiled in.
哎。。。我没有openssl,https不支持啊。。纠结,uis2000的路真难走。
go 进行简单的POST和GET

go 进行简单的POST和GET

用Go来处理GET实在是太简单了。。

u, _ := url.Parse(SMS_URL)
q := u.Query()
q.Set("username", SMS_USER)
q.Set("password", SMS_PASS)
q.Set("mobile", s.To)
q.Set("message", s.Content)
u.RawQuery = q.Encode()
res,err:=http.GET(u.String());
POST分多种,一种是key/value,一种是纯body,还有。。能够上传文件的。这里先不谈上传文件(我还没有用到)
body := bytes.NewBuffer(msg)
res, err := http.Post(http://api.xxx.com/, "application/x-www-form-urlencoded", body)

v := make(url.Values)
v.Set("email", "anything@stathat.com")
v.Set("stat", "messages sent - female to male")
v.Set("count", "1")
res, err := http.PostForm("http://api.xxx.com/", values)
处理res也非常方便:
if err != nil {
log.Fatal(err)
return
}
result, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
log.Fatal(err)
return
}
fmt.Printf("%s", result)
就是这样的方便
转:go语言扫雷

转:go语言扫雷

不要以为扫雷 就是游戏扫雷,其实只不过是扫清程序中可能会遇到的坑。比如原作者写的if else中不能重复定义变量就是一个坑 。我原来想,我要定义一个变量,但他可能会变,特别是[]byte,长度只能用常量。这可怎么办,于是我想直接定义在if else中吧。if a { var a1 [128]byte} elseif b { var a1[256]byte},结果嘛,当然是报错的。。后来才发现这是个坑。当然后面我也解决了这个问题了。。。换个角度make一下。。make的时候就可以用变量了。

以下内容来自:http://my.oschina.net/meilihao/blog/123698

1.//实现前导零出错:sn:="7DC3"+fmt.printf("%05d", uint16(rawdata[2])&0xFF+uint16(rawdata[1]))

&:[fmt.Printf返回的是一个int和一个error,不能与string用+号一起操作]

sn := fmt.Sprintf("%s%05d", "7DC3", uint16(rawdata[2])&0xFF+uint16(rawdata[1]))或fmt.Sprintf("7DC3%05d",uint16(rawdata[2])&0xFF+uint16(rawdata[1]))

2.//fmt.Sprint不能输出

&:根据fmt包API描述,fmt.Sprint是返回字符串,与fmt.Print的标准输出不同.

3.//go run *.go,且*.go引用同一packge中其他文件的函数时,提示undefined "函数名"

&:[go run 时,只会编译当前文件再运行,没有导入其他文件的自定义函数]要先go build 再运行./*

4.//func FormatInt(i int64, base int) string,base的意思

&:base表示进制,如八进制(8),十进制(10)等

5.//在if..else中定义同一个变量出错

&:在golang语法中必须在外面先定义好,再在if..else结构中使用.

6.//go build/install 出错

&:执行命令时需两个条件GOPATH和当前目录下有*.go的文件

7.//panic template: unexpected EOF

&:可能是{{}}标签没有闭合

8.//error信息中template(*Template).Execute

&:检查顺序:先确认go代码正确,然后看调用的模板名称是否正确或已存在,最后检查模板中的golang标签是否正确(或关闭)

9.//http.Get("www.ip138.com") unsupported protocol scheme ""

&:使用http.Get时必须写明使用的协议,应使用http.Get("http://www.ip138.com")
我另外遇到一个问题就是我定义了一下struct,然后我在init前,就

var a struct,但我在使用a.X = 1的时候就报错了。理由是我的a.X没有初始化。起初没看代码说明,后来仔细看了才发现。。。不得已,在var a struct下面加了一行var a.X int。(当然,这得和 sturct中的结构一致)

六种方法全面解释Linux下进程间通信

六种方法全面解释Linux下进程间通信

因为最近在写点东西遇到了这方面的问题。所以关注了一下,这段内容是摘抄来的。因为以前用PHP的时候,一般就是shm_attach/msg_get_queue/ 管道等

有些东西不是特别熟,所以记录下来做笔记

1.socket
2.管道(包括匿名管道适用于父子进程,命名管道)
3.信号量
4.共享内存
5.消息队列

1.socket
socket可以用于本地进程间通信也可以用于远程间,是最常用的。
2.管道--匿名管道
一般用pipe创建,在父子间通信。在父进程中关闭读/写管道,在子进程中关闭写/读管道。
2.管道--命名管道
一般用mkfifo来创建。如果没有说明管道是非阻塞的,那么一个为读打开的管道将阻塞直到有进程为写打开此FIFO。同样如果为写打开的管道将阻塞直到有进程为读打开此FIFO。
3.信号量
一个进程可以用kill发送信号至另外一个进程。
4.共享内存
使用函数:shmget、shmat、shmctl、shmdt
用shmget函数得到一块内存,并用shmat设置为允许本进程使用这块共享内存。使用完以后用shmdt删除内存块。
5.消息队列
使用函数:msgget、msgsnd、msgrcv、msgctl
使用步骤同上。
BAE的坑

BAE的坑

自从GAE出来后。什么SAE,ACE,BAE什么什么的就全部出来了

ACE我跑几个程序一直有问题,禁用了一些函数,所以我最近在看BAE。速度也不错,也能绑域名。所以它就成了首选。但BAE有一个坑 需要注意
如果你的程序的上传没有改过。那么一般都是上传在自己当前的项目目录里,而这个目录由于没有经过svn上传,所以它并不在版本库里,因此,一旦碰到BAE来一个svn迁移的事件。或者更新的时候,极有可能你上传的那些附件会全部丢失。
慎重。我就觉得BAE就象一个实验室。我们上传代码到BAE的svn库里。然后svn库会自动 checkout到BAE的平台。于是。。如果他们要迁移了。这些数据应该都是直接delete。然后再checkout一份。
建议找个程序,上传到BAE自带的存储中(就象sae的存储)。
怪兽大学

怪兽大学

这个暑假,带了小朋友看了几部电影,但我估计印象最深 的可能就是这个怪兽大学了

我爱灰太狼,说实话,不好看,反正小朋友看了一会就在问我,还有多久结束
开心超人,做的还行吧,但是有个很大的问题,很多笑点都是成人才能看得懂的。比如微博转发数,还有一些关于社会的冷笑话(房奴)之类的。小孩子们根本就不懂啊。
然后就是这个怪兽大学了,固然是3D对他来说是新鲜玩意,但是那些逼真的效果以及徐峥等的配音,都确实让人觉得,他们的配音是用心了的。不得不说,皮克斯的3D真心强。太TMD逼真了。对比起国内的那些3D,纯粹是在糟蹋3D
除此之外,自己就看了一个所谓4D版的环太平洋,我老婆就说了,这明显是奥特曼+钢铁侠嘛。第一次在环球港看这种片子,觉得很新鲜,但。。真心不建议看4D吃爆米花,毕竟谁也不知道什么时候就会有水突然漂出来。
当然更值得幸运的是,我们去的时候没遇上砍人,我们是安全的。(欲知砍人情况,请搜索:环球港 砍人)
怪兽大学我就不多剧透,值得一看。成人也OK