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

<channel>
	<title>Feng&#039;s Blog &#187; 服务器</title>
	<atom:link href="http://www.mzfeng.com/html/ytag/%e6%9c%8d%e5%8a%a1%e5%99%a8/feed" rel="self" type="application/rss+xml" />
	<link>http://www.mzfeng.com</link>
	<description>关注internet web windows linux 系统管理 服务器架构</description>
	<lastBuildDate>Mon, 06 Feb 2012 14:39:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>20步打造最安全的Nginx Web服务器</title>
		<link>http://www.mzfeng.com/html/y2012/341.html</link>
		<comments>http://www.mzfeng.com/html/y2012/341.html#comments</comments>
		<pubDate>Thu, 02 Feb 2012 00:36:43 +0000</pubDate>
		<dc:creator>mzfeng</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[安全]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.mzfeng.com/?p=341</guid>
		<description><![CDATA[Nginx是一个轻量级的，高性能的Web服务器以及反向代理和邮箱(IMAP/POP3)代理服务器。它运行在UNIX,GNU /linux,BSD 各种版本，Mac OS X,Solaris和Windows。根据调查统计，6%的网站使用Nginx Web服务器。Nginx是少数能处理C10K问题的服务器之一。跟传统的服务器不同，Nginx不依赖线程来处理请求。相反，它使用了更多的可扩展的事 件驱动（异步）架构。Nginx为一些高流量的网站提供动力，比如WordPress,人人网，腾讯，网易等。这篇文章主要是介绍如何提高运行在 Linux或UNIX系统的Nginx Web服务器的安全性。 默认配置文件和Nginx端口 /usr/local/nginx/conf/ – Nginx配置文件目录，/usr/local/nginx/conf/nginx.conf是主配置文件 /usr/local/nginx/html/ – 默认网站文件位置 /usr/local/nginx/logs/ – 默认日志文件位置 Nginx HTTP默认端口 : TCP 80 Nginx HTTPS默认端口: TCP 443 你可以使用以下命令来测试Nginx配置文件准确性。 /usr/local/nginx/sbin/nginx -t 将会输出。 the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok configuration file /usr/local/nginx/conf/nginx.conf test is successful 执行以下命令来重新加载配置文件。 /usr/local/nginx/sbin/nginx -s reload 执行以下命令来停止服务器。 /usr/local/nginx/sbin/nginx -s stop 一、配置SELinux 安全增强型Linux（SELinux）的是一个Linux内核的功能，它提供支持访问控制的安全政策保护机制。它可以大部分的攻击。下面我们来看如何启动基于centos/RHEL系统的SELinux。 [...]]]></description>
			<content:encoded><![CDATA[<div id="appShareTitle">Nginx是一个轻量级的，高性能的Web<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e6%9c%8d%e5%8a%a1%e5%99%a8" title="查看 服务器 中的全部文章" target="_blank">服务器</a></span>以及反向代理和邮箱(IMAP/POP3)代理<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e6%9c%8d%e5%8a%a1%e5%99%a8" title="查看 服务器 中的全部文章" target="_blank">服务器</a></span>。它运行在UNIX,GNU /linux,BSD 各种版本，Mac OS X,Solaris和Windows。根据调查统计，6%的网站使用Nginx Web服务器。Nginx是少数能处理C10K问题的服务器之一。跟传统的服务器不同，Nginx不依赖线程来处理请求。相反，它使用了更多的可扩展的事 件驱动（异步）架构。Nginx为一些高流量的网站提供动力，比如WordPress,人人网，腾讯，网易等。这篇文章主要是介绍如何提高运行在 Linux或UNIX系统的Nginx Web服务器的<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e5%ae%89%e5%85%a8" title="查看 安全 中的全部文章" target="_blank">安全</a></span>性。</div>
<div id="app-share-content">
<p><strong>默认配置文件和Nginx端口</strong></p>
<ul>
<li>/usr/local/<a title="标签 Nginx 下的日志" rel="tag">nginx</a>/conf/ – Nginx配置文件目录，/usr/local/<a title="标签 Nginx 下的日志" rel="tag">nginx</a>/conf/<a title="标签 Nginx 下的日志" rel="tag">nginx</a>.conf是主配置文件</li>
<p><span id="more-341"></span></p>
<li>/usr/local/<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/nginx" title="查看 nginx 中的全部文章" target="_blank">nginx</a></span>/html/ – 默认网站文件位置</li>
<li>/usr/local/<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/nginx" title="查看 nginx 中的全部文章" target="_blank">nginx</a></span>/logs/ – 默认日志文件位置</li>
<li>Nginx HTTP默认端口 : TCP 80</li>
<li>Nginx HTTPS默认端口: TCP 443</li>
</ul>
<p>你可以使用以下命令来测试Nginx配置文件准确性。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>/usr/local/nginx/sbin/nginx -t</li>
</ol>
</blockquote>
</div>
<p>将会输出。<br />
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok<br />
configuration file /usr/local/nginx/conf/nginx.conf test is successful<br />
执行以下命令来重新加载配置文件。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>/usr/local/nginx/sbin/nginx -s reload</li>
</ol>
</blockquote>
</div>
<p>执行以下命令来停止服务器。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>/usr/local/nginx/sbin/nginx -s stop</li>
</ol>
</blockquote>
</div>
<h3>一、配置SELinux</h3>
<p><span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e5%ae%89%e5%85%a8" title="查看 安全 中的全部文章" target="_blank">安全</a></span>增强型Linux（SELinux）的是一个Linux内核的功能，它提供支持访问控制的<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e5%ae%89%e5%85%a8" title="查看 安全 中的全部文章" target="_blank">安全</a></span>政策保护机制。它可以大部分的攻击。下面我们来看如何启动基于<a>centos</a>/RHEL系统的SELinux。<br />
<strong>安装SELinux</strong></p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>rpm -qa | grep selinux</li>
</ol>
</blockquote>
</div>
<p>libselinux-1.23.10-2<br />
selinux-policy-targeted-1.23.16-6<br />
如果没有返回任何结果，代表没有安装 SELinux，如果返回了类似上面的结果，则说明系统安装了 SELinux。<br />
<strong>布什值锁定</strong><br />
运行命令getsebool -a来锁定系统。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>getsebool -a | less</li>
<li>getsebool -a | grep off</li>
<li>getsebool -a | grep o</li>
</ol>
</blockquote>
</div>
<h3>二、通过分区挂载允许最少特权</h3>
<p>服务器上的网页/html/php文件单独分区。例如，新建一个分区/dev/sda5(第一逻辑分区)，并且挂载在/nginx。确保 /nginx是以noexec, nodev and nosetuid的权限挂载。以下是我的/etc/fstab的挂载/nginx的信息：<br />
LABEL=/nginx /nginx ext3 defaults,nosuid,noexec,nodev 1 2<br />
注意：你需要使用fdisk和mkfs.ext3命令创建一个新分区。</p>
<h3>三、配置/etc/sysctl.conf强化Linux安全</h3>
<p>你可以通过编辑/etc/sysctl.conf来控制和配置Linux内核、网络设置。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li># Avoid a smurf attack</li>
<li>net.ipv4.icmp_echo_ignore_broadcasts = 1</li>
<li># Turn on protection for bad icmp error messages</li>
<li>net.ipv4.icmp_ignore_bogus_error_responses = 1</li>
<li># Turn on syncookies for SYN flood attack protection</li>
<li>net.ipv4.tcp_syncookies = 1</li>
<li># Turn on and log spoofed, source routed, and redirect packets</li>
<li>net.ipv4.conf.all.log_martians = 1</li>
<li>net.ipv4.conf.default.log_martians = 1</li>
<li># No source routed packets here</li>
<li>net.ipv4.conf.all.accept_source_route = 0</li>
<li>net.ipv4.conf.default.accept_source_route = 0</li>
<li># Turn on reverse path filtering</li>
<li>net.ipv4.conf.all.rp_filter = 1</li>
<li>net.ipv4.conf.default.rp_filter = 1</li>
<li># Make sure no one can alter the routing tables</li>
<li>net.ipv4.conf.all.accept_redirects = 0</li>
<li>net.ipv4.conf.default.accept_redirects = 0</li>
<li>net.ipv4.conf.all.secure_redirects = 0</li>
<li>net.ipv4.conf.default.secure_redirects = 0</li>
<li># Don’t act as a router</li>
<li>net.ipv4.ip_forward = 0</li>
<li>net.ipv4.conf.all.send_redirects = 0</li>
<li>net.ipv4.conf.default.send_redirects = 0</li>
<li># Turn on execshild</li>
<li>kernel.exec-shield = 1</li>
<li>kernel.randomize_va_space = 1</li>
<li># Tuen IPv6</li>
<li>net.ipv6.conf.default.router_solicitations = 0</li>
<li>net.ipv6.conf.default.accept_ra_rtr_pref = 0</li>
<li>net.ipv6.conf.default.accept_ra_pinfo = 0</li>
<li>net.ipv6.conf.default.accept_ra_defrtr = 0</li>
<li>net.ipv6.conf.default.autoconf = 0</li>
<li>net.ipv6.conf.default.dad_transmits = 0</li>
<li>net.ipv6.conf.default.max_addresses = 1</li>
<li># Optimization for port usefor LBs</li>
<li># Increase system file descriptor limit</li>
<li>fs.file-max = 65535</li>
<li># Allow for more PIDs (to reduce rollover problems); may break some programs 32768</li>
<li>kernel.pid_max = 65536</li>
<li># Increase system IP port limits</li>
<li>net.ipv4.ip_local_port_range = 2000 65000</li>
<li># Increase TCP max buffer size setable using setsockopt()</li>
<li>net.ipv4.tcp_rmem = 4096 87380 8388608</li>
<li>net.ipv4.tcp_wmem = 4096 87380 8388608</li>
<li># Increase Linux auto tuning TCP buffer limits</li>
<li># min, default, and max number of bytes to use</li>
<li># set max to at least 4MB, or higher if you use very high BDP paths</li>
<li># Tcp Windows etc</li>
<li>net.core.rmem_max = 8388608</li>
<li>net.core.wmem_max = 8388608</li>
<li>net.core.netdev_max_backlog = 5000</li>
<li>net.ipv4.tcp_window_scaling = 1</li>
</ol>
</blockquote>
</div>
<h3>四、删除所有不需要的Nginx模块</h3>
<p>你需要直接通过编译Nginx源代码使模块数量最少化。通过限制只允许web服务器访问模块把风险降到最低。你可以只配置安装nginx你所需要的模块。例如，禁用SSL和autoindex模块你可以执行以下命令：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>./configure –without-http_autoindex_module –without-http_ssi_module</li>
<li>make</li>
<li>make install</li>
</ol>
</blockquote>
</div>
<p>通过以下命令来查看当编译nginx服务器时哪个模块能开户或关闭：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>./configure –help | less</li>
</ol>
</blockquote>
</div>
<p>禁用你用不到的nginx模块。<br />
（可选项）更改nginx版本名称。<br />
编辑文件/http/ngx_http_header_filter_module.c：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>vi +48 src/http/ngx_http_header_filter_module.c</li>
</ol>
</blockquote>
</div>
<p>找到行：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>static char ngx_http_server_string[] = “Server: nginx” CRLF;</li>
<li>static char ngx_http_server_full_string[] = “Server: ” NGINX_VER CRLF;</li>
</ol>
</blockquote>
</div>
<p>按照以下行修改：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>static char ngx_http_server_string[] = “Server: Ninja Web Server” CRLF;</li>
<li>static char ngx_http_server_full_string[] = “Server: Ninja Web Server” CRLF;</li>
</ol>
</blockquote>
</div>
<p>保存并关闭文件。现在你可以编辑服务器了。增加以下代码到nginx.conf文件来关闭nginx版本号的显示。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>server_tokens off</li>
</ol>
</blockquote>
</div>
<h3>五、使用mod_security(只适合后端Apache服务器)</h3>
<p>mod_security为Apache提供一个应用程序级的防火墙。为后端Apache Web服务器安装mod_security，这会阻止很多注入式攻击。</p>
<h3>六、安装SELinux策略以强化Nginx Web服务器</h3>
<p>默认的SELinux不会保护Nginx Web服务器，但是你可以安装和编译保护软件。<br />
1、安装编译SELinux所需环境支持</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>yum -y install selinux-policy-targeted selinux-policy-devel</li>
</ol>
</blockquote>
</div>
<p>2、下载SELinux策略以强化Nginx Web服务器。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>cd /opt</li>
<li>wget ‘http://downloads.sourceforge.net/project/selinuxnginx/se-ngix_1_0_10.tar.gz?use_mirror=nchc’</li>
</ol>
</blockquote>
</div>
<p>3、解压文件</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>tar -zxvf se-ngix_1_0_10.tar.gz</li>
</ol>
</blockquote>
</div>
<p>4、编译文件</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>cd se-ngix_1_0_10/nginx</li>
<li>make</li>
</ol>
</blockquote>
</div>
<p>将会输出如下：<br />
Compiling targeted nginx module<br />
/usr/bin/checkmodule: loading policy configuration from tmp/nginx.tmp<br />
/usr/bin/checkmodule: policy configuration loaded<br />
/usr/bin/checkmodule: writing binary representation (version 6) to tmp/nginx.mod<br />
Creating targeted nginx.pp policy package</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>rm tmp/nginx.mod.fc tmp/nginx.mod</li>
</ol>
</blockquote>
</div>
<p>5、安装生成的nginx.pp SELinux模块：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>/usr/sbin/semodule -i nginx.pp</li>
</ol>
</blockquote>
</div>
<h3>七、基于Iptables防火墙的限制</h3>
<p>下面的防火墙脚本阻止任何除了允许：</p>
<ul>
<li>来自HTTP(TCP端口80)的请求</li>
<li>来自ICMP ping的请求</li>
<li>ntp(端口123)的请求输出</li>
<li>smtp(TCP端口25)的请求输出</li>
</ul>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>#!/bin/bash</li>
<li>IPT=”/sbin/iptables”</li>
<li>#### IPS ######</li>
<li># Get server public ip</li>
<li>SERVER_IP=$(ifconfig eth0 | grep ‘inet addr:’ | awk -F’inet addr:’ ‘{ print $2}’ | awk ‘{ print $1}’)</li>
<li>LB1_IP=”204.54.1.1″</li>
<li>LB2_IP=”204.54.1.2″</li>
<li># Do some smart logic so that we can use damm script on LB2 too</li>
<li>OTHER_LB=””</li>
<li>SERVER_IP=””</li>
<li>[[ "$SERVER_IP" == "$LB1_IP" ]] &amp;&amp; OTHER_LB=”$LB2_IP” || OTHER_LB=”$LB1_IP”</li>
<li>[[ "$OTHER_LB" == "$LB2_IP" ]] &amp;&amp; OPP_LB=”$LB1_IP” || OPP_LB=”$LB2_IP”</li>
<li>### IPs ###</li>
<li>PUB_SSH_ONLY=”122.xx.yy.zz/29″</li>
<li>#### FILES #####</li>
<li>BLOCKED_IP_TDB=/root/.fw/blocked.ip.txt</li>
<li>SPOOFIP=”127.0.0.0/8 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 169.254.0.0/16 0.0.0.0/8 240.0.0.0/4 255.255.255.255/32 168.254.0.0/16 224.0.0.0/4 240.0.0.0/5 248.0.0.0/5 192.0.2.0/24″</li>
<li>BADIPS=$( [[ -f ${BLOCKED_IP_TDB} ]] &amp;&amp; egrep -v “^#|^$” ${BLOCKED_IP_TDB})</li>
<li>### Interfaces ###</li>
<li>PUB_IF=”eth0″   # public interface</li>
<li>LO_IF=”lo”      # loopback</li>
<li>VPN_IF=”eth1″   # vpn / private net</li>
<li>### start firewall ###</li>
<li>echo “Setting LB1 $(hostname) Firewall…”</li>
<li># DROP and close everything</li>
<li>$IPT -P INPUT DROP</li>
<li>$IPT -P OUTPUT DROP</li>
<li>$IPT -P FORWARD DROP</li>
<li># Unlimited lo access</li>
<li>$IPT -A INPUT -i ${LO_IF} -j ACCEPT</li>
<li>$IPT -A OUTPUT -o ${LO_IF} -j ACCEPT</li>
<li># Unlimited vpn / pnet access</li>
<li>$IPT -A INPUT -i ${VPN_IF} -j ACCEPT</li>
<li>$IPT -A OUTPUT -o ${VPN_IF} -j ACCEPT</li>
<li># Drop sync</li>
<li>$IPT -A INPUT -i ${PUB_IF} -p tcp ! –syn -m state –state NEW -j DROP</li>
<li># Drop Fragments</li>
<li>$IPT -A INPUT -i ${PUB_IF} -f -j DROP</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL FIN,URG,PSH -j DROP</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL ALL -j DROP</li>
<li># Drop NULL packets</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL NONE -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” NULL Packets “</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL NONE -j DROP</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,RST SYN,RST -j DROP</li>
<li># Drop XMAS</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,FIN SYN,FIN -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” XMAS Packets “</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP</li>
<li># Drop FIN packet scans</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags FIN,ACK FIN -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” Fin Packets Scan “</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags FIN,ACK FIN -j DROP</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP</li>
<li># Log and get rid of broadcast / multicast and invalid</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -m pkttype –pkt-type broadcast -j LOG –log-prefix ” Broadcast “</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -m pkttype –pkt-type broadcast -j DROP</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -m pkttype –pkt-type multicast -j LOG –log-prefix ” Multicast “</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -m pkttype –pkt-type multicast -j DROP</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -m state –state INVALID -j LOG –log-prefix ” Invalid “</li>
<li>$IPT  -A INPUT -i ${PUB_IF} -m state –state INVALID -j DROP</li>
<li># Log and block spoofed ips</li>
<li>$IPT -N spooflist</li>
<li>for ipblock in $SPOOFIP</li>
<li>do</li>
<li>$IPT -A spooflist -i ${PUB_IF} -s $ipblock -j LOG –log-prefix ” SPOOF List Block “</li>
<li>$IPT -A spooflist -i ${PUB_IF} -s $ipblock -j DROP</li>
<li>done</li>
<li>$IPT -I INPUT -j spooflist</li>
<li>$IPT -I OUTPUT -j spooflist</li>
<li>$IPT -I FORWARD -j spooflist</li>
<li># Allow ssh only from selected public ips</li>
<li>for ip in ${PUB_SSH_ONLY}</li>
<li>do</li>
<li>$IPT -A INPUT -i ${PUB_IF} -s ${ip} -p tcp -d ${SERVER_IP} –destination-port 22 -j ACCEPT</li>
<li>$IPT -A OUTPUT -o ${PUB_IF} -d ${ip} -p tcp -s ${SERVER_IP} –sport 22 -j ACCEPT</li>
<li>done</li>
<li># allow incoming ICMP ping pong stuff</li>
<li>$IPT -A INPUT -i ${PUB_IF} -p icmp –icmp-type 8 -s 0/0 -m state –state NEW,ESTABLISHED,RELATED -m limit –limit 30/sec  -j ACCEPT</li>
<li>$IPT -A OUTPUT -o ${PUB_IF} -p icmp –icmp-type 0 -d 0/0 -m state –state ESTABLISHED,RELATED -j ACCEPT</li>
<li># allow incoming HTTP port 80</li>
<li>$IPT -A INPUT -i ${PUB_IF} -p tcp -s 0/0 –sport 1024:65535 –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT</li>
<li>$IPT -A OUTPUT -o ${PUB_IF} -p tcp –sport 80 -d 0/0 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT</li>
<li># allow outgoing ntp</li>
<li>$IPT -A OUTPUT -o ${PUB_IF} -p udp –dport 123 -m state –state NEW,ESTABLISHED -j ACCEPT</li>
<li>$IPT -A INPUT -i ${PUB_IF} -p udp –sport 123 -m state –state ESTABLISHED -j ACCEPT</li>
<li># allow outgoing smtp</li>
<li>$IPT -A OUTPUT -o ${PUB_IF} -p tcp –dport 25 -m state –state NEW,ESTABLISHED -j ACCEPT</li>
<li>$IPT -A INPUT -i ${PUB_IF} -p tcp –sport 25 -m state –state ESTABLISHED -j ACCEPT</li>
<li>### add your other rules here ####</li>
<li>#######################</li>
<li># drop and log everything else</li>
<li>$IPT -A INPUT -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” DEFAULT DROP “</li>
<li>$IPT -A INPUT -j DROP</li>
<li>exit 0</li>
</ol>
</blockquote>
</div>
<h3>八、控制缓冲区溢出攻击</h3>
<p>编辑nginx.conf，为所有客户端设置缓冲区的大小限制。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>vi /usr/local/nginx/conf/nginx.conf</li>
</ol>
</blockquote>
</div>
<p>编辑和设置所有客户端缓冲区的大小限制如下：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>## Start: Size Limits &amp; Buffer Overflows ##</li>
<li>client_body_buffer_size  1K;</li>
<li>client_header_buffer_size 1k;</li>
<li>client_max_body_size 1k;</li>
<li>large_client_header_buffers 2 1k;</li>
<li>## END: Size Limits &amp; Buffer Overflows ##</li>
</ol>
</blockquote>
</div>
<p>解释：<br />
1、client_body_buffer_size 1k-（默认8k或16k）这个指令可以指定连接请求实体的缓冲区大小。如果连接请求超过缓存区指定的值，那么这些请求实体的整体或部分将尝试写入一个临时文件。<br />
2、client_header_buffer_size 1k-指令指定客户端请求头部的缓冲区大小。绝大多数情况下一个请求头不会大于1k，不过如果有来自于wap客户端的较大的cookie它可能会大于 1k，Nginx将分配给它一个更大的缓冲区，这个值可以在large_client_header_buffers里面设置。<br />
3、client_max_body_size 1k-指令指定允许客户端连接的最大请求实体大小，它出现在请求头部的Content-Length字段。<br />
如果请求大于指定的值，客户端将收到一个”Request Entity Too Large” (413)错误。记住，浏览器并不知道怎样显示这个错误。<br />
4、large_client_header_buffers-指定客户端一些比较大的请求头使用的缓冲区数量和大小。请求字段不能大于一个缓冲区大小，如果客户端发送一个比较大的头，nginx将返回”Request URI too large” (414)<br />
同样，请求的头部最长字段不能大于一个缓冲区，否则服务器将返回”Bad request” (400)。缓冲区只在需求时分开。默认一个缓冲区大小为操作系统中分页文件大小，通常是4k或8k，如果一个连接请求最终将状态转换为keep- alive，它所占用的缓冲区将被释放。<br />
你还需要控制超时来提高服务器性能并与客户端断开连接。按照如下编辑：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>## Start: Timeouts ##</li>
<li>client_body_timeout   10;</li>
<li>client_header_timeout 10;</li>
<li>keepalive_timeout     5 5;</li>
<li>send_timeout          10;</li>
<li>## End: Timeouts ##</li>
</ol>
</blockquote>
</div>
<p>1、client_body_timeout 10;-指令指定读取请求实体的超时时间。这里的超时是指一个请求实体没有进入读取步骤，如果连接超过这个时间而客户端没有任何响应，Nginx将返回一个”Request time out” (408)错误。<br />
2、client_header_timeout 10;-指令指定读取客户端请求头标题的超时时间。这里的超时是指一个请求头没有进入读取步骤，如果连接超过这个时间而客户端没有任何响应，Nginx将返回一个”Request time out” (408)错误。<br />
3、keepalive_timeout 5 5; – 参数的第一个值指定了客户端与服务器长连接的超时时间，超过这个时间，服务器将关闭连接。参数的第二个值（可选）指定了应答头中Keep-Alive: timeout=time的time值，这个值可以使一些浏览器知道什么时候关闭连接，以便服务器不用重复关闭，如果不指定这个参数，nginx不会在应 答头中发送Keep-Alive信息。（但这并不是指怎样将一个连接“Keep-Alive”）参数的这两个值可以不相同。<br />
4、send_timeout 10; 指令指定了发送给客户端应答后的超时时间，Timeout是指没有进入完整established状态，只完成了两次握手，如果超过这个时间客户端没有任何响应，nginx将关闭连接。</p>
<h3>九、控制并发连接</h3>
<p>你可以使用NginxHttpLimitZone模块来限制指定的会话或者一个IP地址的特殊情况下的并发连接。编辑nginx.conf:</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>### Directive describes the zone, in which the session states are stored i.e. store in slimits. ###</li>
<li>### 1m can handle 32000 sessions with 32 bytes/session, set to 5m x 32000 session ###</li>
<li>limit_zone slimits $binary_remote_addr 5m;</li>
<li>### Control maximum number of simultaneous connections for one session i.e. ###</li>
<li>### restricts the amount of connections from a single ip address ###</li>
<li>limit_conn slimits 5;</li>
</ol>
</blockquote>
</div>
<p>上面表示限制每个远程IP地址的客户端同时打开连接不能超过5个。</p>
<h3>十、只允许我们的域名的访问</h3>
<p>如果机器人只是随机扫描服务器的所有域名，那拒绝这个请求。你必须允许配置的虚拟域或反向代理请求。你不必使用IP地址来拒绝。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>## Only requests to our Host are allowed i.e. nixcraft.in, images.nixcraft.in and www.nixcraft.in</li>
<li>if ($host !~ ^(nixcraft.in|www.nixcraft.in|images.nixcraft.in)$ ) {</li>
<li>return 444;</li>
<li>}</li>
<li>##</li>
</ol>
</blockquote>
</div>
<h3>十一、限制可用的请求方法</h3>
<p>GET和POST是互联网上最常用的方法。 Web服务器的方法被定义在RFC 2616。如果Web服务器不要求启用所有可用的方法，它们应该被禁用。下面的指令将过滤只允许GET，HEAD和POST方法：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>## Only allow these request methods ##</li>
<li>if ($request_method !~ ^(GET|HEAD|POST)$ ) {</li>
<li>return 444;</li>
<li>}</li>
<li>## Do not accept DELETE, SEARCH and other methods ##</li>
</ol>
</blockquote>
</div>
<p>更多关于HTTP方法的介绍</p>
<ul>
<li>GET方法是用来请求，如文件<a target="_blank">http://www.mzfeng.com/index.php</a>。</li>
<li>HEAD方法是一样的，除非该服务器的GET请求无法返回消息体。</li>
<li>POST方法可能涉及到很多东西，如储存或更新数据，或订购产品，或通过提交表单发送电子邮件。这通常是使用服务器端处理，如PHP，Perl和Python等脚本。如果你要上传的文件和在服务器处理数据，你必须使用这个方法。</li>
</ul>
<h3>十二、如何拒绝一些User-Agents？</h3>
<p>你可以很容易地阻止User-Agents,如扫描器，机器人以及滥用你服务器的垃圾邮件发送者。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>## Block download agents ##</li>
<li>if ($http_user_agent ~* LWP::Simple|BBBike|wget) {</li>
<li>return 403;</li>
<li>}</li>
<li>##</li>
</ol>
</blockquote>
</div>
<p>阻止Soso和有道的机器人：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>## Block some robots ##</li>
<li>if ($http_user_agent ~* Sosospider|YodaoBot) {</li>
<li>return 403;</li>
<li>}</li>
</ol>
</blockquote>
</div>
<h3>十三、如何防止图片盗链</h3>
<p>图片或HTML盗链的意思是有人直接用你网站的图片地址来显示在他的网站上。最终的结果，你需要支付额外的宽带费用。这通常是在论坛和博客。我强烈建议您封锁，并阻止盗链行为。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li># Stop deep linking or hot linking</li>
<li>location /images/ {</li>
<li>valid_referers none blocked www.example.com example.com;</li>
<li>if ($invalid_referer) {</li>
<li>return   403;</li>
<li>}</li>
<li>}</li>
</ol>
</blockquote>
</div>
<p>例如：重定向并显示指定图片</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>valid_referers blocked www.example.com example.com;</li>
<li>if ($invalid_referer) {</li>
<li>rewrite ^/images/uploads.*\.(gif|jpg|jpeg|png)$ http://www.examples.com/banned.jpg last</li>
<li>}</li>
</ol>
</blockquote>
</div>
<h3>十四、目录限制</h3>
<p>你可以对指定的目录设置访问权限。所有的网站目录应该一一的配置，只允许必须的目录访问权限。<br />
<strong>通过IP地址限制访问</strong><br />
你可以通过IP地址来限制访问目录/admin/:</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>location /docs/ {</li>
<li>## block one workstation</li>
<li>deny    192.168.1.1;</li>
<li>## allow anyone in 192.168.1.0/24</li>
<li>allow   192.168.1.0/24;</li>
<li>## drop rest of the world</li>
<li>deny    all;</li>
<li>}</li>
</ol>
</blockquote>
</div>
<p><strong>通过密码保护目录</strong><br />
首先创建密码文件并增加“user”用户：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>mkdir /usr/local/nginx/conf/.htpasswd/</li>
<li>htpasswd -c /usr/local/nginx/conf/.htpasswd/passwd user</li>
</ol>
</blockquote>
</div>
<p>编辑nginx.conf,加入需要保护的目录：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>### Password Protect /personal-images/ and /delta/ directories ###</li>
<li>location ~ /(personal-images/.*|delta/.*) {</li>
<li>auth_basic  “Restricted”;</li>
<li>auth_basic_user_file   /usr/local/nginx/conf/.htpasswd/passwd;</li>
<li>}</li>
</ol>
</blockquote>
</div>
<p>一旦密码文件已经生成，你也可以用以下的命令来增加允许访问的用户：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>htpasswd -s /usr/local/nginx/conf/.htpasswd/passwd userName</li>
</ol>
</blockquote>
</div>
<h3>十五、Nginx SSL配置</h3>
<p>HTTP是一个纯文本协议，它是开放的被动监测。你应该使用SSL来加密你的用户内容。<br />
<strong>创建SSL证书</strong><br />
执行以下命令：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>cd /usr/local/nginx/conf</li>
<li>openssl genrsa -des3 -out server.key 1024</li>
<li>openssl req -new -key server.key -out server.csr</li>
<li>cp server.key server.key.org</li>
<li>openssl rsa -in server.key.org -out server.key</li>
<li>openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt</li>
</ol>
</blockquote>
</div>
<p>编辑nginx.conf并按如下来更新：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>server {</li>
<li>server_name example.com;</li>
<li>listen 443;</li>
<li>ssl on;</li>
<li>ssl_certificate /usr/local/nginx/conf/server.crt;</li>
<li>ssl_certificate_key /usr/local/nginx/conf/server.key;</li>
<li>access_log /usr/local/nginx/logs/ssl.access.log;</li>
<li>error_log /usr/local/nginx/logs/ssl.error.log;</li>
<li>}</li>
</ol>
</blockquote>
</div>
<p>重启nginx:</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>/usr/local/nginx/sbin/nginx -s reload</li>
</ol>
</blockquote>
</div>
<h3>十六、Nginx与PHP安全建议</h3>
<p>PHP是流行的服务器端脚本语言之一。如下编辑/etc/<a title="标签 PHP 下的日志" rel="tag">php</a>.ini文件：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li># Disallow dangerous functions</li>
<li>disable_functions = phpinfo, system, mail, exec</li>
<li>## Try to limit resources  ##</li>
<li># Maximum execution time of each script, in seconds</li>
<li>max_execution_time = 30</li>
<li># Maximum amount of time each script may spend parsing request data</li>
<li>max_input_time = 60</li>
<li># Maximum amount of memory a script may consume (8MB)</li>
<li>memory_limit = 8M</li>
<li># Maximum size of POST data that PHP will accept.</li>
<li>post_max_size = 8M</li>
<li># Whether to allow HTTP file uploads.</li>
<li>file_uploads = Off</li>
<li># Maximum allowed size for uploaded files.</li>
<li>upload_max_filesize = 2M</li>
<li># Do not expose PHP error messages to external users</li>
<li>display_errors = Off</li>
<li># Turn on safe mode</li>
<li>safe_mode = On</li>
<li># Only allow access to executables in isolated directory</li>
<li>safe_mode_exec_dir = php-required-executables-path</li>
<li># Limit external access to PHP environment</li>
<li>safe_mode_allowed_env_vars = PHP_</li>
<li># Restrict PHP information leakage</li>
<li>expose_php = Off</li>
<li># Log all errors</li>
<li>log_errors = On</li>
<li># Do not register globals for input data</li>
<li>register_globals = Off</li>
<li># Minimize allowable PHP post size</li>
<li>post_max_size = 1K</li>
<li># Ensure PHP redirects appropriately</li>
<li>cgi.force_redirect = 0</li>
<li># Disallow uploading unless necessary</li>
<li>file_uploads = Off</li>
<li># Enable SQL safe mode</li>
<li>sql.safe_mode = On</li>
<li># Avoid Opening remote files</li>
<li>allow_url_fopen = Off</li>
</ol>
</blockquote>
</div>
<h3>十七、如果可能让Nginx运行在一个chroot监狱</h3>
<p>把nginx放在一个chroot监狱以减小潜在的非法进入其它目录。你可以使用传统的与nginx一起安装的chroot。如果可能，那使用FreeBSD jails，Xen，OpenVZ虚拟化的容器概念。</p>
<h3>十八、在防火墙级限制每个IP的连接数</h3>
<p>网络服务器必须监视连接和每秒连接限制。PF和Iptales都能够在进入你的nginx服务器之前阻止最终用户的访问。<br />
Linux Iptables:限制每次Nginx连接数<br />
下面的例子会阻止来自一个IP的60秒钟内超过15个连接端口80的连接数。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>/sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –set</li>
<li>/sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –update –seconds 60  –hitcount 15 -j DROP</li>
<li>service iptables save</li>
</ol>
</blockquote>
</div>
<p>请根据你的具体情况来设置限制的连接数。</p>
<h3>十九：配置操作系统保护Web服务器</h3>
<p>像以上介绍的启动SELinux.正确设置/nginx文档根目录的权限。Nginx以用户nginx运行。但是根目录（/nginx或者/usr /local/nginx/html）不应该设置属于用户nginx或对用户nginx可写。找出错误权限的文件可以使用如下命令：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>find /nginx -user nginx</li>
<li>find /usr/local/nginx/html -user nginx</li>
</ol>
</blockquote>
</div>
<p>确保你更所有权为root或其它用户，一个典型的权限设置 /usr/local/nginx/html/</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>ls -l /usr/local/nginx/html/</li>
</ol>
</blockquote>
</div>
<p>示例输出：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>-rw-r–r– 1 root root 925 Jan  3 00:50 error4xx.html</li>
<li>-rw-r–r– 1 root root  52 Jan  3 10:00 error5xx.html</li>
<li>-rw-r–r– 1 root root 134 Jan  3 00:52 index.html</li>
</ol>
</blockquote>
</div>
<p>你必须删除由vi或其它文本编辑器创建的备份文件：</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>find /nginx -name ‘.?*’ -not -name .ht* -or -name ‘*~’ -or -name ‘*.bak*’ -or -name ‘*.old*’</li>
<li>find /usr/local/nginx/html/ -name ‘.?*’ -not -name .ht* -or -name ‘*~’ -or -name ‘*.bak*’ -or -name ‘*.old*’</li>
</ol>
</blockquote>
</div>
<p>通过find命令的-delete选项来删除这些文件。</p>
<h3>二十、限制Nginx连接传出</h3>
<p>黑客会使用工具如wget下载你服务器本地的文件。使用Iptables从nginx用户来阻止传出连接。ipt_owner模块试图匹配本地产生的数据包的创建者。下面的例子中只允许user用户在外面使用80连接。</p>
<div>
<blockquote>
<ol title="Double click to hide line number.">
<li>/sbin/iptables -A OUTPUT -o eth0 -m owner –uid-owner vivek -p tcp –dport 80 -m state –state NEW,ESTABLISHED  -j ACCEPT</li>
</ol>
</blockquote>
</div>
<p>通过以上的配置，你的nginx服务器已经非常安全了并可以发布网页。可是，你还应该根据你网站程序查找更多的安全设置资料。例如，wordpress或者第三方程序。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mzfeng.com/html/y2012/341.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>雅虎给出的34条网站加速方法</title>
		<link>http://www.mzfeng.com/html/y2009/191.html</link>
		<comments>http://www.mzfeng.com/html/y2009/191.html#comments</comments>
		<pubDate>Tue, 06 Oct 2009 22:13:58 +0000</pubDate>
		<dc:creator>Mzfeng</dc:creator>
				<category><![CDATA[互联网]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[网站]]></category>

		<guid isPermaLink="false">http://www.mzfeng.com/?p=191</guid>
		<description><![CDATA[　　雅虎给出了优化网站加载速度的34条法则（包括Yslow规则22条） 详细说明，下载转发 ponytail 的译文（来自帕兰映像）。 　　1.Minimize HTTP Requests 减少HTTP请求 　　图片、css、script、flash等等这些都会增加http请求数，减少这些元素的数量就能减少响应时间。把多个JS、CSS在可能的情况下写进一个文件，页面里直接写入图片也是不好的做法，应该写进CSS里，利用 CSS sprites 将小图拼合后利用background来定位。 　　2.Use a Content Delivery Network 利用CDN技术 　　CDN 确实是好东西，8过服务器提供商的这项服务一般是要收费的，我以前买的国内空间是有这个的但是我当时根本不知道啥用，现在没了。 　　3.Add an Expires or a Cache-Control Header 设置头文件过期或者静态缓存 　　浏览器会用缓存来减少http请求数来加快页面加载的时间，如果页面头部加一个很长的过期时间，浏览器就会一直缓存页面里的元素。不过这样如果页面里的东西变动的话就要改名字了，否则用户端不会主动刷新，看自己衡量了~ 这项可以通过修改.htaccess文件来实现。 　　4.Gzip Components Gzip压缩 　　Gzip格式是一种很普遍的压缩技术，几乎所有的浏览器都有解压Gzip格式的能力，而且它可以压缩的比例非常大，一般压缩率为85%。压缩没压缩，可以到 这里 做下测试。 　　5.Put Stylesheets at the Top 把CSS放顶部 　　让浏览者能尽早的看到网站的完整样式。 　　6.Put Scripts at the Bottom 把JS放底部 　　网站呈现完毕后再进行功能设置，当然这些JS要在你的加载过程中不影响内容表现。 　　7.Avoid CSS Expressions 避免CSS Expressions [...]]]></description>
			<content:encoded><![CDATA[<p>　　雅虎给出了优化<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e7%bd%91%e7%ab%99" title="查看 网站 中的全部文章" target="_blank">网站</a></span>加载速度的34条法则（包括Yslow规则22条） <a href="http://developer.yahoo.com/performance/rules.html">详细说明</a>，下载转发 ponytail 的译文（来自<a href="http://paranimage.com/">帕兰映像</a>）。<br />
　　<strong>1.Minimize HTTP Requests 减少HTTP请求</strong><br />
　　图片、css、script、flash等等这些都会增加http请求数，减少这些元素的数量就能减少响应时间。把多个JS、CSS在可能的情况下写进一个文件，页面里直接写入图片也是不好的做法，应该写进CSS里，利用 CSS sprites 将小图拼合后利用background来定位。<br />
　　<strong>2.Use a Content Delivery Network 利用CDN技术</strong><br />
　　CDN 确实是好东西，8过<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e6%9c%8d%e5%8a%a1%e5%99%a8" title="查看 服务器 中的全部文章" target="_blank">服务器</a></span>提供商的这项服务一般是要收费的，我以前买的国内空间是有这个的但是我当时根本不知道啥用，现在没了。<br />
　　<strong>3.Add an Expires or a Cache-Control Header 设置头文件过期或者静态缓存</strong><span id="more-191"></span><br />
　　<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e6%b5%8f%e8%a7%88%e5%99%a8" title="查看 浏览器 中的全部文章" target="_blank">浏览器</a></span>会用缓存来减少http请求数来加快页面加载的时间，如果页面头部加一个很长的过期时间，<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e6%b5%8f%e8%a7%88%e5%99%a8" title="查看 浏览器 中的全部文章" target="_blank">浏览器</a></span>就会一直缓存页面里的元素。不过这样如果页面里的东西变动的话就要改名字了，否则用户端不会主动刷新，看自己衡量了~ 这项可以通过修改.htaccess文件来实现。<br />
　　<strong>4.Gzip Components Gzip压缩</strong><br />
　　Gzip格式是一种很普遍的压缩技术，几乎所有的浏览器都有解压Gzip格式的能力，而且它可以压缩的比例非常大，一般压缩率为85%。压缩没压缩，可以到 这里 做下测试。<br />
　　<strong>5.Put Stylesheets at the Top 把CSS放顶部<br />
</strong>　　让浏览者能尽早的看到<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e7%bd%91%e7%ab%99" title="查看 网站 中的全部文章" target="_blank">网站</a></span>的完整样式。<br />
　　<strong>6.Put Scripts at the Bottom 把JS放底部</strong><br />
　　网站呈现完毕后再进行功能设置，当然这些JS要在你的加载过程中不影响内容表现。</p>
<p>　　<strong>7.Avoid CSS Expressions 避免CSS Expressions</strong><br />
　　CSS表达式很可怕，这个只被IE支持的东西执行时候的运算量非常大，你移动一下鼠标它都要进行重计算的，但有时候为了做浏览器的兼容必须要用到这个||| IE6去死去死！~<br />
　　<strong>8.Make JavaScript and CSS External 将JS和CSS外链</strong><br />
　　前面讲到了缓存这个事情，一些较为公用的JS和CSS，我们可以使用外链的形式，譬如我就是从Google外链来的Jquery文件，如果我的浏览者在浏览别的使用了这个外链文件的网站时已经下载并缓存了这个文件，那么他在浏览我的网站的时候就不需要再进行下载了！~<br />
　　<strong>9.Reduce DNS Lookups 减少DNS查找</strong><br />
　　貌似是要减少网站从外部调用资源，我的Google分析和picasa的外链图片都算在里面了。<br />
　　<strong>10.Minify JavaScript and CSS 减小JS和CSS的体积</strong><br />
　　写JS和CSS都是有技巧的，用最少的代码实现同样的功能，减少空白，增强逻辑性，用缩写方式等等，当然也有不少工具也能够帮你实现这一点。<br />
　　<strong>11. Avoid Redirects 避免重定向</strong><br />
　　再写入链接时，虽然”http://www. today-s-ooxx. com”和”http://www. today-s-ooxx. com/” 仅有一个最后的”/”只差，但是结果是不同的，<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e6%9c%8d%e5%8a%a1%e5%99%a8" title="查看 服务器 中的全部文章" target="_blank">服务器</a></span>需要花时间把前者重定向为后者然后进行跳转，这个要自己注意，也可以在Apache里用Alias 或者mod_rewrite或者DirectorySlash解决。<br />
　　<strong>12. Remove Duplicate Scripts 删除重复脚本</strong><br />
　　重复调用的代码浏览器并不会识别忽略，而是会再次运算一遍，这当然是大大的浪费。<br />
　　<strong>13. Configure ETags 配置ETags</strong><br />
　　搞不清楚咋回事，总之我是在. htaccess里把它删除了。<br />
　　<strong>14. Make Ajax Cacheable 缓存Ajax</strong><br />
　　Ajax是实时响应的，在浏览器接收到新的数据前，旧的数据被缓存，这样能够更好的提高效率。<br />
　<strong>　15. Flush the Buffer Early 尽早的释放缓冲</strong><br />
　　当用户进行页面请求时，服务器端需要花费200到500毫秒时间来拼合HTML，将写在head与body之间，释放缓冲，这样可以将文件头先发送出去，然后再发送文件内容，提高效率。<br />
　<strong>　16. Use GET for AJAX Requests 用GET方式进行AJAX请求</strong><br />
　　Get 方法和服务器只有一次交互（发送数据），而 Post 要两次（发送头部再发送数据）。<br />
<strong>　　17. Post-load Components 延迟加载组件</strong><br />
　　最先加载必须的组件进行页面初始化，然后再加载其他，YUI Image Loader 是很好的例子。<br />
　　<strong>18. Preload components 预加载组件</strong><br />
　　提前加载以后可能用到的东西，和延迟加载并不冲突，它的目的是为后续请求提供更快的响应，参见Google首页上的CSS sprites应用。<br />
　　<strong>19. Reduce the Number of DOM Elements 减少DOM元素数量</strong><br />
　　复杂的页面结构意味着更长的下载及响应时间，更合理更高效的使用标签来架构页面，是好的前端的必备条件。<br />
　　<strong>20. Split Components Across Domains 跨域分离组件</strong><br />
　　页面组件多个来源可以增大你的平行下载量，但注意不要过多，超过2-4个域名会引起上面说到的DNS查找浪费。<br />
　　<strong>21. Minimize the Number of iframes 减少iframe数量<br />
</strong>　　需要更有效的利用 ifames。<br />
　　iframe 优点：有利于下载缓慢的广告等第三方内容，安全沙箱，并行下载脚本<br />
　　iframe 缺点：即使为空也会有较大资源消耗，会阻止页面的onload，非语义<br />
　　<strong>22. No 404s 不要出现404页面<br />
</strong>　　站点本身里（非搜索结果）出现404页面，无意义的404页面会影响用户体验并且会消耗服务器资源。<br />
　　<strong>23. Reduce Cookie Size 减小Cookie</strong><br />
　　Cookie在服务器及浏览器之间的通过文件头进行交换，尽可能减小Cookie体积，设置合理的过期时间，能够很好的提高效率。<br />
　　<strong>24. Use Cookie-free Domains for Components 对组件使用无Cookie的域名</strong><br />
　　对静态组件的Cookie读取是一种浪费，使用另一个无Cookie的域名来存放你的静态组件式一个好方法，或者也可以在Cookie中只存放带www的域名。<br />
　　<strong>25. Minimize DOM Access 减少DOM的访问次数</strong><br />
　　JS访问DOM是很慢的，尽量不要用JS来设置页面布局。<br />
　　<strong>26. Develop Smart Event Handlers 开发灵活的事件处理句柄</strong><br />
　　DOM树上过多的元素被加入事件句柄的话，反应效率肯定会低，YUI事件工具有一个 onAvailable 方法可以帮助你灵活的设置DOM事件句柄<br />
　　<strong>27. Choose &lt; link &gt;over @import 使用&lt; link &gt;而非 @import</strong><br />
　　在IE中使用@import就和在页面底部用&lt; link &gt;一样，我们前面说要把&lt; link &gt;放顶部的。<br />
　　<strong>28. Avoid Filters 避免过滤器的使用<br />
</strong>　　如果需要Alpha透明，不要使用AlphaImageLoader，它效率低下而且只对IE6及以下的版本适用，用PNG8图片。如果你非要使用，加上_filter以免影响IE7+用户。<br />
　　<strong>29. Optimize Images 优化图片</strong><br />
　　将你的GIF转为PNG8会是个减小体积的好办法，另外有很多方法处理你的JPG及PNG图片以达到优化效果。<br />
　　<strong>30. Optimize CSS Sprites 优化CSS Sprites</strong><br />
　　在CSS Sprites中竖直并尽量紧凑的排列图片，尽量将颜色相似的图片排在一起，会减小图片本身的大小及提高页面图片显示速度。<br />
　　<strong>31. Don’t Scale Images in HTML 不要在HTML中缩放图片</strong><br />
　　图片要用多大的就用多大的，1000X1000的图片被width=”100″ height=”100″以后，本身的KB数是不会减少的。<br />
　　<strong>32. Make favicon. ico Small and Cacheable 缩小favicon. ico的大小并缓存它<br />
</strong>　　站点的浏览器ICO应该不是经常换吧，那就长时间的缓存它，并且最好控制在1K以下。<br />
　　<strong>33. Keep Components under 25K 保证组件在25K以下<br />
</strong>　　iPhone不能缓存25K以上的组件，并且这还是要在被压缩前。<br />
　　<strong>34. Pack Components into a Multipart Document 将组件打包进一个多部分的文档中<br />
</strong>　　就好像在邮件中加入附件一样，一个HTTP请求就够了，但是这一技术需要确保你的代理支持，iPhone就不支持。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mzfeng.com/html/y2009/191.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

