<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#22823;&#34430;&#30340;&#23398;&#20064;&#31354;&#38388;</title>
	<atom:link href="http://blog.fabrichina.net/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.fabrichina.net</link>
	<description>PHP SEO &#30005;&#23376;&#21830;&#21153;&#26550;&#26500;</description>
	<lastBuildDate>Thu, 29 Jul 2010 02:44:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>看外网ip~~</title>
		<link>http://blog.fabrichina.net/archives/359</link>
		<comments>http://blog.fabrichina.net/archives/359#comments</comments>
		<pubDate>Thu, 29 Jul 2010 02:44:24 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=359</guid>
		<description><![CDATA[curl -s &#8216;http://208.78.70.70/&#8217;  &#124; sed &#8216;s/.*Current IP Address: \([0-9\.]*\).*/\1/g&#8217;]]></description>
			<content:encoded><![CDATA[<p>curl -s &#8216;http://208.78.70.70/&#8217;  | sed &#8216;s/.*Current IP Address: \([0-9\.]*\).*/\1/g&#8217;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/359/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>20个Nginx Web服务器最佳安全实践</title>
		<link>http://blog.fabrichina.net/archives/355</link>
		<comments>http://blog.fabrichina.net/archives/355#comments</comments>
		<pubDate>Wed, 28 Jul 2010 09:55:52 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=355</guid>
		<description><![CDATA[Nginx是一个轻量级，高性能的Web服务器/反向代理和电子邮件代理（IMAP/POP3），它可以运行在UNIX，GNU/Linux，BSD变种，MAC OS X，Solaris和Microsoft Windows上。根据Netcraft的调查数据显示，互联网上6%的域名都使用了Nginx Web服务器。Nginx是解决C10K问题的服务器之一，与传统服务器不一样，Nginx不依赖于线程处理请求，相反，它使用了一个更具扩展性的事件驱动（异步）架构。Nginx在很多高流量网站上得到了应用，如WordPress，Hulu，Github和SourceForge。 本文的主要目是介绍如何提高运行在Linux或UNIX类操作系统上的Nginx Web服务器的安全性。 Nginx默认配置文件和默认端口 ◆ /usr/local/nginx/conf/ – Nginx服务器配置目录，/usr/local/nginx/conf/nginx.conf 是主配置文件 ◆ /usr/local/nginx/html/ – 默认文档位置 ◆ /usr/local/nginx/logs/ – 默认日志文件位置 ◆ Nginx HTTP默认端口：TCP 80 ◆ Nginx HTTPS默认端口：TCP 443 可以使用下面的命令测试Nginx的配置是否正确： # /usr/local/nginx/sbin/nginx –t 输出示例： the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok configuration file /usr/local/nginx/conf/nginx.conf test is successful 要让修改后的配置生效，执行下面的命令： # /usr/local/nginx/sbin/nginx -s reload 如果要停止服务器，运行： # /usr/local/nginx/sbin/nginx [...]]]></description>
			<content:encoded><![CDATA[<p>Nginx是一个轻量级，高性能的Web服务器/反向代理和电子邮件代理（IMAP/POP3），它可以运行在UNIX，GNU/Linux，BSD变种，MAC OS X，Solaris和Microsoft Windows上。根据Netcraft的调查数据显示，互联网上6%的域名都使用了Nginx Web服务器。Nginx是解决C10K问题的服务器之一，与传统服务器不一样，Nginx不依赖于线程处理请求，相反，它使用了一个更具扩展性的事件驱动（异步）架构。Nginx在很多高流量网站上得到了应用，如WordPress，Hulu，Github和SourceForge。<br />
本文的主要目是介绍如何提高运行在Linux或UNIX类操作系统上的Nginx Web服务器的安全性。<br />
Nginx默认配置文件和默认端口<br />
◆ /usr/local/nginx/conf/ – Nginx服务器配置目录，/usr/local/nginx/conf/nginx.conf 是主配置文件<br />
◆ /usr/local/nginx/html/ – 默认文档位置<br />
◆ /usr/local/nginx/logs/ – 默认日志文件位置<br />
◆ Nginx HTTP默认端口：TCP 80<br />
◆ Nginx HTTPS默认端口：TCP 443<br />
可以使用下面的命令测试Nginx的配置是否正确：<br />
# /usr/local/nginx/sbin/nginx –t<br />
输出示例：<br />
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok<br />
configuration file /usr/local/nginx/conf/nginx.conf test is successful<br />
要让修改后的配置生效，执行下面的命令：<br />
# /usr/local/nginx/sbin/nginx -s reload<br />
如果要停止服务器，运行：<br />
# /usr/local/nginx/sbin/nginx -s stop<br />
1、开启SELinux<br />
SELinux（安全增强的Linux）是一个Linux内核功能，它提供了一个机制支持访问控制安全策略，提供了巨大的安全保护能力，它可以防止大多数系统root级攻击，请参考“如何在CentOS/Red Hat系统上开启SELinux”（<a href="http://www.cyberciti.biz/faq/rhel-fedora-redhat-selinux-protection/">http://www.cyberciti.biz/faq/rhel-fedora-redhat-selinux-protection/</a>）。<br />
运行getsebool –a命令查看SELinux设置项：<br />
getsebool -a | less<br />
getsebool -a | grep off<br />
getsebool -a | grep o<br />
然后使用setsebool命令开启需要的配置项，注意：开启SELinux后，在RHEL或CentOS上通常会增加2-8%的系统开销。<br />
2、通过mount参数提供最低权限<br />
为你的/html/php文件创建独立的分区，例如，创建一个/dev/sda5分区挂载在/ngnix上，确定/ngnix使用了noexec，nodev和nosetuid权限挂载。下面是我的一个挂载实例：<br />
LABEL=/nginx    <br />
/nginx         <br />
ext3  <br />
defaults,nosuid,noexec,nodev 1 2<br />
注意你需要使用fdisk和mkfs.ext3命令创建一个新分区。<br />
3、通过/etc/sysctl.conf加固<br />
可以通过/etc/sysctl.conf控制和配置Linux内核及网络设置。<br />
另外，请参考：<br />
# 避免放大攻击<br />
net.ipv4.icmp_echo_ignore_broadcasts = 1<br />
# 开启恶意icmp错误消息保护<br />
net.ipv4.icmp_ignore_bogus_error_responses = 1<br />
# 开启SYN洪水攻击保护<br />
net.ipv4.tcp_syncookies = 1<br />
# 开启并记录欺骗，源路由和重定向包<br />
net.ipv4.conf.all.log_martians = 1<br />
net.ipv4.conf.default.log_martians = 1<br />
# 处理无源路由的包<br />
net.ipv4.conf.all.accept_source_route = 0<br />
net.ipv4.conf.default.accept_source_route = 0</p>
<p># 开启反向路径过滤<br />
net.ipv4.conf.all.rp_filter = 1<br />
net.ipv4.conf.default.rp_filter = 1<br />
# 确保无人能修改路由表<br />
net.ipv4.conf.all.accept_redirects = 0<br />
net.ipv4.conf.default.accept_redirects = 0<br />
net.ipv4.conf.all.secure_redirects = 0<br />
net.ipv4.conf.default.secure_redirects = 0<br />
# 不充当路由器<br />
net.ipv4.ip_forward = 0<br />
net.ipv4.conf.all.send_redirects = 0<br />
net.ipv4.conf.default.send_redirects = 0<br />
# 开启execshild<br />
kernel.exec-shield = 1<br />
kernel.randomize_va_space = 1<br />
# IPv6设置<br />
net.ipv6.conf.default.router_solicitations = 0<br />
net.ipv6.conf.default.accept_ra_rtr_pref = 0<br />
net.ipv6.conf.default.accept_ra_pinfo = 0<br />
net.ipv6.conf.default.accept_ra_defrtr = 0<br />
net.ipv6.conf.default.autoconf = 0<br />
net.ipv6.conf.default.dad_transmits = 0<br />
net.ipv6.conf.default.max_addresses = 1<br />
# 优化LB使用的端口<br />
# 增加系统文件描述符限制<br />
fs.file-max = 65535<br />
# 允许更多的PIDs (减少滚动翻转问题); may break some programs 32768<br />
kernel.pid_max = 65536<br />
# 增加系统IP端口限制<br />
net.ipv4.ip_local_port_range = 2000 65000<br />
# 增加TCP最大缓冲区大小<br />
net.ipv4.tcp_rmem = 4096 87380 8388608<br />
net.ipv4.tcp_wmem = 4096 87380 8388608<br />
# 增加Linux自动调整TCP缓冲区限制<br />
# 最小，默认和最大可使用的字节数<br />
# 最大值不低于4MB，如果你使用非常高的BDP路径可以设置得更高<br />
# Tcp窗口等<br />
net.core.rmem_max = 8388608<br />
net.core.wmem_max = 8388608<br />
net.core.netdev_max_backlog = 5000<br />
net.ipv4.tcp_window_scaling = 1<br />
◆ Linux VM调优（内存）子系统（<a href="http://www.cyberciti.biz/faq/linux-kernel-tuning-virtual-memory-subsystem/">http://www.cyberciti.biz/faq/linux-kernel-tuning-virtual-memory-subsystem/</a>）<br />
◆ Linux网络堆栈调优（缓冲区大小）提高网络性能（<a href="http://www.cyberciti.biz/faq/linux-tcp-tuning/">http://www.cyberciti.biz/faq/linux-tcp-tuning/</a>）<br />
4、移除所有不需要的Nginx模块<br />
你需要最大限度地将Nginx加载的模块最小化，我的意思是满足Web服务器需要就可以了，多余的模块一个不留，例如，禁用SSI和autoindex模块的命令如下：<br />
# ./configure –without-http_autoindex_module –without-http_ssi_module<br />
# make<br />
# make install<br />
在编译Nginx服务器时，使用下面的命令查看哪些模块应该启用，哪些模块应该禁用：<br />
# ./configure –help | less<br />
禁用你不需要的Nginx模块。<br />
修改Nginx版本头信息（可选），编辑src/http/ngx_http_header_filter_module.c：<br />
# vi +48 src/http/ngx_http_header_filter_module.c<br />
找到下面两行：<br />
static char ngx_http_server_string[] = &#8220;Server: nginx&#8221; CRLF;<br />
static char ngx_http_server_full_string[] = &#8220;Server: &#8221; NGINX_VER CRLF;<br />
将其修改为：<br />
static char ngx_http_server_string[] = &#8220;Server: Ninja Web Server&#8221; CRLF;<br />
static char ngx_http_server_full_string[] = &#8220;Server: Ninja Web Server&#8221; CRLF;<br />
保存并关闭文件。现在可以开始编译服务器了，将下面的配置代码添加到nginx.conf中，禁止在所有自动产生的错误页面中显示Nginx版本号：<br />
server_tokens off<br />
5、使用mod_security（仅适用于后端Apache服务器）<br />
Mod_security为Apache提供了一个应用程序级防火墙，为所有后端Apache Web服务器安装mod_security模块，可以阻止许多注入攻击。<br />
6、配置SELinux策略加固Nginx<br />
默认情况下，SELinux没有保护Nginx Web服务器，可以手动配置进行保护，首先安装SELinux编译时需要的支持包：<br />
# yum -y install selinux-policy-targeted selinux-policy-devel<br />
从项目主页（<a href="http://sourceforge.net/projects/selinuxnginx/">http://sourceforge.net/projects/selinuxnginx/</a>）下载SELinux策略：<br />
# cd /opt<br />
# wget ‘http://downloads.sourceforge.net/project/selinuxnginx/se-ngix_1_0_10.tar.<br />
gz?use_mirror=nchc’</p>
<p>解压：<br />
# tar -zxvf se-ngix_1_0_10.tar.gz<br />
编译：<br />
# cd se-ngix_1_0_10/nginx<br />
# make<br />
输出示例：<br />
Compiling targeted nginx module<br />
/usr/bin/checkmodule:  loading policy configuration from tmp/nginx.tmp<br />
/usr/bin/checkmodule:  policy configuration loaded<br />
/usr/bin/checkmodule:  writing binary representation (version 6) to tmp/nginx.mod<br />
Creating targeted nginx.pp policy package<br />
rm tmp/nginx.mod.fc tmp/nginx.mod<br />
安装生成的nginx.pp SELinux模块：<br />
# /usr/sbin/semodule -i nginx.pp<br />
7、通过iptables防火墙设置限制<br />
下面的防火墙脚本可以阻止一切请求，只允许：<br />
◆ 入站HTTP请求（TCP 80端口）<br />
◆ 入站ICMP ping请求<br />
◆ 出站NTP请求（端口123）<br />
◆ 出站SMTP请求（TCP端口25）<br />
#!/bin/bash<br />
IPT=&#8221;/sbin/iptables&#8221;<br />
#### IPS ######<br />
# 获得服务器公共IP<br />
SERVER_IP=$(ifconfig eth0 | grep ‘inet addr:’ | awk -F’inet addr:’ ‘{ print $2}’ | awk ‘{ print $1}’)<br />
LB1_IP=&#8221;204.54.1.1&#8243;<br />
LB2_IP=&#8221;204.54.1.2&#8243;<br />
# 实现某些智能逻辑，以便我们可以在LB2上使用damm脚本<br />
OTHER_LB=&#8221;"<br />
SERVER_IP=&#8221;"<br />
[[ "$SERVER_IP" == "$LB1_IP" ]] &amp;&amp; OTHER_LB=&#8221;$LB2_IP&#8221; || OTHER_LB=&#8221;$LB1_IP&#8221;<br />
[[ "$OTHER_LB" == "$LB2_IP" ]] &amp;&amp; OPP_LB=&#8221;$LB1_IP&#8221; || OPP_LB=&#8221;$LB2_IP&#8221;<br />
### IPs ###<br />
PUB_SSH_ONLY=&#8221;122.xx.yy.zz/29&#8243; #### 文件 #####<br />
BLOCKED_IP_TDB=/root/.fw/blocked.ip.txt<br />
SPOOFIP=&#8221;127.0.0.0/8 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 169.254.0.0/16 0.0.0.0/8 240.0.0.0/4 255.255.255.255/32 168.254.0.0/16 224.0.0.0/4 240.0.0.0/5 248.0.0.0/5 192.0.2.0/24&#8243;<br />
BADIPS=$( [[ -f ${BLOCKED_IP_TDB} ]] &amp;&amp; egrep -v &#8220;^#|^$&#8221; ${BLOCKED_IP_TDB})<br />
### 接口 ###<br />
PUB_IF=&#8221;eth0&#8243;   # public interface<br />
LO_IF=&#8221;lo&#8221;      # loopback<br />
VPN_IF=&#8221;eth1&#8243;   # vpn / private net<br />
### 启动防火墙 ###<br />
echo &#8220;Setting LB1 $(hostname) Firewall…&#8221;<br />
# 删除和关闭一切<br />
$IPT -P INPUT DROP<br />
$IPT -P OUTPUT DROP<br />
$IPT -P FORWARD DROP<br />
# 不受限制的lo访问<br />
$IPT -A INPUT -i ${LO_IF} -j ACCEPT<br />
$IPT -A OUTPUT -o ${LO_IF} -j ACCEPT<br />
# 不受限制的vpn/pnet访问<br />
$IPT -A INPUT -i ${VPN_IF} -j ACCEPT<br />
$IPT -A OUTPUT -o ${VPN_IF} -j ACCEPT<br />
# 删除sync<br />
$IPT -A INPUT -i ${PUB_IF} -p tcp ! –syn -m state –state NEW -j DROP<br />
# 删除碎片<br />
$IPT -A INPUT -i ${PUB_IF} -f -j DROP<br />
$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL FIN,URG,PSH -j DROP<br />
$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL ALL -j DROP<br />
# 删除空包<br />
$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL NONE -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix &#8221; NULL Packets &#8221;<br />
$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL NONE -j DROP<br />
$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,RST SYN,RST -j DROP<br />
# 删除XMAS<br />
$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,FIN SYN,FIN -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix &#8221; XMAS Packets &#8221;<br />
$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP<br />
# 删除FIN包扫描<br />
$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags FIN,ACK FIN -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix &#8221; Fin Packets Scan &#8221;<br />
$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags FIN,ACK FIN -j DROP<br />
$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP<br />
# 记录并放弃广播/多播和无效数据包<br />
$IPT  -A INPUT -i ${PUB_IF} -m pkttype –pkt-type broadcast -j LOG –log-prefix &#8221; Broadcast &#8221;<br />
$IPT  -A INPUT -i ${PUB_IF} -m pkttype –pkt-type broadcast -j DROP<br />
$IPT  -A INPUT -i ${PUB_IF} -m pkttype –pkt-type multicast -j LOG –log-prefix &#8221; Multicast &#8221;<br />
$IPT  -A INPUT -i ${PUB_IF} -m pkttype –pkt-type multicast -j DROP<br />
$IPT  -A INPUT -i ${PUB_IF} -m state –state INVALID -j LOG –log-prefix &#8221; Invalid &#8221;<br />
$IPT  -A INPUT -i ${PUB_IF} -m state –state INVALID -j DROP<br />
# 记录和阻止欺骗IP<br />
$IPT -N spooflist<br />
for ipblock in $SPOOFIP<br />
do   <br />
$IPT -A spooflist -i ${PUB_IF} -s $ipblock -j LOG –log-prefix &#8221; SPOOF List Block &#8220;      <br />
$IPT -A spooflist -i ${PUB_IF} -s $ipblock -j DROP<br />
done<br />
$IPT -I INPUT -j spooflist<br />
$IPT -I OUTPUT -j spooflist<br />
$IPT -I FORWARD -j spooflist<br />
# 只允许从选定的公共IP使用SSH<br />
for ip in ${PUB_SSH_ONLY}<br />
do        $IPT -A INPUT -i ${PUB_IF} -s ${ip} -p tcp -d ${SERVER_IP} –destination-port 22 -j ACCEPT      <br />
$IPT -A OUTPUT -o ${PUB_IF} -d ${ip} -p tcp -s ${SERVER_IP} –sport 22 -j ACCEPT<br />
done<br />
# 允许入站ICMP ping<br />
$IPT -A INPUT -i ${PUB_IF} -p icmp –icmp-type 8 -s 0/0 -m state –state NEW,ESTABLISHED,RELATED -m limit –limit 30/sec  -j ACCEPT<br />
$IPT -A OUTPUT -o ${PUB_IF} -p icmp –icmp-type 0 -d 0/0 -m state –state ESTABLISHED,RELATED -j ACCEPT<br />
# 允许入站HTTP端口80<br />
$IPT -A INPUT -i ${PUB_IF} -p tcp -s 0/0 –sport 1024:65535 –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT<br />
$IPT -A OUTPUT -o ${PUB_IF} -p tcp –sport 80 -d 0/0 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT<br />
# 允许出站NTP<br />
$IPT -A OUTPUT -o ${PUB_IF} -p udp –dport 123 -m state –state NEW,ESTABLISHED -j ACCEPT<br />
$IPT -A INPUT -i ${PUB_IF} -p udp –sport 123 -m state –state ESTABLISHED -j ACCEPT<br />
# 允许出站SMTP<br />
$IPT -A OUTPUT -o ${PUB_IF} -p tcp –dport 25 -m state –state NEW,ESTABLISHED -j ACCEPT<br />
$IPT -A INPUT -i ${PUB_IF} -p tcp –sport 25 -m state –state ESTABLISHED -j ACCEPT<br />
### 在这里添加其他规则 ####<br />
#######################<br />
# 删除并记录其它数据包<br />
$IPT -A INPUT -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix &#8221; DEFAULT DROP &#8221;<br />
$IPT -A INPUT -j DROP<br />
exit 0<br />
8、控制缓冲区溢出攻击<br />
编辑nginx.conf设置所有客户端可用的缓冲区大小限制：<br />
# vi /usr/local/nginx/conf/nginx.conf<br />
具体设置如下：<br />
## Start: Size Limits &amp; Buffer Overflows ##  client_body_buffer_size  1K;</p>
<p>client_header_buffer_size 1k;  client_max_body_size 1k;  large_client_header_buffers 2 1k;<br />
## END: Size Limits &amp; Buffer Overflows ##<br />
说明：<br />
client_body_buffer_size 1k：默认是8k或16k，指定客户端请求主体缓冲区大小。<br />
client_header_buffer_size 1k：指定来自客户端请求头的headerbuffer大小，对于大多数请求，1k的缓冲区大小已经足够，如果你自定义了消息头或有更大的Cookie，你可以增加其大小。<br />
client_max_body_size 1k：客户端请求中可接受的主体最大大小，由请求头中的Content-Length表示，如果大小大于给定的尺寸，客户端将会收到一条“Request Entity Too Large（413）”的错误，如果你要通过POST方法上传文件，可以将该值设大一些。<br />
large_client_header_buffers 2 1k：为客户端请求中较大的消息头指定的缓存最大数量和大小，默认情况下，一个缓冲区的大小等于页面的大小，根据平台的不同可能是4K或8K，如果在请求连接的末尾状态转换为保持活动（keep-alive），这些缓冲区就被释放，2×1K将可以接收2KB数据的URI，这样有助于打击机器人攻击和DoS攻击。<br />
另外，你还需要控制超时时间，提高服务器性能，降低客户端的等待时间，做如下修改：<br />
## Start: Timeouts<br />
##  client_body_timeout  <br />
10;  client_header_timeout 10;</p>
<p>keepalive_timeout    <br />
5 5;  send_timeout         <br />
10;<br />
## End: Timeouts ##<br />
client_body_timeout 10：设置客户端请求主体读取超时时间，如果在这个时间后客户端还没有发送任何数据，Nginx返回“Request time out（408）”错误，默认值是60。<br />
client_header_timeout 10：设置客户端请求头读取超时时间，如果在这个时间后客户端还没有发送任何数据，Nginx返回“Request time out（408）”错误。<br />
keepalive_timeout 5 5：第一个参数指定客户端连接保持活动的超时时间，在这个时间之后，服务器会关掉连接，第二个参数是可选的，它指定了消息头保持活动的有效时间，即响应中的timeout=time，它可以告诉某些浏览器关闭连接，因此服务器就不必关闭连接了，如果没有这个参数，Nginx不会发送Keep-Alive头。<br />
send_timeout 10：指定响应客户端的超时时间，这个超时仅限于两个阅读活动之间的时间，如果这个时间后客户端没有任何活动，Nginx将会关闭连接。<br />
9、控制并发连接<br />
你可以使用NginxHttpLimitZone模块限制指定会话，或某个IP的并发连接数，编辑nginx.conf：<br />
### Directive describes the zone, in which the session states are stored i.e. store in slimits.<br />
### 1m can handle 32000 sessions with 32 bytes/session, set to 5m x 32000 session ###</p>
<p>limit_zone slimits $binary_remote_addr 5m;</p>
<p>### Control maximum number of simultaneous connections for one session i.e. ###<br />
### restricts the amount of connections from a single ip address ###</p>
<p>limit_conn slimits 5;<br />
上述设置可以限制远程客户端每IP地址不能超过5个同时打开的连接。<br />
10、只允许访问指定的域名<br />
如果有机器人程序在随机扫描所有域，那就阻止它访问，你必须配置只允许虚拟域或反向代理请求。<br />
## Only requests to our Host are allowed i.e. nixcraft.in, images.nixcraft.in and <a href="http://www.nixcraft.in">www.nixcraft.in</a>  <br />
if ($host !~ ^(nixcraft.in|www.nixcraft.in|images.nixcraft.in)$ ) {        <br />
return 444;      }<br />
##<br />
11、限制可用的方法<br />
GET和POST是互联网上最常用的方法，RFC 2616定义了Web服务器可用的方法，如果一个Web服务器不要求实现所有方法，那些方法就应该被禁止掉，下面的代码将过滤所有方法，只允许GET，HEAD和POST方法：<br />
## Only allow these request methods ##    <br />
if ($request_method !~ ^(GET|HEAD|POST)$ ) {        <br />
return 444;     }<br />
## Do not accept DELETE, SEARCH and other methods ##<br />
关于HTTP方法的更多信息：<br />
GET方法用于请求文档，如<a href="http://www.cyberciti.biz/index.php">http://www.cyberciti.biz/index.php</a>。<br />
HEAD方法与GET相同，但服务器不会在响应中只返回消息主体。<br />
POST方法功能就多了，如通过表单存储或更新数据，订购一个产品，发送电子邮件等，通常使用服务器端脚本（如PHP，Perl，Python等）处理，如果你要上传文件或在服务器上处理表单就必须用它。<br />
12a、如何阻止某些用户代理（User-Agents）？<br />
你可以轻松阻止用户代理，如扫描器，机器人和垃圾邮件，它们可能会滥用你的服务器。<br />
## Block download agents ##    <br />
if ($http_user_agent ~* LWP::Simple|BBBike|wget) {        <br />
return 403;     }<br />
##<br />
阻止msnbot和scrapbot机器人：<br />
## Block some robots ##    <br />
if ($http_user_agent ~* msnbot|scrapbot) {          <br />
return 403;     }<br />
12b、如何阻止被提名的垃圾邮件<br />
被提名的垃圾邮件都很危险，它们可能会损害你的SEO排名，可以使用下面的代码阻止访问垃圾邮件发送者：<br />
## Deny certain Referers ###  <br />
if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) )    <br />
{       <br />
# return 404;       <br />
return 403;     }<br />
##<br />
13、如何停止图片热链<br />
图片或HTML热链是指有人在他们的网站上引用了你网站的图片，你必须为其它网站的流量支付贷款费用，有点象是网站劫持，通常这种情况发生在博<br />
客和论坛中，我强烈建议你在服务器级停止并阻止图片热链。<br />
# Stop deep linking or hot linking<br />
location /images/ {  valid_referers none blocked <a href="http://www.example.com">www.example.com</a> example.com;  <br />
if ($invalid_referer) {    <br />
return   403;   }<br />
}<br />
例子：重写并显示禁令图片：<br />
valid_referers blocked <a href="http://www.example.com">www.example.com</a> example.com;<br />
if ($invalid_referer) { rewrite ^/images/uploads.*\.(gif|jpg|jpeg|png)$<br />
<a href="http://www.examples.com/banned.jpg">http://www.examples.com/banned.jpg</a> last<br />
}<br />
另外，请参考“How-to：使用Nginx映射阻止图片热链”（<a href="http://nginx.org/pipermail/nginx/2007-June/001082.html">http://nginx.org/pipermail/nginx/2007-June/001082.html</a>）。<br />
14、目录限制<br />
你可以为特定目录设置访问控制，所有网页目录都应配置为按需访问。<br />
通过IP地址限制访问，你可以限制访问/docs/目录的IP地址：<br />
location /docs/ {  ## block one workstation  deny    192.168.1.1;<br />
## allow anyone in 192.168.1.0/24  allow   192.168.1.0/24;<br />
## drop rest of the world  deny    all;<br />
}<br />
通过密码保护目录，首先创建一个密码文件，再添加一个用户vivek：<br />
# mkdir /usr/local/nginx/conf/.htpasswd/<br />
# htpasswd -c /usr/local/nginx/conf/.htpasswd/passwd vivek<br />
编辑nginx.conf添加需要保护的目录：<br />
### Password Protect /personal-images/ and /delta/ directories ###<br />
location ~ /(personal-images/.*|delta/.*) {  auth_basic  &#8220;Restricted&#8221;; <br />
auth_basic_user_file   /usr/local/nginx/conf/.htpasswd/passwd;<br />
}<br />
创建好密码文件后，后面的用户可以使用下面的命令进行追加：<br />
# htpasswd -s /usr/local/nginx/conf/.htpasswd/passwd userName</p>
<p>15、Nginx SSL配置<br />
HTTP是一个纯文本协议，很容易被窃听，你应该使用SSL加密传输的信息。<br />
首先需要创建一个SSL证书，输入下面的命令：<br />
# cd /usr/local/nginx/conf<br />
# openssl genrsa -des3 -out server.key 1024<br />
# openssl req -new -key server.key -out server.csr<br />
# cp server.key server.key.org<br />
# openssl rsa -in server.key.org -out server.key<br />
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt<br />
编辑nginx.conf，找到对应位置，做如下修改：<br />
server {   <br />
server_name example.com;   <br />
listen 443;   <br />
ssl on;   <br />
ssl_certificate /usr/local/nginx/conf/server.crt;   <br />
ssl_certificate_key /usr/local/nginx/conf/server.key;   <br />
access_log /usr/local/nginx/logs/ssl.access.log;   <br />
error_log /usr/local/nginx/logs/ssl.error.log;<br />
重启Nginx：<br />
# /usr/local/nginx/sbin/nginx -s reload<br />
另外，请参考Nginx SSL文档（<a href="http://wiki.nginx.org/NginxHttpSslModule">http://wiki.nginx.org/NginxHttpSslModule</a>）。<br />
16、Nginx和PHP安全技巧<br />
PHP是流行的服务器端脚本语言，对/etc/php.ini做如下修改：<br />
# 禁用危险的函数<br />
disable_functions = phpinfo, system, mail, exec<br />
## 限制资源  ##<br />
# 每个脚本的最大执行时间，单位秒<br />
max_execution_time = 30<br />
# 每个脚本解析请求数据的最大时间<br />
max_input_time = 60<br />
# 每个脚本可以消耗的最大内存（8MB）<br />
memory_limit = 8M<br />
# PHP要接收的POST数据最大大小<br />
post_max_size = 8M<br />
# 是否允许HTTP文件上传<br />
file_uploads = Off<br />
# 允许上传的最大文件大小<br />
upload_max_filesize = 2M<br />
# 不将PHP错误消息暴露给外部用户<br />
display_errors = Off<br />
# 启用安全模式<br />
safe_mode = On<br />
# 只允许访问隔离目录中的可执行文件<br />
safe_mode_exec_dir = php-required-executables-path<br />
# 限制外部访问PHP资源<br />
safe_mode_allowed_env_vars = PHP_<br />
# 限制泄露PHP信息<br />
expose_php = Off<br />
# 记录所有错误<br />
log_errors = On<br />
# 不为输入数据注册全局<br />
register_globals = Off<br />
# 最小化允许的php post大小<br />
post_max_size = 1K<br />
# 确保PHP重定向正确<br />
cgi.force_redirect = 0<br />
# 禁止上传，除非必要<br />
file_uploads = Off<br />
# 启用SQL安全模式<br />
sql.safe_mode = On<br />
# 避免打开远程文件<br />
allow_url_fopen = Off<br />
另外，请参考“PHP安全：限制脚本使用的资源”（<a href="http://www.cyberciti.biz/faq/php-resources-limits/">http://www.cyberciti.biz/faq/php-resources-limits/</a>），“PHP.INI：禁用exec，shell_exec，system，popen和其它功能提高安全”（<a href="http://www.cyberciti.biz/faq/linux-unix-apache-lighttpd-phpini-disable-functions/">http://www.cyberciti.biz/faq/linux-unix-apache-lighttpd-phpini-disable-functions/</a>）。<br />
17、尽可能在Chroot Jail（容器）中运行Nginx<br />
将Nginx放入Chroot Jail可以最大限度地减少被攻击的危险，它将Web服务器隔离到文件系统的专用区域，注意你不能使用传统的chroot方法设置Nginx，但你可以使用FreeBSD jails，Xen或OpenVZ虚拟化，它们也使用了容器的概念。<br />
18、在防火墙级限制每个IP的连接<br />
Web服务器必须时刻关注连接和每秒的连接限制，pf和iptables都可以在访问Nginx服务器之前卡住最终用户。<br />
Linux iptables：每秒卡住的Nginx连接<br />
下面的例子表示如果某个IP在60秒尝试连接到80端口的次数超过了15，iptables将会丢掉来自它的入站连接：<br />
/sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –set<br />
/sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent<br />
–update –seconds 60  –hitcount 15 -j DROP<br />
service iptables save<br />
BSD PF：每秒卡住的Nginx连接<br />
编辑/etc/pf.conf，做如下更新，下面的命令限制了每个来源的最大连接数为100，15/5指定某时间跨度内的连接数限制，这里就是5秒内的最大连接数为<br />
15，如果有人违背这条规则，将被加入到abusive_ips表，那么他以后就不能再连接了。最后刷新所有状态。<br />
ebserver_ip=&#8221;202.54.1.1&#8243;<br />
table  persist<br />
block in quick from<br />
pass in on $ext_if proto tcp to $webserver_ip port www flags S/SA keep state (max-src-conn 100,<br />
max-src-conn-rate 15/5, overload  flush)<br />
请根据你的需要和通信流量调整所有的值（浏览器可能会打开多个连接）。<br />
另外，请参考“PF防火墙脚本示例”（<a href="http://bash.cyberciti.biz/firewall/pf-firewall-script/">http://bash.cyberciti.biz/firewall/pf-firewall-script/</a>），“iptables防火墙脚本示例”（<a href="http://bash.cyberciti.biz/firewall/linux-iptables-firewall-shell-script-for-standalone-server/">http://bash.cyberciti.biz/firewall/linux-iptables-firewall-shell-script-for-standalone-server/</a>）。<br />
19、配置操作系统保护Web服务器<br />
除了开启SELinux外，还要给/nginx目录设置正确的权限，运行Nginx的系统用户名是nginx，但在DocumentRoot（/nginx或/usr/local/nginx/html）中的文件不应该<br />
属于该用户，他也不能进行修改。使用下面的命令找出权限设置不当的文件：<br />
# find /nginx -user nginx<br />
# find /usr/local/nginx/html -user nginx<br />
请确保将文件的所有者修改为root或其它用户，一个典型的权限设置如下：<br />
# ls -l /usr/local/nginx/html/<br />
输出示例：<br />
-rw-r–r– 1 root root 925 Jan  3 00:50 error4xx.html<br />
-rw-r–r– 1 root root  52 Jan  3 10:00 error5xx.html<br />
-rw-r–r– 1 root root 134 Jan  3 00:52 index.html<br />
另外，你必须删除由vi或其它文本编辑器创建的不必要的备份文件：<br />
# find /nginx -name ‘.?*’ -not -name .ht* -or -name ‘*~’ -or -name ‘*.bak*’ -or -name ‘*.old*’<br />
# find /usr/local/nginx/html/ -name ‘.?*’ -not -name .ht* -or -name ‘*~’<br />
-or -name ‘*.bak*’ -or -name ‘*.old*’<br />
给find命令传递-delete参数，它就会自动删除这些文件。<br />
20、限制出站Nginx连接<br />
攻击者可能要在你的Web服务器上使用如wget等工具下载文件，使用iptables阻止来自Nginx用户的出站连接，ipt_owner模块可以匹配各种包创建者的特征，只有在OUTPUT链中的才有效，在这里，允许vivek用户使用80端口连接外部资源（对RHN访问或通过仓库抓取CentOS更新特别有用）。<br />
/sbin/iptables -A OUTPUT -o eth0 -m owner –uid-owner vivek -p tcp<br />
–dport 80 -m state –state NEW,ESTABLISHED  -j ACCEPT<br />
将上述规则添加到你的iptables基础shell脚本中，不允许nginx Web服务器用户连接外部资源。<br />
附送技巧：观察日志和审核<br />
检查日志文件，可以从中找到攻击者的一些行踪和攻击手段。<br />
# grep &#8220;/login.php??&#8221; /usr/local/nginx/logs/access_log<br />
# grep &#8220;…etc/passwd&#8221; /usr/local/nginx/logs/access_log<br />
# egrep -i &#8220;denied|error|warn&#8221; /usr/local/nginx/logs/error_log<br />
Auditd服务提供了系统审核功能，启动SELinux事件，认证事件，文件修改，帐户修改等的审核服务，象往常一样首先关闭所有服务，然后打开我在“Linux服务器加固”（<a href="http://www.cyberciti.biz/tips/linux-security.html">http://www.cyberciti.biz/tips/linux-security.html</a>）一文中指出的服务。<br />
总结<br />
通过这些设置，你的Nginx服务器就可以对外提供服务了，但你应该根据应用程序安全需要进一步查看另外的资源。例如，WordPress或其它第三方程序都有其自身的安全要求。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/355/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php实现验证码的识别(中级篇) 收藏</title>
		<link>http://blog.fabrichina.net/archives/352</link>
		<comments>http://blog.fabrichina.net/archives/352#comments</comments>
		<pubDate>Mon, 26 Jul 2010 09:17:46 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=352</guid>
		<description><![CDATA[恩。。写的不错  php实现验证码的识别(中级篇) 收藏  在上篇文章 &#60;php实现验证码的识别 (初级篇 ) &#62; 中，讲了如何识别简单的验证，这里的简单只的是验证码有数字和字母组成，格式统一，每次出现位置固定。这篇文章将继续深入研究识别验证码，这次识别的目标是，验证码有字符和数字组成，验证码存在旋转（可能左右都旋转），位置不固定，存在字符与字符之间的粘连，且验证码有更强的干扰素。这篇文章讲解的方法，并不是万能的解决方案，并且提供代码不能直接解决你的问题，这里仅仅是方法，具体需求读者自己解决，需要说明的是，识别验证码与具体的编程语言无关，这里只是使用 php 语言实现，使用这里介绍的方法，你可以使用任何语言实现。  这篇文章逐步讲解识别验证码过程中的各个步骤。    如上图，随后的讲解我们都围绕此图展开。  一：拿到一个验证码的，第一眼我们首先要做的工作是，二值化。把验证码的部分用 1 表示，背景部分用 0 表示出来，识别方法很简单，我们打印出验证码正张图片的 RGB ，然后分析其规律即可，通过 RGB 码，我们很容易分辨出上面这张图片的 R 值大于 120 ， G 和 B 的值小于 80 ，所以依据这个规则我们很容易把上面的图片二值化。再看初级篇中识别的两张图     刚看上去，感觉很复杂。验证码的图片每次背景色都不相同，且不是单色，各个验证码数字的颜色每次也各不相同。貌似很难二值化，其实我们打印出其 RGB 值很容易就发现。无论验证数字颜色如何变化，该数字的 RGB 值总有一个值小于 125 ，所以通过如下判断 $rgbarray['red'] &#60; 125 &#124;&#124; $rgbarray['green']&#60;125&#124;&#124; $rgbarray['blue'] &#60; 125 我们就很容易分辨出哪里是数字，哪里是背景。   我们能够找到这些规律的因素是，在制作验证码的干扰素时，为了使干扰素不影响数字的显示效果，必须使用干扰素的 RGB 和数字 [...]]]></description>
			<content:encoded><![CDATA[<p>恩。。写的不错</p>
<p> php实现验证码的识别(中级篇) 收藏<br />
 在上篇文章 &lt;php实现验证码的识别 (初级篇 ) &gt; 中，讲了如何识别简单的验证，这里的简单只的是验证码有数字和字母组成，格式统一，每次出现位置固定。这篇文章将继续深入研究识别验证码，这次识别的目标是，验证码有字符和数字组成，验证码存在旋转（可能左右都旋转），位置不固定，存在字符与字符之间的粘连，且验证码有更强的干扰素。这篇文章讲解的方法，并不是万能的解决方案，并且提供代码不能直接解决你的问题，这里仅仅是方法，具体需求读者自己解决，需要说明的是，识别验证码与具体的编程语言无关，这里只是使用 php 语言实现，使用这里介绍的方法，你可以使用任何语言实现。</p>
<p> 这篇文章逐步讲解识别验证码过程中的各个步骤。</p>
<p> <br />
 如上图，随后的讲解我们都围绕此图展开。<br />
 一：拿到一个验证码的，第一眼我们首先要做的工作是，二值化。把验证码的部分用 1 表示，背景部分用 0 表示出来，识别方法很简单，我们打印出验证码正张图片的 RGB ，然后分析其规律即可，通过 RGB 码，我们很容易分辨出上面这张图片的 R 值大于 120 ， G 和 B 的值小于 80 ，所以依据这个规则我们很容易把上面的图片二值化。再看初级篇中识别的两张图</p>
<p> <br />
  刚看上去，感觉很复杂。验证码的图片每次背景色都不相同，且不是单色，各个验证码数字的颜色每次也各不相同。貌似很难二值化，其实我们打印出其 RGB 值很容易就发现。无论验证数字颜色如何变化，该数字的 RGB 值总有一个值小于 125 ，所以通过如下判断</p>
<p>$rgbarray['red'] &lt; 125 || $rgbarray['green']&lt;125|| $rgbarray['blue'] &lt; 125</p>
<p>我们就很容易分辨出哪里是数字，哪里是背景。</p>
<p>  我们能够找到这些规律的因素是，在制作验证码的干扰素时，为了使干扰素不影响数字的显示效果，必须使用干扰素的 RGB 和数字 RGB 相互独立，互不干扰。只要懂得这个规律，我们就很容易实现二值化。</p>
<p>  我们找到的 120 ， 80 ， 125 等阈值，可能和实际的 RGB 有出入，所以，有时二值化后，会有部分地方出现 1 ，对于验证码上固定位置显示数字，这种干扰没有太大意义。但是对于验证码位置不确定的图片来说，在我们切割字符时，很可能造成干扰。所以，在二值化后要进行去噪出来。</p>
<p>  二：接下来我们进行第二个步骤，出噪。出燥的原理很简单，就是把孤立的有效的值去掉，如果噪点比较高，要求的效率也比较高的话，这里面也有很多工作要做。幸好这里我们不要求这么高深，我们使用最简单的方法就可以，如果一个点为 1 则判断这个点的上下左右上左上右下左下右 8 个方位上数字是否为 1 ，如果不为 1 ，就认为是一个燥点，直接设置为 1 即可。</p>
<p> <br />
如上图所示，我们使用此方法很容易发现红色方框部分的 1 为燥点，直接设置为 1 即可。</p>
<p>在判断时我们使用了一个技巧，有时候的噪点可能是两个连续的 1 ，所以我们</p>
<p>+ expand sourceview plaincopy to clipboardprint?<br />
$num = 0;  <br />
if($data[$i][$j] == 1)  <br />
{  <br />
    // 上  <br />
    if(isset($data[$i-1][$j])){  <br />
        $num = $num + $data[$i-1][$j];  <br />
    }  <br />
    // 下  <br />
    if(isset($data[$i+1][$j])){  <br />
        $num = $num + $data[$i+1][$j];  <br />
    }  <br />
    // 左  <br />
    if(isset($data[$i][$j-1])){  <br />
        $num = $num + $data[$i][$j-1];  <br />
    }  <br />
    // 右  <br />
    if(isset($data[$i][$j+1])){  <br />
        $num = $num + $data[$i][$j+1];  <br />
    }  <br />
    // 上左  <br />
    if(isset($data[$i-1][$j-1])){  <br />
        $num = $num + $data[$i-1][$j-1];  <br />
    }  <br />
    // 上右  <br />
    if(isset($data[$i-1][$j+1])){  <br />
        $num = $num + $data[$i-1][$j+1];  <br />
    }  <br />
    // 下左  <br />
    if(isset($data[$i+1][$j-1])){  <br />
        $num = $num + $data[$i+1][$j-1];  <br />
    }  <br />
    // 下右  <br />
    if(isset($data[$i+1][$j+1])){  <br />
        $num = $num + $data[$i+1][$j+1];  <br />
    }  <br />
}  <br />
if($num == 0){  <br />
    $data[$i][$j] = 0;  <br />
} <br />
$num = 0;<br />
if($data[$i][$j] == 1)<br />
{<br />
 // 上<br />
 if(isset($data[$i-1][$j])){<br />
  $num = $num + $data[$i-1][$j];<br />
 }<br />
 // 下<br />
 if(isset($data[$i+1][$j])){<br />
  $num = $num + $data[$i+1][$j];<br />
 }<br />
 // 左<br />
 if(isset($data[$i][$j-1])){<br />
  $num = $num + $data[$i][$j-1];<br />
 }<br />
 // 右<br />
 if(isset($data[$i][$j+1])){<br />
  $num = $num + $data[$i][$j+1];<br />
 }<br />
 // 上左<br />
 if(isset($data[$i-1][$j-1])){<br />
  $num = $num + $data[$i-1][$j-1];<br />
 }<br />
 // 上右<br />
 if(isset($data[$i-1][$j+1])){<br />
  $num = $num + $data[$i-1][$j+1];<br />
 }<br />
 // 下左<br />
 if(isset($data[$i+1][$j-1])){<br />
  $num = $num + $data[$i+1][$j-1];<br />
 }<br />
 // 下右<br />
 if(isset($data[$i+1][$j+1])){<br />
  $num = $num + $data[$i+1][$j+1];<br />
 }<br />
}<br />
if($num == 0){<br />
 $data[$i][$j] = 0;<br />
}<br />
我们计算这个点的 8 个方向上的值之和，最后我们判断他们的和是否小于特定的阈值<br />
 三：经过去噪后，我们就得到干净的二值化的数据，接下来要做的就是切割字符了。切割字符的方法有很多种，这里我采用最简单的一种，先垂直方向切割成为字符，然后在水平方向去掉多于的 0000 ，如下图</p>
<p> <br />
第一步切割红线部分，第二步切割蓝线部分，这样就可以得到独立的字符了。但是像下面这种情况</p>
<p> <br />
按上面的方法会把 dw 字符切割成一个字符，这是错误的切割，所以这里我们涉及到粘连字符的切割。<br />
 四：粘连字符切割，制作验证码时，规则字符的粘连很容易分割开，如果字符本身有缩放，变形就很难处理，经过分析，我们可以发现，上面的字符粘连属于很简单的方式，只是规则字符的粘连，所以处理这种情况，我们也使用很简单的处理方式。当完成分割操作后，我们不能马上确定分割的部分就为一个字符，要进行验证，验证的关键因素就是，切割下来的字符的宽是否大于阈值，这个阈值的取舍标准是，一个字符无论怎么旋转变形都不会大于这个阈值，所以，如果我们切割的块大于这个阈值，就可以认为这是一个粘连字符；如果大于两个阈值之和，就认为是三个字符粘连，以此类推。知道这个规则后，切割粘连字符也就很简单了。如果我们发现是粘连字符块，直接平分这个块为两个或者多个新的块就可以。当然为了更好的还原字符，我一般都采用平分 +1 ， -1 对字符块的部分进行适当的补充。<br />
 五：经过上面四个步骤，我们就可以提取出比较纯的字符块了，接下来要做就是匹配字符了。对于旋转字符的特征码建立，有很多种方法，这里就不做深入研究了。我这里使用的最简单的方式，为所有字符的所有情况建立匹配库，所以在我提供的代码种增加了 study 操作，其目的就是，先有人手工识别图片的验证码，然后通过 study 方法，写入特征码库。这样写入的图片数据越多，验证识别的准确行也就越高。<br />
 好了，经过以上步骤，我们基本上可以识别现在互联网上大部分的验证码，这里我们都是使用的最简单的方法，没有使用任何 OCR 知识。这些方法，应该属于非 OCR 领域的顶峰了，要想识别更加复杂的验证码，那就需要更多的 OCR 知识了。有机会的话，我会在高级篇中一一做介绍。<br />
 下面是一些容易识别的验证码，希望引起网站管理者的重视。</p>
<p> <br />
制作验证码的一些建议<br />
 对于识别验证码的程序来说，最难得部分是验证字符的切割和特征码的建立，而国内很多程序员只做验证码时，总是喜欢在验证码加很多干扰素，干扰线，影响效果不说，还达不到很好的效果；所以，要想使自己验证码难于本识别，只做下面两点就够了<br />
1 ：字符粘连，最好所有的字符都有粘连的部分；<br />
2 ：不要使用规格字符，验证码的各个部分使用不同比例的缩放或者旋转。<br />
只要做到这两点，或者这两点的变形，识别程序就很难识别。我们看看， yahoo 和 google 的验证码就知道，白字黑底，却很难被识别。</p>
<p>Goole:</p>
<p>yahoo:</p>
<p>源文件下：点击下载</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/ugg/archive/2009/03/09/3972368.aspx">http://blog.csdn.net/ugg/archive/2009/03/09/3972368.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/352/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>varnish 设置header和forward IP设置问题</title>
		<link>http://blog.fabrichina.net/archives/330</link>
		<comments>http://blog.fabrichina.net/archives/330#comments</comments>
		<pubDate>Mon, 26 Jul 2010 09:10:06 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=330</guid>
		<description><![CDATA[What is the purpose of the X-Varnish HTTP header? The X-Varnish HTTP header allows you to find the correct log-entries for the transaction. For a cache hit, X-Varnish will contain both the ID of the current request and the ID of the request that populated the cache. It makes debugging Varnish a lot easier. Does [...]]]></description>
			<content:encoded><![CDATA[<p><strong>What is the purpose of the X-Varnish HTTP header?</strong></p>
<p>The X-Varnish HTTP header allows you to find the correct log-entries for the transaction. For a cache hit, X-Varnish will contain both the ID of the current request and the ID of the request that populated the cache. It makes debugging Varnish a lot easier.</p>
<p><strong>Does Varnish support compression?</strong></p>
<p>This is a simple question with a complicated answer; see <a href="http://varnish-cache.org/wiki/FAQ/Compression">WIKI</a>.</p>
<p><strong>How do I add a HTTP header?</strong></p>
<p>To add a HTTP header, unless you want to add something about the client/request, it is best done in vcl_fetch as this means it will only be processed every time the object is fetched:</p>
<pre>sub vcl_fetch {
  # Add a unique header containing the cache servers IP address:
  remove obj.http.X-Varnish-IP;
  set    obj.http.X-Varnish-IP = server.ip;
  # Another header:
  set    obj.http.Foo = "bar";
}</pre>
<p><strong>How can I log the client IP address on the backend?</strong></p>
<p>All I see is the IP address of the varnish server. How can I log the client IP address?</p>
<p>We will need to add the IP address to a header used for the backend request, and configure the backend to log the content of this header instead of the address of the connecting client (which is the varnish server).</p>
<p>Varnish configuration:</p>
<pre>sub vcl_recv {
  # Add a unique header containing the client address
  remove req.http.X-Forwarded-For;
  set    req.http.X-Forwarded-For = client.ip;
  # [...]
}</pre>
<p>For the apache configuration, we copy the “combined” log format to a new one we call “varnishcombined”, for instance, and change the client IP field to use the content of the variable we set in the varnish configuration:</p>
<pre>LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\"" varnishcombined</pre>
<p>And so, in our virtualhost, you need to specify this format instead of “combined” (or “common”, or whatever else you use):</p>
<pre>&lt;VirtualHost *:80&gt;
  ServerName www.example.com
  # [...]
  CustomLog /var/log/apache2/www.example.com/access.log varnishcombined
  # [...]
&lt;/VirtualHost&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/330/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php网页抓取+分析</title>
		<link>http://blog.fabrichina.net/archives/326</link>
		<comments>http://blog.fabrichina.net/archives/326#comments</comments>
		<pubDate>Mon, 26 Jul 2010 07:41:40 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=326</guid>
		<description><![CDATA[function getAbsolutePath($path,$host,$prefix='') {                 if(strtolower(substr($path,0,7))=='http://') return $path;         $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);         $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen'); //过滤掉空。。         $absolutes = array();         foreach ($parts as $part) {             if ('.' == $part) continue;             if ('..' == $part) {                 array_pop($absolutes);             } else {                 $absolutes[] = $part;             } [...]]]></description>
			<content:encoded><![CDATA[<pre lang=php>

function getAbsolutePath($path,$host,$prefix='') {
                if(strtolower(substr($path,0,7))=='http://') return $path;
        $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
        $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen'); //过滤掉空。。
        $absolutes = array();
        foreach ($parts as $part) {
            if ('.' == $part) continue;
            if ('..' == $part) {
                array_pop($absolutes);
            } else {
                $absolutes[] = $part;
            }
        }
        $end='';
        if(strlen($path)&gt;1 &amp;&amp; substr($path,-1)==DIRECTORY_SEPARATOR) $end=DIRECTORY_SEPARATOR;  //strlen $path &gt;1 是为了针对传入一个/的情况，会返回//,所以限制一下！
        if(strlen($path)&gt;1 &amp;&amp; substr($path,1)==DIRECTORY_SEPARATOR) $prefix=''; //不算前缀
        return $host.$prefix.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $absolutes).$end;
}
function getNodes($node,$type='a',$uri)
{
        $GLOBALS['node_tmp']=array();
        _callBackGetNode($node,$type,$uri);
        $tmp=$GLOBALS['node_tmp'];
        unset($GLOBALS['node_tmp']);
        return $tmp;
}
function _callBackGetNode($node,$type,$uri) {
        if($node-&gt;name ==$type  ) {
                $n=$type=='a'?strtolower($node-&gt;attribute['href']):strtolower($node-&gt;attribute['src']);
                $n=getAbsolutePath($n,$uri['scheme'].'://'.$uri['host'],$uri['path']);
                $GLOBALS['node_tmp'][$n]=1;
        }
        if(is_object($node) &amp;&amp; $node-&gt;hasChildren()) {
                foreach($node-&gt;child as $child) {
                        _callBackGetNode($child,$type,$uri);
                }
        }
}
function getHtml($url,$type='a') {
   $getUrl=parse_url($url);
   $html=tidy_parse_string(file_get_contents($url));
   return getNodes($html-&gt;html(),$type,$getUrl);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/326/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>/usr/bin/ld: cannot find -lltdl php安装错误，libmcrypt编译问题</title>
		<link>http://blog.fabrichina.net/archives/323</link>
		<comments>http://blog.fabrichina.net/archives/323#comments</comments>
		<pubDate>Sun, 25 Jul 2010 06:47:25 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=323</guid>
		<description><![CDATA[/usr/bin/ld: cannot find -lltdl /usr/bin/ld: cannot find -lltdl 安装php make的时候提示如下出错信息： /usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [libphp5.la] Error 1 解决方法：这是因为找不到：   libltdl库文件 ldconfig -p &#124;grep ltdl #/software/libmcrypt-2.5.8/libltdl #./configure  –enable-ltdl-install #make #make install 以下是原文： Then I visited http://mcrypt.hellug.gr/mcrypt/index.html an learned that I have to install not only libmcrypt but also mcrypt [...]]]></description>
			<content:encoded><![CDATA[<h3>/usr/bin/ld: cannot find -lltdl</h3>
<div>
<p>/usr/bin/ld: cannot find -lltdl<br />
安装php make的时候提示如下出错信息：<br />
/usr/bin/ld: cannot find -lltdl<br />
collect2: ld returned 1 exit status<br />
make: *** [libphp5.la] Error 1<br />
解决方法：这是因为找不到：   libltdl库文件</p>
<p>ldconfig -p |grep ltdl<br />
#/software/libmcrypt-2.5.8/libltdl<br />
#./configure  –enable-ltdl-install<br />
#make<br />
#make install<br />
以下是原文：<br />
Then I visited<br />
<a href="http://mcrypt.hellug.gr/mcrypt/index.html">http://mcrypt.hellug.gr/mcrypt/index.html</a><br />
an learned that I have to install not only libmcrypt<br />
but also mcrypt and libmhash.<br />
Here is the to do:<br />
libmcrytp:<br />
———–<br />
download libmcrypt-xxx.tar.gz<br />
create the following directory:  / usr / local / libmcrypt<br />
copy the libmcrypt-xxx.tar.gz into that directory and move to it<br />
run the following shell (&gt;) commands:  (‘xxx’ is the version number)<br />
&gt; gunzip -c libmcrypt-xxx.tar.gz | tar xf -<br />
&gt; cd libmcrypt-xxx<br />
&gt; ./configure –disable-posix-threads<br />
&gt; make<br />
&gt; make check  (note:  ‘make check’ is optional)<br />
&gt; make install<br />
then (update your environment) add in / etc / profile the following path:<br />
/usr/local/libmcrypt/libmcrypt-xxxx<br />
(note:  as I run Red Hat 7.3 I  set the line   a f t e r   the if-part<br />
(id -u = 0 …) with: pathmunge /usr/local / libm….)<br />
and add in / etc / ld.so.conf the following path:  /usr/local/lib<br />
then run ldconfig:<br />
&gt; ldconfig<br />
now comes the important part:<br />
&gt; cd /usr/local/libmcrypt/libmcrypt-xxx/libltdl<br />
&gt; ./configure –enable-ltdl-install<br />
&gt; make<br />
&gt; make install<br />
(maybe not needed:  I also added a link in / usr / bin: )<br />
(&gt; cd /usr/bin)<br />
(&gt; ln -s /usr/lib/libltdl.so.3.1.0 ltdl)</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/323/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux一些常用指令</title>
		<link>http://blog.fabrichina.net/archives/319</link>
		<comments>http://blog.fabrichina.net/archives/319#comments</comments>
		<pubDate>Fri, 23 Jul 2010 09:04:22 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=319</guid>
		<description><![CDATA[1.按内存从大到小排列进程: ps -eo &#8220;%C : %p : %z : %a&#8221;&#124;sort -k5 -nr 2.查看当前有哪些进程；查看进程打开的文件: ps -A ；lsof -p PID 3.获取当前IP地址（从中学习grep,awk,cut的作用） ifconfig eth0 &#124;grep &#8220;inet addr:&#8221; &#124;awk &#8216;{print $2}&#8217;&#124;cut -c 6- 4.统计每个单词出现的频率，并排序 awk &#8216;{arr[$1]+=1 }END{for(i in arr){print arr&#8221;\t&#8221;i}}&#8217; 文件名 &#124; sort -rn 5.显示10条最常用的命令 sed -e &#8220;s/&#124; /\n/g&#8221; ~/.bash_history &#124; cut -d &#8216; &#8216; -f 1 &#124; sort [...]]]></description>
			<content:encoded><![CDATA[<p>1.按内存从大到小排列进程:<br />
ps -eo &#8220;%C : %p : %z : %a&#8221;|sort -k5 -nr</p>
<p>2.查看当前有哪些进程；查看进程打开的文件:<br />
ps -A ；lsof -p PID</p>
<p>3.获取当前IP地址（从中学习grep,awk,cut的作用）<br />
ifconfig eth0 |grep &#8220;inet addr:&#8221; |awk &#8216;{print $2}&#8217;|cut -c 6-</p>
<p>4.统计每个单词出现的频率，并排序<br />
awk &#8216;{arr[$1]+=1 }END{for(i in arr){print arr&#8221;\t&#8221;i}}&#8217; 文件名 | sort -rn</p>
<p>5.显示10条最常用的命令<br />
sed -e &#8220;s/| /\n/g&#8221; ~/.bash_history | cut -d &#8216; &#8216; -f 1 | sort | uniq -c | sort -nr | head<span id="more-319"></span></p>
<p>6.杀死Nginx进程(杀死某一进程)<br />
ps -ef|grep -v grep |grep nginx|awk &#8216;{print $2}&#8217; 或<br />
for i in `ps aux | grep nginx | grep -v grep | awk {&#8216;print $2&#8242;}` ; do kill $i; done</p>
<p>7.列出当前文件夹目录大小，以G，M，K显示。<br />
du -b &#8211;max-depth 1 | sort -nr | perl -pe &#8216;s{([0-9]+)}{sprintf&#8221;%.1f%s&#8221;, $1&gt;=2**30? ($1/2**30, &#8220;G&#8221;): $1&gt;=2**20? ($1/2**20, &#8220;M&#8221;):$1&gt;=2**10? ($1/2**10, &#8220;K&#8221;): ($1, &#8220;&#8221;)}e&#8217;</p>
<p>shaw答案 ：du -hs $(du -sk ./`ls -F |grep /` |sort -nr |awk &#8216;{print $NF}&#8217;)<br />
也可 以实现，不过不是特别完美。但好记。</p>
<p>8.清空linux buffer cache<br />
sync &amp;&amp; echo 3 &gt; /proc/sys/vm/drop_caches</p>
<p>9.将当前目录文件名全部转换成小写<br />
for i in *; do mv &#8220;$i&#8221; &#8220;$(echo $i|tr A-Z a-z)&#8221;; done</p>
<p>10.消除vim中的^M的几种方法<br />
1)dos2uninx filename<br />
2)sed -e &#8216;s/^M//&#8217; filename<br />
3)vim中 :s/^M//gc<br />
4)col -bx &lt; dosfile &gt; newfile<br />
5)tr -s &#8220;\r\n&#8221; &#8220;\n&#8221; &lt; file &gt; newfile</p>
<p>11. 清除所有arp缓存<br />
arp -n|awk &#8216;/^[1-9]/ {print &#8220;arp -d &#8220;$1}&#8217;|sh</p>
<p>12. 绑定已知机器的arp地址<br />
cat /proc/net/arp | awk &#8216;{print $1 &#8221; &#8221; $4}&#8217; |sort -t. -n +3 -4 &gt; /etc/ethers</p>
<p>补perl的可以不？</p>
<p>13. perl -ne &#8216;m/^([^#][^\s=]+)\s*(=.*|)/ &amp;&amp; printf(&#8220;%-35s%s\n&#8221;, $1, $2)&#8217; /etc</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/319/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>varnish 2.x启动指令和配置</title>
		<link>http://blog.fabrichina.net/archives/315</link>
		<comments>http://blog.fabrichina.net/archives/315#comments</comments>
		<pubDate>Fri, 23 Jul 2010 06:37:23 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=315</guid>
		<description><![CDATA[Varnish 2.0.3 has just been released. This release contains multiple changes, amongst them: Support for backend timeouts Multiple fixes in how we process ESI restart in vcl_hit is now supported Documentation has been updated Expiry processing is now more scalable The default session workspace is now 16k instead of 8k More graceful handling of too [...]]]></description>
			<content:encoded><![CDATA[<p>Varnish 2.0.3 has just been released. This release contains multiple changes, amongst them:</p>
<ul>
<li>Support for backend timeouts</li>
<li>Multiple fixes in how we process ESI</li>
<li><tt>restart</tt> in vcl_hit is now supported</li>
<li>Documentation has been updated</li>
<li>Expiry processing is now more scalable</li>
<li>The default session workspace is now 16k instead of 8k</li>
<li>More graceful handling of too many headers from the client or the server.</li>
<li>More expressive purges</li>
</ul>
<p>之前一直使用的还是2.0的一个trunk的R2860版本，因为只有这个版本我从1.1.2升级上来以后没有慢的问题⊙﹏⊙。但是看着新版却一直不能用，实在是让人心里痒。于是抱着死磕到底的态度，在检查了n+1遍配置文件和修改启动参数重启了n+1遍Varnish以后终于找到了问题的所在，即启动参数的-w这个上面。那么这个参数是干什么用的呢？</p>
<p>    -w int[,int[,int]]           # Number of worker threads<br />
                                 #   -w &lt;fixed_count&gt;<br />
                                 #   -w min,max<br />
                                 #   -w min,max,timeout [default: -w2,500,300]</p>
<p>可以看出这个参数是控制每个进程的线程数的，1.1.2版本的时候这个参数我配置的是-w30000,51200,10，貌似到了2.0版以后这个最小启动的线程数不能设定过大，于是在进行了几次调试以后最终将参数定为了-w5,51200,30</p>
<p><strong>软件列表</strong><br />
pcre-8.02.tar.gz<br />
varnish-2.1.tar.gz</p>
<p><strong>软件存放位置</strong><br />
/data/software</p>
<p><strong>安装过程</strong><br />
# /usr/sbin/groupadd www -g 48<br />
# /usr/sbin/useradd -u 48 -g www www<br />
# mkdir -p /data/vcache<br />
# chmod +w /data/vcache<br />
# chown -R www:www /data/vcache<br />
# mkdir -p /var/log/varnish<br />
# chmod +w /var/log/varnish<br />
# chown -R www:www /var/log/varnish<br />
# cd /data/software/pkg<br />
# tar zxvf ../pcre-8.02.tar.gz<br />
# cd pcre-8.02<br />
# ./configure<br />
# make &amp;&amp; make install<br />
# cd ..<br />
# tar zxvf ../varnish-2.1.tar.gz<br />
# cd varnish-2.1<br />
# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig<br />
# ./configure &#8211;prefix=/usr/local/varnish<br />
# make &amp;&amp; make install</p>
<p><strong>编辑Varnish配置文件</strong><br />
# vi /usr/local/varnish/vcl.conf</p>
<p>backend webserver {<br />
       set backend.host = &#8220;10.10.10.8&#8243;;<br />
       set backend.port = &#8220;80&#8243;;<br />
}</p>
<p>acl purge {<br />
       &#8220;localhost&#8221;;<br />
       &#8220;127.0.0.1&#8243;;<br />
       &#8220;10.10.10.0&#8243;/24;<br />
}</p>
<p>sub vcl_recv {<br />
        remove req.http.X-Forwarded-For;<br />
        set    req.http.X-Forwarded-For = client.ip;<br />
        if (req.request == &#8220;PURGE&#8221;) {<br />
               if (!client.ip ~ purge) {<br />
                       error 405 &#8220;Not allowed.&#8221;;<br />
               }<br />
               lookup;<br />
       }</p>
<p>       if (req.http.host ~ &#8220;(a|b|c).test.com&#8221;) {<br />
               set req.backend = webserver;<br />
              if (req.url ~ &#8220;\.(png|gif|jpg|swf|css|js)$&#8221;) {<br />
                       lookup;<br />
        }<br />
               else {<br />
                       pass;<br />
               }<br />
       }</p>
<p>       else {<br />
               error 404 &#8220;Test Cache Server&#8221;;<br />
               pipe;<br />
       }<br />
}</p>
<p>sub vcl_hash {<br />
    set req.hash += req.url;<br />
    if (req.http.host) {<br />
        set req.hash += req.http.host;<br />
    } else {<br />
        set req.hash += server.ip;<br />
    }<br />
    hash;<br />
}</p>
<p>sub vcl_pipe {<br />
        set req.http.connection = &#8220;close&#8221;;<br />
        #pipe;<br />
}</p>
<p>sub vcl_hit {<br />
        if (!obj.cacheable) {<br />
                pass;<br />
        }<br />
       if (req.request == &#8220;PURGE&#8221;) {<br />
               set obj.ttl = 0s;<br />
               error 200 &#8220;Purged.&#8221;;<br />
       }<br />
        deliver;<br />
}</p>
<p>sub vcl_miss {<br />
       if (req.request == &#8220;PURGE&#8221;) {<br />
               error 404 &#8220;Not in cache.&#8221;;<br />
       }<br />
}</p>
<p>sub vcl_fetch {<br />
               set obj.ttl = 180s;<br />
               #set    obj.http.X-Varnish-IP = server.ip;<br />
               set    obj.http.Varnish = &#8220;Tested by Kevin&#8221;;<br />
}</p>
<p><strong>启动Varnish</strong><br />
# /usr/local/varnish/sbin/varnishd -n /data/vcache -f /usr/local/varnish/etc/varnish/default.vcl -a 10.10.10.8:80 -s file,/data/vcache/varnish_cache.data,50G -u www -w2,65536,60 -T 127.0.0.1:3600 -p thread_pool_min=200 -p thread_pool_max=4000 -p thread_pools=4 -p thread_pool_add_delay=2 -p listen_depth=4096 -p lru_interval=20</p>
<p><strong>启动日志记录</strong><br />
#/usr/local/varnish/bin/varnishncsa -n /data/vcache -w /var/log/varnish/varnish.log &amp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/315/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php-fpm vs nginx vs unix socket</title>
		<link>http://blog.fabrichina.net/archives/312</link>
		<comments>http://blog.fabrichina.net/archives/312#comments</comments>
		<pubDate>Wed, 21 Jul 2010 02:57:58 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=312</guid>
		<description><![CDATA[nginx修改 fastcgi_pass unix:/tmp/nginx.socket; php-fpm.conf修改 listen = /tmp/nginx.socket 重启php-fpm 重启nginx 搞定。。不过不知道能有多大改善。。难说。。。。]]></description>
			<content:encoded><![CDATA[<p>nginx修改<br />
fastcgi_pass unix:/tmp/nginx.socket;</p>
<p>php-fpm.conf修改<br />
listen = /tmp/nginx.socket<br />
重启php-fpm 重启nginx 搞定。。不过不知道能有多大改善。。难说。。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/312/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php-fpm vs php 5.3+ 启动指令</title>
		<link>http://blog.fabrichina.net/archives/309</link>
		<comments>http://blog.fabrichina.net/archives/309#comments</comments>
		<pubDate>Wed, 21 Jul 2010 02:38:00 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=309</guid>
		<description><![CDATA[php-5.3.2/sapi/fpm/init.d.php-fpm 这个东西在源始代码里面，copy出来用就可以了，这个脚本可以start stop reload fpm就和5.2+的那个脚本一样了！]]></description>
			<content:encoded><![CDATA[<p>php-5.3.2/sapi/fpm/init.d.php-fpm</p>
<p>这个东西在源始代码里面，copy出来用就可以了，这个脚本可以start stop reload fpm就和5.2+的那个脚本一样了！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/309/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>编译php-fpm cgi模式</title>
		<link>http://blog.fabrichina.net/archives/307</link>
		<comments>http://blog.fabrichina.net/archives/307#comments</comments>
		<pubDate>Tue, 20 Jul 2010 10:56:26 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=307</guid>
		<description><![CDATA[./configure &#8211;prefix=/usr/local/php &#8211;with-mysqli=/usr/local/mysql/bin/mysql_config &#8211;with-mysql=/usr/local/mysql &#8211;with-config-file-path=/usr/local/php/etc &#8211;with-curl &#8211;with-zlib &#8211;enable-ftp  &#8211;with-mcrypt &#8211;enable-inline-optimization &#8211;disable-debug &#8211;with-gd &#8211;enable-gd-native-ttf &#8211;enable-gd-jis-conv &#8211;with-iconv-dir=/usr/local &#8211;with-freetype-dir=/usr/local/lib/freetype &#8211;with-jpeg-dir=/usr/local &#8211;with-png-dir=/usr/local &#8211;with-zlib &#8211;with-libxml-dir=/usr/local/lib/libxml &#8211;enable-xml &#8211;enable-exif &#8211;enable-soap &#8211;enable-zip &#8211;with-openssl &#8211;enable-mbstring &#8211;with-mhash &#8211;with-tidy &#8211;enable-fastcgi &#8211;enable-fpm &#8211;enable-force-cgi-redirect &#8211;enable-mbstring make ZEND_EXTRA_LIBS=&#8217;-liconv&#8217; make install]]></description>
			<content:encoded><![CDATA[<p>./configure &#8211;prefix=/usr/local/php &#8211;with-mysqli=/usr/local/mysql/bin/mysql_config &#8211;with-mysql=/usr/local/mysql &#8211;with-config-file-path=/usr/local/php/etc &#8211;with-curl &#8211;with-zlib &#8211;enable-ftp  &#8211;with-mcrypt &#8211;enable-inline-optimization &#8211;disable-debug &#8211;with-gd &#8211;enable-gd-native-ttf &#8211;enable-gd-jis-conv &#8211;with-iconv-dir=/usr/local &#8211;with-freetype-dir=/usr/local/lib/freetype &#8211;with-jpeg-dir=/usr/local &#8211;with-png-dir=/usr/local &#8211;with-zlib &#8211;with-libxml-dir=/usr/local/lib/libxml &#8211;enable-xml &#8211;enable-exif &#8211;enable-soap &#8211;enable-zip &#8211;with-openssl &#8211;enable-mbstring &#8211;with-mhash &#8211;with-tidy &#8211;enable-fastcgi &#8211;enable-fpm &#8211;enable-force-cgi-redirect &#8211;enable-mbstring</p>
<p>make ZEND_EXTRA_LIBS=&#8217;-liconv&#8217;</p>
<p>make install</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/307/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>libtidy 安装</title>
		<link>http://blog.fabrichina.net/archives/304</link>
		<comments>http://blog.fabrichina.net/archives/304#comments</comments>
		<pubDate>Tue, 20 Jul 2010 09:12:41 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=304</guid>
		<description><![CDATA[wget http://tidy.sourceforge.net/src/old/tidy_src_051026.tgz gunzip tidy-xxxx.tgz tar -xvf tidy-xxxx.tar cd tidy sh build/gnuauto/setup.sh 按照提示装就行了！]]></description>
			<content:encoded><![CDATA[<li>wget <a href="http://tidy.sourceforge.net/src/old/tidy_src_051026.tgz" target="_top">http://tidy.sourceforge.net/src/old/tidy_src_051026.tgz</a></li>
<li>gunzip tidy-xxxx.tgz</li>
<li>tar -xvf tidy-xxxx.tar</li>
<li>cd tidy</li>
<li>sh build/gnuauto/setup.sh</li>
<p>按照提示装就行了！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/304/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Squid3.0与2.7的配置差异</title>
		<link>http://blog.fabrichina.net/archives/300</link>
		<comments>http://blog.fabrichina.net/archives/300#comments</comments>
		<pubDate>Tue, 20 Jul 2010 02:51:20 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=300</guid>
		<description><![CDATA[Squid3.0最重要的新特性: Code converted to C++, with significant internal restructuring and rewrites. ICAP implementation (RFC 3507 and www.icap-forum.org) Edge Side Includes (ESI) implementation (www.esi.org) 更多的请参考官方说明 来说说配置方法的不同之处（只说我自己实际使用的） ./configure的配置项 ./configure &#8211;prefix=/usr/local/squid &#8211;with-large-files &#8211;enable-useragent-log &#8211;enable-referer-log &#8211;enable-linux-netfilter &#8211;enable-x-accelerator-vary &#8211;disable-internal-dns &#8211;disable-mempools &#8211;with-maxfd=65535 3.0版本去掉了以下选项: &#8211;enable-dlmalloc    不再需要 &#8211;enable-epoll    系统会自己选择最优的I/O Loop Method &#8211;enable-truncate     不再需要 &#8211;enable-follow-x-forwarded-for    没有此项配置了 增加了以下选项: &#8211;disable-mempools    相当于2.7配置文件里面的memory_pools off，适合内存使用较大的情况，系统会调用free()来清除没用到的缓存内存 &#8211;with-maxfd=65535    相当于ulimit -n [...]]]></description>
			<content:encoded><![CDATA[<div>
<h2>Squid3.0最重要的新特性:</h2>
</div>
<div>
<ul>
<li>Code converted to C++, with significant internal restructuring and rewrites.</li>
<li>ICAP implementation (RFC 3507 and www.icap-forum.org)</li>
<li>Edge Side Includes (ESI) implementation (www.esi.org)</li>
</ul>
<p>更多的请参考<strong><a title="官方说明" href="http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE14-RELEASENOTES.html" target="_blank">官方说明</a></strong></p>
<p>来说说配置方法的不同之处（只说我自己实际使用的）</p>
<p><strong>./configure的配置项</strong></p>
<p>./configure &#8211;prefix=/usr/local/squid &#8211;with-large-files &#8211;enable-useragent-log &#8211;enable-referer-log &#8211;enable-linux-netfilter &#8211;enable-x-accelerator-vary &#8211;disable-internal-dns &#8211;disable-mempools &#8211;with-maxfd=65535</p>
<p>3.0版本去掉了以下选项:</p>
<p>&#8211;enable-dlmalloc    不再需要<span id="more-300"></span></p>
<p>&#8211;enable-epoll    系统会自己选择最优的I/O Loop Method</p>
<p>&#8211;enable-truncate     不再需要</p>
<p>&#8211;enable-follow-x-forwarded-for    没有此项配置了</p>
<p>增加了以下选项:</p>
<p>&#8211;disable-mempools    相当于2.7配置文件里面的memory_pools off，适合内存使用较大的情况，系统会调用free()来清除没用到的缓存内存</p>
<p>&#8211;with-maxfd=65535    相当于ulimit -n 65535，2.7配置文件里面的max_filedescriptors 65535</p>
<p><strong>配置文件（squid.conf）差别</strong></p>
<p>在Squid3.0版本的配置文件中，如下主要tag发生了变化</p>
<p>acl    去掉了对src为all的定义，已集成；对protocol的定义简写为proto</p>
<p>http_port     去掉了选项http11和act_as_origin；增加了类型http_status</p>
<p>cache_peer    去掉了选项http11</p>
<p>header_access    删除了此tag，以request_header_access和reply_header_access取代</p>
<p>server_http11    删除了此tag</p>
<p>incoming_rate    删除了此tag</p>
<p>memory_pools    删除了此tag，在./configure的时候实现</p>
<p>max_filedescriptors    删除了此tag，在./configure的时候实现</p>
<p>上面只列出了我自己实际配置Squid时，3.0版本和2.7版本的不同之处，关于更多的大家可以参考官方文档。</p>
<p><strong>参考文档</strong></p>
<p><a title="http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE14-RELEASENOTES.html" href="http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE14-RELEASENOTES.html" target="_blank"><strong>http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE14-RELEASENOTES.html</strong></a></p>
<h3>Squid3.0配置参考</h3>
<p>编译参数:<br />
[url=http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE15.tar.gz]http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE15.tar.gz[/url]</p>
<p>[color=Blue]./configure &#8211;prefix=/usr/local/squid3 \<br />
&#8211;enable-debug-cbdata \<br />
&#8211;enable-async-io=100 \<br />
&#8211;with-pthreads \<br />
&#8211;enable-storeio=&#8221;aufs,diskd,ufs&#8221; \<br />
&#8211;enable-removal-policies=&#8221;heap,lru&#8221; \<br />
&#8211;enable-icmp \<br />
&#8211;enable-delay-pools \<br />
&#8211;enable-useragent-log \<br />
&#8211;enable-referer-log \<br />
&#8211;enable-kill-parent-hack \<br />
&#8211;enable-arp-acl \<br />
&#8211;enable-default-err-language=Simplify_Chinese \<br />
&#8211;enable-err-languages=&#8221;Simplify_Chinese English&#8221; \<br />
&#8211;disable-poll \<br />
&#8211;disable-wccp \<br />
&#8211;disable-wccpv2 \<br />
&#8211;disable-ident-lookups \<br />
&#8211;disable-internal-dns \<br />
&#8211;enable-basic-auth-helpers=&#8221;NCSA&#8221; \<br />
&#8211;enable-stacktrace \<br />
&#8211;with-large-files \<br />
&#8211;disable-mempools \<br />
&#8211;with-filedescriptors=65535 \<br />
&#8211;enable-ssl \<br />
&#8211;enable-x-accelerator-var<br />
make<br />
make install[/color]</p>
<p>贴一个我在线上运行的配置供大家参考：）有不足之处欢迎指正。<br />
#accel listen port<br />
[b]http_port 80 accel vhost vport[/b]<br />
#accel domain<br />
[b]cache_peer 211.100.72.109 parent 80 0 no-query originserver no-digest name=www[/b]<br />
[b]cache_peer_domain www .linuxtone.com .linuxtone.com.cn .linuxtone.net .linuxtone.cn .linuxtone.org[/b]</p>
<p>#acl<br />
acl manager proto cache_object<br />
acl localhost src 127.0.0.1/255.255.255.255<br />
acl SSL_ports port 443 563<br />
acl Safe_ports port 80       # http<br />
acl Safe_ports port 8080<br />
acl LanSrc src 211.100.72.0/24<br />
acl LanDst dst 211.100.72.0/24<br />
[b]acl LanDstDM dstdomain .linuxtone.com .linuxtone.com.cn .linuxtone.net .linuxtone.cn .linuxtone.org[/b]</p>
<p>acl CONNECT method CONNECT<br />
http_access allow manager localhost<br />
http_access deny manager<br />
http_access deny !Safe_ports<br />
http_access deny CONNECT !SSL_ports<br />
http_access allow LanSrc<br />
http_access allow LanDst<br />
http_access allow LanDstDM<br />
http_access deny   all</p>
<p>#base<br />
visible_hostname www-cache2.linuxtone.com<br />
cache_mgr [email]cache@linuxtone.org[/email]<br />
cache_effective_user squid<br />
cache_effective_group squid</p>
<p>error_directory /usr/local/squid3/share/errors/Simplify_Chinese<br />
icon_directory /usr/local/squid3/share/icons<br />
mime_table /usr/local/squid3/etc/mime.conf</p>
<p>cache_replacement_policy lru<br />
#cache_dir<br />
cache_dir aufs /data/cache1 32768 64 64<br />
cache_dir aufs /data/cache2 32768 64 64<br />
cache_mem 2048 MB<br />
max_open_disk_fds 0<br />
#maximum_object_size 512 KB<br />
#maximum_object_size_in_memory 256 KB<br />
maximum_object_size 20 MB<br />
maximum_object_size_in_memory 8 MB</p>
<p>#keepalived<br />
client_persistent_connections off<br />
server_persistent_connections on<br />
#persistent_request_timeout 60 seconds</p>
<p>#memory_pools on<br />
#memory_pools_limit 64 MB</p>
<p>forwarded_for on<br />
log_icp_queries off</p>
<p>via off<br />
httpd_suppress_version_string off</p>
<p>ie_refresh off<br />
tcp_recv_bufsize 32 KB</p>
<p>#acl webservices rep_header Server -i ^linuxtoneWS ^Apache ^nginx<br />
#broken_vary_encoding allow webservices</p>
<p>#hidden the squid3 header<br />
#reply_header_access Server deny all<br />
#reply_header_access X-Cache deny all<br />
#reply_header_access Warning deny all<br />
#reply_header_access Expires deny all<br />
#reply_header_access Cache-Control deny all<br />
#reply_header_access age deny all<br />
#reply_header_access All deny all</p>
<p>ipcache_size 1024<br />
ipcache_low 90<br />
ipcache_high 95</p>
<p>memory_replacement_policy lru</p>
<p>hosts_file /etc/hosts<br />
request_header_max_size 128 KB</p>
<p>#deny cache<br />
hierarchy_stoplist cgi-bin ? \.php<br />
acl QUERY urlpath_regex cgi-bin\? \.php<br />
acl DIRECT url_regex -i ^http:\/\/www\.linuxtone\.com\/$<br />
acl DIRECT url_regex -i ^http:\/\/photo\.linuxtone\.com\/.*$<br />
acl DIRECT url_regex -i ^http:\/\/www\.linuxtone\.com\/index\.html$<br />
cache deny QUERY<br />
cache deny DIRECT</p>
<p>#request_body_max_size 0 KB</p>
<p>refresh_pattern ^ftp:           60      20%     10080<br />
refresh_pattern ^gopher:        60      0%      1440<br />
refresh_pattern .               0       20%     1440<br />
refresh_pattern -i \.css$       360    50%     2880    reload-into-ims<br />
refresh_pattern -i \.js$        1440    50%     2880    reload-into-ims<br />
refresh_pattern -i \.html$        720   50%     1440    reload-into-ims<br />
refresh_pattern -i \.jpg$       1440    90%     2880    ignore-reload<br />
refresh_pattern -i \.gif$       1440    90%     2880    ignore-reload<br />
refresh_pattern -i \.swf$       1440    90%     2880    ignore-reload<br />
refresh_pattern -i \.jpg$       1440      50%     2880    ignore-reload<br />
refresh_pattern -i \.png$       1440      50%     2880      ignore-reload  <br />
refresh_pattern -i \.bmp$       1440      50%     2880      ignore-reload</p>
<p>refresh_pattern -i \.doc$ 1440    50%     2880      ignore-reload<br />
refresh_pattern -i \.ppt$ 1440    50%     2880      ignore-reload<br />
refresh_pattern -i \.xls$ 1440    50%     2880      ignore-reload<br />
refresh_pattern -i \.pdf$ 1440    50%     2880      ignore-reload<br />
refresh_pattern -i \.rar$       1440    50%     2880      ignore-reload<br />
refresh_pattern -i \.zip$ 1440    50%     2880      ignore-reload<br />
refresh_pattern -i \.txt$ 1440    50%     2880      ignore-reload</p>
<p>quick_abort_min 20 KB<br />
quick_abort_max 20 KB<br />
quick_abort_pct 95</p>
<p>connect_timeout 1 minute<br />
negative_ttl 0 minutes<br />
read_timeout 30 seconds<br />
pconn_timeout 120 seconds<br />
shutdown_lifetime 5 seconds<br />
strip_query_terms off</p>
<p>#snmp<br />
#snmp_port 3401<br />
#acl snmppublic snmp_orgmunity snsimg<br />
#snmp_access allow snmppublic localhost<br />
#snmp_access deny all</p>
<p>icp_port 0</p>
<p># logfile<br />
emulate_httpd_log on<br />
#logformat combined %{X-Forwarded-For}&gt;h %ui %un [%tl] &#8220;%rm %ru HTTP/%rv&#8221; %Hs %&lt;st &#8220;%{Referer}&gt;h&#8221; &#8220;%{User-Agent}&gt;h&#8221; %Ss:%Sh<br />
#access_log none<br />
#access_log /data/logs/access.log combined<br />
logformat squid  %ts.%03tu %6tr %&gt;a %Ss/%03Hs %&lt;st %rm %ru %un %Sh/%&lt;A %mt<br />
access_log /data/logs/access.log squid<br />
#cache_store_log /var/log/squid3/store.log<br />
cache_store_log /dev/null<br />
cache_log /data/logs/cache.log<br />
logfile_rotate 12</p>
<p># MISCELLANEOUS<br />
store_objects_per_bucket 15<br />
client_db off<span id="_marker"> </span></p>
<h3>Squid3.0配置参考</h3>
<p>编译参数:<br />
[url=http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE15.tar.gz]http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE15.tar.gz[/url]</p>
<p>[color=Blue]./configure &#8211;prefix=/usr/local/squid3 \<br />
&#8211;enable-debug-cbdata \<br />
&#8211;enable-async-io=100 \<br />
&#8211;with-pthreads \<br />
&#8211;enable-storeio=&#8221;aufs,diskd,ufs&#8221; \<br />
&#8211;enable-removal-policies=&#8221;heap,lru&#8221; \<br />
&#8211;enable-icmp \<br />
&#8211;enable-delay-pools \<br />
&#8211;enable-useragent-log \<br />
&#8211;enable-referer-log \<br />
&#8211;enable-kill-parent-hack \<br />
&#8211;enable-arp-acl \<br />
&#8211;enable-default-err-language=Simplify_Chinese \<br />
&#8211;enable-err-languages=&#8221;Simplify_Chinese English&#8221; \<br />
&#8211;disable-poll \<br />
&#8211;disable-wccp \<br />
&#8211;disable-wccpv2 \<br />
&#8211;disable-ident-lookups \<br />
&#8211;disable-internal-dns \<br />
&#8211;enable-basic-auth-helpers=&#8221;NCSA&#8221; \<br />
&#8211;enable-stacktrace \<br />
&#8211;with-large-files \<br />
&#8211;disable-mempools \<br />
&#8211;with-filedescriptors=65535 \<br />
&#8211;enable-ssl \<br />
&#8211;enable-x-accelerator-var<br />
make<br />
make install[/color]</p>
<p>贴一个我在线上运行的配置供大家参考：）有不足之处欢迎指正。<br />
#accel listen port<br />
[b]http_port 80 accel vhost vport[/b]<br />
#accel domain<br />
[b]cache_peer 211.100.72.109 parent 80 0 no-query originserver no-digest name=www[/b]<br />
[b]cache_peer_domain www .linuxtone.com .linuxtone.com.cn .linuxtone.net .linuxtone.cn .linuxtone.org[/b]</p>
<p>#acl<br />
acl manager proto cache_object<br />
acl localhost src 127.0.0.1/255.255.255.255<br />
acl SSL_ports port 443 563<br />
acl Safe_ports port 80       # http<br />
acl Safe_ports port 8080<br />
acl LanSrc src 211.100.72.0/24<br />
acl LanDst dst 211.100.72.0/24<br />
[b]acl LanDstDM dstdomain .linuxtone.com .linuxtone.com.cn .linuxtone.net .linuxtone.cn .linuxtone.org[/b]</p>
<p>acl CONNECT method CONNECT<br />
http_access allow manager localhost<br />
http_access deny manager<br />
http_access deny !Safe_ports<br />
http_access deny CONNECT !SSL_ports<br />
http_access allow LanSrc<br />
http_access allow LanDst<br />
http_access allow LanDstDM<br />
http_access deny   all</p>
<p>#base<br />
visible_hostname www-cache2.linuxtone.com<br />
cache_mgr [email]cache@linuxtone.org[/email]<br />
cache_effective_user squid<br />
cache_effective_group squid</p>
<p>error_directory /usr/local/squid3/share/errors/Simplify_Chinese<br />
icon_directory /usr/local/squid3/share/icons<br />
mime_table /usr/local/squid3/etc/mime.conf</p>
<p>cache_replacement_policy lru<br />
#cache_dir<br />
cache_dir aufs /data/cache1 32768 64 64<br />
cache_dir aufs /data/cache2 32768 64 64<br />
cache_mem 2048 MB<br />
max_open_disk_fds 0<br />
#maximum_object_size 512 KB<br />
#maximum_object_size_in_memory 256 KB<br />
maximum_object_size 20 MB<br />
maximum_object_size_in_memory 8 MB</p>
<p>#keepalived<br />
client_persistent_connections off<br />
server_persistent_connections on<br />
#persistent_request_timeout 60 seconds</p>
<p>#memory_pools on<br />
#memory_pools_limit 64 MB</p>
<p>forwarded_for on<br />
log_icp_queries off</p>
<p>via off<br />
httpd_suppress_version_string off</p>
<p>ie_refresh off<br />
tcp_recv_bufsize 32 KB</p>
<p>#acl webservices rep_header Server -i ^linuxtoneWS ^Apache ^nginx<br />
#broken_vary_encoding allow webservices</p>
<p>#hidden the squid3 header<br />
#reply_header_access Server deny all<br />
#reply_header_access X-Cache deny all<br />
#reply_header_access Warning deny all<br />
#reply_header_access Expires deny all<br />
#reply_header_access Cache-Control deny all<br />
#reply_header_access age deny all<br />
#reply_header_access All deny all</p>
<p>ipcache_size 1024<br />
ipcache_low 90<br />
ipcache_high 95</p>
<p>memory_replacement_policy lru</p>
<p>hosts_file /etc/hosts<br />
request_header_max_size 128 KB</p>
<p>#deny cache<br />
hierarchy_stoplist cgi-bin ? \.php<br />
acl QUERY urlpath_regex cgi-bin\? \.php<br />
acl DIRECT url_regex -i ^http:\/\/www\.linuxtone\.com\/$<br />
acl DIRECT url_regex -i ^http:\/\/photo\.linuxtone\.com\/.*$<br />
acl DIRECT url_regex -i ^http:\/\/www\.linuxtone\.com\/index\.html$<br />
cache deny QUERY<br />
cache deny DIRECT</p>
<p>#request_body_max_size 0 KB</p>
<p>refresh_pattern ^ftp:           60      20%     10080<br />
refresh_pattern ^gopher:        60      0%      1440<br />
refresh_pattern .               0       20%     1440<br />
refresh_pattern -i \.css$       360    50%     2880    reload-into-ims<br />
refresh_pattern -i \.js$        1440    50%     2880    reload-into-ims<br />
refresh_pattern -i \.html$        720   50%     1440    reload-into-ims<br />
refresh_pattern -i \.jpg$       1440    90%     2880    ignore-reload<br />
refresh_pattern -i \.gif$       1440    90%     2880    ignore-reload<br />
refresh_pattern -i \.swf$       1440    90%     2880    ignore-reload<br />
refresh_pattern -i \.jpg$       1440      50%     2880    ignore-reload<br />
refresh_pattern -i \.png$       1440      50%     2880      ignore-reload  <br />
refresh_pattern -i \.bmp$       1440      50%     2880      ignore-reload</p>
<p>refresh_pattern -i \.doc$ 1440    50%     2880      ignore-reload<br />
refresh_pattern -i \.ppt$ 1440    50%     2880      ignore-reload<br />
refresh_pattern -i \.xls$ 1440    50%     2880      ignore-reload<br />
refresh_pattern -i \.pdf$ 1440    50%     2880      ignore-reload<br />
refresh_pattern -i \.rar$       1440    50%     2880      ignore-reload<br />
refresh_pattern -i \.zip$ 1440    50%     2880      ignore-reload<br />
refresh_pattern -i \.txt$ 1440    50%     2880      ignore-reload</p>
<p>quick_abort_min 20 KB<br />
quick_abort_max 20 KB<br />
quick_abort_pct 95</p>
<p>connect_timeout 1 minute<br />
negative_ttl 0 minutes<br />
read_timeout 30 seconds<br />
pconn_timeout 120 seconds<br />
shutdown_lifetime 5 seconds<br />
strip_query_terms off</p>
<p>#snmp<br />
#snmp_port 3401<br />
#acl snmppublic snmp_orgmunity snsimg<br />
#snmp_access allow snmppublic localhost<br />
#snmp_access deny all</p>
<p>icp_port 0</p>
<p># logfile<br />
emulate_httpd_log on<br />
#logformat combined %{X-Forwarded-For}&gt;h %ui %un [%tl] &#8220;%rm %ru HTTP/%rv&#8221; %Hs %&lt;st &#8220;%{Referer}&gt;h&#8221; &#8220;%{User-Agent}&gt;h&#8221; %Ss:%Sh<br />
#access_log none<br />
#access_log /data/logs/access.log combined<br />
logformat squid  %ts.%03tu %6tr %&gt;a %Ss/%03Hs %&lt;st %rm %ru %un %Sh/%&lt;A %mt<br />
access_log /data/logs/access.log squid<br />
#cache_store_log /var/log/squid3/store.log<br />
cache_store_log /dev/null<br />
cache_log /data/logs/cache.log<br />
logfile_rotate 12</p>
<p># MISCELLANEOUS<br />
store_objects_per_bucket 15<br />
client_db off</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/300/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何关闭Squid的Cache功能！</title>
		<link>http://blog.fabrichina.net/archives/298</link>
		<comments>http://blog.fabrichina.net/archives/298#comments</comments>
		<pubDate>Mon, 19 Jul 2010 14:53:48 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=298</guid>
		<description><![CDATA[1、编译的时候添加null的文件系统： &#8211;enable-storeio=null,(Others) 2、在squid.conf设置： cache_dir null /tmp]]></description>
			<content:encoded><![CDATA[<div>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td id="postmessage_4164688">1、编译的时候添加null的文件系统：<br />
&#8211;enable-storeio=null,(Others)</p>
<p>2、在squid.conf设置：<br />
cache_dir null /tmp</td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/298/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>squid 多ip配置</title>
		<link>http://blog.fabrichina.net/archives/295</link>
		<comments>http://blog.fabrichina.net/archives/295#comments</comments>
		<pubDate>Mon, 19 Jul 2010 14:48:32 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=295</guid>
		<description><![CDATA[if (! ($tokens[1] =~ "127.0.0.1")) { 11        push(@acls, "acl ip$count myip $tokens[1]\n"); 12        push(@tcps, "tcp_outgoing_address $tokens[1] ip$count\n"); 13        $count++; 14     } 看懂这个，打在squid.conf里面，就搞定了！！很简单]]></description>
			<content:encoded><![CDATA[<p><code>if</code> <code>(! ($tokens[1] =~ </code><code>"127.0.0.1"</code><code>)) { </code></p>
<div>
<table>
<tbody>
<tr>
<td><code>11</code></td>
<td><code>       </code><code>push(@acls, </code><code>"acl ip$count myip $tokens[1]\n"</code><code>); </code></td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td><code>12</code></td>
<td><code>       </code><code>push(@tcps, </code><code>"tcp_outgoing_address $tokens[1] ip$count\n"</code><code>); </code></td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td><code>13</code></td>
<td><code>       </code><code>$count++; </code></td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td><code>14</code></td>
<td><code>    </code><code>} </code></td>
</tr>
</tbody>
</table>
</div>
<p>看懂这个，打在squid.conf里面，就搞定了！！很简单</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/295/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于多ip路由的例子</title>
		<link>http://blog.fabrichina.net/archives/293</link>
		<comments>http://blog.fabrichina.net/archives/293#comments</comments>
		<pubDate>Mon, 19 Jul 2010 14:27:28 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=293</guid>
		<description><![CDATA[http://uddtm.com/os/linux/duoxianluyoucelue.php]]></description>
			<content:encoded><![CDATA[<p>http://uddtm.com/os/linux/duoxianluyoucelue.php</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/293/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在线的正则表达式检测</title>
		<link>http://blog.fabrichina.net/archives/290</link>
		<comments>http://blog.fabrichina.net/archives/290#comments</comments>
		<pubDate>Fri, 16 Jul 2010 06:03:17 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=290</guid>
		<description><![CDATA[http://www.regextester.com/]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.regextester.com/">http://www.regextester.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/290/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php webdav模块安装</title>
		<link>http://blog.fabrichina.net/archives/287</link>
		<comments>http://blog.fabrichina.net/archives/287#comments</comments>
		<pubDate>Tue, 13 Jul 2010 09:28:09 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=287</guid>
		<description><![CDATA[/root/soft/phpmodel/dav/dav.c:21:23: error: ne_socket.h: No such file or directory /root/soft/phpmodel/dav/dav.c:22:24: error: ne_session.h: No such file or directory /root/soft/phpmodel/dav/dav.c:23:22: error: ne_utils.h: No such file or directory /root/soft/phpmodel/dav/dav.c:24:21: error: ne_auth.h: No such file or directory /root/soft/phpmodel/dav/dav.c:25:22: error: ne_basic.h: No such file or directory /root/soft/phpmodel/dav/dav.c:26:20: error: ne_207.h: No such file or directory http://www.webdav.org/neon/ 需要这个lib]]></description>
			<content:encoded><![CDATA[<p>/root/soft/phpmodel/dav/dav.c:21:23: error: ne_socket.h: No such file or directory<br />
/root/soft/phpmodel/dav/dav.c:22:24: error: ne_session.h: No such file or directory<br />
/root/soft/phpmodel/dav/dav.c:23:22: error: ne_utils.h: No such file or directory<br />
/root/soft/phpmodel/dav/dav.c:24:21: error: ne_auth.h: No such file or directory<br />
/root/soft/phpmodel/dav/dav.c:25:22: error: ne_basic.h: No such file or directory<br />
/root/soft/phpmodel/dav/dav.c:26:20: error: ne_207.h: No such file or directory</p>
<p>http://www.webdav.org/neon/</p>
<p>需要这个lib</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/287/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>libmemcached 安装报错 解决</title>
		<link>http://blog.fabrichina.net/archives/285</link>
		<comments>http://blog.fabrichina.net/archives/285#comments</comments>
		<pubDate>Tue, 13 Jul 2010 09:13:31 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=285</guid>
		<description><![CDATA[clients/ms_conn.o: In function `ms_get_udp_request_id&#8217;: /root/soft/phpmodel/libmemcached-0.42/clients/ms_conn.c:194: undefined reference to `__sync_fetch_and_add_4&#8242; clients/ms_conn.o: In function `ms_reconn_socks&#8217;: /root/soft/phpmodel/libmemcached-0.42/clients/ms_conn.c:1051: undefined reference to `__sync_fetch_and_add_4&#8242; clients/ms_conn.o: In function `ms_reconn&#8217;: /root/soft/phpmodel/libmemcached-0.42/clients/ms_conn.c:919: undefined reference to `__sync_fetch_and_add_4&#8242; /root/soft/phpmodel/libmemcached-0.42/clients/ms_conn.c:956: undefined reference to `__sync_fetch_and_add_4&#8242; clients/ms_thread.o: In function `ms_setup_thread&#8217;: /root/soft/phpmodel/libmemcached-0.42/clients/ms_thread.c:225: undefined reference to `__sync_fetch_and_add_4&#8242; clients/ms_thread.o:/root/soft/phpmodel/libmemcached-0.42/clients/ms_thread.c:208: more undefined references to `__sync_fetch_and_add_4&#8242; follow collect2: ld returned 1 exit status make[2]: [...]]]></description>
			<content:encoded><![CDATA[<p>clients/ms_conn.o: In function `ms_get_udp_request_id&#8217;:<br />
/root/soft/phpmodel/libmemcached-0.42/clients/ms_conn.c:194: undefined reference to `__sync_fetch_and_add_4&#8242;<br />
clients/ms_conn.o: In function `ms_reconn_socks&#8217;:<br />
/root/soft/phpmodel/libmemcached-0.42/clients/ms_conn.c:1051: undefined reference to `__sync_fetch_and_add_4&#8242;<br />
clients/ms_conn.o: In function `ms_reconn&#8217;:<br />
/root/soft/phpmodel/libmemcached-0.42/clients/ms_conn.c:919: undefined reference to `__sync_fetch_and_add_4&#8242;<br />
/root/soft/phpmodel/libmemcached-0.42/clients/ms_conn.c:956: undefined reference to `__sync_fetch_and_add_4&#8242;<br />
clients/ms_thread.o: In function `ms_setup_thread&#8217;:<br />
/root/soft/phpmodel/libmemcached-0.42/clients/ms_thread.c:225: undefined reference to `__sync_fetch_and_add_4&#8242;<br />
clients/ms_thread.o:/root/soft/phpmodel/libmemcached-0.42/clients/ms_thread.c:208: more undefined references to `__sync_fetch_and_add_4&#8242; follow<br />
collect2: ld returned 1 exit status<br />
make[2]: *** [clients/memslap] Error 1<br />
make[2]: Leaving directory `/root/soft/phpmodel/libmemcached-0.42&#8242;<br />
make[1]: *** [all-recursive] Error 1<br />
make[1]: Leaving directory `/root/soft/phpmodel/libmemcached-0.42&#8242;<br />
make: *** [all] Error 2</p>
<p>用这个语句</p>
<p>./configure -disable-64bit CFLAGS=&#8221;-O3 -march=i686&#8243;</p>
<p>就可以了</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/285/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ss5架设</title>
		<link>http://blog.fabrichina.net/archives/281</link>
		<comments>http://blog.fabrichina.net/archives/281#comments</comments>
		<pubDate>Fri, 09 Jul 2010 07:56:09 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>
		<category><![CDATA[linux 服务器安装]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=281</guid>
		<description><![CDATA[yum -y install pam-devel openldap-devel cyrus-sasl-devel 需要BerkeleyDb openladap ss5.tar.gz.. 一个一个编译完毕以后，修改/etc/opt/ss5.conf auth    0.0.0.0/0               -              u permit u 0.0.0.0/0 &#8211; 0.0.0.0/0 &#8211; - ulimit &#8211; - 修改ss5.passwd文件加入 username password 添加ulimit 文件 ulimit里面写上username mv /usr/lib/ss5/mod_socks4.so /usr/lib/ss5/mod_socks4.so.bk 启动/etc/rc.d/init.d/ss5 restart]]></description>
			<content:encoded><![CDATA[<p>yum -y install pam-devel openldap-devel cyrus-sasl-devel</p>
<p>需要BerkeleyDb<br />
openladap<br />
ss5.tar.gz..</p>
<p>一个一个编译完毕以后，修改/etc/opt/ss5.conf<br />
auth    0.0.0.0/0               -              u<br />
permit u 0.0.0.0/0 &#8211; 0.0.0.0/0 &#8211; - ulimit &#8211; -<br />
修改ss5.passwd文件加入<br />
username password<br />
添加ulimit 文件<br />
ulimit里面写上username</p>
<p>mv /usr/lib/ss5/mod_socks4.so /usr/lib/ss5/mod_socks4.so.bk</p>
<p>启动/etc/rc.d/init.d/ss5 restart</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/281/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
