为nginx生成自签名ssl证书
[| 2012/03/03 00:00]
今天要搭一个ssl加密的站点,由于是自用,所以就准备自签发一张证书。之前搞过几次,比较复杂,早忘光了。找到一篇不错的文章,留下备份。
http://blog.duyao.de/posts/to-generate-an-ssl-certificate-for-nginx-in-linux.html
这里说下Linux 系统怎么通过openssl命令生成 证书。
首先执行如下命令生成一个key
openssl genrsa -des3 -out ssl.key 1024
然后他会要求你输入这个key文件的密码。不推荐输入。因为以后要给nginx使用。每次reload nginx配置时候都要你验证这个PAM密码的。
由于生成时候必须输入密码。你可以输入后 再删掉。
mv ssl.key xxx.key
openssl rsa -in xxx.key -out ssl.key
rm xxx.key
然后根据这个key文件生成证书请求文件
openssl req -new -key ssl.key -out ssl.csr
以上命令生成时候要填很多东西 一个个看着写吧(可以随便,毕竟这是自己生成的证书)
最后根据这2个文件生成crt证书文件
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
这里365是证书有效期 推荐3650哈哈。这个大家随意。最后使用到的文件是key和crt文件。
如果需要用pfx 可以用以下命令生成
openssl pkcs12 -export -inkey ssl.key -in ssl.crt -out ssl.pfx
在需要使用证书的nginx配置文件的server节点里加入以下配置就可以了。
ssl on;
ssl_certificate /home/ssl.crt;
ssl_certificate_key /home/ssl.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
然后重启nginx就大功告成了
http://blog.duyao.de/posts/to-generate-an-ssl-certificate-for-nginx-in-linux.html
这里说下Linux 系统怎么通过openssl命令生成 证书。
首先执行如下命令生成一个key
openssl genrsa -des3 -out ssl.key 1024
然后他会要求你输入这个key文件的密码。不推荐输入。因为以后要给nginx使用。每次reload nginx配置时候都要你验证这个PAM密码的。
由于生成时候必须输入密码。你可以输入后 再删掉。
mv ssl.key xxx.key
openssl rsa -in xxx.key -out ssl.key
rm xxx.key
然后根据这个key文件生成证书请求文件
openssl req -new -key ssl.key -out ssl.csr
以上命令生成时候要填很多东西 一个个看着写吧(可以随便,毕竟这是自己生成的证书)
最后根据这2个文件生成crt证书文件
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
这里365是证书有效期 推荐3650哈哈。这个大家随意。最后使用到的文件是key和crt文件。
如果需要用pfx 可以用以下命令生成
openssl pkcs12 -export -inkey ssl.key -in ssl.crt -out ssl.pfx
在需要使用证书的nginx配置文件的server节点里加入以下配置就可以了。
ssl on;
ssl_certificate /home/ssl.crt;
ssl_certificate_key /home/ssl.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
然后重启nginx就大功告成了
strncpy和snprintf
[| 2012/02/29 19:06]
之前用strncpy总是感觉比较恶,老是要考虑最后\0的问题,今天仔细看了下,发现如果源串长度大于等于最大长度的话,strncpy会直接拷贝最大长度,不在后面加\0,也就是说在用一个字符串覆盖另一个字符串一部分的时候用strncpy是很不错的,但全覆盖的话比较麻烦,很容易出bug。
而snprintf会拷贝最大长度-1的字符数,并在后面加\0,使用一个字符串覆盖另一个时很不错。
看了一下资料,发现snprintf的效率也要高于strncpy。
日常字符串拷贝还是推荐snprintf。
而snprintf会拷贝最大长度-1的字符数,并在后面加\0,使用一个字符串覆盖另一个时很不错。
看了一下资料,发现snprintf的效率也要高于strncpy。
日常字符串拷贝还是推荐snprintf。
Soso Spider 不支持base属性
[| 2011/10/27 19:17]
今天博客新迁移,由于对静态化url的改动非常大,难免有遗漏的地方,所以非常关注access日志,看看爬虫们遇到了哪些困扰。
在看日志的时候发现一个有意思的现象,google和百度的蜘蛛今天很不活跃,对于站点的大规模改变似乎并不感兴趣,对css,js不屑一顾,而soso的spider非常活跃,把每个链接都详细爬了一遍,但发现一个问题:
新博客的url是采用base设置+相对url的模式,soso的spider似乎并不识别base标签,直接把相对url附加到当前url之后进行抓取,导致了很多404请求。查了一下,base属性是html标准属性,soso不支持这个属性应该算是个bug了。
在看日志的时候发现一个有意思的现象,google和百度的蜘蛛今天很不活跃,对于站点的大规模改变似乎并不感兴趣,对css,js不屑一顾,而soso的spider非常活跃,把每个链接都详细爬了一遍,但发现一个问题:
新博客的url是采用base设置+相对url的模式,soso的spider似乎并不识别base标签,直接把相对url附加到当前url之后进行抓取,导致了很多404请求。查了一下,base属性是html标准属性,soso不支持这个属性应该算是个bug了。
HTTP请求返回码204
[| 2011/10/27 18:49]
今天测试lighttpd是否支持delete请求,发现webdav模块可以实现此功能。不过发现http返回码是204,查了一下,原来此状态码的意思是说请求成功了,但是没有结果返回来。搜到鸟哥一篇文章,讲的很不错,转载一下:
http://www.laruence.com/2011/01/20/1844.html
之前和人讨论过这个问题,,, 今天感冒在家休息, 就回忆了一下, 整理如下.
我们很多的应用在使用Ajax的时候, 大多数情况都是询问型操作, 比如提交数据, 则Ajax只是期待服务器返回:
{status: 0, message:""} //status 0代表成功, 非零的时候, message中包含出错信息.
我们知道HTTP的状态码, 2xx都是表示成功, 而HTTP的204(No Content)响应, 就表示执行成功, 但是没有数据, 浏览器不用刷新页面.也不用导向新的页面.
在HTTP RFC 2616中关于204的描述如下:
类似的还有205 Reset Content, 表示执行成功, 重置页面(Form表单).
于是, 当有一些服务, 只是返回成功与否的时候, 可以尝试使用HTTP的状态码来作为返回信息, 而省掉多余的数据传输, 比如REST中的DELETE和如上所述的查询式Ajax请求.
最后说说205, 205的意思是在接受了浏览器POST请求以后处理成功以后, 告诉浏览器, 执行成功了, 请清空用户填写的Form表单, 方便用户再次填写,
总的来说, 204适合多次对一个Item进行更新, 而205则适合多次提交一个系列的Item.
但, 请注意, 目前还没有一个浏览器支持205, 大部分的浏览器, 都会把205当做204或者200同样对待.
http://www.laruence.com/2011/01/20/1844.html
之前和人讨论过这个问题,,, 今天感冒在家休息, 就回忆了一下, 整理如下.
我们很多的应用在使用Ajax的时候, 大多数情况都是询问型操作, 比如提交数据, 则Ajax只是期待服务器返回:
{status: 0, message:""} //status 0代表成功, 非零的时候, message中包含出错信息.
我们知道HTTP的状态码, 2xx都是表示成功, 而HTTP的204(No Content)响应, 就表示执行成功, 但是没有数据, 浏览器不用刷新页面.也不用导向新的页面.
在HTTP RFC 2616中关于204的描述如下:
引用
If the client is a user agent, it SHOULD NOT change its document view from that which caused the request to be sent. This response is primarily intended to allow input for actions to take place without causing a change to the user agent’s active document view, although any new or updated metainformation SHOULD be applied to the document currently in the user agent’s active view.
类似的还有205 Reset Content, 表示执行成功, 重置页面(Form表单).
引用
The server has fulfilled the request and the user agent SHOULD reset the document view which caused the request to be sent. This response is primarily intended to allow input for actions to take place via user input, followed by a clearing of the form in which the input is given so that the user can easily initiate another input action.
于是, 当有一些服务, 只是返回成功与否的时候, 可以尝试使用HTTP的状态码来作为返回信息, 而省掉多余的数据传输, 比如REST中的DELETE和如上所述的查询式Ajax请求.
最后说说205, 205的意思是在接受了浏览器POST请求以后处理成功以后, 告诉浏览器, 执行成功了, 请清空用户填写的Form表单, 方便用户再次填写,
总的来说, 204适合多次对一个Item进行更新, 而205则适合多次提交一个系列的Item.
但, 请注意, 目前还没有一个浏览器支持205, 大部分的浏览器, 都会把205当做204或者200同样对待.
博客网络优化-静态文件分离
[| 2011/10/22 00:51]
最近又看了几个vps,总感觉为啥相同配置,相同线路,人家跑wp,我跑自制小博客。人家都比我快得多。
之前一直想当然,认为是网络问题之类的。由于今天考虑到了博客迁移,所以这个问题就提上日程了。于是打开chrome调试工具,看了下时间。
一看不要紧,终于找到瓶颈了。。
首先是jquery.js,最早用本机,后来嫌大,用了google提供的,由于最近和谐,google的连接速度非常慢,导致页面一直卡在下载jquery.js上。
由于是静态文件,比较大的体积,且seo无关,这就需要考虑把文件放在一个网络连接比较快的地方,显然放到国内是值得考虑的。
首先试了一下一款云存储产品,发现速度倒是很快,但是无法开启gzip,这个无法忍受。转而考虑比较专业的web托管,一想,sae就是专门干这个的,直接放到sae上最好。于是在sae上申请了个应用,吧jquery.js和几个比较大的图片移过去了。立竿见影,速度提升极大。
再看,发现google的统计代码加载也很慢,反正我也不怎么看google的统计,注释掉。
再访问,飞一般的速度~~~~~~
之前一直想当然,认为是网络问题之类的。由于今天考虑到了博客迁移,所以这个问题就提上日程了。于是打开chrome调试工具,看了下时间。
一看不要紧,终于找到瓶颈了。。
首先是jquery.js,最早用本机,后来嫌大,用了google提供的,由于最近和谐,google的连接速度非常慢,导致页面一直卡在下载jquery.js上。
由于是静态文件,比较大的体积,且seo无关,这就需要考虑把文件放在一个网络连接比较快的地方,显然放到国内是值得考虑的。
首先试了一下一款云存储产品,发现速度倒是很快,但是无法开启gzip,这个无法忍受。转而考虑比较专业的web托管,一想,sae就是专门干这个的,直接放到sae上最好。于是在sae上申请了个应用,吧jquery.js和几个比较大的图片移过去了。立竿见影,速度提升极大。
再看,发现google的统计代码加载也很慢,反正我也不怎么看google的统计,注释掉。
再访问,飞一般的速度~~~~~~
zabbix安装
[| 2011/10/20 23:34]
今天看到一个非常强大的服务器监控程序:zabbix。装了一下。
首先下来源码,最新源码是1.8.8.解压开,configure。缺了一些库,一个一个装上。没啥大问题,唯一一个问题是在打开--enable-static后会报找不到libcurl,应该是libcurl没有提供静态库。时间不多,没有细究,去掉了--enable-static,编译成动态的了。
./configure --prefix=/home/abc/zabbix --enable-server --enable-agent --with-mysql --with-net-snmp=/home/abc/snmpd/bin/net-snmp-config --with-libcurl --with-jabber --enable-ipv6 --with-ssh2
然后make install。这个比较怪,没有单独的make过程,直接make install了。
然后发现只有bin,sbin,share。zabbix是软件免费,服务收费的。怪不得做的这么不自动化,估计想提高门槛好收费。
zabbix依赖webserver、php、mysql。这些软件我之前已经有了,不用再装了。
先在mysql里建表,去源码里找到
create/schema/mysql.sql
create/data/data.sql
create/data/image_mysql.sql
依次导入到mysql里。
然后在zabbix里mkdir etc
将misc/conf/zabbix_*都拷贝到etc里。配置了一下mysql连接信息。
misc/init.d里面有启动用的脚本,我看了一下,感觉还是自己写比较好。
直接启动,告诉我找不到libnetsnmp.so.30。估计是我snmp是自己编译的,zabbix做的有问题,链接路径搞错了,于是先
export LD_LIBRARY_PATH=/*****/snmpd/lib
再启动即可。
然后配置web管理页面。
frontends/php/*里的php文件拷贝到指定位置。开始配置,发现zabbix有个特点,要求php的最大执行时间超长,估计是数据多了处理比较慢。不配好就不能安装,配好后进入管理后台,默认账号和密码是admin和zabbix。进去后配置了下。网页做得比较土,不过功能很强大,很多配置项。
刚开始只启动了zabbix_server,管理后台老是提示无法连接云云,启动了zabbix_agentd后可以监控了。感觉跟文档不符,文档似乎说server也能够监控的。没打算细研究,所以没有细究。
管理页面还支持中文,不错。
现有的小破vps还不至于用这么重量的监控,试试而已。
首先下来源码,最新源码是1.8.8.解压开,configure。缺了一些库,一个一个装上。没啥大问题,唯一一个问题是在打开--enable-static后会报找不到libcurl,应该是libcurl没有提供静态库。时间不多,没有细究,去掉了--enable-static,编译成动态的了。
./configure --prefix=/home/abc/zabbix --enable-server --enable-agent --with-mysql --with-net-snmp=/home/abc/snmpd/bin/net-snmp-config --with-libcurl --with-jabber --enable-ipv6 --with-ssh2
然后make install。这个比较怪,没有单独的make过程,直接make install了。
然后发现只有bin,sbin,share。zabbix是软件免费,服务收费的。怪不得做的这么不自动化,估计想提高门槛好收费。
zabbix依赖webserver、php、mysql。这些软件我之前已经有了,不用再装了。
先在mysql里建表,去源码里找到
create/schema/mysql.sql
create/data/data.sql
create/data/image_mysql.sql
依次导入到mysql里。
然后在zabbix里mkdir etc
将misc/conf/zabbix_*都拷贝到etc里。配置了一下mysql连接信息。
misc/init.d里面有启动用的脚本,我看了一下,感觉还是自己写比较好。
直接启动,告诉我找不到libnetsnmp.so.30。估计是我snmp是自己编译的,zabbix做的有问题,链接路径搞错了,于是先
export LD_LIBRARY_PATH=/*****/snmpd/lib
再启动即可。
然后配置web管理页面。
frontends/php/*里的php文件拷贝到指定位置。开始配置,发现zabbix有个特点,要求php的最大执行时间超长,估计是数据多了处理比较慢。不配好就不能安装,配好后进入管理后台,默认账号和密码是admin和zabbix。进去后配置了下。网页做得比较土,不过功能很强大,很多配置项。
刚开始只启动了zabbix_server,管理后台老是提示无法连接云云,启动了zabbix_agentd后可以监控了。感觉跟文档不符,文档似乎说server也能够监控的。没打算细研究,所以没有细究。
管理页面还支持中文,不错。
现有的小破vps还不至于用这么重量的监控,试试而已。
linux shell脚本信号处理:trap
[| 2011/10/19 01:50]
之前一直以为shell脚本中没法处理信号,所以也没有探究过,突然发现是可以的。
#!/bin/bash
abc(){
echo "signal receive"
}
trap 'abc' INT
sleep 100
这个脚本会在收到ctrl+c的时候打印signal receive。
#!/bin/bash
abc(){
echo "signal receive"
}
trap 'abc' INT
sleep 100
这个脚本会在收到ctrl+c的时候打印signal receive。
linux系统打开core文件设置
[| 2011/10/14 23:30]
默认linux系统是不开启core文件的,不过对于运行较多自己写的程序的服务器,开启core文件还是很有必要的。
首先设置ulimit允许core文件,默认0,不允许。
使用ulimit -c可以设置,但不是永久的。通过编辑/etc/security/limits.conf 文件可以永久改变这一设置。
加入两行:
* soft core unlimited
root soft core unlimited
要对root单独设置,刚开始只设置了*,后来发现没有对root生效。
默认core文件路径和core文件名都不太好,放到固定位置,使用固定规则生成core文件是比较好的选择。
/proc/sys/kernel/core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
echo 1 > /proc/sys/kernel/core_uses_pid
/proc/sys/kernel/core_pattern可以设置格式化的core文件保存位置或文件名,默认文件内容是core
可以这样修改:
echo "/corefile/core-%e-%p-%t" > core_pattern
将会控制所产生的core文件会存放到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
首先设置ulimit允许core文件,默认0,不允许。
使用ulimit -c可以设置,但不是永久的。通过编辑/etc/security/limits.conf 文件可以永久改变这一设置。
加入两行:
* soft core unlimited
root soft core unlimited
要对root单独设置,刚开始只设置了*,后来发现没有对root生效。
默认core文件路径和core文件名都不太好,放到固定位置,使用固定规则生成core文件是比较好的选择。
/proc/sys/kernel/core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
echo 1 > /proc/sys/kernel/core_uses_pid
/proc/sys/kernel/core_pattern可以设置格式化的core文件保存位置或文件名,默认文件内容是core
可以这样修改:
echo "/corefile/core-%e-%p-%t" > core_pattern
将会控制所产生的core文件会存放到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
ab压力测试时页面动态时被认为错误Failed requests
[| 2011/10/14 10:51]
今天在压力测试一个vps性能时,发现大量Failed requests,非常疑惑,跑脚本curl了很多次,查看结果,发现结果确实有不一致,原来wordpress一个主题上面的主图片是动态变换的,每次请求返回的是随机一个图片地址。ab发现各请求返回内容不一致,所以判断有错误。换成一个普通的主题,正常了。
查看进程所属组(gid)
[| 2011/10/14 00:39]
今天想看某个进程所述的组,发现常用的ps,top等命令都显示不出来。头大,直接去/proc/***/status里面看,有了,Uid,Gid两栏。查到后去passwd和group文件里面对照即可。