The Mirages

樱桃沟夹事

终于用上了StartSSL的免费域名了。这个第一年是免费的。那第二年就继续申请一下了只能。 StartSSL申请的时候还挺逗,没有用户名密码的,只是在你的本机安装了一个key。剩下就是用csr来申请证书了。 接下来就是nginx的配置了。crt和key都是人家给你生成好的。 dhparams.pem是在本机进行生成的。还有要注意一些header的设置。经过这样设置后,我的网站ssllabs检测都是A+水平了。 ssl

1
openssl dhparam -out dhparams.pem 4096 
1
2
3
4
5
6
7
8
9
10
11
12
ssl_certificate      /etc/nginx/conf/ssl/mirages.dev.crt;
ssl_certificate_key  /etc/nginx/conf/ssl/mirages.dev.key;
ssl_dhparam          /etc/nginx/conf/ssl/dhparams.pem;
ssl_ciphers          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:DES-CBC3-SHA;
ssl_prefer_server_ciphers  on;
ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header  Strict-Transport-Security  "max-age=31536000";
add_header  X-Frame-Options  deny;
add_header  X-Content-Type-Options  nosniff;
add_header  Content-Security-Policy  "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' img-src 'self' data: https://www.google-analytics.com; style-src 'self' 'unsafe-inline'";

但是访问的时候虽然做了301把http转为https,但是之前那些图片都是http的,所以浏览器还是会出现黄色警告。所以要把里面的图片地址也都转为https。 下面这个就是修改我的主题里的functions.php文件在最后添加如下内容:

1
/* 替换图片链接为 https */ function content_to_https($content){ if( is_ssl() ){ $content = str_replace('https://images.timoq.com', 'https://images.timoq.com', $content); } return $content; } add_filter('the_content', 'content_to_https'); 

需求是现在有些post请求的内容导致我们某个应用压力巨大,而正常是同样post的内容在24小时内只会请求一次。 初步思路就是将post内容里的变量部分写入到redis中,然后设置过期时间为1天。这样每次post的时候先查一下redis是否存在这个key。有就直接转到google上,没有就继续proxy_pass。 这里面会有几个坑。 不过lua我是第一次写,所以很多问题都没有提前预计到,测试的时候发生了很多问题。 首先自然是加入nginx-lua-redis模块支持。这里碰到个问题,ngx.say以后要是不加return就会报错。然后模块在应用的时候也要注意一下。

1
lua_package_path "/etc/nginx/lua/lua-resty-redis/lib/?.lua;;"; 

自己写一个lua模块。

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
local redis = require "resty.redis"
local cache = redis.new()
local ok, err = cache.connect(cache, '127.0.0.1', '6379')
ngx.req.read_body()
local method = ngx.var.request_method

cache:set_timeout(60000)

if not ok then
-- ngx.say("failed to connect:", err)
return
end

if method == 'POST' then
local data = ngx.req.get_body_data()
if data then
local i = ngx.re.match(data, "[0-9]{11}")
local phone = i[0]
local exist = cache:exists(phone)
if exist == 0 then
cache:set(phone, "phone")
cache:expire(phone, 86400)
else
ngx.redirect("http://www.google.com", 302)
ngx.say(phone, ' is in baned')
return ngx.exit(403)
-- ngx.say(phone, ' is in baned')
-- return ngx.exit(403)
end
end
end


local ok, err = cache:close()

if not ok then
-- ngx.say("failed to close:", err)
return
end

在location中进行应用。这里要用access_lua_by_file, 而不是 content_lua_by_file。但是用access_lua_by_file的时候必须要retrun好,如果return 200的话会继续proxy_pass, 其他的就直接返回了。

1
2
3
4
location = /VerifyCode { 
access_by_lua_file /etc/nginx/conf.d/include/ban-phone-number.lua;
proxy_pass http://test;
}
阅读全文 »

最近在centos7上用systemd进行管理启动进程,发现systemd启动的进程的limit都有问题。

open file都是4096,而不是在/etc/security/limits.conf 设置的数值。

于是看了下systemd本身的openfile, 这个确实都是对的。
然后我手动启动nginx的openfile都是根据limits.conf里设置的。  

看了下/etc/systemd/system.conf  里面确实可以单独设置openfile, 但是我直接修改system.conf里的值,再reload和restart都没有用,起来的nginx还是4096。

最后只能修改systemd的nginx配置文件。  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit] 
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
LimitNOFILE=999999
PIDFile=/opt/nginx/logs/nginx.pid
ExecStartPre=/opt/nginx/sbin/nginx -t
ExecStart=/opt/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
阅读全文 »

在docker hub上下载了一个java8的image的,但是需要在里面进行一些调试,发现明明有apt的源,就是只读本地的,不去cache远程的源。 其实就2个配置的问题。 之前ubuntu用了好多年,居然也没发现这个,还是放狗搜索才知道的,有空要看下apt-conf.d了。 ```c
echo “force-unsafe-io” > /etc/dpkg/dpkg.cfg.d/02apt-speedup echo “Acquire::http {No-Cache=True;};” > /etc/apt/apt.conf.d/no-cache apt-get update apt-cache search telnet


  仅以此文纪念球子费劲的生产过程。 昨天下午护士就过来刮毛了,然后晚上12点以后不让吃东西和喝水了,因为这是刨腹产的要。 今天早上8点多护士又过来插上了导尿管, 虽然将近9点时候护工把球子从自己床挪到了手术室的床,这难道不能支持用自己的病床吗? 非要这样来回折腾一下啊。 真是吓折腾。 球子进手术室好半天后,麻醉医生终于叫上我们了,我们拿着之前手术的各种检查和片子,可这些为什么不在昨天跟我们交流一下呢,非要在马上手术了再看这个,之前已经找过医生,可医生的态度都是明天手术前再说。 这样可不是有助于病人跟医生直接的沟通。 最后的麻醉方案就是先局部麻醉取出孩子,然后再全身麻醉。麻醉用了4种药,我也具体没记住是哪些。可没过20分钟小小球居然推了出来了,而且跟之前我们20分钟前签字麻醉的一家人一起推出来的,这个实在是有点可疑的。 推出来的时候好玩了,2个小孩放在一个车里,我们都还以为谁家生了一对双胞胎,结果其中哭声响亮的居然是我们家小小球,穿着医院的小包被就出来了,于是4个爸爸妈妈就一起下去了,我得继续守着大球子。没过多久另外一家小宝的产妇就推出来了,可我们家大球子估计还早,上次手术的时候做完了2个小时后才推出来,这个怎么着估计也得1个多小时。但我赶忙问下大夫这次二次麻醉的一般要多久,大夫都一样完全没个准话,结果再过20分钟大球子居然出来了。 这个时候4个爸爸妈妈和小田子也都来了,那就一起推到病房里,然后又换下床,这也真够折腾的。 本来以为现在就到此结束了,结果这只是刚开始。 首先是小小球怎么测体温都低,就35.5度一直,没办法,护士抱着,我再跟着去新生儿重症监护室,那边的医生倒是不紧不慢的抽了一下足底血做测试,填完表格就让我们回病房了。 IMG_20151228.122153_副本 回到病房我就听了说我们家小小球已经打了一个疫苗了,说是促进脑部发育的,怎么没经过任何人同意就可以打呢? 我签字就签了乙肝和卡介苗的。这是什么玩意? 到了病房把空调开了,把小小球再裹上一层包被,这次检测终于超过36度了。小小球剩下的就是哭和吃了,以及注意拉屎的事情。 可大球子的噩梦才刚开始,医生说大球子子宫是别人的1.5倍,然后说手术的时候有出血,然后有血块需要排出来,于是整个下午就一会来个护士来压肚子,促排血,一会来个医生压肚子促排血,来来回回10次左右居然,结果球子说还是钱主任按完了之后排的多和舒服点,但是其他人按的估计也是起作用的。有可能也是心理作用而已。 这按肚子可真疼啊,球子握着我的手,都把我手抠出血了,这得有多疼啊,小田子看着我看眼里都有泪花了,估计这样会吓到她了。反正顺产就生的时候疼,生完就好了,而很多刨腹产就生完疼了。怎么着都不会绕过那一关的。 小小球喝奶,本来以为刚做完手术不能马上喝奶的,想不到现在是直接可以的,难道不怕把麻醉药和挂的点滴进到孩子身体里吗? 这里有个大大的疑问。 然后小护士一弄就喝上球子的奶了,可是呢,不是还有按肚子的活,结果一会儿来按肚子,然后小小球就停止喝奶,一会儿来擦身体,然后又停止喝奶,你跟她说过会再来,人还说这水到时候凉了就不管了,看来公立医院也就这个服务态度了。 后来我们自己弄小小球喝奶,这个还是很有技术水平的。

通常大家都用ELK,但是这个世界就永远不会被一样事物统一的,主要是grafana也支持从ES中进行查询了,那就用下,毕竟grafana的界面比kinbana好看很多,虽然都是现成的,也没有二次开发的内容,但是还是会碰到一些问题,这个用ELK其实也会碰到的。 首先,默认fluentd是没有type标志的,这样导致默认到es中的都是string类型,这样只能做count了。所以我们要在所有client上安装fluent-plugin-typecast这个插件。 然后在服务端需要安装2个插件,其实一个就可以了fluent-plugin-elasticsearch, fluent-plugin-secure-forward。 用来支持传输到es中。 好了下面就是fluentd的具体配置了。首先是client端就是靠tail来收集, 但是重点是format的部分如何去匹配,还得考虑日志中的多种不同格式。 同时在打tag的时候把机器名也打进去,这样汇总的时候方便找从哪个nginx过来的日志。 还有type的部分可以把非string的给单独拉出来进行处理,string的就不用处理了。 下面这个是fluentd客户端上的配置: ```c
type tail path /opt/server/log/nginx/nginx-access.log format /^(?[^ ])\s+(?[^ ]) (?[^ ]) \[(?)\] “(?\S+)(?: +(?[^\“]) +\S)?” (?[^ ]) (?[^ ])(?: “(?[^\“])” “(?[^\“])” “(?[^\“])” (?[^ ])\s+(?[^ ])\s+(?[^ ])\s+(?[^ ])\s+(?[^ ]))?$/ time_format %Y-%m-%dT%H:%M:%S%z types status:integer,size:integer,response_time:float,upstream_time:float,cache_status:integer,upstream_status:integer tag “#{Socket.gethostname}.nginx.access.log” pos_file /var/log/td-agent/tmp/nginx.access.log.pos <match .nginx.access.log> type forward flush_interval 60s buffer_type file buffer_path /opt/server/buffer/ host agg1.hk.op.xxx.com port 24224

这里主要就是填写es的地址,然后在time_slice_format稍微耍了小花样,这样可以按年月日的分目录进行存放。不然都放同一个目录也不好查找。 ```c
1
2
3
 <match *.nginx.access.log> type copy <store> type file path /opt/server/logs/nginx-access/ time_slice_format ./nginx-access/%Y/%m/%d/%Y%m%d%H.nginx.access compress gzip flush_interval 10m time_format %Y-%m-%dT%H:%M:%S%z buffer_path /opt/server/buffer/nginx_access_buffer buffer_type file buffer_chunk_limit 50m </store> <store> type elasticsearch host hk1.es.op.xxx.com port 9200 include_tag_key true tag_key @log_name logstash_format true flush_interval 10s </store> </match> 
```   es的安装的部分就不在这里展开了,也许会在其他地方说下。不过要推荐一个工具kopf, zou哥去es大会上听来后马上给装上了,还不错,可以看到index,  node, share 这些信息,而且随着cluster的健康状态会以不同的颜色来显示出来,这样还是很贴心的。 下面这个就是一个运行的截图 [![kopf](https://images.timoq.com/2015/12/kopf.png)](https://images.timoq.com/2015/12/kopf.png) grafana的安装也不说了,我用的是2.5 stable版本,支持了es做为datasource, 也支持用户验证等等。 默认grafana是用query_string来进行全文匹配,而且不支持正则,不过grafana也支持自定义书写es查询 [https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html) https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html 根据上面的语法我们就可以自定义自己的查询语句。不过我更喜欢正则匹配。 [![grafana-regex](https://images.timoq.com/2015/12/grafana-regex.png)](https://images.timoq.com/2015/12/grafana-regex.png) 第一天用正则匹配发现了问题,怎么都匹配不上URL,后来group by 一下,居然发现png,jpg这些排在最前面,于是查了下原因, 正则不匹配的原因是因为es默认通过/ . 这些符号来进行默认分词。 那就只好更改es的index template,  把某些字段不让它进行分词,下面是我自己建立的一个template, 只用在某些index中。也可以在kopf中进行定义。 ```c
curl -XPUT http://hk1.es.op.xxx.com:9200/_template/template_1 -d ' { "mappings": { "_default_": { "_all": { "enabled": false }, "_source": { "compress": true }, "properties" : { "path": { "type": "string", "index": "not_analyzed" }, "referer": { "type": "string", "index": "not_analyzed" }, "agent": { "type": "string", "index": "not_analyzed" } } } }, "settings": { "index.cache.field.type" : "soft", "index.refresh_interval": "5s", "index.store.compress.stored": true, "index.number_of_shards": "3", "index.query.default_field": "querystring", "index.routing.allocation.total_shards_per_node": "2" }, "template": "logstash-*" }'

由于前几次产检结果有臀位,所以在上周四挂了一个麻醉门诊。结果根本没必要那么早去,根本没人挂那个门诊。后来结果等半天来了个医生3分钟就打发了,不过至少也打消了球子说生刨的顾虑了,那这个号也算值了。

不过小小球啊,你就赶紧转过来吧,你妈不想刨腹,还是希望能够顺产的。

还有小小球啊,可恶的医生一会儿说你妈肚子小,然后你妈那半个月老是晚上加餐,体重曲线眼看着超过之前的图表卡了。

然后半个月过去后,照了个B超,又说小小球你长的比别的宝宝要高,还问你妈你爸是不是也高,所以估计你就比别人高了要。

这周你妈又去查了血糖,也都在正常范围内。所以你就放心吧,主要还是前段时间你妈吃多了导致的。

运维的基础就是统一,没有统一啥都是扯谈。 首先是hostname,IP,DNS的统一规划,这个是后续一切的根本。 hostname一定是要可识别具体上面的应用程序的。比如nginx01-bid-hotel.sh1.cn , 这个名字就可以很好的识别部门,项目和具体的应用。同时也可以识别到所在的机房。 为什么要用nginx01呢,不写web01呢,因为用web你是不知道这个是nginx只是代理还是真实的app应用呢。所以我个人用上面的应用程序进行分类,而且尽量不要缩写,毕竟这个是一次性的,你要缩写了你自己清楚,别人未必能够清楚。 IP这个问题,如果可以自己分配的,那必须按需分配好了。先说大的网段。千万不要一个机房就 10.0.0.0/8 这样的进行分。一般来说我们单一一个IDC不会超过256的3次方的机器数量,所以我们一般一个独立IDC都是用10.10.0.0/16 这样的方式来进行,第二个10一般是用省市的电话区号来进行区分,有些省市区号是3个数字或者4个数字,那就自己去编吧。 然后我们说小的,从我个人经验来说,一般会给远程控制卡,运维等基础服务会单独进行分网段。 所有的网关地址都应该是内部的交换机接口,一般都是设置 10.x.x.1/24 这样的。所有的应用最好把网段分的开一点,这样不会导致最后同一应用的网段太分散,比如hadoop集群这样的更要多留几个网段。至于某些领导喜欢吉利数字的网段和IP你也得考虑下。 关于DNS,所有内部服务器地址都是通过dns来获取的,千万别省事弄个hosts文件这样的。而合理的dns设置就应该跟hostname一样就可以了,但是在resolv.conf也要配置好searchdomain 和 重试间隔和次数。 这样大家ping的时候可以偷懒一下,  以及万一你一台DNS挂了不至于等很长时间。  至于nscd的使用还是看实际情况吧。 关于RPM源,这个这么多年还是感觉自己搭建和同步会比较好,一个是速度问题,一个是版本控制问题。虽然在时效性上会没有公共源快,但是我们可以保证速度,不然一旦所有机器同时更新你的公网带宽就挂了。而且时效性主要是看你同步的频率是怎么样的。同时每个IDC之间可以通过rsync进行同步。同时gpgkey还是需要的。 但是gem源,pypi这样的源是否还需要自己建立,这个主要是要评估内部使用的规模来进行了。 系统账号管理,这个无论你用系统本身的,还是LDAP,还是kerberos这样的,绕不过去的就是uid和gid。我一般都会给运维,开发,测试,程序都分不同的起始,比如运维10000开始,开发20000开始这样的。程序启动账号都是5000开始的nologin这样的账号。 同时组的设定也要注意,毕竟后面sudo权限的设置呢还。 安装包目录的统一,要/usr/local或者/opt/app 这样的,个人喜欢把程序,日志,配置文件放在一起。比如 /opt/app/nginx/{logs,sbin,conf,cache} 这样的,也有 喜欢 /opt/app/{logs,sbin,conf}/nginx 这样的。我喜欢那样的只是很方便的进行RPM打包,而且编译参数也比较简单。而且一般一个机器的应用就一个或者几个而已。 日志的收集。 都什么年代了,还一台台看呢。Linux系统日志都必须集中到日志服务器啊,rsyslog不就是干这个的,logwatch就是来进行分析和报警啊。特别是一些kernel类型和sercurity的日志。那程序的log呢, fluentd, flume这些不就是干这些个事情的。当然首先你要准备个大磁盘够装下3年的数据,至于用hdfs,还是glusterfs来装,但是千万别用mongodb来装。

这次产检约的是上午8点到9点之间. 结果球子嫌早,愣是拖到了9点半才到医院。

结果怎么着,人说过号了就要等其他人都看完了才能看,结果小小球你爸上午就白请假了。

等到了12点多,也最终没有看上上午的。下午一点就开始看了,一看也来不及回家吃了,就大众点评查了宽小面,结果点评上的地址还是错的,不过最终还是找到了。马上吃完就回医院了马上,下午就球子妈陪球子看了。

这以后说好的时间可不能再迟到了,之前球子就是在新院看人老迟到,结果自己一来就被延到最后了。

这次产检又要回到老院来进行了。

主要是查有没有糖尿病.不过检查的方法就跟二呆似的,居然要分3次,但是一次结果还不行吗? 还要空腹那么久的,我们医院的检查方法就这水平?

从这周开始,小小球你就开始折腾你妈了,你妈老被你压的喘不过去,居然还沦落到吸氧的地步了。

还有你妈最近老宫缩,可能是之前带你遛弯给遛出来的,还好经过10-1长假的休养总算没啥问题了。

0%