关于http代理
疑问
http代理时,域名解析发生在client端还是代理服务器端?
使用gcloud sdk时,发现域名是在本地解析的,由于是在内网,本地解析到的ip比较特殊,如此以来,即使设置代理也无法规避这个问题,目前我的解决办法就是设置host,当然,修改本地的dns也行,只是内网域名就无法解析了
先说结论吧:
- 只有python中的代理的实现是在本地解析域名的,curl/golang中设置代理时,域名的解析都是发生在代理服务器上的
- 似乎在代理服务器上解析显得更合理一些,如果你要访问的地址有破坏和谐的嫌疑,则,你在dns解析域名的时候会被劫持的,或者无法得到任何响应,比如,歌华就由这样的功能;虽然有cryptDNS,但是还是有些麻烦,而且使用cryptDNS的多半是有不良行为的(至少现在是),也很容易被和谐掉。结论:在代理服务器上解析更加合理一些
- 对于不同的agent,在本地解析还是在代理服务器上解析这事儿也没有个标准;就比如firfox有个选项:network.proxy.socks_remote_dns,允许设置是在本地解析还是在代理服务器上解析。(参考 http://serverfault.com/questions/337791/if-i-am-using-ssh-for-a-socks-proxy-do-dns-connections-go-through-it)
分析
情形1:
- 不需要connect方法,显然(不显然吗)这种方式只支持http的情况,不支持https的情况
- 域名解析发生在代理服务器上
事实上,如果访问的是https的地址,自然会通过使用connect方法的方式实现
情形2:
- 使用connect方法 (通过给curl添加 -p 参数实现, 这应该是比较常见和通用的办法)
- 域名解析发生在代理服务器上
下面我们看看Golang中关于代理的实现,重点关注域名解析发生在了哪里:
golang代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package main import ( "fmt" "io/ioutil" "net" "net/http" "os" "time" ) func main() { get() } func get() { url := "http://baidu.com/" if len(os.Args) > 1 { url = os.Args[1] } res, err := http.Get(url) check_fail(err) defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) check_fail(err) fmt.Println(string(body)) } |
通过环境变量设置代理:
1 2 |
export http_proxy=http://10.79.80.245:8888 export https_proxy=http://10.79.80.245:8888 |
http请求:
- 和curl实现一致
- 域名解析发生在代理服务器上
https请求:
- 和curl实现一致
- 域名解析发生在代理服务器端
- 意外发现: golang关于https请求的实现中,代理的connect和后续的数据交互发生在不同的线程中(看pid就能知晓)
python中的实现
脚本: (这里的httplib2是gcloud sdk中的)
1 2 3 4 5 6 7 8 9 10 |
import httplib2 import sys url = "http://baidu.com/" if len(sys.argv) > 1: url = sys.argv[1] h = httplib2.Http() headers, body = h.request(url) print body |
Http请求:
- 即使是http请求,也默认使用connect方法
- 域名是在client端解析的

网站体验调查方式
在访问微软的帮助页面(https://technet.microsoft.com/en-us/library/jj657728%28v=exchg.150%29.aspx)时,会弹出一个窗口,提示说不要关闭该弹出窗口,当浏览完(即:离开或关闭该页面)时,弹出窗口就会自动弹出到用户的视线内,然后填写一个使用体验的答卷.
问题:弹出窗口是如何知道原来的页面已经关闭了呢?应该可以有多种方法
为函数添加enter和exit级trace
Chrome的桌面通知
tty on ubuntu
缘起
ubuntu下按下 CTRL+ALT+F12 为什么黑屏?
参考资料: http://askubuntu.com/questions/277517/what-does-ctrl-alt-f12-do
docker 学习
参考资料: http://bg.biedalian.com/2014/11/20/docker-start.html
docker 入门: https://www.jayway.com/2015/03/21/a-not-very-short-introduction-to-docker/
docker各种文档: https://docs.docker.com/
知识点:
1. ctrl+P, ctrl+Q 退出容器,但不关闭容器,如果直接ctrl+D 则容器就关闭了
关于磁盘分区的对齐问题
缘起
安装完ubuntu后,不想把 /home 和 系统放在同一分区上,于是,重装了一遍,做了三个分区: / 、 /home 、 /data ; 安装完成之后,执行了一下 sudo fdisk -l ,结果如下:
明知道这不是大问题,但是还是膈应
解决办法:
参考资料: http://www.ibm.com/developerworks/cn/linux/l-linux-on-4kb-sector-disks/
虽然gpart做分区时有“对齐到柱面”的选项,但是尝试多次,似乎还是不行; 最后,索性都创建成主分区,果然就不再出现这样的提示了
nsq学习
摘一幅图:
注意点:
- -broadcast-address:
这个选项在nsqd和nsqlookupd中都有出现,这个不仅仅是一个名字,更是外部连入的一个地址,所以不能错了,如:nsqd向nsqlookupd注册的就是这个,而consumer从nslookupd查询到的需要连接的nsqd的地址也是这个
12$ curl "http://10.79.80.245:4161/lookup?topic=test"{"status_code":200,"status_txt":"OK","data":{"channels":["c1"],"producers":[{"remote_address":"10.79.80.245:47975","hostname":"luna245","broadcast_address":"luna245","tcp_port":4150,"http_port":4151,"version":"0.2.30"},{"remote_address":"10.79.80.245:47976","hostname":"luna245","broadcast_address":"luna245","tcp_port":5150,"http_port":5151,"version":"0.2.30"}]}}
注意: 上面的broadcast_address 就是由于启动nsqd的时候没有指定该选项导致的,consumer如果不能解析该地址的话就不能获取到消息 - -worker-id:
nsqd 会根据worker-id来命名数据文件,即: nsqd.${worker_id}.dat
如: /data1/nsq_data/nsqd.1.dat
如果涉及到 topic和channel的话,不同的nsqd示例就不能(?)使用相同的data目录了,因为topic和channel的meta存储文件名中没有worker-id,如下:
/data1/nsq_data/test:c1.diskqueue.meta.dat
/data1/nsq_data/test.diskqueue.meta.dat由此,也可以看出,每个channel并没有一份重复的存储,应该 - nsqd存储
启动nsq相关的一堆命令太麻烦,写一个脚本来start、stop:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#!/usr/local/bin/php <?php $type = $argv[1]; $ip = "10.10.10.110"; $worker_id = 1; if ($type == "start") { myexec("nsqlookupd -http-address=\"0.0.0.0:4161\" -tcp-address=\"0.0.0.0:4160\" -broadcast-address=\"$ip\" "); foreach(array(4150, 5150) as $tcp_port) { $http_port = $tcp_port + 1; $data_dir = "/data1/nsq_data/$tcp_port"; if(!file_exists($data_dir)) { mkdir($data_dir); } myexec("nsqd -data-path=$data_dir -http-address=\"0.0.0.0:$http_port\" -tcp-address=\"0.0.0.0:$tcp_port\" -broadcast-address=\"$ip\" -worker-id=$worker_id -lookupd-tcp-address=$ip:4160"); $worker_id++; } myexec("nsqadmin -http-address=\"0.0.0.0:4171\" -lookupd-http-address=localhost:4161"); myexec("nsq_pubsub -lookupd-http-address=localhost:4161 -http-address=:8181"); } if ($type == "stop") { mykill("nsqlookupd"); mykill("nsqd"); mykill("nsqadmin"); mykill("nsq_pubsub"); } if ($type == "show") { mygrep("nsqlookupd"); mygrep("nsqd"); mygrep("nsqadmin"); mygrep("nsq_pubsub"); } function mygrep($name) { echo `ps aux|grep $name|grep -v grep`; } function mykill($name) { system("ps aux|grep $name|grep -v grep | awk '{print $2}'|xargs -n 1 kill -9"); } function myexec($cmd) { $arr = explode(" ", $cmd); $name = $arr[0]; $pid = pcntl_fork(); if ($pid == 0) { system("nohup $cmd >$name.log 2>&1 &", $ret); if ($ret != 0) { die("exec cmd fail: $cmd\n"); } } } |