25
七/09
4

什么是LLMP

在网站架构设计中,大家一定对 LAMP (Linux Apache Mysql Php) 不陌生。
LAMP确实是一个非常优秀的架构,秉承着自由,开放,高效,易用的设计理念。
但是,本文不打算探讨LAMP,网上有很多介绍LAMP的资料。
这里,想给大家介绍另一个在LAMP上衍生出来的,以提升性能为主要目的的开源网站架构。

1, 选择高性能 OS
首先,不难理解,任何一个server最底层的支撑还是OS,而OS的选择,主要包括 Unix, Windows server, Linux, BSD等等。
其中,开源的OS,有Linux, BSD及部分unix。从目前使用情况来看,linux还是网站首选OS之一。

但是,Linux由于其自由的特点,也给选择产生了一些不便 – 发行版太多。
现有的主流版本包括 red hat(RHEL), ubuntu, 红旗, opensuse, debian等。

其中,每一个发行版都有自己的特色,比如RHEL的稳定,ubuntu的易用,红旗的中文支持很棒等。

但要以性能为主,又兼顾稳定,易用性,以上都不是最佳选择。
这里推荐一个发行版,它是一个极限性能,加高度可定制,优化的 Linux – gentoo。

gentoo的性能优化是从kernel源码编译就开始入手了,通过选择不同的源码包,可以适应于不同的应用场景。
(不同内核介绍: http://imkenwu.javaeye.com/blog/168906 )
举个经典的例子:国内,douban.com 在定制优化过的 gentoo 上跑的web服务器最高一天支撑了 2500 万pv。
http://www.dbanotes.net/arch/douban_web_server.html

这种流量,哪怕是提供纯静态的内容,也是很恐怖的。
而支持这种大流量的,除了server本身,最关键的就是高度精简的OS了。
所以,综上所述,高性能网站推荐使用可优化,定制的 gentoo 作为载体。

2, 选择高性能 web server
Apache是 LAMP 架构最核心的 web server, 开源,模块丰富,功能强大,稳定是它的绝对优势。
在美国前100个网站中,有49%的使用apache。可见其影响力。

但是,有利有弊,apache的致命缺陷,就是多于臃肿,强大的功能,一定会带来性能上的损耗。
面对这种情形,在市场上,有一支异军突起,那就是更轻量级的 web server – lighty(lighttpd)。
官方为它定义的口号是 fly light。

它具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块支持等特点。
这让他在短时间内占据了14%以上的市场份额。并且有越来越多的人开始选择使用lighty作为前端 web server。

到这里为之,其实高性能 web server 非 lighty 莫属。但更棒的是,依靠 gentoo 的高度定制化,我们还可以
进一步提升 lighty 的性能潜力-那就是定制 lighty。

3,选择高性能 database

数据库是任何网站走动态化内容展现及业务数据存储的保障。
市面上的开源数据库主要有 mysql , postgresql , berkeley db, sqlite 等。
其中,对比一下,

mysql : 多线程,多处理器,高性能,5.0以上支持事务,丰富数据类型和sql语法,跨平台。
postgresql : 面向对象,集成web,支持事务,使用进程,速度略慢于mysql.
berkeley db : 嵌入式,数据操作通过接口完成,跨语言。
sqlite : 与php集成,支持ACID特性,支持大并发量,库锁。

从上面的对比中,不难看出,mysql 应该是性能,稳定性与功能性的综合之选。

4,选择高性能 script language
能与 lighty 结合的脚本语言,主要有 ruby, php, python, perl。方式主要是通过 fast-cgi 来访问。
只从性能角度对比几种语言:

dfct32t2_24356nvhmfh

不难看出,python 是此次测试中,性能最好的脚本语言。
动态处理方面有绝对优势。对比 php , 前者,可以更快的渲染输出内容,并由经lighty, 高速flush缓存到浏览器。
值得一提的是, douban.com 也是使用 python 作为应用服务器。

总结一下,什么是 LLMP?
LLMP 是 Linux Lighty Mysql Python 的组合,作为一种高性能的网站架构设计存在。

什么是高性能的LLMP?
LLMP并不意味着高性能,只是比其他架构,更有性能的提升潜力。高性能的LLMP,需要从系统,程序,硬件各个层面上协同进行的。

关键字:
19
六/09
5

PHPEclipse:A User Guide

今天看到一本好书:《PHPEclipse:A User Guide》,着重对phpeclipse这个插件进行介绍,此类资料中这个算是比较详细,三种平台都有介绍(Linux,Mac,Windows)。对Quantum DB Plug-In也有介绍,唯一“不好”的地方就是:晦涩的单词太多,不知道我辈的英文水平不是很好啊。。借助翻译工具还是硬着头皮看下来了,200多页,其中还有部分插图,花费3个小时,还算值得。

推荐给想用eclipse做php开发的朋友,熟练后就不必使用收费的zend studio了。

关键字: ,
4
一/09
2

PHP Architect’s Guide to PHP Security [3]

今天继续翻译PHP Architect’s Guide to PHP Security这本书的第三章《SQL注入》。由于第二章XSS有专门的书籍介绍,以后会专门翻译,所以暂时跳过XSS,先对SQL Injection进行介绍。

SQL注入是另一种常见的漏洞(针对XSS来说),是由于对输入数据过滤不严导致的。它不像XSS是直接针对站点的用户,而是直接破坏站点本身,特别是数据库。SQL注入的目的是插入任意数据,常常是插入一条被数据库执行的SQL语句。这些潜伏的被插入语句常常执行很多操作,从获取数据到更改或删除数据库信息。

// supposed input
$name = “ilia’; DELETE FROM users;”;
mysql_query(“SELECT * FROM users WHERE name=’{$name}’”);
这段功能本来是想从user表中获取匹配name字段的数据,一般情况下,name变量是一些字母数字和空白字符的组合,比如字符串“ilia”,但如果我们附加了查询语句,这条注入的查询语句将会删除users表中的所有记录。(幸运的是,mysql的mysql_query函数不允许堆查询,在一次调用中不允许执行多次查询,但是SQLite和postgresql扩展是可以的。

PHP的自动转义机制GPC提供了一些基本保护,如果启用了magic_quotes_gpc,将会对单引,双引等一些字符进行转义(在前面加反斜线)。但是magic quotes不包括所有需要转义的字符,并且这个特性不总是开启的。所以你需要自己用代码来阻止SQL注入。

php的很多数据库扩展有自己专门的转义机制,例如Mysql扩展的mysql_real_escape_string()函数。

if (get_magic_quotes_gpc()) {
  $name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query(“SELECT * FROM users WHERE name=’{$name}’”);
在调用数据库扩展的转义机制之前,首先要对magic quotes的状态进行检查,如果magic guotes启用了,则要去掉它可能添加的反斜线,以免输入数据被转义2次。

待续。。。有点累了。

 

关键字: ,
12
十二/08
4

php和python的比较

python的应用现在越来越多了,想多了解点pygtk和django的东西,但只有一些php和C的基础,而python的语法还是比较独特的。接触python半年多,总结一点和php的比较以及优缺点。

首先,python的性能一直比较争议,而php本身的速度是比java的东西慢,但和db操作起来,肯定是比java的东西快很多了,这算是一个php的优势。并且php的成本较低(LAMP)应该算是很便宜的东东了,而现在支持python的服务器还不是很普遍,对机器要求也较高。下面简单看看语法。

php这种类C的语法是以大括号划分代码块来确定程序逻辑的,而python则是以代码缩进的形式。优缺点都有,缩进自然简化了输入繁琐,有人描述写python程序跟写英文作文一样,虽然这个描述有点夸张,但确实反应了python的优雅语法。唯一比较麻烦的事情就是用惯了类C语法的人对缩进不是很适应,比如我刚用python的时候,程序报错30%是缩进相关的问题,慢慢习惯就好了。下面说说引号,php中有单引和双引,加上dochere语法。单引不解析其内的变量或者转义字符,但是速度较快,所以如果是纯字符串,推荐用单引。而双引会将里面的变量或者转义字符解析后输出。php的dochere语法可以输入较长的字符串,而不用顾及单引和双引的交叉问题,但dochere语法要求较为“严格”,比如必须顶头写,开始标记和结束标记必须相同。而python的三引号语法使用起来很简单,单引和双引则没有区别(这点跟php和java等语言不一样)。

下面看数据类型。别的区别不大,主要是php数组这块,php如果分的比较详细,就是一个数组和关联数组,数组相当于python的列表(list),关联数组相当于python的字典(dictionary, perl中叫哈希hash),另外python还有一个tuple(元组),其中的内容和字符串一样是不可变化的。下面看数据处理,php的大部分数据处理都是数组操作,有一大堆以array_开头的函数可提供功能,数组没有负索引,而python的序列相关操作比较方便,功能更强大。php在一些特殊操作平台用-a参数可以使用交互模式,而python也支持交互模式,一些简单计算可以直接使用。

web方面:php的开发框架比较成熟,大都是mysql数据库驱动的。而python目前比较成熟的开发框架不是很多,流行的有zope,django和豆瓣用的Quixote。也不知道豆瓣当时为什么选择后者,可能当时ror和django这些东西还没有吧。

最后说下OO,现在大部分php的产品还是面向过程的,除了使用一些第三方的开源库。php5引入了很多的面向对象特性,对之前的版本来说,面向对象特性就是个鸡肋。而python的模块,OO机制很不错,也是学习的一个重点。

总之,python的特性有很多,学习它一定不会失望。由于本人水平有限的可怜,这个小文章就当是给想接触python的phper们一点动力吧。

关键字: ,
8
十/08
0

PHP Architect’s Guide to PHP Security [2]

White List Validation (白名单验证)
Being Careful with File Uploads (文件上传时要小心)
File Content Validation (文件内容验证)
Accessing Uploaded Data (访问上传数据)
The Dangers of Magic Quotes (Magic Quotes的危险性)
Magic Quotes Normalization (Magic Quotes正规化)
Validating Serialized Data (验证序列化数据)
External Resource Validation (外部资源验证)

Assumption is the enemy of security and making assumptions about user input is a sure way to allow an attacker to subvert your code. 又一次强调开发者的假设所带来的后果。对开发者来说,普遍假设selection box和check box以及radio button和hidden字段值是不用验证的,这就完全错了,
因为恶意用户可以拷贝html表单代码并且修改后来进行恶意提交任意数据。比起黑名单的概念,我们最好还是选择白名单,也就是说我们给出合法的值,然后验证是否合法;而不是给出不合法的值,验证值是否非法。显然后者不如前者来得安全。这里作者给出一个例子,说明了这个问题:
$months = array(“January”, “February”, /* … */);
if (empty($_POST[‘month’]) || !in_array($_POST[‘month’], $months)) {
   exit(“Quit hacking, you’re not a lumberjack!”);
}

关于文件上传:如果你的应用程序不会使用到文件上传的特性,你可以编辑php.ini文件来禁止文件上传。
file_uploads=off
upload_max_filesize指令可以控制上传的单个文件最大值,以字节为单位。默认值为2M
post_max_size指令限制了当表单以POST方式提交的数据大小。通常情况下,这个值我们应该设置地比上面那个file_uploads稍微大一点点。如果你可能用到多文件上传,根据需要自行调整。默认值为8M。

(待补充。。。)

关键字: ,