November 12, 2010
nginx location基础
"\u003cp\u003e\u003cstrong\u003e基本语法\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003elocation [=|\u003cdel\u003e|\u003c/del\u003e*|^~] /uri/ { … }\u003c/p\u003e\n\u003cp\u003e= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。\u003c/p\u003e\n\u003cp\u003e~ 为区分大小写匹配\u003c/p\u003e\n\u003cp\u003e~* 为不区分大小写匹配\u003c/p\u003e\n\u003cp\u003e!\u003cdel\u003e和!\u003c/del\u003e*分别为区分大小写不匹配及不区分大小写不匹配\u003c/p\u003e\n\u003cp\u003e^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e例如:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003elocation = / { # 只匹配 / 查询。\u003c/p\u003e\n\u003cp\u003elocation / { # 匹配任何查询,因为所有请求都已 / 开头。但正则表达式规则和长的块规则将被优先和查询匹配。\u003c/p\u003e\n\u003cp\u003elocation ^~ /images/ { # 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。\u003c/p\u003e\n\u003cp\u003elocation ~* .(gif|jpg|jpeg)$ { # 匹配任何以 gif、jpg 或 jpeg 结尾的请求。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e++ 文件及目录匹配\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e-f和!-f用来判断是否存在文件\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e-d和!-d用来判断是否存在目录\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e-e和!-e用来判断是否存在文件或目录\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e-x和!-x用来判断文件是否可执行\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e++ 一些可用的全局变量\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e$args …\u003c/p\u003e"
November 12, 2010
nginx配置文件中的location中文详解
"\u003cp\u003e\u003cstrong\u003elocation\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e语法:location [=|\u003cdel\u003e|\u003c/del\u003e*|^~] /uri/ { … }\n默认:否\u003c/p\u003e\n\u003cp\u003e上下文:server\u003c/p\u003e\n\u003cp\u003e这个指令随URL不同而接受不同的结构。你可以配置使用常规字符串和正则表达式。如果使用正则表达式,你必须使用 ~* 前缀选择不区分大小写的匹配或者 ~ 选择区分大小写的匹配。\u003c/p\u003e\n\u003cp\u003e确定 哪个location 指令匹配一个特定指令,常规字符串第一个测试。常规字符串匹配请求的开始部分并且区分大小写,最明确的匹配将会被使用(查看下文明白 nginx 怎么确定它)。然后正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。如果没有找到匹配的正则表达式,使用常规字符串的结果。\u003c/p\u003e\n\u003cp\u003e有两个方法修改这个行为。第一个方法是使用 “=”前缀,将只执行严格匹配。如果这个查询匹配,那么将停止搜索并立即处理这个请求。例子:如果经常发生”/”请求,那么使用 “location = /” 将加速处理这个请求。\u003c/p\u003e\n\u003cp\u003e第二个是使用 ^~ 前缀。如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。\u003c/p\u003e\n\u003cp\u003e而且它重要在于 NGINX 做比较没有 URL 编码,所以如果你有 …\u003c/p\u003e"
November 12, 2010
nginx下禁止目录运行php脚本
"\u003cp\u003e为了安全起见,我们一般会对上传目录禁止运行php脚本\u003c/p\u003e\n\u003cp\u003e在 \u003cstrong\u003eapache\u003c/strong\u003e 下面我们可以通过:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003ephp_flag engine off\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e的方式来来禁用目录下文件php执行权限。\u003c/p\u003e\n\u003cp\u003e那么在 \u003cstrong\u003enginx\u003c/strong\u003e 里面同样可以实现这种方法,那就是location的优先匹配,关于location可以参考我之前的一批文章http://226617.cn/archives/392.htm\u003c/p\u003e\n\u003cp\u003e这里简单就举个例子\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation ^~ /attachments/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e{\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eaccess_log off;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这样 attachments这个目录 就不会再去跳转给fastcgi去执行php了.这里利用了nginx下location指令的处理顺序优先级特点.\u003c/p\u003e\n\u003cp\u003e但上面的方法只能算一种技巧,一般不这样设置,正确的方法为:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation /upload/ {\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003elocation ~ .*.(php)?$\u003c/p\u003e\n\u003cp\u003e{\u003c/p\u003e\n\u003cp\u003edeny all;\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e而对于多个目录的话,可以一起进行限定:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation ~* …\u003c/p\u003e\u003c/blockquote\u003e"
November 11, 2010
分布式数据库拆表拆库的常用策略
"\u003cp\u003e在大容量,高负荷的web系统中,对数据库进行一系列拆分,可有效提升数据库容量和性能。在初学程序的早期,程序员通常都喜欢按传统数据库设计模式,设计为单库和单一功能表的结构,这样的结构在数据量和并发量达到一定程度之后,会出现严重性能问题和维护问题。在出现问题的时候才着手进行优化,会非常痛苦,所以应该在系统架设之初就考虑好之后会出现的问题。\u003c/p\u003e\n\u003cp\u003e目前有些数据库策略是采用单库结构,然后通过同步分发到数台服务器实现读写分离。个人觉得这样的策略非常笨拙,还是想办法将其分隔开来好,否则每台机器的内存都很容易超支。\u003c/p\u003e\n\u003cp\u003e一般只对数据量比较大的表进行拆分,这应该没有什么异议;还有一种是有可能会进行维护的比较重要的表,比如文章目录表,如果有从其它系统倒数据进来的可能的话,也要拆掉,不然倒数据时一不小心把目录表弄坏了,发现忘了备份,那真是欲哭无泪。\u003c/p\u003e\n\u003cp\u003e下面来分析一下:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、时间结构\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果业务系统对时效性较高,比如新闻发布系统的文章表,可以把数据库设计成时间结构,按时间分有几种结构:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e平板式\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e表类似:\narticle_200901\narticle_200902\narticle_200903\u003c/p\u003e\n\u003cp\u003e用年来分还是用月可自定, …\u003c/p\u003e"
November 11, 2010
linux挂载新硬盘,开机自动挂载
"\u003cp\u003e\u003cstrong\u003eLinux的硬盘识别:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e2.6 kernel以后,linux会将识别到的硬件设备,在/dev/下建立相应的设备文件.如:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esda 表示第1块SCSI硬盘.# V, z b, }2 F7 u’ |\u003c/p\u003e\n\u003cp\u003ehda 表示第1块IDE硬盘(即连接在第1个IDE接口的Master口上)\u003c/p\u003e\n\u003cp\u003escd0 表示第1个USB光驱.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e当添加了新硬盘后,在/dev目录下会有相应的设备文件产生.cciss的硬盘是个例外,它的设备文件在/dev/cciss/目录下.一般使用”fdisk -l”命令可以列出系统中当前连接的硬盘设备和分区信息.新硬盘没有分区信息,则只显示硬盘大小信息.\u003c/p\u003e\n\u003cp\u003e1.关闭服务器加上新硬盘\u003c/p\u003e\n\u003cp\u003e2.启动服务器,以root用户登录\u003c/p\u003e\n\u003cp\u003e3.查看硬盘信息\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#fdisk -l\u003c/p\u003e\n\u003cp\u003eDisk /dev/sda: 146.1 GB, 146163105792 bytes\u003c/p\u003e\n\u003cp\u003e255 heads, 63 sectors/track, 17769 cylinders\u003c/p\u003e\n\u003cp\u003eUnits = cylinders of 16065 * 512 = 8225280 bytes\u003c/p\u003e\n\u003cp\u003eDevice …\u003c/p\u003e\u003c/blockquote\u003e"
November 10, 2010
用户行为分析-使用JS和_trackPageview函数从时间维度监测页面表现
"\u003cp\u003e\u003cstrong\u003e为什么要从时间维度对页面进行监测?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://bluewhale.cc/\" title=\"网站分析\"\u003e网站分析\u003c/a\u003e 中有一个重要的指标:Bounce rate。定义是当用户在进入你网站的第一个页面后没有点击任何链接就离开了。假设两个用户同时进入网站的第一个页面后,一个什么都没有看就马上离开了,而另一个在阅读了页面上的内容并在Action按钮上忧郁了半天,最后离开了。那么这两个用户在Bounce rate里看起来没有区别。而实际上第二个用户比第一个用户更有可能被转化。而如果两个用户来自不同的渠道,那么第二个渠道相对第一个渠道更有一些价值。\u003c/p\u003e\n\u003cp\u003e在GA的报告中目前只提供两个时间维度:平均 \u003ca href=\"http://bluewhale.cc/2010-01-24/google-analytics-metrics-timeonpage-timeonsite.html\" title=\"页面停留时间\"\u003e页面停留时间\u003c/a\u003e 和平均 \u003ca href=\"http://bluewhale.cc/2010-01-24/google-analytics-metrics-timeonpage-timeonsite.html\" title=\"网站停留时间\"\u003e网站停留时间\u003c/a\u003e。使用JS事件与_trackPageview函数相配合,我们可以看到网页在时间维度上的表现,并获得更多详细的用户与网站互动的时间数据(被计算在Bounce rate内的非点击行为数据)。\u003c/p\u003e\n\u003ch2 id=\"1通过持续时间判断用户行为的有效性\"\u003e\u003cstrong\u003e1通过持续时间判断用户行为的有效性\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"http://bluewhale.cc/2010-01-12/google-analytics-trackpageview-policy.html\"\u003e上一篇文章\u003c/a\u003e的最后一个策略中提到,可以使用_trackPageview函数与JS的onmouseover事件配合。当用户将鼠标移到某个焦点图或按钮上时进行记录。但有一个问题就是收集到的大部分数据可能是用户无意识的行为(如鼠标划 …\u003c/p\u003e"
November 9, 2010
网络七层协议及负载均衡
"\u003cp\u003e根据OSI模型把网络通信的工作分为七层.一至四层被认为是低层,这些层与数据移动密切相关.五至七层是高层,包含应用程序级的数据.每一层负责一项具体的工作,然后把数据传送到下一层.由低到高具体分为:物理层.数据链路层,网络层,传输层,会话层,表示层和应用层.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/11/osi.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/11/osi.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOSI模型的最低层或第一层:物理层\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e物理层包含物理连网网媒介,实际上就是布线,光纤,网卡和其它用来把两台网络通信设备连接在一起的设施.它规定了激活,维持,关闭通信端之间的机械特性,电气特性,功能特性及过程特性.虽然物理层不提供纠错服务,但它能够设定数据传输速率并监测数据出错率.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOSI模型的第二层:数据链路层\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e数据链路层的主要作用是控制网络层与物理层之间的通信.它保证了数据在不可靠的物理线路上进行可靠的传递.它把从网络层接收到的数据侵害成特定的可被牧师层传输的帧,保证了传输的可靠性.它的主要作用包括:物理地址寻址,数据的成帧,流量控制,数据的栓错,重发等.它是独立于网络层和物理层的,工作时无须关心计算机是否在运行软件还是其它操作.\n数据链路层协议主要有:SDLC,DHLC,PPP,STP,帧中继等.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOSI模型的第三层:网络层\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e很多 …\u003c/p\u003e"
November 9, 2010
Nginx中的upstream
"\u003cp\u003eNginx中upstream有以下几种方式:\u003c/p\u003e\n\u003cp\u003e1、轮询(weight=1)\n默认选项,当weight不指定时,各服务器weight相同,\n每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。\u003c/p\u003e\n\u003cp\u003e[shell]upstream bakend {\nserver 192.168.1.10;\nserver 192.168.1.11;\n}\n[/shell]\u003c/p\u003e\n\u003cp\u003e2、weight\n指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。\n如果后端服务器down掉,能自动剔除。\n比如下面配置,则1.11服务器的访问量为1.10服务器的两倍。\u003c/p\u003e\n\u003cp\u003e[shell]upstream bakend {\nserver 192.168.1.10 weight=1;\nserver 192.168.1.11 weight=2;\n}[/shell]\u003c/p\u003e\n\u003cp\u003e3、ip_hash\n每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题。\n如果后端服务器down掉,要手工down掉。\u003c/p\u003e\n\u003cp\u003e[shell]upstream …\u003c/p\u003e"
November 8, 2010
1>/dev/null 2>&1的含义
"\u003cp\u003eshell中可能经常能看到:\u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u003c/p\u003e\n\u003cp\u003e命令的结果可以通过%\u0026gt;的形式来定义输出\u003c/p\u003e\n\u003cp\u003e/dev/null 代表空设备文件\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e代表重定向到哪里,例如:echo “123” \u0026gt; /home/123.txt\n1 表示stdout标准输出,系统默认值是1,所以”\u0026gt;/dev/null”等同于”1\u0026gt;/dev/null”\n2 表示stderr标准错误\n\u0026amp; 表示等同于的意思,2\u0026gt;\u0026amp;1,表示2的输出重定向等同于1\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e那么本文标题的语句:\n1\u0026gt;/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。\n2\u0026gt;\u0026amp;1 接着,标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。\u003c/p\u003e\n\u003cp\u003e另一篇相关文章:\u003c/p\u003e"
November 8, 2010
PHP autoload机制详解
"\u003cp\u003e\u003cstrong\u003e(1) autoload机制概述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这也是OO设计的基本思想之一。在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可。下面是一个实际的例子:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/* Person.class.php */\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eclass Person {\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003evar $name, $age;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003efunction __construct ($name, $age)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e{\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$this-\u0026gt;name = $name;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$this-\u0026gt;age = $age;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e}\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e?\u0026gt;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/* no_autoload.php */\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003erequire_once (”Person.class.php”);\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$person = new Person(”Altair”, 6);\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003evar_dump ($person);\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e?\u0026gt;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在这个例子 …\u003c/p\u003e"
November 6, 2010
谷歌发布apache加速模块可提速50%
"\u003cp\u003e 大多人浏览网页如果超过3秒打不开就会离开,Google为此推出了一款Apache加速模块:mod_pagespeed,该模块可以有效将网页加载速度提高50%。网页提速的问题是一个复杂多样的问题,有很多解决方法,往往关系到网站系统程序,服务器硬件,网络传输速度等方面,而Google这款加速模块简单的解决了许多复情况的问题:\u003c/p\u003e\n\u003cp\u003e ◆如果你的网站采用Apache构建服务器,不需要对网站CMS系统进行处理即可应用;\u003c/p\u003e\n\u003cp\u003e ◆加速模块可以自行对网络传输的HTML字节优化及对图象,CSS进入压缩优化传输;\u003c/p\u003e\n\u003cp\u003e ◆智能缓存是一大亮点,它可以自动智能缓存,加速下载。\u003c/p\u003e\n\u003cp\u003e 下面介绍一下所有特点功能:\u003c/p\u003e\n\u003cp\u003e ◆优化缓存\u003c/p\u003e\n\u003cp\u003e ◆缓存扩展\u003c/p\u003e\n\u003cp\u003e ◆压缩处理CSS\u003c/p\u003e\n\u003cp\u003e ◆优化JavaScript最大限度的减少重复请求\u003c/p\u003e\n\u003cp\u003e ◆自动缓存CSS\u003c/p\u003e\n\u003cp\u003e ◆JavaScript内嵌技术\u003c/p\u003e\n\u003cp\u003e ◆有效载荷尺寸最小化\u003c/p\u003e\n\u003cp\u003e ◆压缩空白\u003c/p\u003e\n\u003cp\u003e ◆合并头信息\u003c/p\u003e\n\u003cp\u003e ◆附加属性\u003c/p\u003e\n\u003cp\u003e ◆内建核心JavaScript\u003c/p\u003e\n\u003cp\u003e ◆优化图像下载\u003c/p\u003e\n\u003cp\u003e ◆跳地非法字符\u003c/p\u003e\n\u003cp\u003e ◆重写优化CSS\u003c/p\u003e\n\u003cp\u003e Google官方文档说明: …\u003c/p\u003e"
November 1, 2010
使用FreeBSD构建流量控制防火墙
"\u003cp\u003e\u003cstrong\u003e概述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e利用FreeBSD内核支持的BRIDGE、IPFIREWALL以及DUMMYNET选项,可以建立基于FreeBSD的透明流量控制防火墙(桥接模式),起到限制流量和包过滤的功能。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e准备\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e可以在任何FreeBSD的兼容硬件上构建流量控制防火墙,但是基于性能和管理上的考虑,建议:\u003c/p\u003e\n\u003cp\u003e使用Intel PII450以上的处理器\u003c/p\u003e\n\u003cp\u003e使用至少128MB RAM\u003c/p\u003e\n\u003cp\u003e使用高性能10/100Mbps自适应网络适配器\u003c/p\u003e\n\u003cp\u003e如果多于一组桥接设备,建议使用双处理器系统\u003c/p\u003e\n\u003cp\u003e另外准备一块单独的网络适配器用于管理\u003c/p\u003e\n\u003cp\u003e——————————————————————————–\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e实例\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e联想万全1300 PC服务器,具有一颗Intel PII300处理器,配置有128MB RAM,主板集成Intel 82557网络适配器,另外安装了4块3Com 3C905B 10/100Mbps自适应PCI网络适配器。\u003c/p\u003e\n\u003cp\u003e——————————————————————————–\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e安装最新版本的FreeBSD。可以从www.FreeBSD.org获取当前的FreeBSD版本信息,并且获得安装源文件。可以使用光盘安装和FTP安装方式。为了保证最好的硬件 …\u003c/p\u003e"
October 31, 2010
C语言中指针变量和数组的组合
"\u003cp\u003eint a[10];\u003c/p\u003e\n\u003cp\u003eint * p;\u003c/p\u003e\n\u003cp\u003eC语言规定数组名代表数组中第一个元素(即序号为0的元素)的地址,因此,下面两个语句等价:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ep = \u0026amp;a[0];\u003c/p\u003e\n\u003cp\u003ep = a;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e摘自:C语言程序设计(第二版)p211\u003c/p\u003e\n\u003cp\u003e(5)指针变量的值是可以改变的,见下例。\u003c/p\u003e\n\u003cp\u003e例10.20 改变指针变量的值。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#include \u0026lt;stdio.h\u0026gt;\nvoid main()\n{\nchar *a = \u0026#34;I love China!\u0026#34;:\na = a + 7;\nprintf(\u0026#34;%s\u0026#34;, a);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e运行结果如下:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eChina!\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e指针变量a的值是可以变化的,输出字符串是地从a当时所指向的单元开始输出各个字符,起码到遇’\\0’为止。而数组名虽然代表地址,但它是常量,它的值是不能改变的。下面的用法是错误的:\u003c/p\u003e\n\u003cp\u003echar str[] = {“I love China!”};\u003c/p\u003e\n\u003cp\u003estr = str + 7;\u003c/p\u003e\n\u003cp\u003eprintf(“%s”, str);\u003c/p\u003e\n\u003cp\u003e需要说明,若定义了一个指针变量, 并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。\u003c/p\u003e\n\u003cp\u003e例10.21 用带下标的字符指针变 …\u003c/p\u003e"
October 30, 2010
又拍网架构中的分库设计
"\u003cp\u003e又拍网是一个照片分享社区,从2005年6月至今积累了260万用户,1.1亿张照片,目前的日访问量为200多万。5年的发展历程里经历过许多起伏,也积累了一些经验,在这篇文章里,我要介绍一些我们在技术上的积累。\u003c/p\u003e\n\u003cp\u003e又拍网和大多数Web2.0站点一样,构建于大量开源软件之上,包括\u003ca href=\"http://www.mysql.com/\"\u003eMySQL\u003c/a\u003e、\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e、\u003ca href=\"http://nginx.org/en/\"\u003enginx\u003c/a\u003e、\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e、\u003ca href=\"http://www.danga.com/memcached/\"\u003ememcached\u003c/a\u003e、\u003ca href=\"http://code.google.com/p/redis\"\u003eredis\u003c/a\u003e、\u003ca href=\"http://lucene.apache.org/solr/\"\u003eSolr\u003c/a\u003e、\u003ca href=\"http://hadoop.apache.org/\"\u003eHadoop\u003c/a\u003e和\u003ca href=\"http://www.rabbitmq.com/\"\u003eRabbitMQ\u003c/a\u003e等等。又拍网的服务器端开发语言主要是\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e和\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e,其中\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e用于编写Web逻辑(通过HTTP和用户直接打交道), 而\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e则主要用于开发内部服务和后台任务。在客户端则使用了大量的Javascript, 这里要感谢一下\u003ca href=\"http://mootools.net/\"\u003eMooTools\u003c/a\u003e这个JS框架,它使得我们很享受前端开发过程。 另外,我们把图片处理过程从\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e进程里独立出来变成一个服务。这个服务基于\u003ca href=\"http://nginx.org/en/\"\u003enginx\u003c/a\u003e,但是是作为\u003ca href=\"http://nginx.org/en/\"\u003enginx\u003c/a\u003e的一个模块而开放REST API。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/10/sharding1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/sharding1.png\" alt=\"开发语言\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e**图1:**开发语言\u003c/p\u003e\n\u003cp\u003e由于\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e的单线程模型,我们把耗时较久的运算和I/O操作从HTTP请求周期中分离出来, 交给由\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e实现的任务进程来完成,以保证请求响应速度。这 …\u003c/p\u003e"
October 30, 2010
软件架构设计中的同步与异步问题(修改版)
"\u003cp\u003e内容概要:本文分析了大型程序系统设计中经常需要面对的同步和异步结构问题。列举异步结构模式实现手段,论证异步模式效率远远优越于同步模式,证明在硬件资源理想情况下,对同步模式而言并发量对计算机系统的平均交易处理时间没有影响,对异步模式而言平均交易处理时间会随着并发量的增大而急剧下降,最终也趋向一个恒定值。在实际有限计算机资源情况下,程序设计必须设置最大并发量以控制并发程度,否则过多并发量会形成交易对硬件资源的竞争,造成交易的拥塞。\u003c/p\u003e\n\u003cp\u003e关键词:同步,异步,消息队列,效率,并发\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.基本概念\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e同步和异步问题是大型程序设计中需要慎重等待的问题,但目前这方面的讨论很少,本文就试图进行有关方面讨论。\u003c/p\u003e\n\u003cp\u003e一个大型的程序系统常常是由很多不能功能模块组成的。程序系统运行时不同功能模块要按一定顺序执行,以协同完成一件任务。功能模块协作运行完成一件任务存在同步和异步两种方式。如果在某一时间段,这个程序系统的所有功能模块都在为完成相同的一件任务而服务,某一个功能模块在完成一件任务的子任务后,需要等待其他功能模块完成子任务,这样只有当全部功能模块按顺序完成一件任务后,程序系统才能接收下一个任务,功能模块是串行运行,这 …\u003c/p\u003e"