Submitted by gouki on 2010, April 25, 8:30 PM
最近javaeye发生一起小故障,是robbin自己说的:
XML/HTML代码
- @robbinfan: 昨晚JE所在机房切换电源关机导致网站无法访问。早上恢复后因为数据库和缓存服务器都被清空,巨大流量(QPS将近400,并发连接到1000)直接冲击导致web服务被阻塞,现在正在逐步恢复中。
在mikespook.com看到对待这个问题的分析时,突然想起桔子也遇到过类似的问题,所以把他们两个人的事情贴出来。
先上mikespook的:
XML/HTML代码
- 显然,这是一次运维事故。事故的原因是分流作用的数据库和缓存出现“故障”,导致数据层响应延迟,web 服务器阻塞。这里我没有用“清空”而是用了“故障”来描述分流数据库和缓存,是因为实质上 javaeye 的这次事故虽然是正常维护(电源切换)后发生的,但是其表象跟分流数据库和缓存宕机是一样的。
-
- 这个故事给我的两个启示:
-
- 在架构设计上,对于分流数据库或者缓存或许应有一定的持久化能力。比如,在维护时,按照从“外”到“内”的顺序逐步关闭服务。在这个例子里,“外” 就是 web服务,“内”就是数据层。在关闭了“外”服务后,手工或自动将缓存持久化。维护完成,开启顺序从“内”到“外”,并在回复完底层存储后,将持久化数据恢复到缓存。
-
- 在运维规范上,在维护后应让系统进入一个的磨合期,在合理的时间内通过分流(比如跳转到一个“系统忙”的页面)或者防火墙封锁的方式。让系统保持在比正常负载低一些的水平。持续一段时间(或者维护后累计访问量达到某个值)后再让系统开足马力去运行。
-
- 这样,应该可以避免空缓存大并发导致的宕机事故。
-
- 再次感谢 robbin 和 javaeye 为我们带来的启示。
再上桔子的,汗,突然发现桔子的博客上居然没有写,看来是上次在群里看到了,大意如下:
XML/HTML代码
- 某次更新系统,然后需要重启,结果重启后CPU长时间处于100%(?还是死机了?),后来检查发现,原来故障是出在缓存上。
- 因为是采用文件缓存,而又设定了过期时间,重启后,所有的缓存都过期了。然后网站访问量又大,突然而来的访问导致缓存重新生成,差点让机器出故障。
- 所以现在开始要调整缓存架构。
其实上面两个问题都差不多。都是在访问大的时候,缓存频繁生成造成的故障,这确实不容忽略,但如何解决真的是一个问题。很多时候在访问量不大时,我们都考虑使用文件来作为缓存存储。但真正访问量高了后,文件缓存不可避免的就带来IO的消耗,如何批量生成缓存?还是按次生成缓存?还是定有一定的策略?难道还要采用队列?那就夸张了。
所以,一个好的系统架构也是很需要的,不能因为一次宕机就永远起不来。我个人是偏向于队列生成缓存,这样就不用担心一次写入过多文件引起IO的崩溃。但队列是因为有延迟的,如果控制同样的内容不重复生成文件缓存,则需要另外考虑
Tags: 故障, 缓存, 重启, 维护
PHP | 评论:1
| 阅读:16045
Submitted by gouki on 2010, April 25, 12:12 PM
这篇文章很有意思,以前注意过,但没仔细考虑过用来注入,或许就象王猛说的:
了解很长一段时间的web安全了,个人觉得世上最聪明的程序员其实是黑客,一次想N步,逻辑超强,技术全面,从操作系统漏洞、到语言本身漏洞、数据库本身漏洞、再到开发者代码,无孔不入。
文章来自寂寞hacker,http://hi.baidu.com/isbx/blog/item/08ef48547ef1ad58574e00bf.html:
当前的Web开发者中肯定有不少人没有注意到作者所提到的这两个问题的。
第一个问题是这样的,MySQL默认有一个配置参数 max_packet_size,这个参数是用于限制MySQL客户端和MySQL服务器端数据通信的数据包大小,MySQL的默认配置是1MB。如果客 户端发送的数据超过了1MB,则MySQL服务器端会忽略掉这个请求数据。作者接下来举了两个利用这个缺陷的例子,第一个是利用超长数据来使MySQL的 日志记录程序失效,第二个是在PHP+MySQL的环境下,PHP的Session清理程序会由于一次发送的清理session数据的请求数据包超过 max_packet_size的限制,而导致清理session失败。
而实际上,由于很多PHP+MySQL的程序都会运行用户上传附件之类,而一般的PHP+MySQL的上传附件限制都是大于1MB的,所以PHP的 程序开发人员一般是会去修改max_packet_size的值为大于1MB。这就给我们的漏洞利用带来了一定的麻烦,毕竟在当前的网络状况下,构造 1MB多的数据去上传还是可以忍受的。但是太大的数据量就比较考验我们的耐心了,呵呵。
第二个问题就比较严重了,MySQL对于超过字段长度的数据插入操作会进行默认的字符串截短。例如一个字段定义的长度为10,如果插入的字符串长度 超过10,MySQL会将长度超过10的部分字符串自动舍去后插入到数据表中。默认配置条件下,MySQL会产生一个警告信息,但是这个警告信息不会被 Web应用程序捕获到。所以,从表面上来看,超长数据也是可以“成功”插入数据表的。作者在下面举的这个例子就很有代表性了,首先是一个场景假设:
- The application is a forum where new users can register
- The administrator’s name is known e.g. ‘admin’
- MySQL is used in the default mode
- There is no application restriction on the length of new user names
- The database column username is limited to 16 characters
用户如果尝试注册一个用户名为admin的用户,会由于Web应用程序中的isAlreadyRegistered函数的校验而注册失败。
SQL代码
- SELECT * FROM user WHERE username='admin'
但如果用户使用用户名’admin x’来注册(注意admin和x之间有11个空格),则注册流程会是这样的:
isAlreadyRegistered函数会使用上面的SQL语句来检查user表中是否存在相同用户名的用户,查询结果肯定是不存在的。那么用户注册成功!
实际上,真正插入到user表中的用户名是’admin’!也就是说,MySQL不仅会截短超过长度限制部分的字符串,也会对字符串头尾的空白字符进行截短!所以,在user表中,现在存在了两个admin用户!
接下来,用户登陆,他使用的是用户名admin,密码是他刚才设置的’admin x’的密码。假设Web应用程序的登陆认证和授权函数是这样的一段代码:
PHP代码
- $userdata = null;
- if (isPasswordCorrect($username, $password)) {
- $userdata = getUserDataByLogin($username);
- ...
- }
其中isPasswordCorrect函数使用的SQL语句为:
SQL代码
- SELECT username FROM users WHERE username = ? AND passhash = ?
getUserDataByLogin函数使用的SQL语句为:
SQL代码
- SELECT * FROM users WHERE username = ?
可以看得出,上面的语句使用了预编译的SQL语句,是无法实施SQL注入的。但是由于MySQL的默认字段截短策 略,isPasswordCorrect函数会成功执行并返回用户名admin,接下来的getUserDataByLogin也会正确执行,返回的结果 虽然是一个数组,但是Web应用程序一般是取返回数组中的第一个结果,也就是真正的管理员用户admin的所有数据!
怎么样,不用SQL注入,一样拿到管理员权限!
后记:经过测试,上面的漏洞利用过程在MySQL 4中是确实存在并且可以利用的。但是在MySQL 5中,本机测试失败。失败的关键就在于MySQL 5对于超过字段长度限制的字符串插入会报错,并停止字符串插入操作。
附:MySQL 4的测试过程
SQL代码
- mysql> select * from tb_sqltest where name='jason';
- +
- | id | name | remark | time | col1 | col2 | col3 |
- +
- | 1 | jason | NULL | NULL | NULL | NULL | NULL |
- +
- 1 row in set
-
- mysql> select * from tb_sqltest where name='jason x';
- Empty set
-
- mysql> insert into tb_sqltest (id,name) values (2,'jason x');
- Query OK, 1 row affected
-
- mysql> select * from tb_sqltest where name='jason';
- +
- | id | name | remark | time | col1 | col2 | col3 |
- +
- | 1 | jason | NULL | NULL | NULL | NULL | NULL |
- | 2 | jason | NULL | NULL | NULL | NULL | NULL |
- +
- 2 rows in set
Tags: mysql
DataBase | 评论:1
| 阅读:19525
Submitted by gouki on 2010, April 24, 12:01 PM
说实话,看到Qeephp常年不更新后,也担心这个程序会消失。所以,我自己还是备份一下比较好。在以前的博客里我也作过介绍,但都是给的官方地址,而官方地址从fleaphp.net到fleaphp.org,再到现在的qeephp.com,很多链接都失效了。所以,我还是在本地备份一下较好。
这个版本已经又快一年没更新了,不过想来也没有什么好更新的东西。所以。我还是复制了一下官方的介绍:
APM Express 是一个集成了 Apache 2.2、PHP5、MySQL 5,以及 phpMyAdmin、QeePHP 框架(含示例)的绿色集成运行环境,简称为“APMXE”。解压缩即可使用,不写入任何系统文件,100% 绿色。
版本说明
- Apache 2.2(完整)
- PHP 5.2.9–2(完整)
- XCache 2.0.4
- MySQL 5.0(服务端和命令行工具)
- phpMyAdmin 3.2
- QeePHP 2.1(含示例)
使用说明
下载后可以获得一个 .zip 文件,其中包含安装程序。运行安装程序设置好解压缩目录后,即可通过快捷方式启动。启动后,通过浏览器访问 http://localhost/ 查看 APM Express 的欢迎页面。
注意:默认设置的端口号为 9000,MySQL 端口号为 9066。
配置文件修改说明:
配置文件共有三个:
httpd.conf.tempalte - Apache2 的配置文件
mysql.ini.template - MySQL5 的配置文件
php.ini.template - PHP5 的配置文件
修改这三个文件后,启动 APM Express 时就会以这三个文件为基础生成 apache/mysql/php 的配置文件。所以要自定义设置,就改这三个文件。
配置文件模版
配置文件中所有 %APMXE% 的字符串将会在 APM Express 运行时替换为 apmxe.exe 所在路径。替换后的内容会写入三个新的配置文件,供 Apache/PHP/MySQL 使用。
两个下载地址:
说 明: apmxe-setup-2009-06-17.zip
官 方: apmxe-setup-2009-06-17.zip (11130.92 KB, 上传日期:2009-06-17 22:58)
本 地: apmxe-setup-2009-06-17.zip (11130.92 KB, 上传日期:2010-04-24 12:00)分流
说 明: apmxe-2009-01-20.zip
官 方: apmxe-2009-01-20.zip (7646.35 KB, 上传日期:2009-01-20 07:48)
本 地:apmxe-2009-01-20.zip (7646.35 KB, 上传日期:2010-04-24 12:00)分流
Tags: apmxe, amp
Software | 评论:2
| 阅读:22235
Submitted by gouki on 2010, April 23, 10:56 PM
rtf是一种富文本格式,根据RFC的规范,可以将其转为各种文件,如doc,wps等,但如果真的要根据RFC规范一点点的写程序,那就真的太累了。所以。。。我用wps转换了。
以前写过wps生成文档的程序,就是这篇闲着无聊,用WPS生成文档,现在,这个RTF转换到HTML也可以用PHP来完成
PHP代码
- <?php
- $wps = new COM('WPS.Application');
- $wps->Visible = false; //不显示wps界面
- $filename = realpath('./RTF_to_HTML_Converter.rtf');
- $stime = microtime(1);
- for ( $ii = 0; $ii < 1000; $ii++ ){
- $savedfile = "c:\\convert\\{$ii}_test.html";
- $doc = $wps->Documents->Open($filename);
- $doc->SaveAs($savedfile, 8);
- $doc->Close();
- }
- $wps->Quit();
- echo( sprintf( "%0.6f" , (microtime(1)-$stime) ) );
- unset( $doc , $wps );
测试了一下,生成1000个文件,花了257秒,4分多种,可以接受这个时间,只是在转换的时候,CPU超过50%,而且是在命令行下的。如果是在网页界面肯定是没有这么快的了。
PS:转换后,中文编码实体化了,看看中文怎么转,变成这样的格式,它是什么内容呢?它们就是:【看看中文怎么转】<-- 可以看一下源码,就知道这7个字是什么样的了
Tags: rtf, html, wps
PHP | 评论:1
| 阅读:23542
Submitted by gouki on 2010, April 23, 7:29 AM
这篇SEO的文章内容很长,而且里面的链接很多,我就不转载了,内容在http://xuui.net/librarys/seo-for-wordpress.html,我自己下载了一份,打包上传成附件。
作者举了这些例子:
1、设置一个友好链接
2、让 WordPress 的 URL 地址唯一化
3、合理设置一个 robots.txt
4、关于 Meta 内容
5、优化 title(页标题)内容
6、文章标题 (Headings) 二级标题、三级标题的使用
7、建立一个合理的导航结构
8、是否移除链接上的 nofollow 属性
9、建立一个 Site Map(站点地图)
10、页面的设计
11、关键词的使用
12、CSS
13、文章内容和反向链接
说明:如果有必要,这篇文章以后可以不断更新,就像 jim 一样,SEO for WordPress 这篇文章从 05 年一直写到现在。如果有什么不对的地方,也欢迎大家指正,以便及时修改。
--EOF--
由于文章一直在更新,所以,如果觉得有用的可以去网上查看和下载。基本上最早的来源是:http://www.osxcn.com/wordpress/seo-for-wordpress.html
附件: wordpress.rar (78.2 K, 下载次数:2096)
Tags: seo, wordpress, xuii.net
Misc | 评论:0
| 阅读:18187