<?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>Akii Snow</title>
	<atom:link href="http://www.akii.org/feed" rel="self" type="application/rss+xml" />
	<link>http://www.akii.org</link>
	<description>Happiness is Grasp now!</description>
	<lastBuildDate>Thu, 26 Aug 2010 18:30:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>WordPress 3.0 禁止历史版本及自动草稿(auto-draft)的方法</title>
		<link>http://www.akii.org/wordpress-3-0-prohibit-to-historical-versions-and-automatically-save-the-draft.html</link>
		<comments>http://www.akii.org/wordpress-3-0-prohibit-to-historical-versions-and-automatically-save-the-draft.html#comments</comments>
		<pubDate>Thu, 26 Aug 2010 18:21:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.akii.org/?p=655</guid>
		<description><![CDATA[WordPress3.0版本发布有一段时间了。该版本不仅仅有自动保存历史版本的功能（通常都用不着，还会造成一些垃圾数据），还增加了一个自动保存草稿的功能。你每次点击&#8221;add new&#8221;时都会在post表中保存一条状态为“auto-draft”的后台不可见记录，同样会造成一些垃圾数据以及ID的不连续性。 为保证尽量减少数据库中的垃圾和保持日志ID的连续性，人们想了很多办法，各显神通。但大部分都是采用插件形式。插件形式仅仅能禁止日志的历史版本，却对自动插入的状态为&#8221;auto-draft&#8221;的记录无能为力。而且这种记录并不能在wordpress的后台看到。对于追求完美和有洁癖的人来说，这些记录实在是很烦人。 我这篇文章，首先，是原创，亮点在于，我可以不禁止自动保存草稿功能，但依然不生成垃圾数据以及保持日志ID的连续性。我们分两步走，先禁止历史版本，再禁止自动保存草稿。 1.禁止WordPress的历史版本 插件可以禁止历史版本的功能。但如果要禁止历史版本的功能，仅需要修改wp-config.php这个配置文件就可一劳永逸。效率比用插件还高。而且，升级时不会修改wp-config.php，不会造成升级就失效。 方法如下： 在wordpress的程序根目录，配置文件wp-config.php中，找到 define('WP_DEBUG', false); 在其下方插下以下内容 define('WP_POST_REVISIONS', false); define('AUTOSAVE_INTERVAL', 86400); 解释一下，插入的第一条WP_POST_REVISIONS，看字面意思就知道是禁止历史版本功能。 第二条AUTOSAVE_INTERVAL，这个是禁止自动保存。86400就是一天，自动保存时间设置为一天。比如你在后台添加日志的时候，当输入标题，切换到内容输入时，此时就会自动保存成草稿。当你编辑时，也会定时保存一下，防止你正在编辑的内容丢失。这个草稿是在后台可见的。所以这条根据你的需要来定。如果需要自动保存草稿，这条可以删掉不要。而根据我后面的修改，这条是完全可以删掉的。 2.禁止自动生成 auto-draft 的不可见草稿 读了一下WordPress的代码，我找到一段决定这个功能的地方。 在wp-admin/includes/post.php中，从第374行开始，有一个if判断，代码如下： if ( $create_in_db ) { // Cleanup old auto-drafts more than 7 days old $old_posts = $wpdb-&#62;get_col( "SELECT &#8230; <a href="http://www.akii.org/wordpress-3-0-prohibit-to-historical-versions-and-automatically-save-the-draft.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>WordPress3.0版本发布有一段时间了。该版本不仅仅有自动保存历史版本的功能（通常都用不着，还会造成一些垃圾数据），还增加了一个自动保存草稿的功能。你每次点击&#8221;add new&#8221;时都会在post表中保存一条状态为“auto-draft”的后台不可见记录，同样会造成一些垃圾数据以及ID的不连续性。</p>
<p>为保证尽量减少数据库中的垃圾和保持日志ID的连续性，人们想了很多办法，各显神通。但大部分都是采用插件形式。插件形式仅仅能禁止日志的历史版本，却对自动插入的状态为&#8221;auto-draft&#8221;的记录无能为力。而且这种记录并不能在wordpress的后台看到。对于追求完美和有洁癖的人来说，这些记录实在是很烦人。</p>
<p>我这篇文章，首先，是原创，亮点在于，我可以不禁止自动保存草稿功能，但依然不生成垃圾数据以及保持日志ID的连续性。我们分两步走，先禁止历史版本，再禁止自动保存草稿。<br />
<span id="more-655"></span><br />
<strong>1.禁止WordPress的历史版本</strong></p>
<p>插件可以禁止历史版本的功能。但如果要禁止历史版本的功能，仅需要修改wp-config.php这个配置文件就可一劳永逸。效率比用插件还高。而且，升级时不会修改wp-config.php，不会造成升级就失效。</p>
<p>方法如下：</p>
<p>在wordpress的程序根目录，配置文件wp-config.php中，找到</p>
<pre class="brush:php">define('WP_DEBUG', false);</pre>
<p>在其下方插下以下内容</p>
<pre class="brush:php">define('WP_POST_REVISIONS', false);
define('AUTOSAVE_INTERVAL', 86400);</pre>
<p>解释一下，插入的第一条WP_POST_REVISIONS，看字面意思就知道是禁止历史版本功能。</p>
<p>第二条AUTOSAVE_INTERVAL，这个是禁止自动保存。86400就是一天，自动保存时间设置为一天。比如你在后台添加日志的时候，当输入标题，切换到内容输入时，此时就会自动保存成草稿。当你编辑时，也会定时保存一下，防止你正在编辑的内容丢失。这个草稿是在后台可见的。所以这条根据你的需要来定。如果需要自动保存草稿，这条可以删掉不要。而根据我后面的修改，这条是完全可以删掉的。</p>
<p><strong>2.禁止自动生成 auto-draft 的不可见草稿</strong></p>
<p>读了一下WordPress的代码，我找到一段决定这个功能的地方。</p>
<p>在wp-admin/includes/post.php中，从第374行开始，有一个if判断，代码如下：</p>
<pre class="brush:php"> if ( $create_in_db ) {
                // Cleanup old auto-drafts more than 7 days old
                $old_posts = $wpdb-&gt;get_col( "SELECT ID FROM $wpdb-&gt;posts WHERE post_status = 'auto-draft' AND DATE_SUB( NOW(), INTERVAL 7 DAY ) &gt; post_date" );
                foreach ( (array) $old_posts as $delete )
                        wp_delete_post( $delete, true ); // Force delete
                $post_id = wp_insert_post( array( 'post_title' =&gt; __( 'Auto Draft' ), 'post_type' =&gt; $post_type, 'post_status' =&gt; 'auto-draft' ) );
                $post = get_post( $post_id );
} else {
</pre>
<p>我来解释一下这段代码的功能，首先，清除七天以前的自动草稿，然后插入一条新草稿，如果你继续写文章并发布，那么这条草稿就被使用了，包括在后台首页有一个快速发布，也用到了这个。但如果你仅仅是点击了new post(添加文章)，接下来没有输入任何内容就跳到别的页面去了或关闭了，此时仍然会生成一个自动草稿，而这个草稿，是后台不可见的，是垃圾数据。</p>
<p>所以我修改了一下代码，将这个if判断中的内容替换成以下内容，代码如下：</p>
<pre class="brush:php"> if ( $create_in_db ) {
		// modify by akii start
		global $current_user;
		$post_auto_draft = $wpdb-&gt;get_row( "SELECT * FROM $wpdb-&gt;posts WHERE post_status = 'auto-draft' AND post_author = $current_user-&gt;ID ORDER BY ID ASC LIMIT 1" );
		if ($post_auto_draft){
			$post = $post_auto_draft;
		} else {
			$post_id = wp_insert_post( array( 'post_title' =&gt; __( 'Auto Draft' ), 'post_type' =&gt; $post_type, 'post_status' =&gt; 'auto-draft' ) );
			$post = get_post( $post_id );
		}
		// modify by akii end
} else {
</pre>
<p>原理及说明：当数据库中有一条或多条状态为&#8221;auto-draft&#8221;的自动草稿时，取ID最小的，新文章即使用此条记录。如果没有此种类型的数据，才会新插入一条数据。并且查询数据时是根据当前的用户来判断，不会出现多用户时出错。这样就可以避免了自动草稿(auto-draft)的冗余垃圾数据。保证了日志ID的连续性。但最后我要提醒一句，如果你在日志中添加了附件，如图片，那么该图片也会占用一条数据，即一个连续的ID，所以，如果你以ID形式，发现日志有时候不是连续的ID了，那么，有可能是你日志的附件占用了临近的ID。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.akii.org/wordpress-3-0-prohibit-to-historical-versions-and-automatically-save-the-draft.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在中国商业中&#8221;诚信&#8221;的重要性</title>
		<link>http://www.akii.org/in-china-the-quality-of-integrity-is-a-luxury.html</link>
		<comments>http://www.akii.org/in-china-the-quality-of-integrity-is-a-luxury.html#comments</comments>
		<pubDate>Wed, 18 Aug 2010 16:54:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情随笔]]></category>
		<category><![CDATA[China]]></category>

		<guid isPermaLink="false">http://www.akii.org/?p=654</guid>
		<description><![CDATA[罗永浩曾经说过一句话：在中国，诚实是一个奢侈的品质。 在中国的商业环境中，“诚信”也是一个奢侈的品质。 淘宝以数亿元的铺天盖地的广告和马云的精明领导下已雄起七年。夫妻间有七年之痒，淘宝也面临着七年之痒，盈利模式已经挖掘的差不多了。先是某些政府官员看到支付宝是一块肥肉，想染指一下，马云赶紧做危机公关，把老温请进了阿里巴巴。然后是一直困扰淘宝的一大问题：淘宝上假货横行。民众对此深恶痛决。甚至是照片和实物差别非常大。而实际上对产品质量又没有一个标准，是否合格等，即便你能退了货，人家还可以赚你点运费。而你除了赔了运费，糟了心情，别无它法。 对我而言，除充值卡点卡之类的东西，基本不会在淘宝买东西。那怕贵一点，首选京东，新蛋，然后是卓越。 人们想买个产品，第一是产品的品质，是否真伪是第一位的。第二是服务，第三是价位。前两条决定第三条。 以我个人的网上购物经历，在京东买的东西，15天之内坏了，打个电话，第二天京东就拿新的来换我的坏的。当然，不想要可以退掉。 凡客也是，买的衣服不合适了，没穿过（凡客说的是未长时间穿着）没有损坏什么的，也是免费给你更换。而且京东和凡客的退换是不收你运费的。 而在淘宝上买东西，完全看卖家人品。就算是卖家人品好，基本上退换货来回的运费也是要你承担的。更不用说买到假货什么的。 因为在中国可以证明一样东西是否是假货或是是否合格，是某些“权威”部门。而这些部门要么是对个人不开放，要么是你要花一大笔钱，关键是要花一大笔时间去跟进。所以更多的人选择了宁可吃点亏也耽误不起这时间。 前几天一个同事和他同学去中关村买了个笔记本电脑。被无良商家给骗了，报了个低价，然后拿出了做系统（这个特制的系统装完了开机就蓝屏），然后就是卖笔记本的惯用的一招：转型。给你转个别的型号，你不熟悉，可以狠狠的宰你一笔。如果你不同意，反正是你先交钱才能看到机器，这时候就会拿出人多势众的气势以及没有底限的无耻，要么逼着你加价，要么对你的机器动手脚，例如我那同事的同学的电脑，就被卸下了电池和内存。然后逼着你签一份协议，出门之后这台电脑软硬件都和他们无关，甚至无耻到签字不行，还要按手印。 在中国，现在按手印的地方，据我所知的，一个是犯罪嫌疑人，一个是银行贷款（可能某些地方贷款也不用按手印）。除了银行外，其它的怎么觉得都带有一种严重的侮辱性质。而实际上这份协议我觉得理论上是无效的。这是一份极不公平的协议。如果真要打起官司来，这份协议完全可以申请判为无效。 还有一个案例，在中关村卖相机的一个人，有一个人大代表去买相机（当然未亮出人大代表的身份，而且这个代表还有些能量），不到2万的相机卖给人家5万多。后来人家回去一查发现上当了，回去找，卖家就凶起来了，我就赚你钱了怎么着，有种你就去告啊。结果这个代表一个电话给了北京市公安局某位领导，这个小老板跑路了，把卖相机的销售人员给抓起来判了。可是咱们毕竟不是每个人都是人大代表。骗你蒙你没商量。 所以我总结了一下中关村卖相机和笔记本的几大骗招，希望对读者有益。 中关村卖相机的招数无非就是以下几招： 1.给你报的一个不含税的价，但你必须开发票，不带票不卖给你，开发票要交至少5个点的税。而实际上那发票要么就是假的，要么就是套开的。 2.基本上裸机不卖给你，你还必须要买一堆或是一定要忽悠你买一堆配件。配件的利润比相机的利润还高。 3.用一些返修回来的或是水货来当行货卖给你。 中关村卖笔记本的无非就是以下几招： 1.报个低价把你带到公司（非卖场，人家就人多势众了），然后让你先交钱。交了钱你就失去主动性了。处处被动。 2.你被动了，忽悠你转型，就是给你推荐一个别的型号的，你不熟悉，狠宰你一笔。 3.如果你铁了心就要这一款，好，给你装系统，装一个一开机就蓝屏的系统，然后说这机器这不好那不好，让你转型。 4.如果你还铁了心不转，要你开发票，要你加配件。或是无赖的直接拿走你的机器说这机器要返厂。这下你该同意转型了吧。 5.如果你还不转型，人家人多势众，对你轻则辱骂，重则动手动脚，给你施加压力。 6.最后，如果你确定就要这台机器了，就该对你的机器动手脚了。抠电池，卸内存是常见手段。甚至还可以卸掉你的硬盘等等。 7.你已经筋疲力尽了，就希望赶紧拿了机器走人，这时候要求你签一份协议，因为表面是他们确实没赚到钱，这机器不给你售后，你走了这机器跟他们再无关系，任何问题不能再找他们。 8.在中关村，就算你遇到这种事情，找警察都没用，警察顶多是在的时候，能让别人不打你。但他们不会为你撑腰。因为你给不了他们任何好处。 在天朝，无论是权力机构还是商业组织，都在不断刷新道德底限，不断挑战人们的心理预期。 有句俗话：穷山恶水出刁民。如果你想让百姓都遵纪守法，都道德高尚路不拾遗，首先就要提高人民的物质生活水平。 再到强势的权力机构和商业组织，也是同样道理，尤其是商业组织，让他们不用违法乱纪也可以实现合理的利润比例。那当然企业就不愿意去以身犯险。 而权力机关，这个就是最没谱的了。能说现在的权力机构行工作者工资低吗？可是他们依然秉承了人类的最原始的品性：自私与贪婪。 艾未未在成都公安局大喊一句：“我们养了一群畜牲”，无一制服者敢应。因为他们心虚。 我相信景帝还有心想实行一些让百姓可以休养生息的一些政策，可是人单势孤，抵不过利益集团的攻击和渗透。 最近在看《明朝那些事儿》，眼下的中国，正在走明朝的老路。甚至连明朝都不如。明朝的言官看谁不顺眼就上书骂谁，贪污受贿甚至是生活做风道德品质都可以拿来骂人一顿。现在，谁敢？上访者不计其数，甚至形成了一个畸形的利益链，靠抓上访者回来的利益链条。 如果由上至下，都能以诚信待人，不欺上瞒下，不推托，尽职尽责，民主自由，何愁新中国不强大。 而现在的情况是，我以我是一个中国人而感到羞耻。]]></description>
			<content:encoded><![CDATA[<p>罗永浩曾经说过一句话：在中国，诚实是一个奢侈的品质。<br />
在中国的商业环境中，“诚信”也是一个奢侈的品质。</p>
<p>淘宝以数亿元的铺天盖地的广告和马云的精明领导下已雄起七年。夫妻间有七年之痒，淘宝也面临着七年之痒，盈利模式已经挖掘的差不多了。先是某些政府官员看到支付宝是一块肥肉，想染指一下，马云赶紧做危机公关，把老温请进了阿里巴巴。然后是一直困扰淘宝的一大问题：淘宝上假货横行。民众对此深恶痛决。甚至是照片和实物差别非常大。而实际上对产品质量又没有一个标准，是否合格等，即便你能退了货，人家还可以赚你点运费。而你除了赔了运费，糟了心情，别无它法。</p>
<p>对我而言，除充值卡点卡之类的东西，基本不会在淘宝买东西。那怕贵一点，首选京东，新蛋，然后是卓越。</p>
<p>人们想买个产品，第一是产品的品质，是否真伪是第一位的。第二是服务，第三是价位。前两条决定第三条。<br />
以我个人的网上购物经历，在京东买的东西，15天之内坏了，打个电话，第二天京东就拿新的来换我的坏的。当然，不想要可以退掉。<br />
凡客也是，买的衣服不合适了，没穿过（凡客说的是未长时间穿着）没有损坏什么的，也是免费给你更换。而且京东和凡客的退换是不收你运费的。<br />
<span id="more-654"></span><br />
而在淘宝上买东西，完全看卖家人品。就算是卖家人品好，基本上退换货来回的运费也是要你承担的。更不用说买到假货什么的。<br />
因为在中国可以证明一样东西是否是假货或是是否合格，是某些“权威”部门。而这些部门要么是对个人不开放，要么是你要花一大笔钱，关键是要花一大笔时间去跟进。所以更多的人选择了宁可吃点亏也耽误不起这时间。</p>
<p>前几天一个同事和他同学去中关村买了个笔记本电脑。被无良商家给骗了，报了个低价，然后拿出了做系统（这个特制的系统装完了开机就蓝屏），然后就是卖笔记本的惯用的一招：转型。给你转个别的型号，你不熟悉，可以狠狠的宰你一笔。如果你不同意，反正是你先交钱才能看到机器，这时候就会拿出人多势众的气势以及没有底限的无耻，要么逼着你加价，要么对你的机器动手脚，例如我那同事的同学的电脑，就被卸下了电池和内存。然后逼着你签一份协议，出门之后这台电脑软硬件都和他们无关，甚至无耻到签字不行，还要按手印。</p>
<p>在中国，现在按手印的地方，据我所知的，一个是犯罪嫌疑人，一个是银行贷款（可能某些地方贷款也不用按手印）。除了银行外，其它的怎么觉得都带有一种严重的侮辱性质。而实际上这份协议我觉得理论上是无效的。这是一份极不公平的协议。如果真要打起官司来，这份协议完全可以申请判为无效。</p>
<p>还有一个案例，在中关村卖相机的一个人，有一个人大代表去买相机（当然未亮出人大代表的身份，而且这个代表还有些能量），不到2万的相机卖给人家5万多。后来人家回去一查发现上当了，回去找，卖家就凶起来了，我就赚你钱了怎么着，有种你就去告啊。结果这个代表一个电话给了北京市公安局某位领导，这个小老板跑路了，把卖相机的销售人员给抓起来判了。可是咱们毕竟不是每个人都是人大代表。骗你蒙你没商量。</p>
<p>所以我总结了一下中关村卖相机和笔记本的几大骗招，希望对读者有益。</p>
<p>中关村卖相机的招数无非就是以下几招：<br />
1.给你报的一个不含税的价，但你必须开发票，不带票不卖给你，开发票要交至少5个点的税。而实际上那发票要么就是假的，要么就是套开的。<br />
2.基本上裸机不卖给你，你还必须要买一堆或是一定要忽悠你买一堆配件。配件的利润比相机的利润还高。<br />
3.用一些返修回来的或是水货来当行货卖给你。</p>
<p>中关村卖笔记本的无非就是以下几招：<br />
1.报个低价把你带到公司（非卖场，人家就人多势众了），然后让你先交钱。交了钱你就失去主动性了。处处被动。<br />
2.你被动了，忽悠你转型，就是给你推荐一个别的型号的，你不熟悉，狠宰你一笔。<br />
3.如果你铁了心就要这一款，好，给你装系统，装一个一开机就蓝屏的系统，然后说这机器这不好那不好，让你转型。<br />
4.如果你还铁了心不转，要你开发票，要你加配件。或是无赖的直接拿走你的机器说这机器要返厂。这下你该同意转型了吧。<br />
5.如果你还不转型，人家人多势众，对你轻则辱骂，重则动手动脚，给你施加压力。<br />
6.最后，如果你确定就要这台机器了，就该对你的机器动手脚了。抠电池，卸内存是常见手段。甚至还可以卸掉你的硬盘等等。<br />
7.你已经筋疲力尽了，就希望赶紧拿了机器走人，这时候要求你签一份协议，因为表面是他们确实没赚到钱，这机器不给你售后，你走了这机器跟他们再无关系，任何问题不能再找他们。<br />
8.在中关村，就算你遇到这种事情，找警察都没用，警察顶多是在的时候，能让别人不打你。但他们不会为你撑腰。因为你给不了他们任何好处。</p>
<p>在天朝，无论是权力机构还是商业组织，都在不断刷新道德底限，不断挑战人们的心理预期。<br />
有句俗话：穷山恶水出刁民。如果你想让百姓都遵纪守法，都道德高尚路不拾遗，首先就要提高人民的物质生活水平。<br />
再到强势的权力机构和商业组织，也是同样道理，尤其是商业组织，让他们不用违法乱纪也可以实现合理的利润比例。那当然企业就不愿意去以身犯险。<br />
而权力机关，这个就是最没谱的了。能说现在的权力机构行工作者工资低吗？可是他们依然秉承了人类的最原始的品性：自私与贪婪。</p>
<p>艾未未在成都公安局大喊一句：“我们养了一群畜牲”，无一制服者敢应。因为他们心虚。<br />
我相信景帝还有心想实行一些让百姓可以休养生息的一些政策，可是人单势孤，抵不过利益集团的攻击和渗透。<br />
最近在看《明朝那些事儿》，眼下的中国，正在走明朝的老路。甚至连明朝都不如。明朝的言官看谁不顺眼就上书骂谁，贪污受贿甚至是生活做风道德品质都可以拿来骂人一顿。现在，谁敢？上访者不计其数，甚至形成了一个畸形的利益链，靠抓上访者回来的利益链条。</p>
<p>如果由上至下，都能以诚信待人，不欺上瞒下，不推托，尽职尽责，民主自由，何愁新中国不强大。<br />
而现在的情况是，我以我是一个中国人而感到羞耻。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.akii.org/in-china-the-quality-of-integrity-is-a-luxury.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>htpasswd 命令用法</title>
		<link>http://www.akii.org/htpasswd-command-usage.html</link>
		<comments>http://www.akii.org/htpasswd-command-usage.html#comments</comments>
		<pubDate>Wed, 11 Aug 2010 07:51:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux & FreeBSD]]></category>
		<category><![CDATA[Web Server]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[htpassword]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.akii.org/?p=653</guid>
		<description><![CDATA[htpasswd建立和更新存储用户名、密码的文本文件， 用于对HTTP用户的basic认证。 如果htpasswd不能存取文件， 比如，不能写入到输出文件中，或者读取需要更新的文件， 它将不做任何改变，并返回一个出错代码。 htpasswd使用专为Apache作了修改的MD5或系统函数crypt()加密密码。 htpasswd所管理的文件可以包含两种类型的密码； 有些用户的密码使用MD5加密的，而同一个文件中的其他用户是用crypt()加密的。 概要 在linux下执行htpasswd 可出现如下提示： htpasswd [-cmdpsD] passwordfile username htpasswd -b[cmdpsD] passwordfile username password htpasswd -n[mdps] username htpasswd -nb[mdps] username password apache htpasswd命令选项参数说明 -b 使用批处理方式; 即, 从命令行中获得密码，而不显示提示要求输入。 此选项的使用应该极为谨慎，因为命令行中的密码是清晰可见的。 -c 建立passwdfile文件。如果passwdfile已经存在，则它被重写并截断。 此选项不能与-n选项同时使用。 -n 在标准输出设备上显示结果，而不更新文件。 用于生成可以为Apache非文本输出存储格式所接受的密码记录。 &#8230; <a href="http://www.akii.org/htpasswd-command-usage.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>htpasswd建立和更新存储用户名、密码的文本文件， 用于对HTTP用户的basic认证。 如果htpasswd不能存取文件， 比如，不能写入到输出文件中，或者读取需要更新的文件， 它将不做任何改变，并返回一个出错代码。</p>
<p>htpasswd使用专为Apache作了修改的MD5或系统函数crypt()加密密码。 htpasswd所管理的文件可以包含两种类型的密码； 有些用户的密码使用MD5加密的，而同一个文件中的其他用户是用crypt()加密的。</p>
<p><strong>概要</strong><br />
在linux下执行htpasswd 可出现如下提示：<br />
htpasswd [-cmdpsD] passwordfile username<br />
htpasswd -b[cmdpsD] passwordfile username password<br />
htpasswd -n[mdps] username<br />
htpasswd -nb[mdps] username password<br />
<span id="more-653"></span><br />
<strong>apache htpasswd命令选项参数说明</strong><br />
-b<br />
    使用批处理方式; 即, 从命令行中获得密码，而不显示提示要求输入。 此选项的使用应该极为谨慎，因为命令行中的密码是清晰可见的。<br />
-c<br />
    建立passwdfile文件。如果passwdfile已经存在，则它被重写并截断。 此选项不能与-n选项同时使用。<br />
-n<br />
    在标准输出设备上显示结果，而不更新文件。 用于生成可以为Apache非文本输出存储格式所接受的密码记录。 此选项在命令行中的语法有所改变，因为passwdfile参数(通常是第一个)被省略了。 此选项不能与-c选项同时使用。<br />
-m<br />
    使用MD5加密密码。在Windows, Netware 和TPF上，这是默认的。<br />
-d<br />
    使用crypt()加密密码。在除了Windows, Netware和TPF的平台上，这是默认的。 虽然它在所有平台上可以为htpasswd所支持， 但是在Windows, Netware和TPF上不能为httpd服务器所支持。<br />
-s<br />
    使用SHA加密密码。 它是为了方便转入或移植到使用LDAP Directory Interchange Format (ldif)的Netscape而设计的。<br />
-p<br />
    使用纯文本的密码。虽然在所有平台上htpasswd都可以建立这样的密码， 但是httpd后台只在Windows, Netware和TPF上支持纯文本的密码。<br />
passwdfile<br />
    包含用户名和密码的文件的名称。 如果使用了-c，而此文件不存在则建立，如果已经存在，则重写并截断此文件。<br />
username<br />
    需要在passwdfile中建立或更新的用户名。 如果此文件中username不存在，则增加一项，如果已经存在，则改变其密码。<br />
password<br />
    将被加密并存储到文件中的纯文本的密码。仅用于和-b选项同时使用。 </p>
<p><strong>返回值</strong><br />
如果htpasswd成功地在passwdfile中增加或修改了用户名和密码， 则其返回值是0(&#8220;真&#8221;)； 如果存取文件发生某种错误，则返回1； 如果命令行语法有问题，则返回2； 如果进入交互状态而两次输入的密码不相同，则返回3； 如果操作被中断，则返回4； 如果一个值太长(用户名、文件名、密码或者最后得到的记录长度)，则返回5； 如果用户名包含非法字符(见Restrictions section)，则返回6。</p>
<p><strong>apache htpasswd命令用法举例</strong></p>
<p> htpasswd /usr/local/etc/apache/.htpasswd-users jsmith<br />
此例增加或修改了用户jsmith的密码。程序会给出提示要求输入密码。 如果在Windows系统中运行，此密码将以专为Apache修改过的MD5算法加密； 在其他平台上，则使用系统函数crypt()。 如果文件不存在，则htpasswd不作任何操作并返回一个出错代码。</p>
<p> htpasswd -c /home/doe/public_html/.htpasswd jane<br />
此例建立一个新的文件，并在其中为用户jane存储一个记录。 程序会给出提示要求输入密码。如果文件存在但是不能读或写， 则htpasswd会显示一个消息并返回一个出错代码。</p>
<p> htpasswd -mb /usr/web/.htpasswd-all jones Pwd4Steve<br />
使用MD5算法加密从命令行得到的密码(Pwd4Steve)，并存储在指定的文件中。</p>
<p><strong>安全方面的提示</strong><br />
由诸如htpasswd管理的网站密码文件都不应该位于网站服务器的URI空间中， &#8212; 也就是说，不应该被浏览器读取。<br />
不鼓励使用-b选项，因为未经加密的密码会出现在命令行中。</p>
<p><strong>限制</strong><br />
在Windows和MPE平台上， 由htpasswd加密的密码的长度上限是255个字符。 太长的密码会被截断为255个字符。<br />
htpasswd使用的MD5算法是专供Apache软件使用的； 其加密的密码不能为其他网站服务器所使用。<br />
用户名的长度上限是255个字节，并不能包含字符:。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.akii.org/htpasswd-command-usage.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>nginx关闭默认站点(主机)或引导转向</title>
		<link>http://www.akii.org/nginx-default-host-or-rewrite.html</link>
		<comments>http://www.akii.org/nginx-default-host-or-rewrite.html#comments</comments>
		<pubDate>Wed, 04 Aug 2010 03:00:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Web Server]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://www.akii.org/?p=652</guid>
		<description><![CDATA[无论是中国大陆变态的“监管”还是为抵制垃圾访问，我们都应该关闭nginx的默认站点，或者把这些垃圾流量转化为你的流量，让它跳转到你指定的网站。 对于nginx来说，即使是访问服务器上不存在的域名时，nginx也会返回一个出错页面“bad hostname”之类的。 解决方法是在nginx的配置文件中（nginx.conf）加入一个处理默认（就是不符合其他任何已有的vhost）server的项目： server { listen 80 default_server; server_name _; return 444; } # default_server 是 8.21+加入的参数，如果低于8.21 ，则可以注意将下面代码放在其他server项前面 server { listen 80 ; return 444; } 这其中最关键的是 magic number 444。 444是nginx内置的错误代码。对我们来说 return 444 比 return 404还要好。因为 nginx 下即使return 404，也会有返回的header和一个包含错误信息的html &#8230; <a href="http://www.akii.org/nginx-default-host-or-rewrite.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>无论是中国大陆变态的“监管”还是为抵制垃圾访问，我们都应该关闭nginx的默认站点，或者把这些垃圾流量转化为你的流量，让它跳转到你指定的网站。</p>
<p>对于nginx来说，即使是访问服务器上不存在的域名时，nginx也会返回一个出错页面“bad hostname”之类的。</p>
<p>解决方法是在nginx的配置文件中（nginx.conf）加入一个处理默认（就是不符合其他任何已有的vhost）server的项目：</p>
<pre class="brush:shell">server {
listen       80  default_server;
server_name  _;
return       444;
}</pre>
<p><span id="more-652"></span><br />
# default_server 是 8.21+加入的参数，如果低于8.21 ，则可以注意将下面代码放在其他server项前面</p>
<pre class="brush:shell">server {
listen 80 ;
return 444;
}</pre>
<p>这其中最关键的是 magic number 444。 444是nginx内置的错误代码。对我们来说 return 444 比 return  404还要好。因为 nginx 下即使return 404，也会有返回的header和一个包含错误信息的html body。但是return  444，服务器会立刻关闭连接，就好象服务不存在一样。</p>
<p>当然，你也可以把这些流量导入你的站点。</p>
<pre class="brush:shell">server {
listen 80 default;
rewrite ^(.*) http://www.myip.net permanent;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.akii.org/nginx-default-host-or-rewrite.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linode centos 开启iptables出错的解决</title>
		<link>http://www.akii.org/linode-centos-iptables-start-error.html</link>
		<comments>http://www.akii.org/linode-centos-iptables-start-error.html#comments</comments>
		<pubDate>Tue, 03 Aug 2010 09:26:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux & FreeBSD]]></category>

		<guid isPermaLink="false">http://www.akii.org/?p=651</guid>
		<description><![CDATA[There is a known issue with iptables and our Latest Paravirt kernel. To fix this issue, simply select our Latest Stable kernel from the configuration profile drop-down: 1) Click your configuration profile on the &#8220;Dashboard&#8221; page. 2) Select the &#8220;Latest &#8230; <a href="http://www.akii.org/linode-centos-iptables-start-error.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>There is a known issue with iptables and our Latest Paravirt kernel. To fix this issue, simply select our Latest Stable kernel from the configuration profile drop-down:</p>
<p>1) Click your configuration profile on the &#8220;Dashboard&#8221; page.<br />
2) Select the &#8220;Latest 2.6 Stable&#8221; kernel from the kernel drop-down menu.<br />
3) Select &#8220;Save&#8221;<br />
4) Reboot your Linode.</p>
<p>我原来用的是最新的非stable版本的配置文件。网上搜了很多相关问题都不对。后来问了下linode客服。得到此答案。一下解决。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.akii.org/linode-centos-iptables-start-error.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux使用私钥登陆ssh 防止暴力破解</title>
		<link>http://www.akii.org/linux-ssh-login-using-the-private-key-to-prevent-brute-force.html</link>
		<comments>http://www.akii.org/linux-ssh-login-using-the-private-key-to-prevent-brute-force.html#comments</comments>
		<pubDate>Tue, 03 Aug 2010 05:10:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux & FreeBSD]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[SSH]]></category>

		<guid isPermaLink="false">http://www.akii.org/?p=650</guid>
		<description><![CDATA[linux使用私钥登陆ssh可以有效的防止暴力破解。禁止使用用户名和密码登陆，更加安全。 本文中的示例用户为user1,你可以根据自己的需要改成自己的用户名。 1.useradd user1 2.makedir -p /home/user1/.ssh 3.ssh-keygen -t rsa 提示路径写成 /home/user1/.ssh/id_rsa 4.提示Enter passphrase (empty for no passphrase) 可以为空，也可以输入一个二次加密口令 5.cp /home/user1/.ssh/id_rsa.pub /home/user1/.ssh/authorized_keys 6.chown -R user1:user1 /home/user1/.ssh 7.chmod -R 700 /home/user1/.ssh 8.chmod 400 /home/user1/.ssh/authorized_keys 9.chmod 600 /home/user1/.ssh/id_rsa 10.vim /etc/ssh/sshd_config（修改PasswordAuthentication no禁止使用密码登录） 11.将id_rsa下载下来,或将其内容完整复制下来。存在本地。 &#8230; <a href="http://www.akii.org/linux-ssh-login-using-the-private-key-to-prevent-brute-force.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>linux使用私钥登陆ssh可以有效的防止暴力破解。禁止使用用户名和密码登陆，更加安全。</p>
<p>本文中的示例用户为user1,你可以根据自己的需要改成自己的用户名。</p>
<p>1.useradd user1<br />
2.makedir -p /home/user1/.ssh<br />
3.ssh-keygen -t rsa 提示路径写成 /home/user1/.ssh/id_rsa<br />
4.提示Enter passphrase (empty for no passphrase) 可以为空，也可以输入一个二次加密口令<br />
5.cp /home/user1/.ssh/id_rsa.pub /home/user1/.ssh/authorized_keys<br />
6.chown -R user1:user1 /home/user1/.ssh<br />
7.chmod -R 700 /home/user1/.ssh<br />
8.chmod 400 /home/user1/.ssh/authorized_keys<br />
9.chmod 600 /home/user1/.ssh/id_rsa<br />
10.vim /etc/ssh/sshd_config（修改PasswordAuthentication no禁止使用密码登录）<br />
11.将id_rsa下载下来,或将其内容完整复制下来。存在本地。<br />
12.在putty.org上下载PuTTYgen,打开，菜单file-&gt;load private key-&gt;选择浏览所有文件，打开刚才保存的id_rsa，然后点Save private key保存私钥。<br />
13.windows在putty上保存一个ip和Sessions名称，在左侧菜单SSH-&gt;Auth中浏览刚才生成的ppk私钥，然后回到左侧最上方的Session，点击右方的Save.这样就加入了私钥。<br />
14.service sshd resrart<br />
15.用私钥和新建的user1登陆。（即putty上的直接登陆。）,如果你先前设置了passphrase，登陆的时候输入这个口令，否则不用密码输入用户名就可以登陆了。<br />
16.<span style="color: #ff0000;">未成功登陆前，千万不要断开先前的ssh链接。否则你就再也登陆不上去了。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.akii.org/linux-ssh-login-using-the-private-key-to-prevent-brute-force.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux 禁ping和开启ping方法</title>
		<link>http://www.akii.org/linux-ban-ping-and-open-way.html</link>
		<comments>http://www.akii.org/linux-ban-ping-and-open-way.html#comments</comments>
		<pubDate>Tue, 03 Aug 2010 05:04:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux & FreeBSD]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.akii.org/?p=649</guid>
		<description><![CDATA[Linux 禁ping和开启ping操作 # echo 1 &#62; /proc/sys/net/ipv4/icmp_echo_ignore_all 如果要恢复，只要： # echo 0 &#62; /proc/sys/net/ipv4/icmp_echo_ignore_all 即可，挺方便，不要去专门使用ipchains或者iptables了。 或者用以下方法也可以，异曲同工 以root进入Linux系统，然后编辑文件icmp_echo_ignore_all vi /proc/sys/net/ipv4/icmp_echo_ignore_all 将其值改为1后为禁止PING 将其值改为0后为解除禁止PING]]></description>
			<content:encoded><![CDATA[<p>Linux 禁ping和开启ping操作<br />
# echo 1 &gt; /proc/sys/net/ipv4/icmp_echo_ignore_all<br />
如果要恢复，只要：<br />
# echo 0 &gt; /proc/sys/net/ipv4/icmp_echo_ignore_all<br />
即可，挺方便，不要去专门使用ipchains或者iptables了。</p>
<p>或者用以下方法也可以，异曲同工</p>
<p>以root进入Linux系统，然后编辑文件icmp_echo_ignore_all<br />
vi /proc/sys/net/ipv4/icmp_echo_ignore_all<br />
将其值改为1后为禁止PING<br />
将其值改为0后为解除禁止PING</p>
]]></content:encoded>
			<wfw:commentRss>http://www.akii.org/linux-ban-ping-and-open-way.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux查看系统信息常用命令</title>
		<link>http://www.akii.org/linux-check-system-information-used-commands.html</link>
		<comments>http://www.akii.org/linux-check-system-information-used-commands.html#comments</comments>
		<pubDate>Mon, 02 Aug 2010 16:19:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux & FreeBSD]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.akii.org/?p=648</guid>
		<description><![CDATA[系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量 &#8230; <a href="http://www.akii.org/linux-check-system-information-used-commands.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3><strong>系统</strong></h3>
<p># uname -a # 查看内核/操作系统/CPU信息<br />
# head -n 1  /etc/issue # 查看操作系统版本<br />
# cat /proc/cpuinfo # 查看CPU信息<br />
#  hostname # 查看计算机名<br />
# lspci -tv # 列出所有PCI设备<br />
# lsusb -tv #  列出所有USB设备<br />
# lsmod # 列出加载的内核模块<br />
# env # 查看环境变量</p>
<h3><strong>资源</strong></h3>
<p><span id="more-648"></span># free -m # 查看内存使用量和交换区使用量<br />
# df -h # 查看各分区使用情况<br />
# du -sh #  查看指定目录的大小<br />
# grep MemTotal /proc/meminfo # 查看内存总量<br />
# grep  MemFree /proc/meminfo # 查看空闲内存量<br />
# uptime # 查看系统运行时间、用户数、负载<br />
# cat /proc/loadavg # 查看系统负载</p>
<h3><strong>磁盘和分区</strong></h3>
<p># mount | column -t #  查看挂接的分区状态<br />
# fdisk -l # 查看所有分区<br />
# swapon -s # 查看所有交换分区<br />
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)<br />
# dmesg | grep IDE #  查看启动时IDE设备检测状况</p>
<h3><strong>网络</strong></h3>
<p># ifconfig # 查看所有网络接口的属性<br />
#  iptables -L # 查看防火墙设置<br />
# route -n # 查看路由表<br />
# netstat -lntp #  查看所有监听端口<br />
# netstat -antp # 查看所有已经建立的连接<br />
# netstat -s #  查看网络统计信息</p>
<h3><strong>进程</strong></h3>
<p># ps -ef # 查看所有进程<br />
# top # 实时显示进程状态</p>
<h3><strong>用户</strong></h3>
<p># w # 查看活动用户<br />
# id # 查看指定用户信息<br />
# last # 查看用户登录日志<br />
# cut -d: -f1 /etc/passwd # 查看系统所有用户<br />
# cut -d: -f1 /etc/group #  查看系统所有组<br />
# crontab -l # 查看当前用户的计划任务</p>
<h3><strong>服务</strong></h3>
<p># chkconfig  &#8211;list # 列出所有系统服务<br />
# chkconfig &#8211;list | grep on # 列出所有启动的系统服务</p>
<h3><strong>程序</strong></h3>
<p># rpm -qa # 查看所有安装的软件包</p>
<p>附言：用户登陆日志文件</p>
<p>文件 <tt>/var/run/utmp</tt> 记录着现在登录的用户。<br />
文件 <tt>/var/log/wtmp</tt> 记录所有的登录和登出。<br />
文件 <tt>/var/log/lastlog</tt> 记录每个用户最后的登录信息。<br />
文件 <tt>/var/log/btmp</tt> 记录错误的登录尝试。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.akii.org/linux-check-system-information-used-commands.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一号店，你还能再无耻一些吗？</title>
		<link>http://www.akii.org/yihaodian-wuchi.html</link>
		<comments>http://www.akii.org/yihaodian-wuchi.html#comments</comments>
		<pubDate>Thu, 29 Jul 2010 02:25:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情随笔]]></category>

		<guid isPermaLink="false">http://www.akii.org/?p=647</guid>
		<description><![CDATA[一号店，你还能再无耻一些吗？ 在维洛城的优惠券打印机上打印的一号店的优惠券，说这么免费送，那个免费送，加入购物车输入优惠码即可。可是我去试了试，要么就是售完的，例如那什么洗发水就几百份，都售完（谁知道是不是个虚数），要么就是死活加不进购物车的，例如抽纸。能加进购物车的口香糖，还要求订单满50才能抵扣。 我操，你还能再无耻些吗？ 玩不起就不要说什么免费送。 update:你找人攻击我我也要说，一号店，就是个无耻的东西。不信你自己google一下“一号店 无耻”，你看看结果吧。 有句俗话说的好，“装B死于非命”。你将注定亏损致死。]]></description>
			<content:encoded><![CDATA[<p>一号店，你还能再无耻一些吗？ 在维洛城的优惠券打印机上打印的一号店的优惠券，说这么免费送，那个免费送，加入购物车输入优惠码即可。可是我去试了试，要么就是售完的，例如那什么洗发水就几百份，都售完（谁知道是不是个虚数），要么就是死活加不进购物车的，例如抽纸。能加进购物车的口香糖，还要求订单满50才能抵扣。</p>
<p>我操，你还能再无耻些吗？ 玩不起就不要说什么免费送。</p>
<p>update:你找人攻击我我也要说，一号店，就是个无耻的东西。不信你自己google一下“一号店 无耻”，你看看结果吧。</p>
<p>有句俗话说的好，“装B死于非命”。你将注定亏损致死。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.akii.org/yihaodian-wuchi.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>使用awstats自动分析Nginx日志</title>
		<link>http://www.akii.org/use-awstats-automatic-analysis-nginx-log.html</link>
		<comments>http://www.akii.org/use-awstats-automatic-analysis-nginx-log.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 18:07:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux & FreeBSD]]></category>
		<category><![CDATA[Web Server]]></category>
		<category><![CDATA[awstats]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://www.akii.org/use-awstats-automatic-analysis-nginx-log.html</guid>
		<description><![CDATA[使用awstats可以分析apache日志，同样也可以分析nginx日志。本文将详细介绍自动定时切割nginx的访问日志，并使用awstats来定时分析nginx的日志的实现方法。 前言 本文中使用的是awstats 7.0版本。 此版本增加了对win7的支持以及一些更新的特性。 New features/improvements: - Detect Windows 7. - Can format numbers according to language. - More mime types. - Added geoip_asn_maxmind plugin. - Geoip Maxmind city plugin have now override file capabilities to complete missing entries &#8230; <a href="http://www.akii.org/use-awstats-automatic-analysis-nginx-log.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>使用awstats可以分析apache日志，同样也可以分析nginx日志。本文将详细介绍自动定时切割nginx的访问日志，并使用awstats来定时分析nginx的日志的实现方法。</p>
<h2><strong>前言</strong></h2>
<p>本文中使用的是awstats 7.0版本。<br />
此版本增加了对win7的支持以及一些更新的特性。</p>
<blockquote><p>New features/improvements:<br />
- Detect Windows 7.<br />
- Can format numbers according to language.<br />
- More mime types.<br />
- Added geoip_asn_maxmind plugin.<br />
- Geoip Maxmind city plugin have now override file capabilities to complete<br />
missing entries in geoip maxmind database.<br />
- Added graphgooglechartapi to use online Google chart api to build graph.<br />
- Can show map of country to report countries when using graphgooglechartapi.<br />
- Part of codes was change to use more functions and have a cleaner code.<br />
- Added parameter to ignore missing log files when merging for a site on<br />
multiple servers where a single server may not have created a log for a given day.<br />
- Update robots database.<br />
- Added Download tracking where certain mime types are defined as downloads<br />
and HTTP status 206 is tracked as download continuation</p></blockquote>
<p>Awstats 是在 SourceForge 上发展很快的一个基于 Perl 的 WEB 日志分析工具，一个充分的日志分析让  Awstats 显示您下列资料:<span id="more-646"></span></p>
<ul>
<li> 访问次数、独特访客人数,</li>
<li> 访问时间和上次访问,</li>
<li> 使用者认证、最近认证的访问,</li>
<li> 每周的高峰时间(页数,点击率,每小时和一周的千字节),</li>
<li> 域名/国家的主机访客(页数,点击率,字节,269域名/国家检测, geoip 检测),</li>
<li> 主机名单,最近访问和未解析的 IP 地址名单</li>
<li> 大多数看过的进出页面,</li>
<li> 档案类型,</li>
<li> 网站压缩统计表(mod_gzip 或者 mod_deflate),</li>
<li> 使用的操作系统 (每个操作系统的页数,点击率 ,字节, 35 OS detected),</li>
<li> 使用的浏览器,</li>
<li> 机器人访问(检测 319 个机器人),</li>
<li> 蠕虫攻击 (5 个蠕虫家族),</li>
<li> 搜索引擎，利用关键词检索找到你的地址,</li>
<li> HTTP 协议错误(最近查阅没有找到的页面),</li>
<li> 其他基于 URL 的个性报导,链接参数, 涉及综合行销领域目的.</li>
<li> 贵网站被加入&#8221;最喜爱的书签&#8221;.次数.</li>
<li> 屏幕大小(需要在索引页补充一些 HTML 标签).</li>
<li> 浏览器的支持比例:  Java, Flash, RealG2 reader, Quicktime reader, WMA reader, PDF  reader.</li>
<li> 负载平衡服务器比率集群报告.</li>
</ul>
<p>Awstats 的运行是需要 PERL 环境的支持，从 awstats 的文档来看，它对 Apache HTTP Server  的支持是非常完美的，而当我们把 Web 服务器换成 Nginx 后，要运行 awstats 变得很麻烦。首先 Nginx 本身对 Perl  的支持是比较弱的，甚至官方也不建议使用；另外在日志格式上有需要修改后才能运行。</p>
<h2><strong>日志切割</strong></h2>
<p>本文主要介绍通过让 awstats 对日志统计的结果生成静态页面，然后通过 Nginx 输出以达到统计 Nginx  访问日志的效果，其中还包括如何让 Nginx 自动切割日志文件。对于nginx的日志，我的做法是按天切割。然后存入日期形式的目录中并压缩。</p>
<p>需要注意的是，nginx的日志应该遵循以下格式，才可以被awstats识别，如定义日志格式</p>
<pre class="brush:shell"> log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';</pre>
<p>使用日志格式</p>
<pre class="brush:shell">access_log  /home/www/logs/access.log  main;</pre>
<p>本文不讲如何安装nginx，稍后我将发布我的lnmp一键安装包(linux nginx mysql php)。全编译+优化自动化安装，使用php-fpm运行php的fastcgi进程。</p>
<p>我写了一个定时切割日志的脚本。每天0:00开始执行，切割昨天的日志（交由awstats分析），压缩前天的日志（压缩日志可减小存储空间，为防止awstats没有分析完就被压缩，所以只压缩前天的日志）。如果你的nginx和log文件放的路径和我的不一样，请对应修改。</p>
<pre class="brush:shell">vim cut_log.sh</pre>
<p>输入以下内容</p>
<pre class="brush:shell">#!/bin/bash
# This script run at 00:00
# cut yesterday log and gzip the day before yesterday log files.
# yesterday logs to awstats

# The Nginx logs path
logs_path="/home/www/logs/"
date_dir=${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/$(date -d "yesterday" +"%d")/
gzip_date_dir=${logs_path}$(date -d "-2 day" +"%Y")/$(date -d "-2 day" +"%m")/$(date -d "-2 day" +"%d")/

mkdir -p $date_dir
mv ${logs_path}*access.log $date_dir
/usr/local/nginx/sbin/nginx -s reopen
/usr/bin/gzip ${gzip_date_dir}*.log</pre>
<p>然后让它每天0时起开始进行，执行crontab -e加入以下代码再按:wq保存退出，这里我将此脚本放在/root/下，切记要给它可执行权限（chmod +x cut_log.sh）.</p>
<pre class="brush:shell">00 00 * * * /bin/bash /root/cut_log.sh</pre>
<p>这样就可以每天凌里自动切割昨天的日志到以日期为目录结构的目录中。可以留存以后查询。留着昨天的日志交给下面的awstats来分析，压缩前天的日志（前天的已经被分析过了）。</p>
<h2><strong>安装和配置awstats</strong></h2>
<p>下载最新的 awstats，我使用的是迄今为止最新的7.0版本</p>
<p>安装到/usr/local下，这个路径是习惯。大部分人保持的良好习惯。</p>
<pre class="brush:shell">wget http://awstats.sourceforge.net/files/awstats-7.0.tar.gz
tar -zxvf awstats-7.0.tar.gz
mv awstats-7.0 /usr/local/awstats</pre>
<p>修改权限，wget下载下来的包中权限是非root的，赋予过权限之后，.pl的文件也就可以运行了。</p>
<pre class="brush:shell">chown -R root:root /usr/local/awstats
chmod -R =rwX /usr/local/awstats
chmod +x /usr/local/awstats/tools/*.pl
chmod +x /usr/local/awstats/wwwroot/cgi-bin/*.pl
</pre>
<p>然后执行 tools 目录中的 awstats_configure.pl 配置向导，创建一个新的统计</p>
<p>运行(注意这里要在当前目录运行。否则会有一些关于标准目录的提示。)</p>
<pre class="brush:shell">cd /usr/local/awstats/tools
./awstats_configure.pl</pre>
<p>将会有如下一些提示：</p>
<pre class="brush:shell">-----&gt; Running OS detected: Linux, BSD or Unix

-----&gt; Check for web server install

Enter full config file path of your Web server.
Example: /etc/httpd/httpd.conf
Example: /usr/local/apache2/conf/httpd.conf
Example: c:\Program files\apache group\apache\conf\httpd.conf
Config file path ('none' to skip web server setup):
&gt;none #这里添none并回车，因为我们没有使用apache</pre>
<p>回车之后下一个选项</p>
<pre class="brush:shell">Your web server config file(s) could not be found.
You will need to setup your web server manually to declare AWStats
script as a CGI, if you want to build reports dynamically.
See AWStats setup documentation (file docs/index.html)

-----&gt; Update model config file '/usr/local/awstats/wwwroot/cgi-bin/awstats.model.conf'
 File awstats.model.conf updated.

-----&gt; Need to create a new config file ?
Do you want me to build a new AWStats config/profile
file (required if first install) [y/N] ?</pre>
<p>#这里选Y，创建一个新的配置文件</p>
<pre class="brush:shell">-----&gt; Define config file name to create
What is the name of your web site or profile analysis ?
Example: www.mysite.com
Example: demo
Your web site, virtual server or profile name:
&gt;akii.org  #这里输入你要分析的域名，或是随便一个你易记的配置名并回车</pre>
<p>接下来要定义你的配置文件存放的路径，可用默认</p>
<pre class="brush:shell">-----&gt; Define config file path
In which directory do you plan to store your config file(s) ?
Default: /etc/awstats
Directory path to store config file(s) (Enter for default):
&gt; #直接回车，使用默认路径/etc/awstats</pre>
<p>回车后的提示</p>
<pre class="brush:shell">-----&gt; Create config file '/etc/awstats/awstats.akii.org.conf'
 Config file /etc/awstats/awstats.akii.org.conf created.

-----&gt; Add update process inside a scheduler
Sorry, configure.pl does not support automatic add to cron yet.
You can do it manually by adding the following command to your cron:
/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=akii.org
Or if you have several config files and prefer having only one command:
/usr/local/awstats/tools/awstats_updateall.pl now
Press ENTER to continue... #按回车继续

A SIMPLE config file has been created: /etc/awstats/awstats.akii.org.conf
You should have a look inside to check and change manually main parameters.
You can then manually update your statistics for 'yuyuanchun.com' with command:
&gt; perl awstats.pl -update -config=akii.org
You can also build static report pages for 'akii.org' with command:
&gt; perl awstats.pl -output=pagetype -config=akii.org

Press ENTER to finish... #回车完成配置文件的创建</pre>
<p>完成配置文件的创建后，我们还要修改一下。因为我们是按天切割的日志，切割完成后交由awstats去分析。并不是让awstats去分时正在时时增长的也就是正在被写入的日志，这样的好处是不至于遗漏数据，并且分析已经切割完成的日志，更不用担心会有冲突。坏处是我一天切割一次日志，你要等第二天才能看昨天的一些详细数据。</p>
<p>修改/etc/awstats/awstats.akii.org.conf，执行：</p>
<pre class="brush:shell">vi /etc/awstats/awstats.akii.org.conf</pre>
<p>找到</p>
<pre class="brush:shell">LogFile="/var/log/httpd/mylog.log"</pre>
<p>修改为：</p>
<pre class="brush:shell">LogFile="/home/www/logs/%YYYY-24/%MM-24/%DD-24/akii.org_access.log"</pre>
<p>如果你的日志路径和我的不一样，请修改成对应的日志文件名。以上的完整路径是切割后保存的nginx日志文件。其中%YYYY-24/%MM-24/%DD-24表示年月日都减去24小时，也就是昨天的日志目录。修改完成后按:wq保存退出。</p>
<p>接下来可以测试一下awstats分析日志了（前提是你已经有了切割过的日志，没有的话可以先退行一下切割日志的脚本/root/cut_log.sh）</p>
<p>首先，还要创建一个awstats用于记录数据的目录</p>
<pre class="brush:shell">mkdir -p /var/lib/awstats</pre>
<p>然后运行awstats的wwwroot目录中的awatsts.pl来测试一下</p>
<pre class="brush:shell">/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=akii.org</pre>
<p>你如果看到类似下面的提示就说明配置文件都正确了。</p>
<pre class="brush:shell">Create/Update database for config "/etc/awstats/awstats.akii.org.conf" by AWStats version 7.0 (build 1.964)
From data in log file "/home/www/logs/2010/07/24/akii.org_access.log"...
Phase 1 : First bypass old records, searching new record...
Direct access after last parsed record (after line 43260)
Jumped lines in file: 43260
 Found 43260 already parsed records.
Parsed lines in file: 0
 Found 0 dropped records,
 Found 0 comments,
 Found 0 blank records,
 Found 0 corrupted records,
 Found 0 old records,
 Found 0 new qualified records</pre>
<p>统计分析完成后，结果还在 Awstats 的数据库中。在 Apache 上，可以直接打开 Perl 程序的网页查看统计。 但本文开始时已经提到，Nginx 对 Perl 支持并不好，所以我们要换个方法，利用 awstats  的工具将统计的结果生成静态文件，具体的步骤如下：</p>
<ul>
<li>首先在 webroot 目录下创建一个文件夹。例：/home/www/awstats</li>
<li>写一个脚本，定期执行让 Awstats 把静态页面生成到该目录中</li>
</ul>
<p>先生成存放awstats生成的静态文件的目录，我这里用的是/home/www/awstats</p>
<pre class="brush:shell">mkdir -p /home/www/awstats</pre>
<p>我们来写一个脚本</p>
<pre class="brush:shell">vim /root/awstats.sh</pre>
<p>然后输入以下内容</p>
<pre class="brush:shell">#!/bin/bash
mkdir -p /home/www/awstats/akii.org
/usr/local/awstats/tools/awstats_buildstaticpages.pl -update  \
-config=akii.org -lang=cn -dir=/home/www/awstats/akii.org  \
-awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl</pre>
<p>上述命令的具体意思如下：</p>
<ul>
<li>/usr/local/awstats/tools/awstats_buildstaticpages.pl	Awstats  静态页面生成工具</li>
<li>-update -config=akii.org			更新配置项</li>
<li>-lang=cn				语言为中文</li>
<li>-dir=/home/www/awstats	统计结果输出目录</li>
<li>-awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl	Awstats  日志更新程序路径。</li>
</ul>
<p>然后在你的nginx的配置文件中，在你想要安置awstats或默认的ip或域名的server段中，加入关于awstats和icon的两个目录配置。</p>
<p>如一个完整案例：</p>
<pre class="brush:shell">server {
listen       80;
server_name  localhost;
root /home/www;
index index.html;

location ~ ^/awstats/ {	    # awstats  静态页面目录
        root   /home/www/awstats;
        autoindex on; #可以目录浏览你的多个域名的目录用于分析
        index  index.html;
        access_log off;
}

location ~ ^/icon/ {             # 图标目录
        root   /usr/local/awstats/wwwroot;
        index  index.html;
        access_log off;
}
}</pre>
<p>接下来可以测试一下脚本是否可以正确执行</p>
<p>还是别忘了给它可执行权限</p>
<pre class="brush:shell">chmod +x /root/awstats.sh
/root/awstats.sh</pre>
<p>如果你看到它生成了一堆网页，那就说明成功了。</p>
<p>输出信息部分例如</p>
<pre class="brush:shell">Launch update process : "/usr/local/awstats/wwwroot/cgi-bin/awstats.pl" -config=akii.org -update -configdir=
......
Build keywords page: "/usr/local/awstats/wwwroot/cgi-bin/awstats.pl" -config=akii.org -staticlinks -lang=cn -output=keywords
Build errors404 page: "/usr/local/awstats/wwwroot/cgi-bin/awstats.pl" -config=akii.org -staticlinks -lang=cn -output=errors404
20 files built.
Main HTML page is 'awstats.akii.org.html'.</pre>
<p>然后可以把它加入自动运行了。</p>
<h2><strong>配置awstats脚本自动运行</strong></h2>
<pre class="brush:shell">crontab -e</pre>
<p>加入</p>
<pre class="brush:shell">00 1 * * * /root/awstats.sh</pre>
<p>然后保存退出。</p>
<p>这样就可以每天在凌晨自动分割日志，并且开始自动用awstats分析nginx的日志了。</p>
<h2><strong>认证访问</strong></h2>
<p>如果你想给你的awstats加上访问密码，可以见这里：<a href="http://www.akii.org/nginx-auth_basic-website-dir.html" target="_blank">nginx为目录或网站加上密码认证</a></p>
<p>原创文章，写的辛苦。如果你要转载，请保留出处及链接。</p>
<p>参考资料:<a href="http://www.ibm.com/developerworks/cn/linux/l-cn-awstats-nginx/index.html" target="_blank">http://www.ibm.com/developerworks/cn/linux/l-cn-awstats-nginx/index.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.akii.org/use-awstats-automatic-analysis-nginx-log.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
