<?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; mzfeng</title>
	<atom:link href="http://www.mzfeng.com/html/yauthor/admin/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>使用 SWFObject.js 插入Flash且符合W3C标准</title>
		<link>http://www.mzfeng.com/html/y2012/342.html</link>
		<comments>http://www.mzfeng.com/html/y2012/342.html#comments</comments>
		<pubDate>Thu, 02 Feb 2012 00:53:53 +0000</pubDate>
		<dc:creator>mzfeng</dc:creator>
				<category><![CDATA[互联网]]></category>
		<category><![CDATA[SWFObject]]></category>

		<guid isPermaLink="false">http://www.mzfeng.com/?p=342</guid>
		<description><![CDATA[“SWFObject”是利用Javascript 插入flash，好处多多，代码简洁，不会出现IE6下的“单击此处以激活控件”的提示，并且能通过W3C验证。不同于传统的“object”插入flash的方法。 SWFObject在新的2.x版本中，其最简单的调用竟只需一句话，并且不需要等待页面加载完成，这意味着你可以将这句话写在页面的任何地方。比以前的版本，要简便多了。下面来看几个简单常用的调用方法： 1、最简单，最基本，只要想插入flash都能用到的经典一句话。 &#60;script type=”text/javascript” src=”swfobject.js”&#62;&#60;/script&#62; &#60;script type=”text/javascript”&#62; swfobject.embedSWF(“test.swf”, ”swfid”, ”300&#8243;, ”120&#8243;, ”9.0.0&#8243;, ”expressInstall.swf”); &#60;/script&#62; &#60;div id=”swfid”&#62;&#60;/div&#62; 参数注解：调用方法embedSWF——插入SWF文件，参数依次是： @swf文件的地址； @用于装入swf文件的容器(如div)的id； @flash的宽度； @flash的高度（当然，这里的宽高都可以使用诸如100%这样的百分比来表示）； @正常播放该flash所需的最低版本； @当版本低于要求时，执行该swf文件，这里利用这个flash跳转到官方下载最新版本的flash插件。（该参数可以省略） 在同一个页面插入多个flash到不同位置时，只要重复上面的语句，使用不同的容器id就可以了。 2、给swf文件传递参数、变量、属性的调用方法 &#160; &#60;script type=”text/javascript” src=”swfobject.js”&#62;&#60;/script&#62; &#60;script type=”text/javascript”&#62; //1、使用Json初始化变量、参数、属性 var flashvars = { name1: ”hello”, name2: ”world”, name3: ”foobar” }; var params = { menu: ”false” }; var attributes = { id: ”dynamicContent2&#8243;, name: ”dynamicContent2&#8243; }; swfobject.embedSWF(“test6_flashvars.swf”, ”content2&#8243;, ”300&#8243;, ”120&#8243;, ”6.0.0&#8243;, ”expressInstall.swf”, flashvars, params, attributes); //2、传统的初始化设置，效果一样 var flashvars = {}; flashvars.name1 = ”hello”; flashvars.name2 = ”world”; flashvars.name3 = ”foobar”; var params = {}; params.menu = ”false”; var attributes = {}; attributes.id = ”dynamicContent3&#8243;; attributes.name = ”dynamicContent3&#8243;; swfobject.embedSWF(“test6_flashvars.swf”, ”content3&#8243;, ”300&#8243;, ”120&#8243;, ”6.0.0&#8243;, ”expressInstall.swf”, flashvars, params, attributes); //3、直接写在后面，就一句话，简洁剽悍，不拖泥带水 swfobject.embedSWF(“test6_flashvars.swf”, ”content5&#8243;, ”300&#8243;, ”120&#8243;, ”6.0.0&#8243;, ”expressInstall.swf”, {name1:”hello”,name2:”world”,name3:”foobar”}, {menu:”false”}, {id:”dynamicContent5&#8243;,name:”dynamicContent5&#8243;}); &#60;/script&#62; &#160; SWFObject Downland]]></description>
			<content:encoded><![CDATA[<p>“<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/swfobject" title="查看 SWFObject 中的全部文章" target="_blank">SWFObject</a></span>”是利用Javascript 插入flash，好处多多，代码简洁，不会出现IE6下的“单击此处以激活控件”的提示，并且能通过W3C验证。不同于传统的“object”插入flash的方法。</p>
<p><span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/swfobject" title="查看 SWFObject 中的全部文章" target="_blank">SWFObject</a></span>在新的2.x版本中，其最简单的调用竟只需一句话，并且不需要等待页面加载完成，这意味着你可以将这句话写在页面的任何地方。比以前的版本，要简便多了。下面来看几个简单常用的调用方法：</p>
<p>1、最简单，最基本，只要想插入flash都能用到的经典一句话。</p>
<div>&lt;script type=”text/javascript” src=”swfobject.js”&gt;&lt;/script&gt;<br />
&lt;script type=”text/javascript”&gt;<br />
swfobject.embedSWF(“test.swf”, ”swfid”, ”300&#8243;, ”120&#8243;, ”9.0.0&#8243;, ”expressInstall.swf”);<br />
&lt;/script&gt;</p>
<p>&lt;div id=”swfid”&gt;&lt;/div&gt;</p>
<div></div>
</div>
<p>参数注解：调用方法embedSWF——插入SWF文件，参数依次是：<br />
@swf文件的地址；<span id="more-342"></span><br />
@用于装入swf文件的容器(如div)的id；<br />
@flash的宽度；<br />
@flash的高度（当然，这里的宽高都可以使用诸如100%这样的百分比来表示）；<br />
@正常播放该flash所需的最低版本；<br />
@当版本低于要求时，执行该swf文件，这里利用这个flash跳转到官方下载最新版本的flash插件。（该参数可以省略）<br />
在同一个页面插入多个flash到不同位置时，只要重复上面的语句，使用不同的容器id就可以了。</p>
<p>2、给swf文件传递参数、变量、属性的调用方法</p>
<p>&nbsp;</p>
<div>&lt;script type=”text/javascript” src=”swfobject.js”&gt;&lt;/script&gt;<br />
&lt;script type=”text/javascript”&gt;<br />
//1、使用Json初始化变量、参数、属性<br />
var flashvars = {<br />
name1: ”hello”,<br />
name2: ”world”,<br />
name3: ”foobar”<br />
};<br />
var params = {<br />
menu: ”false”<br />
};<br />
var attributes = {<br />
id: ”dynamicContent2&#8243;,<br />
name: ”dynamicContent2&#8243;<br />
};<br />
swfobject.embedSWF(“test6_flashvars.swf”, ”content2&#8243;, ”300&#8243;, ”120&#8243;, ”6.0.0&#8243;, ”expressInstall.swf”, flashvars, params, attributes);</p>
<p>//2、传统的初始化设置，效果一样<br />
var flashvars = {};<br />
flashvars.name1 = ”hello”;<br />
flashvars.name2 = ”world”;<br />
flashvars.name3 = ”foobar”;<br />
var params = {};<br />
params.menu = ”false”;<br />
var attributes = {};<br />
attributes.id = ”dynamicContent3&#8243;;<br />
attributes.name = ”dynamicContent3&#8243;;<br />
swfobject.embedSWF(“test6_flashvars.swf”, ”content3&#8243;, ”300&#8243;, ”120&#8243;, ”6.0.0&#8243;, ”expressInstall.swf”, flashvars, params, attributes);<br />
//3、直接写在后面，就一句话，简洁剽悍，不拖泥带水<br />
swfobject.embedSWF(“test6_flashvars.swf”, ”content5&#8243;, ”300&#8243;, ”120&#8243;, ”6.0.0&#8243;, ”expressInstall.swf”, {name1:”hello”,name2:”world”,name3:”foobar”}, {menu:”false”}, {id:”dynamicContent5&#8243;,name:”dynamicContent5&#8243;});<br />
&lt;/script&gt;</p>
<div></div>
</div>
<p>&nbsp;</p>
<p><strong><a href="http://code.google.com/p/swfobject/" target="_blank">SWFObject Downland</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mzfeng.com/html/y2012/342.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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内核的功能，它提供支持访问控制的安全政策保护机制。它可以大部分的攻击。下面我们来看如何启动基于<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>中文版putty后门事件后的几个需要注意的地方</title>
		<link>http://www.mzfeng.com/html/y2012/340.html</link>
		<comments>http://www.mzfeng.com/html/y2012/340.html#comments</comments>
		<pubDate>Wed, 01 Feb 2012 15:34:45 +0000</pubDate>
		<dc:creator>mzfeng</dc:creator>
				<category><![CDATA[互联网]]></category>
		<category><![CDATA[putty后门事件]]></category>

		<guid isPermaLink="false">http://www.mzfeng.com/?p=340</guid>
		<description><![CDATA[这几天互联网上爆出中文版putty后门事件，引起技术界一片恐慌，大家都争先修改密码、修改端口。这次事件起因就是汉化出来的PUTTY给植入后门了，最主要还是这个软件是连接和管理LINUX服务器的软件。这个软件本来就很小，在网上一搜一大片，很多人都是直接下载就使用，从来都没有怀疑过会出问题；最后就是帐号密码给人家盗走了。 这次事件带来的几个问题值得我们深思: 1.大家尽量使用原官网下载软件来使用。作为国人来讲，下载使用国外软件首先考虑的还是软件是否中文版，但国外软件经过别人汉化有可能给人家植入后门或者病毒；他们可以使软件可以正常运行，同时释放病毒或者开启后门，这样对一般用户来讲很难察觉的。所以，大家尽量在官网下载，比较下载好软件后最好还是进行一下MD5效验。 2.比较常用的软件应该自己拷贝起来自己留用。一些经常使用的软件，可以复制到自己的电脑中留用，经常往外跑或者换电脑的用U盘或者是自己组建个FTP放着。不用每次都是网上搜网上DOWN.当然也可以传到现在时很多免费的网盘，云盘或者邮箱之类的网络储存。要用的时候再去自己的空间下载。 3.要养成经常更改密码的习惯。很多人把服务器弄好后直接把密码保存在软件里面；要用的时候直接联接。久了，自己还会忘记密码。作为技术人员应该经常修改密码，把比较主要的密码要做个备案。一段时候要记得修改密码。]]></description>
			<content:encoded><![CDATA[<p>这几天互联网上爆出中文版<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/putty%e5%90%8e%e9%97%a8%e4%ba%8b%e4%bb%b6" title="查看 putty后门事件 中的全部文章" target="_blank">putty后门事件</a></span>，引起技术界一片恐慌，大家都争先修改密码、修改端口。这次事件起因就是汉化出来的PUTTY给植入后门了，最主要还是这个软件是连接和管理LINUX服务器的软件。这个软件本来就很小，在网上一搜一大片，很多人都是直接下载就使用，从来都没有怀疑过会出问题；最后就是帐号密码给人家盗走了。<br />
这次事件带来的几个问题值得我们深思:<br />
1.大家尽量使用原官网下载软件来使用。作为国人来讲，下载使用国外软件首先考虑的还是软件是否中文版，但国外软件经过别人汉化有可能给人家植入后门或者病毒；他们可以使软件可以正常运行，同时释放病毒或者开启后门，这样对一般用户来讲很难察觉的。所以，大家尽量在官网下载，比较下载好软件后最好还是进行一下MD5效验。<br />
2.比较常用的软件应该自己拷贝起来自己留用。一些经常使用的软件，可以复制到自己的电脑中留用，经常往外跑或者换电脑的用U盘或者是自己组建个FTP放着。不用每次都是网上搜网上DOWN.当然也可以传到现在时很多免费的网盘，云盘或者邮箱之类的网络储存。要用的时候再去自己的空间下载。<span id="more-340"></span><br />
3.要养成经常更改密码的习惯。很多人把服务器弄好后直接把密码保存在软件里面；要用的时候直接联接。久了，自己还会忘记密码。作为技术人员应该经常修改密码，把比较主要的密码要做个备案。一段时候要记得修改密码。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mzfeng.com/html/y2012/340.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>超过4G以上的ISO量产方法</title>
		<link>http://www.mzfeng.com/html/y2012/336.html</link>
		<comments>http://www.mzfeng.com/html/y2012/336.html#comments</comments>
		<pubDate>Wed, 01 Feb 2012 07:06:02 +0000</pubDate>
		<dc:creator>mzfeng</dc:creator>
				<category><![CDATA[电脑网络]]></category>
		<category><![CDATA[U盘]]></category>
		<category><![CDATA[量产]]></category>

		<guid isPermaLink="false">http://www.mzfeng.com/?p=336</guid>
		<description><![CDATA[前阵子下载了CENTOS6.2的ISO准备在U盘进行量产，但是量产试了几次都不成功。自己有几个KINGSTON的8G U盘，都拿来试都不行。但量产其它ISO镜像又没问题，在网上找了一下，原来是ISO镜像太于4G的问题。知道问题在那就好解决了，最终量产成功。原来超过4G或4G以上的ISO镜像量产要指定ISO镜像大小，就是我们量产的时候要指定量产的CD-ROM的容量大小，比如是4.5G的ISO镜像，可以把容量设置成4.6G，这样就能量产成功了。]]></description>
			<content:encoded><![CDATA[<p>前阵子下载了CENTOS6.2的ISO准备在<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/u%e7%9b%98" title="查看 U盘 中的全部文章" target="_blank">U盘</a></span>进行<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e9%87%8f%e4%ba%a7" title="查看 量产 中的全部文章" target="_blank">量产</a></span>，但是<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e9%87%8f%e4%ba%a7" title="查看 量产 中的全部文章" target="_blank">量产</a></span>试了几次都不成功。自己有几个KINGSTON的8G <span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/u%e7%9b%98" title="查看 U盘 中的全部文章" target="_blank">U盘</a></span>，都拿来试都不行。但<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e9%87%8f%e4%ba%a7" title="查看 量产 中的全部文章" target="_blank">量产</a></span>其它ISO镜像又没问题，在网上找了一下，原来是ISO镜像太于4G的问题。知道问题在那就好解决了，最终量产成功。原来超过4G或4G以上的ISO镜像量产要指定ISO镜像大小，就是我们量产的时候要指定量产的CD-ROM的容量大小，比如是4.5G的ISO镜像，可以把容量设置成4.6G，这样就能量产成功了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mzfeng.com/html/y2012/336.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mzfeng.com域名终于回来了</title>
		<link>http://www.mzfeng.com/html/y2012/335.html</link>
		<comments>http://www.mzfeng.com/html/y2012/335.html#comments</comments>
		<pubDate>Wed, 01 Feb 2012 01:37:01 +0000</pubDate>
		<dc:creator>mzfeng</dc:creator>
				<category><![CDATA[生活琐碎]]></category>

		<guid isPermaLink="false">http://www.mzfeng.com/?p=335</guid>
		<description><![CDATA[域名终于经过抢注回来了。。去年由于域名没有及时续费所以导致域名流失了，现在终于注册回来了。可以继续写我的Blog了。以后写篇抢注域名的介绍。]]></description>
			<content:encoded><![CDATA[<p>域名终于经过抢注回来了。。去年由于域名没有及时续费所以导致域名流失了，现在终于注册回来了。可以继续写我的Blog了。以后写篇抢注域名的介绍。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mzfeng.com/html/y2012/335.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>轻松搞定window2003 超出远程连接限制</title>
		<link>http://www.mzfeng.com/html/y2010/333.html</link>
		<comments>http://www.mzfeng.com/html/y2010/333.html#comments</comments>
		<pubDate>Thu, 02 Sep 2010 21:44:33 +0000</pubDate>
		<dc:creator>mzfeng</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[window2003]]></category>
		<category><![CDATA[远程连接]]></category>
		<category><![CDATA[限制]]></category>

		<guid isPermaLink="false">http://www.mzfeng.com/?p=333</guid>
		<description><![CDATA[windows2003 server远程终端连接有2个连接数的限制，如果用户登陆后未注销或有超过2人同时登陆时会出现终端超过最大连接数的提示。 解决方法： 1、如果能telnet登录的话，telnet上去，然后执行query user命令，使用logoff命令注销相关用户。(一般都很难telenet上去，至少我连不上) 2、没有telnet的，如果服务器安装了sqlserver，使用sqlserver的xp_cmdshell语句执行cmd命令，xp_cmdshell &#8216;query user&#8217;;xp_cmdshell &#8216;logoff #管道id&#8217;。 3、如果mstsc的版本是5的话，可以运行 &#8216;mstsc -console&#8217; 来连接到服务器的终端，不受远程连接数的影响。适于于 XP SP2。  4、如果mstsc的版本是6的话，可以运行 &#8216;mstsc -admin&#8217; 来连接到服务器的终端。适于于Vista SP1, Server 2008, XP SP3。 5、运行 mstsc /v:IP /console 就可以连接到远程系统的的0会话, mstsc 还有很多参数 可以运行 mstsc /?来查看. 适用于xp。 6、运行“tsmmc.msc”就可以打开远程桌面连接,在这里我们添加一个新的连接,输入对方的IP地址帐号和密码后就可以成功登陆到对方的桌面中,这时可以再踢下一个用户.适用于windows2003。 7、 通过设置解决，输入“gpedit.msc”，回车后打开组策略窗口，然后依次定位到“计算机配置→管理模板→终端服务→会话”，然后在右侧窗口中双击“为断开的会话设置时间限制”，在打开的窗口中将“结束断开连接的会话”时间设置为5分钟 好了，问题解决了，继续工作，有和我一样问题的朋友快去试试吧~~~]]></description>
			<content:encoded><![CDATA[<p>windows2003 server远程终端连接有2个连接数的<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e9%99%90%e5%88%b6" title="查看 限制 中的全部文章" target="_blank">限制</a></span>，如果用户登陆后未注销或有超过2人同时登陆时会出现终端超过最大连接数的提示。<br />
解决方法：<br />
1、如果能telnet登录的话，telnet上去，然后执行query user命令，使用logoff命令注销相关用户。(一般都很难telenet上去，至少我连不上)<br />
2、没有telnet的，如果服务器安装了sqlserver，使用sqlserver的xp_cmdshell语句执行cmd命令，xp_cmdshell &#8216;query user&#8217;;xp_cmdshell &#8216;logoff #管道id&#8217;。<br />
3、如果mstsc的版本是5的话，可以运行 &#8216;mstsc -console&#8217; 来连接到服务器的终端，不受<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e8%bf%9c%e7%a8%8b%e8%bf%9e%e6%8e%a5" title="查看 远程连接 中的全部文章" target="_blank">远程连接</a></span>数的影响。适于于 XP SP2。 <br />
4、如果mstsc的版本是6的话，可以运行 &#8216;mstsc -admin&#8217; 来连接到服务器的终端。适于于Vista SP1, Server 2008, XP SP3。<span id="more-333"></span><br />
5、运行 mstsc /v:IP /console 就可以连接到远程系统的的0会话, mstsc 还有很多参数 可以运行 mstsc /?来查看. 适用于xp。<br />
6、运行“tsmmc.msc”就可以打开远程桌面连接,在这里我们添加一个新的连接,输入对方的IP地址帐号和密码后就可以成功登陆到对方的桌面中,这时可以再踢下一个用户.适用于windows2003。<br />
7、 通过设置解决，输入“gpedit.msc”，回车后打开组策略窗口，然后依次定位到“计算机配置→管理模板→终端服务→会话”，然后在右侧窗口中双击“为断开的会话设置时间<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e9%99%90%e5%88%b6" title="查看 限制 中的全部文章" target="_blank">限制</a></span>”，在打开的窗口中将“结束断开连接的会话”时间设置为5分钟<br />
好了，问题解决了，继续工作，有和我一样问题的朋友快去试试吧~~~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mzfeng.com/html/y2010/333.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>常用SQL语句大全</title>
		<link>http://www.mzfeng.com/html/y2010/332.html</link>
		<comments>http://www.mzfeng.com/html/y2010/332.html#comments</comments>
		<pubDate>Fri, 20 Aug 2010 15:25:41 +0000</pubDate>
		<dc:creator>mzfeng</dc:creator>
				<category><![CDATA[软件应用]]></category>
		<category><![CDATA[SQL语句]]></category>

		<guid isPermaLink="false">http://www.mzfeng.com/?p=332</guid>
		<description><![CDATA[　　SELECT –从数据库表中检索数据行和列 　　INSERT –向数据库表添加新数据行 　　DELETE –从数据库表中删除数据行 　　UPDATE –更新数据库表中的数据 　　–数据定义 　　CREATE TABLE –创建一个数据库表 　　DROP TABLE –从数据库中删除表 　　ALTER TABLE –修改数据库表结构 　　CREATE VIEW –创建一个视图 　　DROP VIEW –从数据库中删除视图 　　CREATE INDEX –为数据库表创建一个索引 　　DROP INDEX –从数据库中删除索引 　　CREATE PROCEDURE –创建一个存储过程 　　DROP PROCEDURE –从数据库中删除存储过程 　　CREATE TRIGGER –创建一个触发器 　　DROP TRIGGER –从数据库中删除触发器 　　CREATE SCHEMA –向数据库添加一个新模式 　　DROP SCHEMA –从数据库中删除一个模式 　　CREATE DOMAIN –创建一个数据值域 　　ALTER DOMAIN –改变域定义 　　DROP [...]]]></description>
			<content:encoded><![CDATA[<p>　　SELECT –从数据库表中检索数据行和列</p>
<p>　　INSERT –向数据库表添加新数据行</p>
<p>　　DELETE –从数据库表中删除数据行</p>
<p>　　UPDATE –更新数据库表中的数据</p>
<p>　　–数据定义</p>
<p>　　CREATE TABLE –创建一个数据库表</p>
<p>　　DROP TABLE –从数据库中删除表</p>
<p>　　ALTER TABLE –修改数据库表结构</p>
<p>　　CREATE VIEW –创建一个视图<span id="more-332"></span></p>
<p>　　DROP VIEW –从数据库中删除视图</p>
<p>　　CREATE INDEX –为数据库表创建一个索引</p>
<p>　　DROP INDEX –从数据库中删除索引</p>
<p>　　CREATE PROCEDURE –创建一个存储过程</p>
<p>　　DROP PROCEDURE –从数据库中删除存储过程</p>
<p>　　CREATE TRIGGER –创建一个触发器</p>
<p>　　DROP TRIGGER –从数据库中删除触发器</p>
<p>　　CREATE SCHEMA –向数据库添加一个新模式</p>
<p>　　DROP SCHEMA –从数据库中删除一个模式</p>
<p>　　CREATE DOMAIN –创建一个数据值域</p>
<p>　　ALTER DOMAIN –改变域定义</p>
<p>　　DROP DOMAIN –从数据库中删除一个域</p>
<p>　–数据控制</p>
<p>　　GRANT –授予用户访问权限</p>
<p>　　DENY –拒绝用户访问</p>
<p>　　REVOKE –解除用户访问权限</p>
<p>　　–事务控制</p>
<p>　　COMMIT –结束当前事务</p>
<p>　　ROLLBACK –中止当前事务</p>
<p>　　SET TRANSACTION –定义当前事务数据访问特征</p>
<p>　　–程序化SQL</p>
<p>　　DECLARE –为查询设定游标</p>
<p>　　EXPLAN –为查询描述数据访问计划</p>
<p>　　OPEN –检索查询结果打开一个游标</p>
<p>　　FETCH –检索一行查询结果</p>
<p>　　CLOSE –关闭游标</p>
<p>　　PREPARE –为动态执行准备SQL 语句</p>
<p>　　EXECUTE –动态地执行SQL 语句</p>
<p>　　DESCRIBE –描述准备好的查询</p>
<p>　　—局部变量</p>
<p>　　declare @id char(10)</p>
<p>　　–set @id = ’10010001′</p>
<p>　　select @id = ’10010001′</p>
<p>—全局变量</p>
<p>　　—必须以@@开头</p>
<p>　　–IF ELSE　　</p>
<p>declare @x int @y int @z int<br />
　　select @x = 1 @y = 2 @z=3<br />
　　if @x &gt; @y<br />
　　print ‘x &gt; y’ –打印字符串’x &gt; y’<br />
　　else if @y &gt; @z<br />
　　print ‘y &gt; z’<br />
　　else print ‘z &gt; y’</p>
<p>　　–CASE　　</p>
<p>use pangu<br />
　　update employee<br />
　　set e_wage =<br />
　　case<br />
　　when job_level = ’1’ then e_wage*1.08<br />
　　when job_level = ’2’ then e_wage*1.07<br />
　　when job_level = ’3’ then e_wage*1.06<br />
　　else e_wage*1.05<br />
　　end</p>
<p>　　–WHILE CONTINUE BREAK　　</p>
<p>declare @x int @y int @c int<br />
　　select @x = 1 @y=1<br />
　　while @x &lt; 3<br />
　　begin<br />
　　print @x &#8211;打印变量x 的值<br />
　　while @y &lt; 3<br />
　　begin<br />
　　select @c = 100*@x + @y<br />
　　print @c &#8211;打印变量c 的值<br />
　　select @y = @y + 1<br />
　　end<br />
　　select @x = @x + 1<br />
　　select @y = 1<br />
　　end</p>
<p>&#8211;WAITFOR</p>
<p>　　&#8211;例 等待1 小时2 分零3 秒后才执行SELECT 语句　</p>
<p>waitfor delay ’01:02:03’<br />
　　select * from employee</p>
<p>　　&#8211;例 等到晚上11 点零8 分后才执行SELECT 语句　　</p>
<p>waitfor time ’23:08:00’<br />
　　select * from employee</p>
<p>　　***SELECT***　</p>
<p>select *(列名) from table_name(表名) where column_name operator value<br />
　　ex:(宿主)<br />
　　select * from stock_information where stockid = str(nid)<br />
　　stockname = &#8216;str_name&#8217;<br />
　　stockname like &#8216;% find this %&#8217;<br />
　　stockname like &#8216;[a-zA-Z]%&#8217; &#8212;&#8212;&#8212; ([]指定值的范围)<br />
　　stockname like &#8216;[^F-M]%&#8217; &#8212;&#8212;&#8212; (^排除指定范围)<br />
　　&#8212;&#8212;&#8212; 只能在使用like关键字的where子句中使用通配符)<br />
　　or stockpath = &#8216;stock_path&#8217;<br />
　　or stocknumber &lt; 1000<br />
　　and stockindex = 24<br />
　　not stock*** = &#8216;man&#8217;<br />
　　stocknumber between 20 and 100<br />
　　stocknumber in(10,20,30)<br />
　　order by stockid desc(asc) &#8212;&#8212;&#8212; 排序，desc-降序，asc-升序<br />
　　order by 1,2 &#8212;&#8212;&#8212; by列号<br />
　　stockname = (select stockname from stock_information where stockid = 4)</p>
<p>　　&#8212;&#8212;&#8212; 子查询</p>
<p>　　&#8212;&#8212;&#8212; 除非能确保内层select只返回一个行的值，</p>
<p>　　&#8212;&#8212;&#8212; 否则应在外层where子句中用一个in限定符　</p>
<p>select distinct column_name form table_name &#8212;&#8212;&#8212; distinct指定检索独有的列值，不重复<br />
　　select stocknumber ,stocknumber + 10 = stocknumber + 10 from table_name<br />
　　select stockname , stocknumber = count(*) from table_name group by stockname</p>
<p>　　&#8212;&#8212;&#8212; group by 将表按行分组,指定列中有相同的值　　</p>
<p>having count(*) = 2 &#8212;&#8212;&#8212; having选定指定的组<br />
　　select *<br />
　　from table1, table2<br />
　　where table1.id *= table2.id &#8212;&#8212;&#8211; 左外部连接，table1中有的而table2中没有得以null表示<br />
　　table1.id =* table2.id &#8212;&#8212;&#8211; 右外部连接<br />
　　select stockname from table1<br />
　　union [all] &#8212;&#8211; union合并查询结果集，all-保留重复行<br />
　　select stockname from table2</p>
<p>　***insert***　　</p>
<p>insert into table_name (Stock_name,Stock_number) value (xxx,xxxx)<br />
　　value (select Stockname , Stocknumber from Stock_table2)&#8212;value为select语句</p>
<p>　　***update***　　</p>
<p>update table_name set Stockname = xxx [where Stockid = 3]<br />
　　Stockname = default<br />
　　Stockname = null<br />
　　Stocknumber = Stockname + 4</p>
<p>　　***delete***　　</p>
<p>delete from table_name where Stockid = 3<br />
　　truncate table_name &#8212;&#8212;&#8212;&#8211; 删除表中所有行，仍保持表的完整性<br />
　　drop table table_name &#8212;&#8212;&#8212;&#8212;&#8212; 完全删除表</p>
<p>　　***alter table*** &#8212; 修改数据库表结构　　</p>
<p>alter table database.owner.table_name add column_name char(2) null &#8230;..<br />
　　sp_help table_name &#8212;- 显示表已有特征<br />
　　create table table_name (name char(20), age smallint, lname varchar(30))<br />
　　insert into table_name select &#8230;&#8230;&#8230; &#8212;&#8211; 实现删除列的方法(创建新表)<br />
　　alter table table_name drop constraint Stockname_default &#8212;- 删除Stockname的default约束</p>
<p>　　***function(/*常用函数*/)***</p>
<p>　　&#8212;-统计函数&#8212;-</p>
<p>　　***G &#8211;求平均值</p>
<p>　　COUNT &#8211;统计数目</p>
<p>　　MAX &#8211;求最大值</p>
<p>　　MIN &#8211;求最小值</p>
<p>　　SUM &#8211;求和</p>
<p>　　&#8211;***G　</p>
<p>use pangu<br />
　　select avg(e_wage) as dept_avgWage<br />
　　from employee<br />
　　group by dept_id</p>
<p>&#8211;MAX</p>
<p>　　&#8211;求工资最高的员工姓名</p>
<p>use pangu<br />
　　select e_name<br />
　　from employee<br />
　　where e_wage =<br />
　　(select max(e_wage)<br />
　　from employee)</p>
<p>　　&#8211;STDEV()</p>
<p>　　&#8211;STDEV()函数返回表达式中所有数据的标准差</p>
<p>　　&#8211;STDEVP()</p>
<p>　　&#8211;STDEVP()函数返回总体标准差</p>
<p>　　&#8211;VAR()</p>
<p>　　&#8211;VAR()函数返回表达式中所有值的统计变异数</p>
<p>　　&#8211;VARP()</p>
<p>　　&#8211;VARP()函数返回总体变异数</p>
<p>　　&#8212;-算术函数&#8212;-</p>
<p>　　/***三角函数***/</p>
<p>　　SIN(float_expression) &#8211;返回以弧度表示的角的正弦</p>
<p>　　COS(float_expression) &#8211;返回以弧度表示的角的余弦</p>
<p>　　TAN(float_expression) &#8211;返回以弧度表示的角的正切</p>
<p>　　COT(float_expression) &#8211;返回以弧度表示的角的余切</p>
<p>/***反三角函数***/</p>
<p>　　ASIN(float_expression) &#8211;返回正弦是FLOAT 值的以弧度表示的角</p>
<p>　　ACOS(float_expression) &#8211;返回余弦是FLOAT 值的以弧度表示的角</p>
<p>　　ATAN(float_expression) &#8211;返回正切是FLOAT 值的以弧度表示的角</p>
<p>　　ATAN2(float_expression1,float_expression2)</p>
<p>　　&#8211;返回正切是float_expression1 /float_expres-sion2的以弧度表示的角</p>
<p>　　DEGREES(numeric_expression)</p>
<p>　　&#8211;把弧度转换为角度返回与表达式相同的数据类型可为</p>
<p>　　&#8211;INTEGER/MONEY/REAL/FLOAT 类型</p>
<p>　　RADIANS(numeric_expression) &#8211;把角度转换为弧度返回与表达式相同的数据类型可为</p>
<p>　　&#8211;INTEGER/MONEY/REAL/FLOAT 类型</p>
<p>　　EXP(float_expression) &#8211;返回表达式的指数值</p>
<p>　　LOG(float_expression) &#8211;返回表达式的自然对数值</p>
<p>　　LOG10(float_expression)&#8211;返回表达式的以10 为底的对数值</p>
<p>　　SQRT(float_expression) &#8211;返回表达式的平方根</p>
<p>　　/***取近似值函数***/</p>
<p>　　CEILING(numeric_expression) &#8211;返回&gt;=表达式的最小整数返回的数据类型与表达式相同可为</p>
<p>　　–INTEGER/MONEY/REAL/FLOAT 类型</p>
<p>　　FLOOR(numeric_expression) –返回&lt;=表达式的最小整数返回的数据类型与表达式相同可为</p>
<p>　　&#8211;INTEGER/MONEY/REAL/FLOAT 类型</p>
<p>　　ROUND(numeric_expression) &#8211;返回以integer_expression 为精度的四舍五入值返回的数据</p>
<p>　　&#8211;类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型</p>
<p>　　ABS(numeric_expression) &#8211;返回表达式的绝对值返回的数据类型与表达式相同可为</p>
<p>　　&#8211;INTEGER/MONEY/REAL/FLOAT 类型</p>
<p>　　SIGN(numeric_expression) &#8211;测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型</p>
<p>　　&#8211;与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型</p>
<p>　　PI() &#8211;返回值为π 即3.1415926535897936</p>
<p>　　RAND([integer_expression]) &#8211;用任选的[integer_expression]做种子值得出0-1 间的随机浮点数</p>
<p>&#8212;-字符串函数&#8212;-</p>
<p>　　ASCII() &#8211;函数返回字符表达式最左端字符的ASCII 码值</p>
<p>　　CHAR() &#8211;函数用于将ASCII 码转换为字符</p>
<p>　　&#8211;如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值</p>
<p>　　LOWER() &#8211;函数把字符串全部转换为小写</p>
<p>　　UPPER() &#8211;函数把字符串全部转换为大写</p>
<p>　　STR() &#8211;函数把数值型数据转换为字符型数据</p>
<p>　　LTRIM() &#8211;函数把字符串头部的空格去掉</p>
<p>　　RTRIM() &#8211;函数把字符串尾部的空格去掉</p>
<p>　　LEFT(),RIGHT(),SUBSTRING() &#8211;函数返回部分字符串</p>
<p>　　CHARINDEX(),PATINDEX() &#8211;函数返回字符串中某个指定的子串出现的开始位置</p>
<p>　　SOUNDEX() &#8211;函数返回一个四位字符码</p>
<p>　　&#8211;SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值</p>
<p>　　DIFFERENCE() &#8211;函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异</p>
<p>　　&#8211;0 两个SOUNDEX 函数返回值的第一个字符不同</p>
<p>　　&#8211;1 两个SOUNDEX 函数返回值的第一个字符相同</p>
<p>　　&#8211;2 两个SOUNDEX 函数返回值的第一二个字符相同</p>
<p>　　&#8211;3 两个SOUNDEX 函数返回值的第一二三个字符相同</p>
<p>　　&#8211;4 两个SOUNDEX 函数返回值完全相同</p>
<p>QUOTENAME() &#8211;函数返回被特定字符括起来的字符串　</p>
<p>select quotename(&#8216;abc&#8217;, &#8216;{&#8216;) quotename(&#8216;abc&#8217;)</p>
<p>　　运行结果如下</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-{</p>
<p>　　{abc} [abc]*/</p>
<p>　　REPLICATE() &#8211;函数返回一个重复character_expression 指定次数的字符串</p>
<p>　　以下是引用片段：　</p>
<p>select replicate(&#8216;abc&#8217;, 3) replicate( &#8216;abc&#8217;, -2)</p>
<p>　　运行结果如下</p>
<p>　　&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8211;</p>
<p>　　abcabcabc NULL*/</p>
<p>　　REVERSE() &#8211;函数将指定的字符串的字符排列顺序颠倒</p>
<p>　　REPLACE() &#8211;函数返回被替换了指定子串的字符串</p>
<p>　　/*select replace(&#8216;abc123g&#8217;, &#8217;123&#8242;, &#8216;def&#8217;)</p>
<p>　　运行结果如下</p>
<p>　　&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8211;</p>
<p>　　abcdefg*/</p>
<p>　　SPACE() &#8211;函数返回一个有指定长度的空白字符串</p>
<p>　　STUFF() &#8211;函数用另一子串替换字符串指定位置长度的子串</p>
<p>　&#8212;-数据类型转换函数&#8212;-</p>
<p>　　CAST() 函数语法如下　</p>
<p>CAST() ( AS [ length ])</p>
<p>　　CONVERT() 函数语法如下　</p>
<p>CONVERT() ([ length ], [, style])<br />
　</p>
<p>select cast(100+99 as char) convert(varchar(12), getdate())</p>
<p>　　运行结果如下</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;</p>
<p>　　199 Jan 15 2000</p>
<p>　　&#8212;-日期函数&#8212;-</p>
<p>　　DAY() &#8211;函数返回date_expression 中的日期值</p>
<p>　　MONTH() &#8211;函数返回date_expression 中的月份值</p>
<p>　　YEAR() &#8211;函数返回date_expression 中的年份值</p>
<p>　　DATEADD( , ,)</p>
<p>　　&#8211;函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期</p>
<p>　　DATEDIFF( , ,)</p>
<p>　　&#8211;函数返回两个指定日期在datepart 方面的不同之处</p>
<p>　　DATENAME( , ) &#8211;函数以字符串的形式返回日期的指定部分</p>
<p>　　DATEPART( , ) &#8211;函数以整数值的形式返回日期的指定部分</p>
<p>　　GETDATE() &#8211;函数以DATETIME 的缺省格式返回系统当前的日期和时间</p>
<p>&#8212;-系统函数&#8212;-</p>
<p>　　APP_NAME() &#8211;函数返回当前执行的应用程序的名称</p>
<p>　　COALESCE() &#8211;函数返回众多表达式中第一个非NULL 表达式的值</p>
<p>　　COL_LENGTH(&lt;&#8217;table_name&#8217;&gt;, &lt;&#8217;column_name&#8217;&gt;) –函数返回表中指定字段的长度值</p>
<p>　　COL_NAME(, ) –函数返回表中指定字段的名称即列名</p>
<p>　　DATALENGTH() –函数返回数据表达式的数据的实际长度</p>
<p>　　DB_ID(['database_name']) –函数返回数据库的编号</p>
<p>　　DB_NAME(database_id) –函数返回数据库的名称</p>
<p>　　HOST_ID() –函数返回服务器端计算机的名称</p>
<p>　　HOST_NAME() –函数返回服务器端计算机的名称</p>
<p>　　IDENTITY([, seed increment]) [AS column_name])</p>
<p>　　–IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中　</p>
<p>/*select identity(int, 1, 1) as column_name<br />
　　into newtable<br />
　　from oldtable*/</p>
<p>　　ISDATE() –函数判断所给定的表达式是否为合理日期</p>
<p>　　ISNULL(, ) –函数将表达式中的NULL 值用指定值替换</p>
<p>　　ISNUMERIC() –函数判断所给定的表达式是否为合理的数值</p>
<p>　　NEWID() –函数返回一个UNIQUEIDENTIFIER 类型的数值</p>
<p>　　NULLIF(, )</p>
<p>　　–NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值</p>
<p>　sql中的保留字</p>
<p>　　action add aggregate all</p>
<p>　　alter after and as</p>
<p>　　asc avg avg_row_length auto_increment</p>
<p>　　between bigint bit binary</p>
<p>　　blob bool both by</p>
<p>　　cascade case char character</p>
<p>　　change check checksum column</p>
<p>　　columns comment constraint create</p>
<p>　　cross current_date current_time current_timestamp</p>
<p>　　data database databases date</p>
<p>　　datetime day day_hour day_minute</p>
<p>　　day_second dayofmonth dayofweek dayofyear</p>
<p>　　dec decimal default delayed</p>
<p>　　delay_key_write delete desc describe</p>
<p>　　distinct distinctrow double drop</p>
<p>　　end else escape escaped</p>
<p>　　enclosed enum explain exists</p>
<p>　　fields file first float</p>
<p>　　float4 float8 flush foreign</p>
<p>　　from for full function</p>
<p>　　global grant grants group</p>
<p>　　having heap high_priority hour</p>
<p>　　hour_minute hour_second hosts identified</p>
<p>　　ignore in index infile</p>
<p>　　inner insert insert_id int</p>
<p>　　integer interval int1 int2</p>
<p>　　int3 int4 int8 into</p>
<p>　　if is isam join</p>
<p>　　key keys kill last_insert_id</p>
<p>　　leading left length like</p>
<p>　　lines limit load local</p>
<p>　　lock logs long longblob</p>
<p>　　longtext low_priority max max_rows</p>
<p>　　match mediumblob mediumtext mediumint</p>
<p>　　middleint min_rows minute minute_second</p>
<p>　　modify month monthname myisam</p>
<p>　natural numeric no not</p>
<p>　　null on optimize option</p>
<p>　　optionally or order outer</p>
<p>　　outfile pack_keys partial password</p>
<p>　　precision primary procedure process</p>
<p>　　processlist privileges read real</p>
<p>　　references reload regexp rename</p>
<p>　　replace restrict returns revoke</p>
<p>　　rlike row rows second</p>
<p>　　select set show shutdown</p>
<p>　　smallint soname sql_big_tables sql_big_selects</p>
<p>　　sql_low_priority_updates sql_log_off sql_log_update sql_select_limit</p>
<p>　　sql_small_result sql_big_result sql_warnings straight_join</p>
<p>　　starting status string table</p>
<p>　　tables temporary terminated text</p>
<p>　　then time timestamp tinyblob</p>
<p>　　tinytext tinyint trailing to</p>
<p>　　type use using unique</p>
<p>　　unlock unsigned update usage</p>
<p>　　values varchar variables varying</p>
<p>　　varbinary with write when</p>
<p>　　where year year_month zerofill</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mzfeng.com/html/y2010/332.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysqld-nt.exe大量占用CPU问题的解决方法</title>
		<link>http://www.mzfeng.com/html/y2010/330.html</link>
		<comments>http://www.mzfeng.com/html/y2010/330.html#comments</comments>
		<pubDate>Sat, 14 Aug 2010 12:08:26 +0000</pubDate>
		<dc:creator>mzfeng</dc:creator>
				<category><![CDATA[软件应用]]></category>
		<category><![CDATA[mysqld]]></category>
		<category><![CDATA[数据表]]></category>

		<guid isPermaLink="false">http://www.mzfeng.com/?p=330</guid>
		<description><![CDATA[早上帮朋友一台服务器解决了 Mysql cpu 占用 100% 的问题，稍整理如下，希望对各位有所帮助。 该主机 (Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下。此主机有10个左右的 database, 分别给十个网站调用。据朋友测试，导致 mysqld-nt.exe cpu 占用奇高的是网站A，一旦在 IIS 中将此网站停止服务，CPU 占用就降下来了。一启用，则马上上升。 MYSQL CPU 占用 100% 的解决过程 今天早上仔细检查了一下。目前此网站的七日平均日 IP 为2000，PageView 为 3万左右。网站A 用的 database 目前有39个表，记录数 60.1万条，占空间 45MB。按这个数据，MySQL 不可能占用这么高的资源。 于是在服务器上运行命令，将 mysql 当前的环境变量输出到文件 output.txt： d:\web\mysql&#62;mysqld.exe&#8211;help&#62;output.txt 发现 tmp_table_size 的值是默认的 [...]]]></description>
			<content:encoded><![CDATA[<p>早上帮朋友一台服务器解决了 Mysql cpu 占用 100% 的问题，稍整理如下，希望对各位有所帮助。</p>
<p>该主机 (Windows 2003 +  IIS + PHP + MYSQL )近来 MySQL 服务进程 (<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/mysqld" title="查看 mysqld 中的全部文章" target="_blank">mysqld</a></span>-nt.exe) CPU  占用率总为 100% 高居不下。此主机有10个左右的  database, 分别给十个网站调用。据朋友测试，导致 <span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/mysqld" title="查看 mysqld 中的全部文章" target="_blank">mysqld</a></span>-nt.exe  cpu 占用奇高的是网站A，一旦在 IIS 中将此网站停止服务，CPU  占用就降下来了。一启用，则马上上升。</p>
<p>MYSQL CPU 占用 100% 的解决过程</p>
<p>今天早上仔细检查了一下。目前此网站的七日平均日 IP 为2000，PageView 为 3万左右。网站A 用的 database  目前有39个表，记录数 60.1万条，占空间 45MB。按这个数据，MySQL 不可能占用这么高的资源。</p>
<p>于是在服务器上运行命令，将 mysql  当前的环境变量输出到文件 output.txt：</p>
<p>d:\web\mysql&gt;<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/mysqld" title="查看 mysqld 中的全部文章" target="_blank">mysqld</a></span>.exe&#8211;help&gt;output.txt</p>
<p>发现 tmp_table_size 的值是默认的 32M，于是修改 My.ini, 将 tmp_table_size 赋值到 200M:</p>
<p>d:\web\mysql&gt;notepad c:\windows\my.ini[mysqld]tmp_table_size=200M</p>
<p>然后重启 MySQL 服务。CPU 占用有轻微下降，以前的CPU 占用波形图是 100% 一根直线，现在则在  97%~100%之间起伏。这表明调整 tmp_table_size 参数对 MYSQL 性能提升有改善作用。但问题还没有完全解决。</p>
<p><span id="more-330"></span></p>
<p>于是进入  mysql 的 shell 命令行，调用 show processlist, 查看当前 mysql 使用频繁的 sql 语句：</p>
<p>mysql&gt;show processlist;</p>
<p>反复调用此命令(每秒刷两次），发现网站 A 的两个 SQL  语句经常在 process list 中出现，其语法如下：</p>
<p>SELECT  t1.pid, t2.userid, t3.count,  t1.date FROM _mydata AS t1LEFT JOIN  _myuser AS t3 ON t1.userid=t3.useridLEFT  JOIN _mydata_body AS t2 ON  t1.pid=t3.pid ORDER BY t1.pid LIMIT0,15</p>
<p>调用 show columns 检查这三个表的结构 :</p>
<p>mysql&gt;show columns from  _myuser;mysql&gt;show columns from _mydata;mysql&gt;show columns from  _mydata_body;</p>
<p>终于发现了问题所在：_mydata 表，只根据 pid 建立了一个 primary key，但并没有为  userid 建立索引。而在这个 SQL 语句的第一个 LEFT JOIN ON 子句中：</p>
<p>LEFT JOIN _myuser AS t3 ON  t1.userid=t3.userid</p>
<p>_mydata 的 userid 被参与了条件比较运算。于是我为给 _mydata 表根据字段  userid 建立了一个索引：</p>
<p>mysql&gt;ALTER TABLE `_mydata` ADD INDEX ( `userid` )</p>
<p>建立此索引之后，CPU 马上降到了 80% 左右。看到找到了问题所在，于是检查另一个反复出现在 show processlist 中的  sql 语句：</p>
<p>SELECT COUNT(*)FROM _mydata AS t1, _mydata_key AS t2WHERE  t1.pid=t2.pid and t2.keywords=<br />
&#8216;孔雀&#8217;</p>
<p>经 检查 _mydata_key 表的结构，发现它只为  pid 建了了 primary key, 没有为 keywords 建立  index。_mydata_key 目前有 33  万条记录，在没有索引的情况下对33万条记录进行文本检索匹配，不耗费大量的 cpu  时间才怪。看来就是针对这个表的检索出问题了。于是同样为 _mydata_key  表根据字段 keywords 加上索引:</p>
<p>mysql&gt;ALTER TABLE `_mydata_key` ADD INDEX (  `keywords` )</p>
<p>建立此索引之后，CPU立刻降了下来，在 50%~70%之间震荡。</p>
<p>再次调用 show  prosslist，网站A 的sql 调用就很少出现在结果列表中了。但发现此主机运行了几个 Discuz 的论坛程序，  Discuz论坛的好几个表也存在着这个问题。于是顺手一并解决，cpu占用再次降下来了。</p>
<p>至此，问题解决。<br />
1.  增加  tmp_table_size 值。mysql 的配置文件中，tmp_table_size 的默认大小是  32M。如果一张临时表超出该大小，MySQL产生一个  The table tbl_name is full 形式的错误，如果你做很多高级  GROUP BY 查询，增加 tmp_table_size 值。 这是  mysql 官方关于此选项的解释：</p>
<p>tmp_table_size<br />
This  variable determines the  maximum size for a temporary table in memory.  If the table becomes too large, a  MYISAM table is created on disk. Try  to avoid temporary tables by optimizing the  queries where possible, but  where this is not possible, try to ensure temporary  tables are always  stored in memory. Watching the processlist for queries with  temporary  tables that take too long to resolve can give you an early warning  that  tmp_table_size needs to be upped. Be aware that memory is also  allocated  per-thread. An example where upping this worked for more was a  server where I  upped this from 32MB (the default) to 64MB with  immediate effect. The quicker  resolution of queries resulted in less  threads being active at any one time,  with all-round benefits for the  server, and available memory.</p>
<p>2. 对  WHERE, JOIN, MAX(), MIN(), ORDER BY 等子句中的条件判断中用到的字段,应该根据其建立索引 INDEX。</p>
<p>索 引被用来快速找出在一个列上用一特定值的行。没有索引，MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大，花费时间越 多。如果表对于查询的列有一个索引，MySQL能快速到达一个位置去搜寻到数据文件的中间，没有必要考虑所有数据。如果一个表有1000行，这比顺序读取 至少快100倍。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。</p>
<p>根据 mysql 的开发文档:</p>
<p>索引 index 用于：</p>
<p>o 快速找出匹配一个WHERE子句的行<br />
o  当执行联结(JOIN)时，从其他表检索行。<br />
o 对特定的索引列找出MAX()或MIN()值<br />
o  如果排序或分组在一个可用键的最左面前缀上进行(例如，ORDER BY  key_part_1,key_part_2)，排序或分组一个表。如果所有键值部分跟随DESC，键以倒序被读取。<br />
o  在一些情况中，一个查询能被优化来检索值，不用咨询数据文件。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀，为了更快，值可以从索引树被检索出来。</p>
<p>假定你发出下列SELECT语句：</p>
<p>mysql&gt;SELECT*FROM tbl_name WHERE col1=val1  AND col2=val2;</p>
<p>如果一个多列索引存在于col1和col2上，适当的行可以直接被取出。如果分开的单行列索引存在于col1和col2上，优化器试图通过决定哪个索引将找到更少的行并来找出更具限制性的索引并且使用该索引取行。</p>
<p>开发人员做 SQL <span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/%e6%95%b0%e6%8d%ae%e8%a1%a8" title="查看 数据表 中的全部文章" target="_blank">数据表</a></span>设计的时候，一定要通盘考虑清楚。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mzfeng.com/html/y2010/330.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux主机使用DenyHosts阻止SSH暴力攻击</title>
		<link>http://www.mzfeng.com/html/y2010/329.html</link>
		<comments>http://www.mzfeng.com/html/y2010/329.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 00:41:11 +0000</pubDate>
		<dc:creator>mzfeng</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[DenyHosts]]></category>

		<guid isPermaLink="false">http://www.mzfeng.com/?p=329</guid>
		<description><![CDATA[现今很多朋友都在用国外的VPS，国外由于LINUX是免费开源，相比微软的高额的Windows费用，Linux就有很大的优势。从而有很多朋友都采用LINUX来做系统 ；但是网上有很多无聊的人经常在扫描SSH端口,试图连接ssh端口进行暴力破解（穷举扫描），所以建议vps主机的空间,尽量设置复杂的ssh登录密码，还有就是可以使用denyhosts这款软件，它会分析/var/log/secure（redhat，Fedora Core）等日志文件，当发现同一IP在进行多次SSH密码尝试时就会记录IP到/etc/hosts.deny文件，从而达到自动屏蔽该IP的目的。 DenyHosts官方网站为：http://denyhosts.sourceforge.net/ 1、下载DenyHosts 并解压 # wget http://soft.vpser.net/security/denyhosts/DenyHosts-2.6.tar.gz # tar zxvf DenyHosts-2.6.tar.gz # cd DenyHosts-2.6 2、安装、配置和启动 # python setup.py install 默认是安装到/usr/share/denyhosts/目录的,进入相应的目录修改配置文件 # cd /usr/share/denyhosts/ # cp denyhosts.cfg-dist denyhosts.cfg # cp daemon-control-dist daemon-control 默认的设置已经可以适合centos系统环境，你们可以使用vi命令查看一下denyhosts.cfg和daemon-control，里面有详细的解释 接着使用下面命令启动denyhosts程序 # chown root daemon-control # chmod 700 daemon-control # ./daemon-control start 如果要使DenyHosts每次重起后自动启动还需做如下设置： # cd /etc/init.d # ln -s /usr/share/denyhosts/daemon-control denyhosts [...]]]></description>
			<content:encoded><![CDATA[<p>现今很多朋友都在用国外的VPS，国外由于LINUX是免费开源，相比微软的高额的Windows费用，<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/linux" title="查看 Linux 中的全部文章" target="_blank">Linux</a></span>就有很大的优势。从而有很多朋友都采用LINUX来做系统 ；但是网上有很多无聊的人经常在扫描SSH端口,试图连接ssh端口进行暴力破解（穷举扫描），所以建议vps主机的空间,尽量设置复杂的ssh登录密码，还有就是可以使用denyhosts这款软件，它会分析/var/log/secure（redhat，Fedora Core）等日志文件，当发现同一IP在进行多次SSH密码尝试时就会记录IP到/etc/hosts.deny文件，从而达到自动屏蔽该IP的目的。</p>
<p><span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/denyhosts" title="查看 DenyHosts 中的全部文章" target="_blank">DenyHosts</a></span>官方网站为：http://denyhosts.sourceforge.net/</p>
<p>1、下载<span class='wp_keywordlink_affiliate'><a href="http://www.mzfeng.com/html/ytag/denyhosts" title="查看 DenyHosts 中的全部文章" target="_blank">DenyHosts</a></span> 并解压</p>
<p># wget http://soft.vpser.net/security/denyhosts/DenyHosts-2.6.tar.gz<br />
# tar zxvf DenyHosts-2.6.tar.gz<br />
# cd DenyHosts-2.6</p>
<p>2、安装、配置和启动</p>
<p># python setup.py install<br />
默认是安装到/usr/share/denyhosts/目录的,进入相应的目录修改配置文件</p>
<p># cd /usr/share/denyhosts/<br />
# cp denyhosts.cfg-dist denyhosts.cfg<br />
# cp daemon-control-dist daemon-control</p>
<p>默认的设置已经可以适合centos系统环境，你们可以使用vi命令查看一下denyhosts.cfg和daemon-control，里面有详细的解释<br />
接着使用下面命令启动denyhosts程序<br />
# chown root daemon-control<br />
# chmod 700 daemon-control<br />
# ./daemon-control start</p>
<p>如果要使DenyHosts每次重起后自动启动还需做如下设置：<br />
# cd /etc/init.d<br />
# ln -s /usr/share/denyhosts/daemon-control denyhosts<br />
# chkconfig &#8211;add denyhosts<br />
# chkconfig &#8211;level 2345 denyhosts on<br />
或者执行下面的命令，将会修改/etc/rc.local文件：<br />
# echo “/usr/share/denyhosts/daemon-control start” &gt;&gt; /etc/rc.local</p>
<p>DenyHosts配置文件denyhosts.cfg说明：</p>
<p>SECURE_LOG = /var/log/secure</p>
<p>#sshd日志文件，它是根据这个文件来判断的，不同的操作系统，文件名稍有不同。</p>
<p>HOSTS_DENY = /etc/hosts.deny</p>
<p>#控制用户登陆的文件</p>
<p>PURGE_DENY = 5m</p>
<p>#过多久后清除已经禁止的</p>
<p>BLOCK_SERVICE = sshd</p>
<p>#禁止的服务名</p>
<p>DENY_THRESHOLD_INVALID = 1</p>
<p>#允许无效用户失败的次数</p>
<p>DENY_THRESHOLD_VALID = 10</p>
<p>#允许普通用户登陆失败的次数</p>
<p>DENY_THRESHOLD_ROOT = 5</p>
<p>#允许root登陆失败的次数</p>
<p>HOSTNAME_LOOKUP=NO</p>
<p>#是否做域名反解</p>
<p>DAEMON_LOG = /var/log/denyhosts</p>
<p>更多的说明请查看自带的README文本文件，好了以后维护VPS就会省一些心了，但是各位朋友们注意了安全都是相对的哦，没有绝对安全，请定期或不定期的检查你的VPS主机，而且要定时备份你的数据哦。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mzfeng.com/html/y2010/329.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一封程序员的爱情表白书</title>
		<link>http://www.mzfeng.com/html/y2010/327.html</link>
		<comments>http://www.mzfeng.com/html/y2010/327.html#comments</comments>
		<pubDate>Mon, 14 Jun 2010 01:50:41 +0000</pubDate>
		<dc:creator>mzfeng</dc:creator>
				<category><![CDATA[互联网]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[表白书]]></category>

		<guid isPermaLink="false">http://www.mzfeng.com/?p=327</guid>
		<description><![CDATA[原文出处：http://www.1985y.com.cn/188.html 我能抽象出整个世界．．． 但是我不能抽象出你．．． 因为你在我心中是那么的具体．．． 所以我的世界并不完整．．． 我可以重载甚至覆盖这个世界里的任何一种方法．．． 但是我却不能重载对你的思念．．． 也许命中注定了 你在我的世界里永远的烙上了静态的属性．．． 而我不慎调用了爱你这个方法．．． 当我义无返顾的把自己作为参数传进这个方法时．．． 我才发现爱上你是一个死循环．．． 它不停的返回对你的思念压入我心里的堆栈．．． 在这无尽的黑夜中．．． 我的内存里已经再也装不下别人．．． 我不停的向系统申请空间．．． 但却捕获一个异常－－－我爱的人不爱我．．． 为了解决这个异常．．． 我愿意虚拟出最后一点内存．．． 把所有我能实现的方法地址压入堆栈．．． 并且在栈尾压入最后一个方法－－－将字符串＂我爱你，你爱我吗？＂传递给你．．． 如果返回值为真－－我将用尽一生去爱你．．． 否则－－我将释放掉所有系资源．]]></description>
			<content:encoded><![CDATA[<p>原文出处：http://www.1985y.com.cn/188.html</p>
<p>我能抽象出整个世界．．．<br />
但是我不能抽象出你．．．<br />
因为你在我心中是那么的具体．．．<br />
所以我的世界并不完整．．．<br />
我可以重载甚至覆盖这个世界里的任何一种方法．．．<br />
但是我却不能重载对你的思念．．．<br />
也许命中注定了 你在我的世界里永远的烙上了静态的属性．．．<br />
而我不慎调用了爱你这个方法．．．<br />
当我义无返顾的把自己作为参数传进这个方法时．．．<span id="more-327"></span><br />
我才发现爱上你是一个死循环．．．<br />
它不停的返回对你的思念压入我心里的堆栈．．．<br />
在这无尽的黑夜中．．．<br />
我的内存里已经再也装不下别人．．．<br />
我不停的向系统申请空间．．．<br />
但却捕获一个异常－－－我爱的人不爱我．．．<br />
为了解决这个异常．．．<br />
我愿意虚拟出最后一点内存．．．<br />
把所有我能实现的方法地址压入堆栈．．．<br />
并且在栈尾压入最后一个方法－－－将字符串＂我爱你，你爱我吗？＂传递给你．．．<br />
如果返回值为真－－我将用尽一生去爱你．．．<br />
否则－－我将释放掉所有系资源．</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mzfeng.com/html/y2010/327.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

