网络 > 记录:通过nginx设置为站点资源,根据国内国外使用不同的cdn
2017-12-15
目标:加速客户网站访问,使用cdn。
为了效果以及费用考虑,国内的加载阿里云的,国外的加载cloudflare。使用nginx的变量功能实现了这一效果
首先,确认nginx有geoip模块,并下载相应geoip数据
其次,调整nginx.conf的http部分
geoip_country /GeoIP.dat;
geoip_city /GeoLiteCity.dat;
map $geoip_country_code $cdn {
default cf;
CN ali;
}
然后,调整nginx反代配置,以wordpress为例
location / {
set $cdnpath cfcdn.cfcdn.com;
sub_filter_once off;
if ($cdn = ali){
set $cdnpath alicdn.alicdn.com;
}
add_header X-Cdn $cdn;
sub_filter '${host}/wp-content/' '$cdnpath/wp-content/';
sub_filter '${host}/wp-includes/' '$cdnpath/wp-includes/';
sub_filter 'http:\/\/${host}\/wp-content\/' 'http:\/\/${cdnpath}\/wp-content\/';
sub_filter 'http:\/\/${host}\/wp-includes' 'http:\/\/${cdnpath}\/wp-includes';
sub_filter 'url("/wp-content/' 'url("http://${cdnpath}/wp-content/';
sub_filter 'src="/wp-content/' 'src="http://${cdnpath}/wp-content/';
sub_filter 'src="/wp-include/' 'src="http://${cdnpath}/wp-include/';
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
完成。
工地 > 优化完成,发现自己自High起来越发不要脸了
2017-12-14
终于把blog代码走redis缓存在本机提升到10k rps以上了。
手法相当无耻。
在各种分析代码后,发现cpu主要耗费在redis连接和反序列化这两个和内容长度直接相关的部分后。
直接写了个简单的gzip中间件挂在了缓存后面,缓存压缩过的数据。
一下子就ok了。
顺便,在把模板系统也折腾过一遍以后,结论:
- 模板系统也和输出的内容多少直接相关。
- blog这种长度主要在数据的,还是直接缓存页面比缓存数据+渲染快很多。
- Golang的template模块是真心慢。Jet html相对好不少,但还是很难让人满意。同样的首页用本地内存缓存过的数据渲染的话,大概也只有5k-6k rps。走redis就真心没法看了,2k rps出头。
- 在c10k这个层面,走redis的成本其实也是很高的。
工地 > 博客pprof分析
2017-12-13
给blog程序做了个pprof分析。
先是安装 工具库
go get github.com/pkg/profile
然后再引入
import "github.com/pkg/profile"
再在入口中加入代码
defer profile.Start(profile.CPUProfile).Stop()
然后go build,ab跑需要的值。
再go tool pprof ./app pprfo文件位置,输入web指令,看到全图,能按时间占用来分析网站的问题点在哪了。
就我这次分析,一共是151s/238s。
其中
http请求头解析 13s
http相应写入 26.8s
属于硬消耗,除非不使用net/http,否则基本无法避免和优化。
fd操作:
accept fd_unix 6.07s
destory fd_unix 9.76应该也是避不过。
msgpack的反序列化是27s,比我一直预期的其实要更好。
然后大头就是redis连接使用的70s了。
直接就占了总cpu消耗的1/3了。
看来只要用了 redis库,这个数量级就逃不掉了。
唯一能优化的地方是,为了能按分类优化,我加如了一个临时前缀。
这部分走的也是redis,占用了大概占用了一般的redis消耗,这是个很大的问题。
工地 > 博客负优化中
2017-12-13
最近终于有了一点时间,开始完善自己的go框架,拿博客作为方向。
重做用户系统,加入评论功能。
在修改/调整缓存模块的时候,再跑了一下ab,发现网站访问的愈发的慢了。
同一台2014 rmbp
在使用freecache做程序内缓存的时候,从之前有记录可查的首页18k rps/内页22k rps下降到了 13k /18k
驱动切换为redis的话,低到令人发指的,8k.12k
连c10k都实现不了了。
充分暴露我了我只是一个喜欢写代码的渣渣票友的本质……
真担心等真的调整完功能都实现后rps连php都不如了。
只能催眠自己这是因为电脑Cpu老化了,终于有理由可以换新电脑了-_____-
杂言碎语 > 大半夜的快被苹果蠢哭了
2017-12-02
最近要给公司弄个Phonegap封装的app,逃不过 max os的虐,搞了几天,好不容易能收尾了。今天彻底被蠢哭。
先记录,封装提交最靠谱的资料是这篇
http://ionicframework.com/docs/v1/guide/publishing.html
开发时遇到了 “Cordova/CDVViewController.h” 找不到,各大网站的方案都试过没用。
最后是因为之前有安装过旧版本的 cordova,手动通过npm升级解决。
然后吐槽。
app万年提交不上去。
xcode和application loader都卡在app store/ituns 验证这布。睡了几觉了都不行。你tm在大陆进行运营,还收了开发者的注册费用,结果连提交服务器都无法保证正常工作?呵呵你一脸啊。
那好,我想办法ss总行吧?
找个了客户端,要求mac os 版本升级。
升就升吧?
然后噩梦开始了。
升级必须要登apple id?
好,登自己的ipad/iphone帐号
提示“此版本的osx 不支持银联,请升级至最新版本的osx并重试”
我要升级系统,你告诉我要升级到最新版本的osx再重试?
我要升级系统,你告诉我要升级到最新版本的osx再重试?
我要升级系统,你告诉我要升级到最新版本的osx再重试?
好,我换用公司帐号。Apple 开发者帐号,总行了吧?
还不行,必须检查信息。
好吧,我检查,谁让我贱呢。一个表格而已,难道还能难倒我不成?
还真难倒了。
查看您的地址过不了,除了优惠码啥空都填了,居然提示我 您没有完整填写表格。
一脸懵逼。
我连没啥好填的街都给你写了个 “无” 好不。
我认怂,我放狗搜
http://tieba.baidu.com/p/3534415626
不能选无,必须选银行卡。
既然不能选无,你把它列出来,还作为默认选项干嘛?
可以选,不可以用?
你一个连空root帐号都能暴漏洞直接登录的系统,还强制让我选个支付方式给你?
行,你狠,我贱。
从心底里心疼ios/mac程序员,以后一定要对他们好一点。
网络 > 上海电信封禁80/443端口后,将公司内网管理系统app接了vpn转到了外网服务器上。
2017-10-26
之前一直想着开个外网固定ip的出口的。
这次被迫实行了。
外网服务器做openvpn server
内网服务器作为openvpn client,固定ip
然后前端nginx直接转发。
杂言碎语 > 不耐摔的mix,装google play很累的米6
2017-10-05
用了4个月的小米mix,最后还是没有火锅这个国庆,在我和女儿的手里彻底摔烈了。
全陶瓷的外壳,就是这样的脆弱。
Mix什么都好,这外壳实在是让人难以接受。
不禁让人怀念诺基亚的时代。
对于同样陶瓷的mix 2暂时也没啥兴趣了。看了看有现货的米6,搞了台,毕竟便宜摔了也不心疼。
拿到手后,对于屏幕适应了半天,总算习惯了。
就是装Google play有点蛋疼。卡在了正在核对信息这一步。
看了各路攻略更是混乱。
最后用了最简单的方法。
- 手机打开www.miui.com.下载开法版的rom。
- 利用手机自带的功能刷成开发板。
- 连上无障碍的网络。
- 搜索go谷歌安装器安装。
- 完工
代码 > 用nssm为windows添加服务
2017-09-29
最近牵涉到需要在为客户做一个提供api转发的守护程序,研究了下什么方法最方便,立刻看中了nssm
nssm有命令行以及图形界面,通过简单的bat程序就能非常容易的做一个注册服务的安装程序。
具体网址:
https://nssm.cc/
代码 > golang中生成prefix形式的xmlns的xml文件
2017-09-17
最近在做一个调用soap接口守护程序。
找了一圈golang的库,都不是太好用,就干脆用仿照soap代码,自己生成和解析xml代码了。
然后发现golang 至少 1.9的xml库,虽然可以解析prefix,但不能生成prefix。查了一圈只能用模拟的方式自行去实现。
也就是自己去生成xmlns的属性,自己填入。
具体来说,代码结构如下:
type GetPartsInfoListRequest struct {
SoapNS string `xml:"xmlns:soap,attr"`
TemNS string `xml:"xmlns:tem,attr"`
XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ soap:Envelope"`
}
req := GetPartsInfoListRequest{}
req.SoapNS = "http://schemas.xmlsoap.org/soap/envelope"
req.TemNS = "http://tempuri.org/"
bytes, err := xml.Marshal(req)
if err != nil {
panic(err)
}
fmt.Println(string(bytes))
另有之前遇到的错误
The SOAP action specified on the message, '', does not match the HTTP SOAP Action, 'http://tempuri.org/xxxx'.
这是构建请求xml时没有加入ws-a信息
参考 https://social.msdn.microsoft.com/Forums/vstudio/en-US/ed32328d-e3ad-47dd-bcb0-3db9e6205f9c/actionmismatchaddressingexception?forum=wcf
解决方案是在soap header中加入wsa的header。大概代码为
<soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:Action>http://tempuri.org/xxx</wsa:Action>
</soap:Header>
杂言碎语 > 不得不说雷军的策略很成功
2017-09-13
Iphone x发布当天,知乎上讨论的最多的就是iphone x 和mix 2的比较。
平心而论,iphone x , 三星s8,mix 2三款手机里,我还是觉得s8的外形最吸引我。
但为什么对比的最多的是这两款呢?
不得不说雷军的策略好啊,成功的蹭了一波热度。