很经典的图片效果:Lightbox和FancyBox

2009年12月8日 没有评论

        适才有朋友问道Kim Minji作品欣赏上显示图片的效果是怎么做到的,于是谈起了图片显示特效来。武汉百度推广

        我所知道的,比较经典的当属这两个:Lightbox和FancyBox。下面一一来介绍给朋友们。

       1. Lightbox                                   

       效果预览:

        http://blog.designlinks.cn/gallery
        http://www.flashpic.cn/down/code/js/lightbox-js-v2/
        http://beach.blogbus.com/logs/3470001.html

        如何使用:
步骤 1 – 安装
Lightbox v2.0 使用 Prototype 框架和 Scriptaculous 效果库. 你将需要外调这三个 Javascript 文件在你的 header. <script type=”text/javascript” src=”js/prototype.js”></script>
<script type=”text/javascript” src=”js/scriptaculous.js?load=effects”></script>
<script type=”text/javascript” src=”js/lightbox.js”></script>
外调 Lightbox CSS 文件 (或添加 Lightbox 样式到你现行的样式表中). <link rel=”stylesheet” href=”css/lightbox.css” type=”text/css” media=”screen” />
检查 CSS 并确定调用的 prev.gif 和 next.gif 文件在正确的位置. 同样要确定调用的 loading.gif 和 close.gif 文件及 lightbox.js 文件在正确的位置.
步骤 2 – 激活
添加 rel=”lightbox” 属性到任何一个链接标签去激活lightbox. 例如: <a href=”images/image-1.jpg” rel=”lightbox” title=”my caption”>image #1</a>
可选择项: 使用 title 属性加上说明.
如果你有一套你想分组的相关图片, 接着上一部并且又在 rel 属性中添加一个带方括号的组名. 例如: <a href=”images/image-1.jpg” rel=”lightbox[roadtrip]“>image #1</a>
<a href=”images/image-2.jpg” rel=”lightbox[roadtrip]“>image #2</a>
<a href=”images/image-3.jpg” rel=”lightbox[roadtrip]“>image #3</a>
没有限定每个页面的图片组数量和每个图片组图片的数量. 疯了!

        下载Lightbox:http://www.flashpic.cn/code/jscode_2.html

          2. FancyBox

         效果预览:

         http://flashpic.cn/down/code/js/jquery.fancybox-1.2.1/

        简介:              武汉百度公司

        FancyBox是一款基于jquery开发的类Lightbox插件。支持对放大的图片添加阴影效果,对于一组相关的图片添加导航操作按纽,该lightbox除了能够展示图片之外,还可以展示iframed内容, 通过css自定义外观。

         相对与Lightbox而言,阴影效果更好。但是比Lightbox绚丽。

         使用很是简单,可以参照Lightbox,修改添加代码。

         下载及更多介绍:

          http://www.flashpic.cn/code/jscode_7.html

分类: 前端技术 标签:

对于magic_quotes_gpc的一点认识

2009年12月6日 没有评论

       最近遇到件挺郁闷的事情,服务器上面装了两次软件都失败,大致问题出在数据初始化上面,猜测大概是因为单引号双引号的问题处理上吧,即死活记不起来是配置哪个参数来着,遂找到了这篇博文。。。

      为了达到更好的兼容性,其中的程序涉及到了magic_quotes_gpc,看了下手册,又找了些资料,分析了下,分享给大家。                                     武汉百度公司

blankyao 说“学习的过程就是不断的发现错误,不断的改正错误”;

更多文章请访问
blankyao.cn
先看下手册上怎么说的吧!

对一般人来说看下前两段就可以了

Magic Quotes

[复制到剪切板]
CODE:
Magic Quotes is a process that automagically escapes incoming data to the PHP script. Its preferred to code with magic quotes off and to instead escape the data at runtime, as needed.

What are Magic Quotes

[复制到剪切板]
CODE:
When on, all (single-quote), " (double quote), \ (backslash) and NULL characters are escaped with a backslash automatically. This is identical to what addslashes() does.   

There are three magic quote directives: ;

magic_quotes_gpc

[复制到剪切板]
CODE:
Affects HTTP Request data (GET, POST, and COOKIE). Cannot be set at runtime, and defaults to on in PHP.

magic_quotes_runtime

[复制到剪切板]
CODE:
If enabled, most functions that return data from an external source, including databases and text files, will have quotes escaped with a backslash. Can be set at runtime, and defaults to off in PHP.

magic_quotes_sybase

[复制到剪切板]
CODE:
If enabled, a single-quote is escaped with a single-quote instead of a backslash. If on, it completely overrides magic_quotes_gpc. Having both directives enabled means only single quotes are escaped as ”. Double quotes, backslashes and NULLs will remain untouched and unescaped.

Why use Magic Quotes

1 Useful for beginners    
  
Magic quotes are implemented in PHP to help code written by beginners from being dangerous. Although SQL Injection is still possible with magic quotes on, the risk is reduced.    
  
2Convenience    
  
For inserting data into a database, magic quotes essentially runs addslashes() on all Get, Post, and Cookie data, and does so automagically.    
  

Why not to use Magic Quotes

1 Portability

[复制到剪切板]
CODE:
Assuming it to be on, or off, affects portability. Use get_magic_quotes_gpc() to check for this, and code accordingly.

2 Performance

[复制到剪切板]
CODE:
Because not every piece of escaped data is inserted into a database, there is a performance loss for escaping all this data. Simply calling on the escaping functions (like addslashes()) at runtime is more efficient.    
  
Although php.ini-dist enables these directives by default, php.ini-recommended disables it. This recommendation is mainly due to performance reasons.

3 Inconvenience

[复制到剪切板]
CODE:
Because not all data needs escaping, it’s often annoying to see escaped data where it shouldn’t be. For example, emailing from a form, and seeing a bunch of within the email. To fix, this may require excessive use of stripslashes().

这些英文实在是需要像我这类人有足够的耐心啊(不是说我有耐心,而是我英语烂),刚才也说了,对于一般人只看下前两段就可以了,特别是我用红色标出来的字!!!

另外,特别注意的是,魔术引用发生作用是在传递$_GET,$_POST,$_COOKIE时

下面是案例

[复制到剪切板]
CODE:
1.
条件: magic_quotes_gpc=off
写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。

数据: &#8194;$data="snow””sun" ; (snow和sun之间是四个连续的单引号).

操作: 将字符串:"snow””sun" 写入数据库,

结果: 出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。

数据库保存格式:无数据。

输出数据格式:无数据。

说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误。

武汉百度推广

[复制到剪切板]
CODE:
2.
条件: magic_quotes_gpc=off
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。

数据: &#8194;$data="snow””sun" ; (snow和sun之间是四个连续的单引号).

操作: 将字符串:"snow””sun" 写入数据库,

结果: sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow””sun (和输入一样)

输出数据格式:snow””sun (和输入一样)

说明: addslashes()函数将单引号转换为’的转义字符使sql语句成功执行,
但\’并未作为数据存入数据库,数据库保存的是snow”’sun 而并不是我们想象的snowsun

[复制到剪切板]
CODE:
3.
条件: magic_quotes_gpc=on
写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。

数据: &#8194;$data="snow””sun" ; (snow和sun之间是四个连续的单引号).

操作: 将字符串:"snow””sun" 写入数据库,

结果: sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow””sun (和输入一样)

输出数据格式:snow””sun (和输入一样)

说明: magic_quotes_gpc=on 将单引号转换为’的转义字符使sql语句成功执行,
但\’并未作为数据入数据库,数据库保存的是snow”’sun而并不是我们想象的snowsun。

[复制到剪切板]
CODE:
4.
条件: magic_quotes_gpc=on
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。

数据: &#8194;$data="snow””sun" ; (snow和sun之间是四个连续的单引号).

操作: 将字符串:"snow””sun" 写入数据库,

结果: sql语句顺利执行,数据成功写入数据库

数据库保存格式:snowsun (添加了转义字符)

输出数据格式:snowsun (添加了转义字符)

说明: magic_quotes_gpc=on 将单引号转换为的转义字符使sql语句成功执行,
addslashes又将即将写入数据库的单引号转换为,后者的转换被作为数据写入
数据库,数据库保存的是snowsun

总结如下:

1. 对于magic_quotes_gpc=on的情况,

我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。

如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2. 对于magic_quotes_gpc=off 的情况

必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

补充:

magic_quotes_gpc 作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.
magic_quotes_runtime 作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据

原文地址:http://www.phpfans.net/bbs/viewthread.php?tid=6860&page=1&extra=page%3D1

分类: PHP 标签:

UCHome二次开发规范

2009年12月4日 没有评论


注意:此文和UCHome的Manyou开发模式不同,Manyou是利用Discuz的开放平台MYOP开发公共插件,可供所有基于UCHome的网站使用;而此文涉及的开发模式与Manyou不同,是在本地开发,以插件的形式扩展UCHome原有功能。

        UCHome是Discuz的一款 SNS程序,能让每个网站都用拥有自己的Facebook/校内。Discuz也提供了MYOP开发者平台,所有开发者都可以在此平台上开发自己的应用程 序供其他UCHome网站使用,不但可以为自己的网站增加功能,同时也能将自己网站的功能推广到数以万计的UCHome网站中,可谓一举两得。

      有时候,开发者并不一定希望使用MYOP开发应用,一是由于产品的需要,并不希望开发出来的应用被其他网站使用;二者MYOP的开发,必须处理联网模式,不能本地开发,较为繁琐。因此,很多有能力的站长会在UCHome的基础之上,以修改UCHome代码的方式增加功能。

      但UCHome发展速度很快,经常会有版本更新,往往这个时候,修改了UCHome源码的站长就会面临一个两难的问题:是升级程序?还是为了保留以 往的修改,而不升级?在我看来,如果前期做好开发规范,是完全可以避免这个问题的。下面介绍一下我在UCHome Apps开发过程中的一些经验。

      想要能够随着官方的程序发布实现平滑的代码升级,无非一点:尽量的少改UCHome原有代码。少改,但不是不改。一点不改程序的源代码是不可能的。但如何能实现少改呢?我定制了了下面的一些规则:

基本原则 

      除template目录下的模板文件,其余uchome原有文件尽量不要改动。如需要改动,需汇报项目管理人员记录后才可实施修改。
      即使需要对系统原有文件进行修改,尽量不要在文件中增加逻辑代码,也不要修改原有逻辑,使用include的方式来增加逻辑。
      例如,需要在系统首页增加growth的表单,设计到两个系统原有文件的修改:
source/space_feed.php
template/space_feed.htm
        但请不要直接在这两个文件中增加逻辑代码,对于模板文件,可以使用<!-{template apps/growth/tpl/widget/form.htm}–>的方式加载一个外部文件;同样,针对程序文件,也可以使用include ‘apps/growth/widget/form.php’的方式。
采用这样的方式,即使以后程序文件被覆盖,也不会增加太多工作量。

文件结构

  • 以apps.php作为入口文件,所有应用都使用类似apps.php?do=growth&ac=list这样的URL访问应用程序。 其中do为应用名称,ac为动作(执行的脚本名)。例如上面的例子,实际是以apps.php为入口,再加载apps/growth/list.php。
  • 应用程序统一放在apps目录之下,以应用的名称创建文件夹。例如,成长曲线的名称为growth,则创建apps/growth/目录,所有成 长曲线的应用程序都放在此文件夹下。其中tpl文件夹存放模板文件,image文件夹存放图片,可根据应用需求安排apps/growth/内的文件结 构。
  • growth/doc 目录用于存放当前应用的文档,例如开发文档、api手册、数据库脚本等。
  • growth/api.php为growth为外部程序提供的接口。文件内的代码是一个类,命名为AppsGrowthApi,类中方法均为静态方法,方法名采用驼峰格式,例如getGrowthPointByUid,方法名称要足以描述其功能。
  • apps/common文件存放一些应用程序公用的文件,例如公用的js库,function库,类库等。

命名规范

程序命名规范

  • 文件名一律小写,单词间以下划线分隔
  • 类名采用首字母大写的驼峰命名方式
  • 类中的方法名采用首字母小写的驼峰方式命名
  • 类中的私有方法和私有变量以下划线开头
  • 函数名全小写,单词间以下划线分隔
  • 变量名同函数名

数据库命名规范

  • 数据表以uchome_app_作为前缀,例如uchome_app_growth_point
  • 字段名全为小写,以下划线分隔单词
  • 建议在建表时注明备注,方便理解字段用处
  • 对数据表结构的更改,请在当前应用的doc/sql目录下以日期为单位新建文件,记录更改。
分类: 其他 标签:

eGroupWare 协同工作平台的搭建及使用

2009年12月2日 没有评论


      老板要求给公司搞个OA,要求还不少,之前对OA接触的并不多(幸亏还知道OA是啥,不然掉大了)。于是我在网上一通搜索,找了一些以PHP开发的开源系统工作平台,包括: Simple GroupwarePHProjektGForgeeGroupWarephpGroupWare。试用了这些系统的demo, 从用户体验,本地化程度及功能特点,我最终选择了eGroupWare作为这个项目的协同工作平台。

         eGroupware是一个多用户,在以PHP为基础的API上的定制集为基础开发的,以WEB为基础的工作件套装。目前可用的模板包括:电子邮件,通讯录,日程表,记事簿(备注,任务,电话),内容管理,论坛,书签,维客等。

    由于本人以前没有接触过PHP相关的技术,所以从搭建eGroupWare到配置花了两个下午的时间,中途被无数个问题折磨。综合考虑,我想下面的部分主要从两个部分谈起,一个是eGroupWare的安装及配置,另外一个是eGroupWare的使用。

eGroupWare的安装及配置

     在配置eGroupWare之前,我最先查阅的是BugFree的帮助文件,知道了PHP相关应用通常需要Apache+PHP+Mysql。
二话不说,先准备环境:
     Windows XP Sp2
     apache_1.3.39-win32-x86
     php-5.2.5-Win32
     MySql 5.0(MySql-Front V3.2)
     eGroupWare-1.4.002

*这里发生了一件搞笑的事情,我在sourceforge上下载eGroupWare包的时候,我把eGroupWare-gallery-1.4.002 当作eGroupWare-1.4.002了,结果等我配好之后才发现不对

     我最先安装的是apache(apache的安装只要一直next就可以成功完成),然后解压php进行相关配置。这里的配置在网上可以搜出一大堆文章,其中不乏一些图文版。但是要注意的是在配置的过程中:1.注意自己apache和php的版本,不同的版本配置不太一样 2.决定采用CGI还是嵌入模块的方法进行安装。 其实那么多文章我看了很多,每个都说的不一样。刚开始我一直配置不成功,phpinfo()就是显示不出来。这里推荐给大家的方法是使用PHP自带的帮助,可以在php解压后的install.txt中找到具体步骤。另外我还推荐把php的目录和php下的ext目录加入到系统环境变量中,这样可以少了很多麻烦事,然后加完之后一定要记得重启哦

     这里不得不提的是我犯了一个以前犯过很多次的错误:在我检查配置n次后,始终无法正确查看 test.php文件,浏览器显示为文本文件。殊不知那个文件在隐藏后缀的情况下实际上是text.php.txt

     还有一个注意点,在php.ini中加入LoadModule php5_module "C:/php/php5apache.dll"的时候,一定不要把php5apache.dll写成php5apache2.dll或者其他。因为前者是面向apache1.x系列,后者面向2.0的。还有在ini中书写文件路径时,一定要用"/",而不是"\",后者被理解为转义字符。

     上面的步骤做完之后就可以拿一个简单的php页面做测试了,如果能够正常显示,配置的就没问题了。如果apache服务有问题或者php仍然无法正常显示,请重新阅读安装说明并查看windows的应用程序日志。

     下面的工作就是安装eGroupWare了,把下载的包解压到您设定的DocRoot下(默认在XX:\Program Files\Apache Group\Apache\htdocs)。和eGroupWare Gallery2一样,eGroupWare的安装相当的人性化,只需在浏览器中定位到http://XXXX/egroupware/setup/ 就可以进行安装了。STEP by STEP,如果出现error或者warning,只要参照网页上面的出错提示一步步做就没问题了。中间需要安装MySql,这个也只需要一直next就可以了。配置好header.inc.php和admin相关之后基本上eGroupWare的配置就结束了。 注意这些所有的配置过程都可以通过以后登录setup这个页面进行修改的。

eGroupWare的使用
      首先让我们看看eGroupWare的主要模块组成!

Chatty是一个实时的聊天室,也是修改自一个独立的程序,不过是原作者带着它加入eGroupWare中;透过它可以检视目前有哪些人上线,并且与上线的人实时传递讯息。比较特别的地方是这个模块是以 AJAX 技术设计,因此并不会像部份网络聊天室一样频繁的更新画面(这样子对眼睛很不好…),对于服务器也不会造成太大的负担。

   当然,对我们的项目而言,并不需要如此多的功能,因此我也只挑选了部分的应用程序进行安装,这要得益于eGroupWare的插件式的应用程序集成接口。要指出的是,尽管eGroupWare很强大,但是有很多地方可能使用起来不太习惯,例如在配置“新闻管理”时候,需要先进行权限分配才可以进行添加操作(ACL很强大);"bug跟踪"里头删除需要在编辑里面将状态改为"deleted"才行等等。另外,eGroupWare的汉化不是很完全。

下图为系统的一些截图:

日程表


通讯录


记事簿

项目管理

资源

时间表

bug追踪


网上文件柜

新闻管理


更多精彩要亲自体验

原文地址:http://www.cnblogs.com/drizzlecrj/archive/2008/01/08/1030821.html

[felamimail 电子邮件]

一个只支持 IMAP 协议(大部分是 POP3)的邮件阅读程序,它支持 Sieve 邮件过滤规则语言(RFC 3028),也能够在 eGroupWare 建立新帐号时,同步在Cyrus IMAP或是Postfix等邮件服务器上建立对应的邮件帐号;只是目前对于欧美语系以外邮件的支持还不算完整。

[calendar 行事历]

eGroupWare 的行事历提供许多弹性,能够在安排行程时检视同样群组的使用者行程,也能够由系统协助查询时间的空档,避免在安排行程时产生冲突。除了一般常见到的重复行程、行程提醒与相关字段外,它还能够与eGroupWare的其它模块产生连结,并且安排行程的与会人员、需要的资源(例如会议室、投影机等),考虑的相当周到。

行事历、通讯簿与记事本等模块能够透过 SyncML 协议与计算机、手机和PDA等设备进行资料同步,行程的资料也可以透过 iCAL 或是 CSV 格式汇入,以及汇出 iCAL 格式资料。

[timesheet 时间表]

时间表也可以称之为工时记录表,主要是配合项目管理模块使用,用来让使用者根据项目中的工作内容提报工时,方便会计部门进行项目成本的估算。

[manual 线上说明]

线上说明是基于 wiki 模块延伸出来的功能,主要是希望在官方网站汇集来自世界各地使用者提供的操作说明,透过这个模块就可以下载官方网站最新版本的资料,只是目前资料是以英语、德语为主。

[resources 资源管理]

许多公司内部经常发生抢资源的情形,像是约了一个客户来公司却发现所有的会议室都在使用中,或是等半天就是借不到那个神奇的投影机。资源管理模块就是为了避 免类似情况而设计,可以让使用者预约包括会议室、投影机、公务车或是各种公用资源,避免因为行程上的冲突造成损失。…当然,前提是没有人有”插队”的特权。

[projectmanager,projects 项目管理]

projectmanager是新版的项目管理模块,前一个版本为 projects ,前者与其它模块有较佳的整合,而后者则是兼顾了许多细节;虽然两个模块各有拥护者,但是都来自同一个开发者,而这个开发者未来应该只会维护新版的项目管理模块。

[mydms,filemanager 档案管理]

旧版的档案管理模块 filemanager 只是单纯提供档案上传与下载的管理功能,而 mydms 提供了许多进阶功能,像是版本控制、关联档案、异动通知与权限控管等;filemanager也能够控制权限,不过仅限于模块本身的增、删、改、查, mydms 进一步做到控制类别与个别档案的权限,适合对于资料安全诉求较高的组织。


[fudforum 讨论区]

FUDforum 本身就是国外的一个热门讨论区系统,除了大部分讨论区系统可以看到的功能外,甚至能够透过与新闻群组、通讯论坛等系统整合,让部份从BBS起家的网 站能够移转或是保留现有系统运作。eGroupWare所内建的 FUDforum 版本已经没有再更新,不过功能已经能够满足大部分需求。

[tts 问题传票系统]

传票给人的感觉很像会计在使用的,其实这个模块有点类似内部联系单,像是计算机坏了需要人处理、客户留言需要转给业务、或是初一十五拜拜要请人去采买牲礼等都 可以透过这个模块”交办”或是”求救”;因为这样的需求可能像是A部门接到B部门的客户电话,然后将资料转给B部门的主管,再由B部门的主管转给适当的业 务处理,信息需要传来传去,所以称之为传票。

[messenger 线上传讯]

这个模块提供个人与个人之间的留言功能, 不受限于时间与地理位置限制,像是A部门的某甲男心仪B部门的某乙女,就可以透过这个功能留言给某乙女,请她去吃个饭;公司是否允许这样的行为不清楚、某 乙女会不会把某甲男的简讯传给其它人看也不知道,线上传讯就是这么样的一个工具。

[workflow 工作流程]

工作流程是eGroupWare中较复杂的模块之一,主要用来进行商业流程的自动化,像是文件、信息或任务在一个流程中的参与者中如何传递、处理与通知,可以定义相当多的自动处理规则;这个模块的前身是 tikiwiki GalaxiaWorkflow,一个以活动为基础的工作流程系统,需要花些时间理解其中的概念才能够应用。

[wiki 协同编辑]

资讯圈子中的朋友对于 wiki 这个新名词应该不陌生,也有人将它翻译作”快记”,大部分的人都将它拿来当作知识管理的工具之一;eGroupWare内建的 wiki 模块与需要记忆大量特殊语法的wiki系统不同,使用了所见即所得编辑器处理大部分的内容。

[jinn 网站管理]

JiNN 代表了 JiNN is Not Nuke 的递归缩写,作者藉此传达对于 Nuke 系统的热门相当不以为意;这个模块有点像是进阶的数据库管理工具,能够同时让多个人参与多个网站数据库的管理工作,只是操作方式需要花些时间理解。

举例来说,在JiNN中定义了一个网站后,JiNN会去撷取指定网站的数据库信息,接着可以根据数据库中的资料表定义对象;对象中除了资料表的字段名称与属性外,还能够进一步定义数据域位间的关联以及数据域位输入的方式、限制等。相关操作完成后就可以透过JiNN对该网站进行资料的增、删、改、查,甚至是制作报表等进阶功能,等于是只要将一个网站的前端处理完成就能够用它来进行管理,功能还不会比自己设计的管理接口逊色。

[phpbrain 知识管理]

最简单的知识管理方式就是搜集常见问答,接着将许多相关的文章串连在一起,必要时在以这些问答内容为基础撰写完整的教学,甚至延伸出其它格式的教学内容; eGroupWare中的知识管理就是基于这样的概念设计,除了发问、回答、自问自答外,还能够连结内部文章或是外部网站,并且附加档案、评论等,所有的操作也会有详实的纪录保留。

[chatty 聊天室]

分类: 其他 标签:

找到一款不错的网站压力测试工具webbench

2009年11月30日 没有评论

  webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便。

  1、适用系统:Linux

  2、编译安装:
引用
wget http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gz
tar zxvf webbench-1.5.tar.gz
cd webbench-1.5
make && make install

  3、使用:
引用
webbench -c 500 -t 30 http://127.0.0.1/test.jpg
  参数说明:-c表示并发数,-t表示时间(秒)

  4、测试结果示例:

引用
Webbench – Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://127.0.0.1/test.jpg
500 clients, running 30 sec.

Speed=3230 pages/min, 11614212 bytes/sec.
Requests: 1615 susceed, 0 failed.

原文:http://blog.s135.com/post/288/

分类: 架构 标签:

Varnish vs Squid

2009年11月29日 没有评论

对于坊间流传的:
1.varnish的性能比squid高10~20倍
2.squid 3.0的性能比2.6有提高
本次测试将会揭示结果,
是否varnish的架构真的能提升那么多的性能
是否squid的新版本在性能上有所提升
测试中将不对平台.软件.等等进行优化
由于优化水平的关系将极大的影响结果.
此次测试中的数据可以作为基准数据.
可以由其中个别软件的优化与非优化结果比例系数
自行计算得出比较结果.所以个别软件的优化或者系统优化后对整体的影响
可以由读者自行对特定软件进行,并使用此基准数据进行推算.
WEB站点的页面
我将淘宝的首页获取到本地
作为测试对象
测试页面下载
index_files

平台:
PROXY:
CentOS 5.1 最小化安装
浪潮NF190
Xeon 2.8
1G RAM
73G SCSI
Squid 2.6,Squid 3.0,Varnish 1.1.2

WEB:
CentOS 5.1 最小化安装
浪潮NF180
Xeon 2.8
1G RAM
73G SCSI
Nginx 0.6.31

CLIENT:
CentOS 5.1 最小化安装
浪潮NF260
Xeon 2.4
512M RAM
36G SCSI
http_load-12mar2006

SWITCH:
DLINK DES 1024R+

1.Squid 2.6
编译参数

./configureprefix=/usr/local/squid26

配置文件

visible_hostname test2.hiadmin.com
http_port 80 accel vhost vport
cache_peer 192.168.210.111 parent 80 0 noquery originserver name=test1
acl all src 0.0.0.0/0.0.0.0
http_access allow all
cache_log /var/log/squid26/cache.log

2.Squid 3.0
编译参数

./configureprefix=/usr/local/squid30

配置文件

visible_hostname test2.hiadmin.com
http_port 80 accel vhost vport
cache_peer 192.168.210.111 parent 80 0 noquery originserver name=test1
acl all src 0.0.0.0/0.0.0.0
http_access allow all
cache_log /var/log/squid30/cache.log

3.Varnish 1.1.2
编译参数

./configureprefix=/usr/local/varnish

配置文件

backend default {
  
set backend.host = "192.168.210.111";
  
set backend.port = "80";
}

运行参数

varnishdf /usr/local/varnish/default.vcla 0.0.0.0:80

4.Nginx 0.6.31
编译参数

./configureprefix=/usr/local/nginx

配置文件

worker_processes10;
events {
  
worker_connections1024;
}
http {
  
includemime.types;
  
default_typeapplication/octetstream;
  
sendfileon;
  
keepalive_timeout65;
  
server {
  
listen80;
  
server_namelocalhost;
  
location / {
  
roothtml;
  
indexindex.html index.htm;
  
}
  
error_page500 502 503 504/50x.html;
  
location = /50x.html {
  
roothtml;
  
}
  
}
}

5.http_load
运行参数

./http_loadparallel 1000seconds 10 urls.txt
urls.txt
http://192.168.210.222/index.html

6.squid 2.7
编译参数

./configureprefix=/usr/local/squid27

配置文件

visible_hostname test2.hiadmin.com
http_port 80 accel vhost vport
cache_peer 192.168.210.111 parent 80 0 noquery originserver name=test1
acl all src 0.0.0.0/0.0.0.0
http_access allow all
cache_log /var/log/squid27/cache.log

测试结果

点图放大
图标中标注浅黄色的为客户端在抓取过程中只出现一次或几次的500
橙色的为出现500抓取错误的频率较多
红色的为几乎每次都会出现500抓取错误
值得注意的是squid 3.0
在500并发连接数时500出现的次数很多
但是在1000的时候反而抓取失败率下降了.

CPU和内存占用率

点图放大
varnish一直保持良好的CPU和内存使用率
但是到了1000并发数的时候
你会发现CPU使用率到了103%
没错.我并没有打错.在5次测试中,VARNISH的1000并发数测试其CPU占用率一直徘徊在101~103之间
可能是varnish的连接池写的不是特别好.当大于varnish处理量时,会使用更多的CPU资源去处理
squid 3.0似乎是个CPU和内存的占用大户
可能和版本比较新以及特性比较多有关(虽然这次什么特性都没用上)
squid 2.6保持了良好的姿态,稳定的CPU占用率和内存占用率.表明了为何市面上使用最多是它的原因.

更详细的内容可以下载此表格
varnish-vs-squid3

虽然varnish有着令人吃惊的CPU占用率(超过处理能力时也很令人吃惊)
但是其处理超大量的链接时内存和CPU使用率的暴涨并不令人满意
不过其表现出的在最大负荷时的fetchs/second
确实比squid 2.6要高出大约8%
实验表明.在需要更加稳定的生产环境中,varnish还不能替代老一代的squid 2.6
但是其对squid 3.0已经产生了很明显的挑战.
如果squid 3.0不能比他的上代产品提供更好的性能和稳定性的话
很有可能最佳反向代理的宝座会被varnish夺走
不论如何
这次测试的主题.varnish比squid有着10倍或者20倍的性能
被证实是不可能实现的.
虽然测试数据量充满100M带宽可能影响到测试的准确度.
但是更高的带宽所带来的同时连接数,很可能会撑爆varnish主机的CPU和内存.

结论
1.varnish在高负载下以CPU和内存为代价,比squid 2.6提高8%,但是绝非10倍~20倍.
2.squid 3.0的性能比2.6更低.而非更高.相反,3.0是最不稳定以及性能最差的.
3.squid 2.7的性能比2.6低,但是CPU和内存占用率控制的更好.

分类: 架构 标签:

Linux防火墙IPTables配置方法详解

2009年11月29日 没有评论

如果你的IPTABLES基础知识还不了解,建议先去看看。

我们来配置一个filter表的防火墙

1、查看本机关于IPTABLES的设置情况

[root@tp ~]# iptables -L -n

Chain INPUT (policy ACCEPT)

target prot opt source destination

Chain FORWARD (policy ACCEPT)

target prot opt source destination

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

Chain RH-Firewall-1-INPUT (0 references)

target prot opt source destination

ACCEPT all — 0.0.0.0/0 0.0.0.0/0

ACCEPT icmp — 0.0.0.0/0 0.0.0.0/0 icmp type 255

ACCEPT esp — 0.0.0.0/0 0.0.0.0/0

ACCEPT ah — 0.0.0.0/0 0.0.0.0/0

ACCEPT udp — 0.0.0.0/0 224.0.0.251 udp dpt:5353

ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp dpt:631

ACCEPT all — 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22

ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80

ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25

REJECT all — 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

可以看出我在安装linux时,选择了有防火墙,并且开放了22,80,25端口.

如果你在安装linux时没有选择启动防火墙,是这样的

[root@tp ~]# iptables -L -n

Chain INPUT (policy ACCEPT)

target prot opt source destination

Chain FORWARD (policy ACCEPT)

target prot opt source destination

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

什么规则都没有.

2、清除原有规则.

不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则.

[root@tp ~]# iptables -F 清除预设表filter中的所有规则链的规则

[root@tp ~]# iptables -X 清除预设表filter中使用者自定链中的规则

我们在来看一下

[root@tp ~]# iptables -L -n

Chain INPUT (policy ACCEPT)

target prot opt source destination

Chain FORWARD (policy ACCEPT)

target prot opt source destination

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

什么都没有了吧,和我们在安装linux时没有启动防火墙是一样的.(提前说一句,这些配置就像用命令配置IP一样,重起就会失去作用),怎么保存.

[root@tp ~]# /etc/rc.d/init.d/iptables save

这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.

[root@tp ~]# service iptables restart

现在IPTABLES配置表里什么配置都没有了,那我们开始我们的配置吧。

3、设定预设规则

[root@tp ~]# iptables -p INPUT DROP

[root@tp ~]# iptables -p OUTPUT ACCEPT

[root@tp ~]# iptables -p FORWARD DROP

上面的意思是,当超出了IPTABLES里filter表里的两个链规则(INPUT,FORWARD)时,不在这两个规则里的数据包怎么处理呢,那就是DROP(放弃).应该说这样配置是很安全的.我们要控制流入数据包

而对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT,也就是说,不在着个规则里的包怎么办呢,那就是通过.

可以看出INPUT,FORWARD两个链采用的是允许什么包通过,而OUTPUT链采用的是不允许什么包通过.

这样设置还是挺合理的,当然你也可以三个链都DROP,但这样做我认为是没有必要的,而且要写的规则就会增加.但如果你只想要有限的几个规则是,如只做WEB服务器.还是推荐三个链都是DROP.

注:如果你是远程SSH登陆的话,当你输入第一个命令回车的时候就应该掉了.因为你没有设置任何规则.

怎么办,去本机操作呗!

4、添加规则.

首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链

为了能采用远程SSH登陆,我们要开启22端口.

[root@tp ~]# iptables -A INPUT -p tcp –dport 22 -j ACCEPT

[root@tp ~]# iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT (注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一部,好多人都是望了写这一部规则导致,始终无法SSH.在远程一下,是不是好了.

其他的端口也一样,如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链:

[root@tp ~]# iptables -A OUTPUT -p tcp –sport 80 -j ACCEPT ,其他同理.)

如果做了WEB服务器,开启80端口.

[root@tp ~]# iptables -A INPUT -p tcp –dport 80 -j ACCEPT

如果做了邮件服务器,开启25,110端口.

[root@tp ~]# iptables -A INPUT -p tcp –dport 110 -j ACCEPT

[root@tp ~]# iptables -A INPUT -p tcp –dport 25 -j ACCEPT

如果做了FTP服务器,开启21端口

[root@tp ~]# iptables -A INPUT -p tcp –dport 21 -j ACCEPT

[root@tp ~]# iptables -A INPUT -p tcp –dport 20 -j ACCEPT

如果做了DNS服务器,开启53端口

[root@tp ~]# iptables -A INPUT -p tcp –dport 53 -j ACCEPT

如果你还做了其他的服务器,需要开启哪个端口,照写就行了.

上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP

允许icmp包通过,也就是允许ping,

[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)

[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话)

允许loopback!(不然会导致DNS无法正常关闭等问题)

IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)

IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)

下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要DROP(放弃)的链.

减少不安全的端口连接

[root@tp ~]# iptables -A OUTPUT -p tcp –sport 31337 -j DROP

[root@tp ~]# iptables -A OUTPUT -p tcp –dport 31337 -j DROP

有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会

还有其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关资料.

当然出入更安全的考虑你也可以包OUTPUT链设置成DROP,那你添加的规则就多一些,就像上边添加

允许SSH登陆一样.照着写就行了.

下面写一下更加细致的规则,就是限制到某台机器

如:我们只允许192.168.0.3的机器进行SSH连接

[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp –dport 22 -j ACCEPT

如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.

24表示子网掩码数.但要记得把 /etc/sysconfig/iptables 里的这一行删了.

-A INPUT -p tcp -m tcp –dport 22 -j ACCEPT 因为它表示所有地址都可以登陆.

或采用命令方式:

[root@tp ~]# iptables -D INPUT -p tcp –dport 22 -j ACCEPT

然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存.写入到/etc/sysconfig/iptables文件里.

[root@tp ~]# /etc/rc.d/init.d/iptables save

这样写 !192.168.0.3 表示除了192.168.0.3的ip地址

其他的规则连接也一样这么设置.

在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控.

开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)

[root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state –state RELATED,ESTABLISHED -j ACCEPT

[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT

丢弃坏的TCP包

[root@tp ~]#iptables -A FORWARD -p TCP ! –syn -m state –state NEW -j DROP

处理IP碎片数量,防止攻击,允许每秒100个

[root@tp ~]#iptables -A FORWARD -f -m limit –limit 100/s –limit-burst 100 -j ACCEPT

设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.

[root@tp ~]#iptables -A FORWARD -p icmp -m limit –limit 1/s –limit-burst 10 -j ACCEPT

我在前面只所以允许ICMP包通过,就是因为我在这里有限制。

配置一个NAT表放火墙

1、查看本机关于NAT的设置情况

[root@tp rc.d]# iptables -t nat -L

Chain PREROUTING (policy ACCEPT)

target prot opt source destination

Chain POSTROUTING (policy ACCEPT)

target prot opt source destination

SNAT all — 192.168.0.0/24 anywhere to:211.101.46.235

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

我的NAT已经配置好了的(只是提供最简单的代理上网功能,还没有添加防火墙规则).关于怎么配置NAT,参考我的另一篇文章

当然你如果还没有配置NAT的话,你也不用清除规则,因为NAT在默认情况下是什么都没有的

如果你想清除,命令是

[root@tp ~]# iptables -F -t nat

[root@tp ~]# iptables -X -t nat

[root@tp ~]# iptables -Z -t nat

2、添加规则

添加基本的NAT地址转换,(关于如何配置NAT可以看我的另一篇文章),

添加规则,我们只添加DROP链.因为默认链全是ACCEPT.

防止外网用内网IP欺骗

[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP

[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP

[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP

如果我们想,比如阻止MSN,QQ,BT等的话,需要找到它们所用的端口或者IP,(个人认为没有太大必要)

例:

禁止与211.101.46.253的所有连接

[root@tp ~]# iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP

禁用FTP(21)端口

[root@tp ~]# iptables -t nat -A PREROUTING -p tcp –dport 21 -j DROP

这样写范围太大了,我们可以更精确的定义.

[root@tp ~]# iptables -t nat -A PREROUTING -p tcp –dport 21 -d 211.101.46.253 -j DROP

这样只禁用211.101.46.253地址的FTP连接,其他连接还可以.如web(80端口)连接.

按照我写的,你只要找到QQ,MSN等其他软件的IP地址,和端口,以及基于什么协议,只要照着写就行了.

最后:

drop非法连接

[root@tp ~]# iptables -A INPUT -m state –state INVALID -j DROP

[root@tp ~]# iptables -A OUTPUT -m state –state INVALID -j DROP

[root@tp ~]# iptables-A FORWARD -m state –state INVALID -j DROP

允许所有已经建立的和相关的连接

[root@tp ~]# iptables-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

[root@tp ~]# iptables-A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

[root@tp ~]# /etc/rc.d/init.d/iptables save

这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.

[root@tp ~]# service iptables restart

别忘了保存,不行就写一部保存一次。你可以一边保存,一边做实验,看看是否达到你的要求,

上面的所有规则我都试过,没有问题。

写这篇文章,用了我将近1个月的时间.查找资料,自己做实验,希望对大家有所帮助.如有不全及不完善的地方还请提出。

因为本篇文章以配置为主.关于IPTABLES的基础知识及指令命令说明等我会尽快传上,当然你可以去网上搜索一下,还是很多的。

分类: Linux 标签:

CentOS+Nginx+PHP+Mysql+安全指南全环境搭建笔记(二)

2009年11月29日 没有评论

– 服务器的安全设置及其他

主要内容:
[设置Ngnix可提供AVI、MP3等的下载]
[设置网站并发数限制]
[设置nginx程序限制的1M上传问题]
[优化PHP]
[优化mysql]
[mysql的安全设置]
[系统整体安全调整]

[设置Ngnix可提供AVI、MP3等的下载]

# vi /usr/local/webserver/nginx/conf/mime.types
↑ 编辑mime.types文件
将需要提供下载的格式前的文件类型修改为"application/octet-stream"
# vi /usr/local/webserver/nginx/conf/mime.types.default
↑ 编辑mime.types.default文件
将需要提供下载的格式前的文件类型修改为"application/octet-stream"

[设置网站并发数限制]
已在配置nginx.conf文件时加入并发数限制,具体参见官方维基百科(http://wiki.codemongers.com/NginxChsHttpLimit_zoneModule)"httplimit_zonemodule "部分

[设置nginx程序限制的1M上传问题]
已在配置nginx.conf文件时取消1M上传限制,具体参见nginx.conf文件内注释

[优化PHP]
具体参见(http://www.cnprint.org/bbs/blogs/1/blog312.html)"php 优化设置"部分
此处仅设置部分必要内容

# vi /usr/local/webserver/php/etc/php.ini
↑ 编辑php.ini文件

1.将"disable_functions ="
修改为 "disable_functions = phpinfo,passthru,exec,system,popen,chroot,escapeshellcmd,escapeshellarg,shell_exec,proc_open,proc_get_status"
↑**这条建议在网站建成之后修改**该选项可以设置哪些PHP函数是禁止使用的,PHP中有一些函数的风险性还是相当大的,可以直接执行一些系统级脚本命令,如果允许这些函数执行,当PHP程序出现漏洞时,损失是非常严重的!
需注意:如果您的服务器中含有一些系统状态检测的PHP程序,则不要禁用shell_exec,proc_open,proc_get_status等函数。

2.将"upload_max_filesize = 2M"
修改为 "upload_max_filesize = 50M"
↑该选项设定PHP所能允许最大上传文件大小,默认为2MB。根据实际应用需求,可以适当增大该设置。

[优化mysql]
具体参见(http://www.cnprint.org/bbs/blogs/1/blog312.html)"mysql 优化及安全设置"部分
此处仅设置部分必要内容

# vi /usr/local/webserver/mysql/my.cnf ↑ 编辑my.cnf文件

1.将"table_cache = 64"
修改为 "table_cache = 512"
↑指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果您发现open_tables等于 table_cache,并且opened_tables在不断增长,那么您就需要增加table_cache的值了(上述状态值可以使用show status like ‘Open_tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。

2.将"sort_buffer_size = 512k"
修改为 "sort_buffer_size = 2M"
↑每个线程排序所需的缓冲

3.将"read_buffer_size = 128k"
修改为 "read_buffer_size = 2M"
↑当一个查询不断地扫描某一个表,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果您认为连续扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。

4.将"read_rnd_buffer_size = 512k"
修改为 "read_rnd_buffer_size = 4M"
↑加速排序操作后的读数据,提高读分类行的速度。如果正对远远大于可用内存的表执行GROUP BY或ORDER BY操作,应增加read_rnd_buffer_size的值以加速排序操作后面的行读取。仍然不明白这个选项的用处…

5.将"myisam_sort_buffer_size = 8M"
修改为 "myisam_sort_buffer_size = 32M"
↑用于REPAIR TABLE。不明白这个选项的用处,百度上找到的设置方向也是五花八门,有128M、64M、32M等,折中选一个。

[mysql的安全设置]
具体参见(http://www.cnprint.org/bbs/blogs/1/blog312.html)"Mysql 的安全设置"部分
此处仅设置部分必要内容

**iptables中设置**关闭远程连接,即3306端口。这是MySQL的默认监听端口。由于此处MySQL只服务于本地脚本,所以不需要远程连接。尽管MySQL内建的安全机制很严格,但监听一个TCP端口仍然是危险的行为,因为如果MySQL程序本身有问题,那么未授权的访问完全可以绕过 MySQL的内建安全机制。(您必须确定,您是否真的不需要远程连接mysql)

[系统整体安全调整]

1、**最后设置**RHEL或Red Had Enterprise Linux 5.X 的用户要首先要打开SElinux,方法是修改/etc/selinux/config文件中的SELINUX="" 为enforcing 。它可以保证您的系统不会非正常的崩溃。有些人认为应该关闭,我强烈不推荐,当然只是将RHEL用来玩玩,不是用于实际服务器则无所谓了。
2、**最后设置**启用iptables 防火墙,对增加系统安全有许多好处。设置好防火墙的规则。
iptables要求:
* 屏蔽所有端口
* 把SSH的缺省端口设置为56565
* 把56565、80、3306端口打开
* 把3306端口设置为只允许本机访问

Iptables规则:
# vi /usr/local/webserver/fw.sh
将以下脚本命令粘贴到 fw.sh 文件中
#!/bin/bash
# Stop iptables service
/sbin/service iptables stop
# Inital chains default policy
/sbin/iptables -F -t filter
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT ACCEPT
# Enable Native Network Transfer
/sbin/iptables -A INPUT -i lo -j ACCEPT
# Accept Established Connections
/sbin/iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
# ICMP Control
/sbin/iptables -A INPUT -p icmp -m limit –limit 1/s –limit-burst 10 -j ACCEPT
# WWW Service
/sbin/iptables -A INPUT -p tcp –dport 80 -j ACCEPT
# SSH Service
/sbin/iptables -A INPUT -p tcp –dport 56565 -j ACCEPT
# Anti DDOS
/sbin/iptables -I INPUT -p tcp –syn -m ttl –ttl-eq 117 -j DROP
/sbin/iptables -I INPUT -p tcp –syn -m length –length :40 -j DROP
# mysql 3306 Accept
/sbin/iptables -A INPUT -p tcp -s 127.0.0.1 –dport 3306 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -s 127.0.0.1 –dport 3306 -j ACCEPT
# Start iptables service
/sbin/service iptables start

保存后执行以下命令
# chmod 755 /usr/local/webserver/fw.sh
# echo ‘/usr/local/webserver/fw.sh’ >> /etc/rc.d/rc.local
# /usr/local/webserver/fw.sh

3、执行setup关闭那些不需要的服务,少开一个服务,就少一个危险,已在< 系统安装后的初始环境设置 >中设置
4、禁止Control-Alt-Delete键盘关闭命令
在"/etc/inittab"文件中注释掉下面这行(使用#):
# vi /etc/inittab
将"ca::ctrlaltdel:/sbin/shutdown -t3 -r now" 修改为: "#ca::ctrlaltdel:/sbin/shutdown -t3 -r now"
为了使这项改动起作用,输入下面这个命令:
# /sbin/init q
5、给"/etc/rc.d/init.d"下script文件设置权限
给执行或关闭启动时执行的程序的script文件设置权限。
# chmod -R 700 /etc/rc.d/init.d/*
这表示只有root才允许读、写、执行该目录下的script文件。
6、使"/etc/services"文件免疫
使"/etc/services"文件免疫,防止未经许可的删除或添加服务:
#chattr +i /etc/services
7.阻止您的系统响应任何从外部/内部来的ping请求。
既然没有人能ping通您的机器并收到响应,您可以大大增强您的站点的安全性。您可以加下面的一行命令到/etc/rc.d/rc.local,以使每次启动后自动运行。
# vi /etc/rc.d/rc.local
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
8、对您的系统上所有的用户设置资源限制可以防止DoS类型攻击(denial of service attacks)
如最大进程数,内存数量等。例如,对所有用户的限制象下面这样:
# vi /etc/security/limits.conf
下面的代码示例中,所有用户每个会话都限制在 10 MB,并允许同时有四个登录。第三行禁用了每个人的内核转储。第四行除去了用户 bin 的所有限制。
* hard rss 10000
* hard maxlogins 4
* hard core 0
bin –
激活这些限制
# vi /etc/pam.d/login 底部添加一行: session required /lib/security/pam_limits.so。
9、用chattr命令给下面的文件加上不可更改属性。
# chattr +i /etc/passwd
# chattr +i /etc/shadow
# chattr +i /etc/group
# chattr +i /etc/gshadow
**mysql数据库密码变更后再设置**注意执行这个操作后,以root身份都不能向系统增加用户或者修改密码了。
如果我们要增加用户或者修改密码的。应该先用chattr -i /etc/passwd等命令解除不可写设置,再进行操作。
10、修改sshd的端口:
修改防火墙配置,开启新的远程端口(56565)
# vi /etc/sysconfig/iptables

修改/etc/ssh/sshd_config:
# vi /etc/ssh/sshd_config
将里面的 Port 改为 56565,(具体的端口随意,不能和其他程序的端口冲突)。并注释掉前面的#号

使sshd服务生效:
# pkill sshd
# service sshd start

修改防火墙配置,关闭旧的远程端口(22)
# vi /etc/sysconfig/iptables
注意:修改了防火墙配置文件后不得再使用setup修改防火墙设置,否则现在的设置会失效
11、 内核参数调整
编辑sysctl.conf文件:
# vi /etc/sysctl.conf
修改如下:
net.ipv4.conf.default.accept_source_route=0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_echo_ignore_all=1
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.ip_conntrack_max=65535
net.ipv4.tcp_syn_retries=1
net.ipv4.tcp_synack_retries=1
net.ipv4.route.gc_timeout=100
net.ipv4.tcp_max_syn_backlog=32768
net.ipv4.conf.default.rp_filter=0
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
kernel.shmmax = 134217728
查看状态:
# sysctl -p
12、经常检查系统日志。系统日志主要位于/var/log/目录下。防患于未然。

– 数据自动备份

主要内容:
[安装NCFTP软件以支持自动上传数据库备份]
[数据库每日备份]
[数据库即时备份**按需操作**]
[日志备份]

[安装NCFTP软件以支持自动上传数据库备份]

# cd /software
# wget ftp://ftp.ncftp.com/ncftp/ncftp-3.2.2-src.tar.gz
# tar zxvf ncftp-3.2.2-src.tar.gz
# cd ncftp-3.2.2
# ./configure –prefix=/usr/local/webserver/ncftp
# make && make install

[数据库每日备份]
每天4:00,将数据库拷贝至/backup/day后进行压缩,然后上传至FTP服务器上,/backup/day/留有压缩文件一天。

# vi /usr/local/webserver/backupd.sh

↑ 编辑脚本/usr/local/webserver/backupd.sh

写入以下内容:

#!/bin/bash
rm -rf /backup/day/*
cd /backup/day/
cp -rf /usr/local/webserver/mysql/data/(此处为数据库名称)/ /backup/day/wp_db_$(date +%Y%m%d)
sleep 10
echo "ready to tar in 10s ."
tar zcvf `hostname`_wpdata_of_$(date +%Y%m%d).tar.gz wp_db_$(date +%Y%m%d)
sleep 10
echo "ready to upload in 10s ."
/usr/local/webserver/ncftp/bin/ncftpput -u backupd -p (FTP密码) (FTP服务器地址) / /backup/day/`hostname`_wpdata_of_$(date +%Y%m%d).tar.gz
sleep 30
echo "upload done ."
rm -f `hostname`_wpdata_of_$(date +%Y%m%d).tar.gz
sleep 5
rm -rf wp_db_$(date +%Y%m%d)
clear

保存,并设置计划任务:

# crontab -e

增加一行:

00 4 * * * /bin/bash /usr/local/webserver/backupd.sh

↑ 每天凌晨4点将自动备份数据库并上传。

[数据库即时备份**按需操作**]
每隔6小时,将数据库拷贝至/backup/hour目录进行备份,然后将压缩文件上传至FTP服务器上,/backup/hour/留有压缩文件一天。

# vi /usr/local/webserver/backuph.sh

↑ 编辑脚本/usr/local/webserver/backuph.sh

写入以下内容::

#!/bin/bash
rm -rf /backup/hour/*
cd /backup/hour/
cp -rf /usr/local/webserver/mysql/data/(数据库名称)/ /backup/hour/wp_db_$(date +%Y%m%d%H)
sleep 10
echo "ready to tar in 10s ."
tar zcvf `hostname`_wpdata_of_$(date +%Y%m%d%H).tar.gz wp_db_$(date +%Y%m%d%H)
sleep 10
echo "ready to upload in 10s ."
/usr/local/webserver/ncftp/bin/ncftpput -u backuph -p (FTP密码) (FTP服务器地址) / /backup/hour/`hostname`_wpdata_of_$(date +%Y%m%d%H).tar.gz
sleep 30
echo "upload done ."
rm -f `hostname`_wpdata_of_$(date +%Y%m%d%H).tar.gz
sleep 5
rm -rf wp_db_$(date +%Y%m%d%H)
clear

保存,并设置计划任务:

# crontab -e

增加一行:

0 */6 * * * /bin/bash /usr/local/webserver/backuph.sh

↑ 每6小时将自动备份数据库并上传一次。

[日志备份]
每天02:00,将/logs/下前一天的日志,进行压缩,然后上传至FTP服务器。

# vi /usr/local/webserver/logs.sh

↑ 编辑脚本/usr/local/webserver/logs.sh

写入以下内容::

#!/bin/bash
cd /logs/
mkdir logs_of_$(date -d "yesterday" +"%Y%m%d")
cp $(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log /logs/logs_of_$(date -d "yesterday" +"%Y%m%d")
cp $(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/nginx_error_$(date -d "yesterday" +"%Y%m%d").log /logs/logs_of_$(date -d "yesterday" +"%Y%m%d")
sleep 10
echo "ready to tar in 10s ."
tar zcvf `hostname`_logs_of_$(date -d "yesterday" +"%Y%m%d").tar.gz logs_of_$(date -d "yesterday" +"%Y%m%d")
sleep 10
echo "ready to upload in 10s ."
/usr/local/webserver/ncftp/bin/ncftpput -u logs -p (FTP密码) (FTP服务器地址) / /logs/`hostname`_logs_of_$(date -d "yesterday" +"%Y%m%d").tar.gz
sleep 30
echo "upload done ."
rm -f `hostname`_logs_of_$(date -d "yesterday" +"%Y%m%d").tar.gz
sleep 5
rm -rf logs_of_$(date -d "yesterday" +"%Y%m%d")
clear

保存,并设置计划任务::

# crontab -e

增加一行:

00 2 * * * /bin/bash /usr/local/webserver/logs.sh

↑ 每天凌晨2点将自动备份日志并上传。

分类: Linux 标签:

Web服务器性能/压力测试工具http_load、webbench、ab、Siege

2009年11月29日 没有评论

一、http_load

程序非常小,解压后也不到100K

http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工

具,它可以以一个单一的进程运行,一般不会把客户机搞死。还可以测试HTTPS类的网站请求。

下载地址:http://soft.vpser.net/test/http_load/http_load-12mar2006.tar.gz
安装很简单
#tar zxvf http_load-12mar2006.tar.gz
#cd http_load-12mar2006
#make && make install

命令格式:http_load -p 并发访问进程数 -s 访问时间 需要访问的URL文件

参数其实可以自由组合,参数之间的选择并没有什么限制。比如你写成http_load -parallel 5 -seconds

300 urls.txt也是可以的。我们把参数给大家简单说明一下。
-parallel 简写-p :含义是并发的用户进程数。
-fetches 简写-f :含义是总计的访问次数
-rate   简写-p :含义是每秒的访问频率
-seconds简写-s :含义是总计的访问时间

准备URL文件:urllist.txt,文件格式是每行一个URL,URL最好超过50-100个测试效果比较好.文件格式

如下:
http://www.vpser.net/uncategorized/choose-vps.html
http://www.vpser.net/vps-cp/hypervm-tutorial.html
http://www.vpser.net/coupons/diavps-april-coupons.html
http://www.vpser.net/security/vps-backup-web-mysql.html
例如:

http_load -p 30 -s 60 urllist.txt
参数了解了,我们来看运行一条命令来看看它的返回结果
命令:% ./http_load -rate 5 -seconds 10 urls说明执行了一个持续时间10秒的测试,每秒的频率为5。

49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds5916 mean bytes/connection4.89274

fetches/sec, 28945.5 bytes/secmsecs/connect: 28.8932 mean, 44.243 max, 24.488 minmsecs/first

-response: 63.5362 mean, 81.624 max, 57.803 minHTTP response codes: code 200 — 49

结果分析:
1.49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds
说明在上面的测试中运行了49个请求,最大的并发进程数是2,总计传输的数据是289884bytes,运行的时间是10.0148秒
2.5916 mean bytes/connection说明每一连接平均传输的数据量289884/49=5916
3.4.89274 fetches/sec, 28945.5 bytes/sec
说明每秒的响应请求为4.89274,每秒传递的数据为28945.5 bytes/sec
4.msecs/connect: 28.8932 mean, 44.243 max, 24.488 min说明每连接的平均响应时间是28.8932 msecs

,最大的响应时间44.243 msecs,最小的响应时间24.488 msecs
5.msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min
6、HTTP response codes: code 200 — 49    说明打开响应页面的类型,如果403的类型过多,那可能

要注意是否系统遇到了瓶颈。
特殊说明:
测试结果中主要的指标是 fetches/sec、msecs/connect 这个选项,即服务器每秒能够响应的查询次数,

用这个指标来衡量性能。似乎比 apache的ab准确率要高一些,也更有说服力一些。
Qpt-每秒响应用户数和response time,每连接响应用户时间。
测试的结果主要也是看这两个值。当然仅有这两个指标并不能完成对性能的分析,我们还需要对服务器的

cpu、men进行分析,才能得出结论

二、webbench

webbench是Linux下的一个网站压力测试工具,最多可以模拟3万个并发连接去测试网站的负载能力。下载地址可以到google搜,我这里给出一个
下载地址:http://soft.vpser.net/test/webbench/webbench-1.5.tar.gz
这个程序更小,解压后不到50K,呵呵
安装非常简单
#tar zxvf webbench-1.5.tar.gz
#cd webbench-1.5
#make && make install
会在当前目录生成webbench可执行文件,直接可以使用了

用法:

webbench -c 并发数 -t 运行测试时间 URL
如:
webbench -c 5000 -t 120 http://www.vpser.net

三、ab
ab是apache自带的一款功能强大的测试工具
安装了apache一般就自带了,
用法可以查看它的说明

$ ./ab
./ab: wrong number of arguments
Usage: ./ab [options] [http://]hostname[:port]/path
Options are:
-n requests Number of requests to perform
-c concurrency Number of multiple requests to make
-t timelimit Seconds to max. wait for responses
-p postfile File containing data to POST
-T content-type Content-type header for POSTing
-v verbosity How much troubleshooting info to print
-w Print out results in HTML tables
-i Use HEAD instead of GET
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-C attribute Add cookie, eg. ‘Apache=1234. (repeatable)
-H attribute Add Arbitrary header line, eg. ‘Accept-Encoding: gzip’
Inserted after all normal header lines. (repeatable)
-A attribute Add Basic WWW Authentication, the attributes
are a colon separated username and password.
-P attribute Add Basic Proxy Authentication, the attributes
are a colon separated username and password.
-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-h Display usage information (this message)
参数众多,一般我们用到的是-n 和-c
例如:
./ab -c 1000 -n 100 http://www.vpser.net/index.php

Concurrency Level:     1000
//并发数
Time taken for tests:  8.188731 seconds
//整个测试持续的时间
Complete requests:     1000
//完成的请求数量
Failed requests:       0
//失败的请求数量
Requests per second:   122.12 [#/sec] (mean)
//大家最关心的指标之一,相当于 LR 中的每秒事务数,后面括号中的 mean 表示这是一个平均值
Time per request:      8188.731 [ms] (mean)
//大家最关心的指标之二,相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是一个平均值
Time per request:      8.189 [ms] (mean, across all concurrent requests)
//每个请求实际运行时间的平均值
Transfer rate:         162.30 [Kbytes/sec] received
//平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题

这个表示同时处理1000个请求并运行100次index.php文件.

四、Siege
一款开源的压力测试工具,可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。
官方:http://www.joedog.org/
Siege下载:http://soft.vpser.net/test/siege/siege-2.67.tar.gz
解压:
# tar -zxf siege-2.67.tar.gz
进入解压目录:
# cd siege-2.67/
安装:
#./configure ; make
#make install

使用
siege -c 200 -r 10 -f example.url
-c是并发量,-r是重复次数。 url文件就是一个文本,每行都是一个url,它会从里面随机访问的。

example.url内容:

http://www.licess.cn
http://www.vpser.net
http://soft.vpser.net

结果说明
Lifting the server siege… done.
Transactions: 3419263 hits //完成419263次处理
Availability: 100.00 % //100.00 % 成功率
Elapsed time: 5999.69 secs //总共用时
Data transferred: 84273.91 MB //共数据传输84273.91 MB
Response time: 0.37 secs //相应用时1.65秒:显示网络连接的速度
Transaction rate: 569.91 trans/sec //均每秒完成 569.91 次处理:表示服务器后
Throughput: 14.05 MB/sec //平均每秒传送数据
Concurrency: 213.42 //实际最高并发数
Successful transactions: 2564081 //成功处理次数
Failed transactions: 11 //失败处理次数
Longest transaction: 29.04 //每次传输所花最长时间
Shortest transaction: 0.00 //每次传输所花最短时间

分类: 架构 标签:

CentOS+Nginx+PHP+Mysql+安全指南全环境搭建笔记(一)

2009年11月29日 没有评论

这是第一部分,< 系统安装后的初始环境设置 >
主要内容有:
[用户管理与用户安全]
[设置系统时间及自动同步系统时间]
[关闭不需要的服务]
[系统更新]
[用OpenSSH构建SSH服务器]

CentOS+Nginx+PHP+Mysql+安全指南全环境搭建笔记(1)

                                                         - 系统安装后的初始环境设置

[普通用户的建立与删除]

# useradd lovemoon
↑ 建立用户名为 lovemoon 的普通用户
# passwd lovemoon
↑ 为用户 lovemoon 设置密码
Changing password for user lovemoon.
New UNIX password:
↑ 输入密码(密码不会被显示)
Retype new UNIX password:
↑ 再次输入密码确认两次密码一致
passwd: all authentication tokens updated successfully.
↑ 密码设置成功

#userdel -r lovemoon
↑ 删除用户名为 lovemoon 的普通用户

[将普通用户设置到不同的用户组中]

# usermod -G wheel lovemoon
↑ 将普通用户 lovemoon 加在管理员组wheel组中
# usermod -G wheel,www lovemoon
↑ 将普通用户 lovemoon 同时加在wheel和www组中

[设置只有管理员wheel组才可以使用su命令进入root权限]

# vi /etc/pam.d/su  ← 打开这个配置文件
auth required /lib/security/$ISA/pam_wheel.so use_uid
↑ 修改文件为此状态(大约在第6行的位置)
# echo "SU_WHEEL_ONLY yes" >> /etc/login.defs
↑ 添加语句到login.defs文件行末

[设置系统时间及自动同步系统时间]

# yum install Cy ntp
↑ 安装NTP官方的时间同步程序 (NTP:中国国家授时中心)
# /usr/sbin/ntpdate -s pool.ntp.org
↑ 以NTP官方服务器为准调整本地时间
# crontab -e
↑ 编辑计划任务列表
0 3 * * * /usr/sbin/ntpdate -s pool.ntp.org
↑ 编辑文件到此状态,表示每天凌晨3点自动同步时间
# /sbin/service crond reload
↑ 重载计划任务配置

[关闭不需要的服务]

# setup
↑ 开启图形设置界面
选择System service 进入服务列表
使用"空格"键选择"[*]"或取消"[ ]"服务

只保留以下服务,未列出的服务一律关闭:
crond
irqbalance
↑ 仅当服务器CPU为S.M.P架构或支持双核心、HT技术时,才需开启,否则关闭。
iptables
microcode_ctl
network
sshd
syslog
vsftpd
yum-updatesd

[系统更新]

# vi /etc/yum.repos.d/CentOS-Base.repo
↑ 修改系统更新地址文件
将所有"baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/"
修改为"baseurl=http://mirrors.shlug.org/centos/$releasever/os/$basearch/"
# yum -y upgrade
↑ 更新系统文件

[用OpenSSH构建SSH服务器]

# vi /etc/ssh/sshd_config
↑ 用vi打开SSH的配置文件
将"#Protocol 2,1"
修改为      "Protocol 2"
↑ 只允许SSH2方式的连接(Centos 5.2中已包含此设置)

将"#ServerKeyBits 768"
修改为      "ServerKeyBits 1024"
↑ 将ServerKey强度改为1024比特

将"#PermitRootLogin yes"
修改为      "PermitRootLogin no"
↑ 不允许用root进行登录(wheel组用户SSH登陆后可用su命令使用root权限)

将"#PasswordAuthentication yes"
修改为      "PasswordAuthentication no"
↑ 不允许密码方式的登录(SSH远程管理用密钥登陆会安全很多)

将"#PermitEmptyPasswords no"
修改为      "PermitEmptyPasswords no"
↑ 不允许空密码登录

# vi /etc/hosts.deny
↑ 修改屏蔽规则,在此限定仅有哪些IP地址可以SSH远程登陆本服务器
sshd: ALL
↑ 在文件末尾添加这一行,屏蔽所有的SSH连接请求

# vi /etc/hosts.allow
↑ 修改允许规则,在此限定仅有哪些IP地址可以SSH远程登陆本服务器
sshd:222.17.177.
sshd:10.3.92.25
sshd:10.3.97.137
↑ 在文件末尾添加这三行,只允许来自222.17.177网段、IP地址为10.3.92.25和IP地址为10.3.97.137的SSH连接请求

# /etc/rc.d/init.d/sshd restart
↑ 重新启动SSH服务器
Stopping sshd:             [ OK ]
Starting sshd:             [ OK ]
↑ SSH服务器重新启动成功

# su -lovemoon
↑ 用普通用户 lovemoon 登陆服务器
$ ssh-keygen -t rsa
↑ 建立公钥与私钥
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kaz/.ssh/id_rsa):
↑ 钥匙的文件名,这里保持默认直接回车
Created directory ‘/home/kaz/.ssh’
Enter passphrase (empty for no passphrase):
↑ 输入密钥口令(使用SSH远程软件时会用到)
Enter same passphrase again:
↑ 再次输入密钥口令(使用SSH远程软件时会用到)
Your identification has been saved in /home/kaz/.ssh/id_rsa.
↑ 建立了id_rsa私钥文件
Your public key has been saved in /home/kaz/.ssh/id_rsa.pub.
↑ 建立了id_rsa.pub公钥文件

$ cd ~/.ssh
↑ 进入 lovemoon 用户SSH配置文件的目录(~/目录相当于/home/lovemoon/)
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
↑ 公钥内容输出到authorized_keys文件中
$ rm -f ~/.ssh/id_rsa.pub
↑ 删除原来的公钥文件
$ chmod 400 ~/.ssh/authorized_keys
↑ 将新建立的公钥文件属性设置为400

$ exit
↑ 退出普通用户的登录
登陆为root用户,插入U盘
# fdisk -l
↑ 显示目前所有硬盘,找到U盘设备名为sdb1 (具体情况具体对待,这里各服务器有所不同)
# mount /dev/sdb1 /mnt
↑ 挂载U盘设备到/mnt目录
# mv /home/lovemoon/.ssh/id_rsa /mnt/
↑ 移动id_rsa私钥文件到U盘中
# umount /mnt/
↑ 卸载U盘

-Nginx+PHP+MySQL环境搭建

[利用yum命令配置、升级所需程序库]

# sudo -s
# LANG=C
# yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel
↑安装、升级这些程序库

[下载环境所需文件到指定目录]

# mkdir -p /software
↑ 在根目录建立software文件夹
# cd /software
↑ 进入software文件夹
# wget http://sysoev.ru/nginx/nginx-0.7.19.tar.gz
# wget http://www.php.net/get/php-5.2.6.tar.gz/from/this/mirror
# wget http://php-fpm.anight.org/downloads/head/php-5.2.6-fpm-0.5.9.diff.gz
# wget http://blog.s135.com/soft/linux/mysql/mysql-5.1.26-rc.tar.gz
# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz
# wget http://mirror.optus.net/sourceforge/m/mc/mcrypt/libmcrypt-2.5.8.tar.gz
# wget http://mirror.optus.net/sourceforge/m/mc/mcrypt/mcrypt-2.6.7.tar.gz
# wget http://pecl.php.net/get/memcache-2.2.3.tgz
# wget http://mirror.optus.net/sourceforge/m/mh/mhash/mhash-0.9.9.tar.gz
# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz
# wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
↑ 下载这些文件到software目录

[编译安装PHP 5.2.6所需的支持库]

# tar zxvf libiconv-1.12.tar.gz
↑ 解压(tar) 参数(zxvf) 文件名(libiconv-1.12.tar.gz)
# cd libiconv-1.12/
↑ 进入解压出来的文件的文件夹(libiconv-1.12)
# ./configure –prefix=/usr/local
↑ 配置安装信息 指定安装目录为/usr/local
# make
↑ make安装文件
# make install
↑ 开始安装
# cd ../
↑ 返回上级目录(此处即software目录)

# tar zxvf libmcrypt-2.5.8.tar.gz
# cd libmcrypt-2.5.8/
# ./configure
# make
# make install
# /sbin/ldconfig
# cd libltdl/
# ./configure –enable-ltdl-install
# make
# make install
# cd ../../

# tar zxvf mhash-0.9.9.tar.gz
# cd mhash-0.9.9/
# ./configure
# make
# make install
# cd ../

# cp /usr/local/lib/libmcrypt.* /usr/lib
# ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2

# tar zxvf mcrypt-2.6.7.tar.gz
# cd mcrypt-2.6.7/
# ./configure
# make
# make install
# cd ../

[编译安装MySQL 5.1.26-rc]

# /usr/sbin/groupadd mysql
↑ 建立mysql用户组
# /usr/sbin/useradd -g mysql mysql
↑ 建立mysql用户到mysql用户组中
# tar zxvf mysql-5.1.26-rc.tar.gz
# cd mysql-5.1.26-rc/
# ./configure –prefix=/usr/local/webserver/mysql/ –enable-assembler –with-extra-charsets=complex –enable-thread-safe-client –with-big-tables –with-readline –with-ssl –with-embedded-server –enable-local-infile
# make && make install
# chmod +w /usr/local/webserver/mysql
# chown -R mysql:mysql /usr/local/webserver/mysql
# cp support-files/my-medium.cnf /usr/local/webserver/mysql/my.cnf
# cd ../

# /usr/local/webserver/mysql/bin/mysql_install_db –defaults-file=/usr/local/webserver/mysql/my.cnf –basedir=/usr/local/webserver/mysql –datadir=/usr/local/webserver/mysql/data –user=mysql –pid-file=/usr/local/webserver/mysql/mysql.pid –skip-locking –port=3306 –socket=/tmp/mysql.sock
↑ 以mysql用户帐号的身份建立数据表

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/local/mysql//bin/mysqladmin -u root password ‘new-password’
/usr/local/mysql//bin/mysqladmin -u root -h localhost.localdomain password ‘new-password’

Alternatively you can run:
/usr/local/mysql//bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd /usr/local/mysql/ ; /usr/local/mysql//bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd mysql-test ; perl mysql-test-run.pl

Please report any problems with the /usr/local/mysql//bin/mysqlbug script!

# /bin/sh /usr/local/webserver/mysql/bin/mysqld_safe –defaults-file=/usr/local/webserver/mysql/my.cnf &
↑ 启动MySQL(最后的&表示在后台运行)

[编译安装PHP(FastCGI模式)]

# tar zxvf php-5.2.6.tar.gz
# gzip -cd php-5.2.6-fpm-0.5.9.diff.gz | patch -d php-5.2.6 -p1
# cd php-5.2.6/
# ./configure –prefix=/usr/local/webserver/php –with-config-file-path=/usr/local/webserver/php/etc –with-mysql=/usr/local/webserver/mysql –with-mysqli=/usr/local/webserver/mysql/bin/mysql_config –with-iconv-dir=/usr/local –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib –with-libxml-dir=/usr –enable-xml –disable-rpath –enable-discard-path –enable-safe-mode –enable-bcmath –enable-shmop –enable-sysvsem –enable-inline-optimization –with-curl –with-curlwrappers –enable-mbregex –enable-fastcgi –enable-fpm –enable-force-cgi-redirect –enable-mbstring –with-mcrypt –with-gd –enable-gd-native-ttf –with-openssl
# sed -i ‘s#-lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt#& -liconv#’ Makefile
# make
# make install
# cp php.ini-dist /usr/local/webserver/php/etc/php.ini
# cd ../

[编译安装PHP5扩展模块]

# tar zxvf memcache-2.2.3.tgz
# cd memcache-2.2.3/
# /usr/local/webserver/php/bin/phpize
# ./configure –with-php-config=/usr/local/webserver/php/bin/php-config
# make
# make install
# cd ../

# tar jxvf eaccelerator-0.9.5.3.tar.bz2
# cd eaccelerator-0.9.5.3/
# /usr/local/webserver/php/bin/phpize
# ./configure –enable-eaccelerator=shared –with-php-config=/usr/local/webserver/php/bin/php-config
# make
# make install
# cd ../

[修改php.ini文件]

手工修改:
# vi /usr/local/webserver/php/etc/php.ini
将 " extension_dir = "./" "
修改为           " extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/" "

将 "output_buffering = Off"
修改为           " output_buffering = On "

extension = "memcache.so"
↑ 文件末尾增加此行

自动修改(已使用手动修改的跳过):
# sed -i ‘s#extension_dir = "./"#extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/"\nextension = "memcache.so"\n#’ /usr/local/webserver/php/etc/php.ini
# sed -i ‘s#output_buffering = Off#output_buffering = On#’ /usr/local/webserver/php/etc/php.ini

[配置eAccelerator加速PHP]

# mkdir -p /usr/local/webserver/eaccelerator_cache
# vi /usr/local/webserver/php/etc/php.ini
按shift+g键跳到配置文件的最末尾,加入以下配置信息:

[eaccelerator]
zend_extension="/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="128"
eaccelerator.cache_dir="/usr/local/webserver/eaccelerator_cache"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="300"
eaccelerator.shm_prune_period="120"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

# vi /etc/sysctl.conf
↑ 修改配置文件

将   "kernel.shmmax = **********"
修改为       "kernel.shmmax = 134217728"

# /sbin/sysctl -p
↑ 执行此命令使配置生效

[创建www用户和组]

# /usr/sbin/groupadd www -g 48
↑ 创建www用户组并指定组ID为48
# /usr/sbin/useradd -u 48 -g www www
↑ 创建www用户到www用户组中
# mkdir -p /wwwroot
↑ 在根目录中创建wwwroot网站目录
# chmod +w /wwwroot
↑ 给wwwroot目录增加可写权限
# chown -R www:www /wwwroot
↑ 使wwwroot目录所属用户组为www,所属用户为www

[创建php-fpm配置文件]

php-fpm是为PHP打的一个FastCGI管理补丁,可以平滑变更php.ini配置而无需重启php-cgi
# rm -f /usr/local/webserver/php/etc/php-fpm.conf
↑ 删除原有php-fpm.conf文件
# vi /usr/local/webserver/php/etc/php-fpm.conf
↑ 建立新的php-fpm.conf文件并启动vi编辑器编辑该文件
输入以下内容(请注意以下内容中"↑"标志后的内容不能出现在实际文件中):

<?xml version="1.0" ?>
<configuration>

All relative paths in this config are relative to php’s install prefix

<section name="global_options">

Pid file
<value name="pid_file">/usr/local/webserver/php/logs/php-fpm.pid</value>

Error log file
<value name="error_log">/usr/local/webserver/php/logs/php-fpm.log</value>

Log level
<value name="log_level">notice</value>

When this amount of php processes exited with SIGSEGV or SIGBUS …
<value name="emergency_restart_threshold">10</value>

… in a less than this interval of time, a graceful restart will be initiated.
Useful to work around accidental curruptions in accelerator’s shared memory.
<value name="emergency_restart_interval">1m</value>

Time limit on waiting child’s reaction on signals from master
<value name="process_control_timeout">5s</value>

Set to ‘no’ to debug fpm
<value name="daemonize">yes</value>

</section>

<workers>

<section name="pool">

Name of pool. Used in logs and stats.
<value name="name">default</value>

Address to accept fastcgi requests on.
Valid syntax is ‘ip.ad.re.ss:port’ or just ‘port’ or ‘/path/to/unix/socket’
<value name="listen_address">127.0.0.1:9000</value>

<value name="listen_options">

Set listen(2) backlog
<value name="backlog">-1</value>

Set permissions for unix socket, if one used.
In Linux read/write permissions must be set in order to allow connections from web server.
Many BSD-derrived systems allow connections regardless of permissions.
<value name="owner"></value>
<value name="group"></value>
<value name="mode">0666</value>
</value>

Additional php.ini defines, specific to this pool of workers.
<value name="php_defines">
<value name="sendmail_path">/usr/sbin/sendmail -t -i</value>
<value name="display_errors">0</value>
↑ 如果安装 Nginx + PHP 用于程序调试,则此处应设置为"1"以显示PHP错误信息,设置为"0" Nginx 会报状态为500的空白错误页
</value>

Unix user of processes
<value name="user">www</value>

Unix group of processes
<value name="group">www</value>

Process manager settings
<value name="pm">

Sets style of controling worker process count.
Valid values are ‘static’ and ‘apache-like’
<value name="style">static</value>

Sets the limit on the number of simultaneous requests that will be served.
Equivalent to Apache MaxClients directive.
Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi
Used with any pm_style.
<value name="max_children">64</value>
↑ 进程数为64,如果服务器内存大于3GB,可以只开启128-200个进程

Settings group for ‘apache-like’ pm style
<value name="apache_like">

Sets the number of server processes created on startup.
Used only when ‘apache-like’ pm_style is selected
<value name="StartServers">20</value>

Sets the desired minimum number of idle server processes.
Used only when ‘apache-like’ pm_style is selected
<value name="MinSpareServers">5</value>

Sets the desired maximum number of idle server processes.
Used only when ‘apache-like’ pm_style is selected
<value name="MaxSpareServers">35</value>

</value>

</value>

The timeout (in seconds) for serving a single request after which the worker process will be terminated
Should be used when ‘max_execution_time’ ini option does not stop script execution for some reason
‘0s’ means ‘off’
<value name="request_terminate_timeout">0s</value>

The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file
‘0s’ means ‘off’
<value name="request_slowlog_timeout">0s</value>

The log file for slow requests
<value name="slowlog">logs/slow.log</value>

Set open file desc rlimit
<value name="rlimit_files">51200</value>

Set max core size rlimit
<value name="rlimit_core">0</value>

Chroot to this directory at the start, absolute path
<value name="chroot"></value>

Chdir to this directory at the start, absolute path
<value name="chdir"></value>

Redirect workers’ stdout and stderr into main error log.
If not set, they will be redirected to /dev/null, according to FastCGI specs
<value name="catch_workers_output">yes</value>

How much requests each process should execute before respawn.
Useful to work around memory leaks in 3rd party libraries.
For endless request processing please specify 0
Equivalent to PHP_FCGI_MAX_REQUESTS
<value name="max_requests">10240</value>

Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.
Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)
Makes sense only with AF_INET listening socket.
<value name="allowed_clients">127.0.0.1</value>

Pass environment variables like LD_LIBRARY_PATH
All $VARIABLEs are taken from current environment
<value name="environment">
<value name="HOSTNAME">$HOSTNAME</value>
<value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
<value name="TMP">/tmp</value>
<value name="TMPDIR">/tmp</value>
<value name="TEMP">/tmp</value>
<value name="OSTYPE">$OSTYPE</value>
<value name="MACHTYPE">$MACHTYPE</value>
<value name="MALLOC_CHECK_">2</value>
</value>

</section>

</workers>

</configuration>

[启动php-cgi进程,监听127.0.0.1的9000端口]

# ulimit -SHn 51200
# /usr/local/webserver/php/sbin/php-fpm start

[安装Nginx所需的pcre库]

# tar zxvf pcre-7.7.tar.gz
# cd pcre-7.7/
# ./configure
# make && make install
# cd ../

[安装Nginx 0.7.19]

# tar zxvf nginx-0.7.19.tar.gz
# cd nginx-0.7.19/
# ./configure –user=www –group=www –prefix=/usr/local/webserver/nginx –with-http_stub_status_module –with-http_ssl_module
# make
# make install
# cd ../

[创建Nginx日志目录]

# mkdir -p /logs
# chmod +w /logs
# chown -R www:www /logs

[创建nginx.conf配置文件]

# rm -f /usr/local/webserver/nginx/conf/nginx.conf
# vi /usr/local/webserver/nginx/conf/nginx.conf
输入以下内容(请注意以下内容中"↑"标志后的内容不能出现在实际文件中):

user www www;

worker_processes 8;
↑ Nginx每个进程耗费10M~12M内存

error_log /logs/nginx_error.log warn;

pid       /usr/local/webserver/nginx/nginx.pid;

#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;

events
{
use epoll;
worker_connections 51200;
}

http
{
include      mime.types;
default_type application/octet-stream;

#charset gb2312;

server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;

sendfile on;
tcp_nopush    on;

keepalive_timeout 60;

tcp_nodelay on;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

gzip on;
gzip_min_length 1k;
gzip_buffers    4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types      text/plain application/x-javascript text/css application/xml;
gzip_vary on;

limit_zone crash $binary_remote_addr 10m;
↑ 定义一个叫“crash”的记录区,总容量为 10M,以变量 $binary_remote_addr 作为会话的判断基准(即一个地址一个会话),当区的大小为 1M 的时候,大约可以记录 32000 个会话信息(一个会话占用 32 bytes)

server
{
listen      80;
server_name 222.17.177.205;
index index.html index.htm index.php;
root /wwwroot;

#limit_conn  crash 5;
↑ *此处已被#注释掉了,即不起作用*定义整个网站的限制。此处为在"crash"记录区中,以变量 $binary_remote_addr 作为会话的判断基准(即一个地址一个会话),限制网站全局目录,一个会话只能进行5个连接(即一个IP只能发起5个连接,多过5个,一律503错误)

location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires     30d;
}

location ~ .*\.(js|css)?$
{
expires     1h;
}

location /resource/ {
limit_conn  crash 2;
↑ 定义resource目录的限制。此处为在"crash"记录区中,以变量 $binary_remote_addr 作为会话的判断基准(即一个地址一个会话),限制resource目录,一个会话只能进行2个连接(即一个IP只能发起2个连接,多过2个,一律503错误)
}

log_format access ‘$remote_addr – $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" $http_x_forwarded_for’;
access_log /logs/access.log access;
sendfile on;
tcp_nopush on;
client_max_body_size 50m;
↑ 网站程序中允许上传的最大size,这里设置成50M,这里只是nginx的限制,PHP本身限制2M
}
}

[创建fcgi.conf配置文件]

# vi /usr/local/webserver/nginx/conf/fcgi.conf
输入以下内容:

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE   nginx;

fastcgi_param QUERY_STRING      $query_string;
fastcgi_param REQUEST_METHOD    $request_method;
fastcgi_param CONTENT_TYPE      $content_type;
fastcgi_param CONTENT_LENGTH    $content_length;

fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME       $fastcgi_script_name;
fastcgi_param REQUEST_URI       $request_uri;
fastcgi_param DOCUMENT_URI      $document_uri;
fastcgi_param DOCUMENT_ROOT     $document_root;
fastcgi_param SERVER_PROTOCOL   $server_protocol;

fastcgi_param REMOTE_ADDR       $remote_addr;
fastcgi_param REMOTE_PORT       $remote_port;
fastcgi_param SERVER_ADDR       $server_addr;
fastcgi_param SERVER_PORT       $server_port;
fastcgi_param SERVER_NAME       $server_name;

# PHP only, required if PHP was built with –enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS   200;

[启动Nginx]

# ulimit -SHn 51200
# /usr/local/webserver/nginx/sbin/nginx

[在不停止Nginx服务的情况下平滑变更Nginx配置]

修改/usr/local/webserver/nginx/conf/nginx.conf配置文件后,请执行以下命令检查配置文件是否正确:
# /usr/local/webserver/nginx/sbin/nginx -t
如果测试ok successfully,则可以使用下面命令重启Nginx
(第1种)# pkill nginx
# /usr/local/webserver/nginx/conf/nginx.conf
(第2种)# kill -HUP `cat /usr/local/webserver/nginx/nginx.pid`
# /usr/local/webserver/nginx/conf/nginx.conf
(第3种)# ps -ef | grep "nginx: master process" | grep -v "grep" | awk -F ‘ ‘ ‘{print $2}’
# kill -HUP 数字
↑ 此数字来自于上一条命令执行后屏幕输出的数字,即Nginx的pid进程号
# /usr/local/webserver/nginx/conf/nginx.conf

如果屏幕显示以下两行信息,说明配置文件正确:
the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok
the configuration file /usr/local/webserver/nginx/conf/nginx.conf was tested successfully

[配置开机自动启动Nginx + PHP + MySQL]

# vi /etc/rc.local
在末尾增加以下内容:
/bin/sh /usr/local/webserver/mysql/bin/mysqld_safe –defaults-file=/usr/local/webserver/mysql/my.cnf &
ulimit -SHn 51200
/usr/local/webserver/php/sbin/php-fpm start
/usr/local/webserver/nginx/sbin/nginx

[优化Linux内核参数]

# vi /etc/sysctl.conf
在文件末尾增加以下内容:

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000   65000

# /sbin/sysctl -p
↑ 使配置立即生效

[编写每天定时切割Nginx日志的脚本]

# vi /usr/local/webserver/nginx/sbin/cut_nginx_log.sh
↑ 创建切割脚本

输入以下内容:
#!/bin/bash
# This script run at 00:00

# The Nginx logs path
logs_path="/logs/"

mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log
mv ${logs_path}nginx_error.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/nginx_error_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`

[设置切割日志的计划任务]

# crontab -e
↑ 编辑计划任务列表

输入以下内容:
00 00 * * * /bin/bash /usr/local/webserver/nginx/sbin/cut_nginx_log.sh
↑ 每天凌晨00:00切割nginx访问日志

分类: Linux 标签: