<?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>Leakon &#187; Linux</title>
	<atom:link href="http://www.leakon.com/archives/category/linux/feed" rel="self" type="application/rss+xml" />
	<link>http://www.leakon.com</link>
	<description>勤奋 - 创新 - 矢志不渝 - 锲而不舍</description>
	<lastBuildDate>Mon, 06 Feb 2012 02:43:07 +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>grep 归档日志的好办法</title>
		<link>http://www.leakon.com/archives/704?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=grep-%25e5%25bd%2592%25e6%25a1%25a3%25e6%2597%25a5%25e5%25bf%2597%25e7%259a%2584%25e5%25a5%25bd%25e5%258a%259e%25e6%25b3%2595</link>
		<comments>http://www.leakon.com/archives/704#comments</comments>
		<pubDate>Sun, 29 Jan 2012 10:56:21 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[grep]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=704</guid>
		<description><![CDATA[归档的日志文件，想要从中找出匹配的数据，我最近才知道有更好的办法。
先说说我以前的笨方法：
* 先解压 bz2 文件到纯文本
* 再 grep 这个文本
* 完成后再删除这个纯文本
整个过程很麻烦。
&#160;
有位高手告诉我更简单的办法：
bzcat debug_log.bz2 &#124; grep &#8216;pattern&#8217; &#62; result.txt
这个是一边解压一边 grep，不用创建新文件，不太占 IO。
试了下，效果还不错，可以同时处理好几个，系统负载也不高。
]]></description>
			<content:encoded><![CDATA[<p>归档的日志文件，想要从中找出匹配的数据，我最近才知道有更好的办法。</p>
<p>先说说我以前的笨方法：</p>
<p>* 先解压 bz2 文件到纯文本</p>
<p>* 再 grep 这个文本</p>
<p>* 完成后再删除这个纯文本</p>
<p>整个过程很麻烦。</p>
<p>&nbsp;</p>
<p>有位高手告诉我更简单的办法：</p>
<p>bzcat debug_log.bz2 | grep &#8216;pattern&#8217; &gt; result.txt</p>
<p>这个是一边解压一边 grep，不用创建新文件，不太占 IO。</p>
<p>试了下，效果还不错，可以同时处理好几个，系统负载也不高。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/704/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用 rsync 备份多台服务器</title>
		<link>http://www.leakon.com/archives/697?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e4%25bd%25bf%25e7%2594%25a8-rsync-%25e5%25a4%2587%25e4%25bb%25bd%25e5%25a4%259a%25e5%258f%25b0%25e6%259c%258d%25e5%258a%25a1%25e5%2599%25a8</link>
		<comments>http://www.leakon.com/archives/697#comments</comments>
		<pubDate>Fri, 27 Jan 2012 15:56:35 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[rsync]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=697</guid>
		<description><![CDATA[今天对服务器备份的脚本进行了重构，把配置参数独立成文件，使用 PHP 代替不熟悉的 shell，理顺了思路，分享一下。
【环境】
一共3台服务器，server-1 和 server-2 是线上生产环境，backup-server 是专门用于备份的服务器。
【目的】
定期把 server-1 和 server-2 的 user 目录下的所有文件同步到 backup-server 的指定目录下。
【前提】
backup-server 上有一个用户 backup，他用 ssh-keygen 生成公钥，传到 server-1 和 server-2，这样 backup 用户登录这 2  [...]]]></description>
			<content:encoded><![CDATA[<p>今天对服务器备份的脚本进行了重构，把配置参数独立成文件，使用 PHP 代替不熟悉的 shell，理顺了思路，分享一下。</p>
<p>【环境】</p>
<p>一共3台服务器，server-1 和 server-2 是线上生产环境，backup-server 是专门用于备份的服务器。</p>
<p>【目的】</p>
<p>定期把 server-1 和 server-2 的 user 目录下的所有文件同步到 backup-server 的指定目录下。</p>
<p>【前提】</p>
<p>backup-server 上有一个用户 backup，他用 ssh-keygen 生成公钥，传到 server-1 和 server-2，这样 backup 用户登录这 2 台线上服务器时不再需要密码。</p>
<p>[backup@backup-server rsync]$ ssh-keygen -t rsa -b 1024</p>
<p>在 ~/.ssh/ 下生成 id_rsa 和 id_rsa.pub，分别是私钥和公钥。</p>
<p>把 id_rsa 重命名成 identity，chmod 600。</p>
<p>把 id_rsa.pub 复制到 server-1 的 /home/user/.ssh/ 目录下，把内容追加到 authorized_keys 文件中，注意此文件也要 chmod 600。</p>
<p>server-2 也如此操作。</p>
<p>之后，backup 用户可以随意 ssh user@server-1 和 ssh user@server-2，不会再问密码。</p>
<p>【功能列表】<br />
* 根据配置文件的 serverName，生成 shell 命令<br />
* 判断是否为唯一 rsync 进程，如果有正在执行的进程，则不执行任何操作<br />
* 确认没有重复进程之后，执行 rsync 命令同步文件，并输出进度信息到 logs 目录<br />
* php 的程序只输出 shell 命令，确认无误后用管道输出给 bash 来运行</p>
<p>【使用方法】<br />
[backup@backup-server rsync]$ /usr/bin/php /home/backup/script/rsync/rsync_web.php server-1 | sh</p>
<p>【详情】</p>
<p>根据 server-1 这个关键字，找到对应的配置信息。</p>
<p>根据一些列规则，生成一串管道命令，输出如下所示：</p>
<p>rsync_process_num=$(ps ax | grep &#8216;rsync&#8217; | grep -v &#8216;grep&#8217; | grep &#8216;server-1&#8242; | grep &#8216;bwlimit&#8217; | wc -l) &amp;&amp; test $rsync_process_num -lt 1 &amp;&amp; /usr/bin/nohup /usr/bin/rsync &#8211;links &#8211;delete &#8211;recursive &#8211;itemize-changes &#8211;progress &#8211;exclude-from=/home/backup/script/rsync/conf/exclude.server-1.conf &#8211;bwlimit=110 user@server-1:/home/user/* /home/backup/server-1/home/user/ &gt;&gt; /home/backup/script/rsync/logs/rsync_web.server-1.log 2&gt;&amp;1 &amp;</p>
<p>对比“功能列表”，可以看明白这一串命令都在干嘛。</p>
<p>【SVN】</p>
<p>具体的代码，我提交到了 googlecode，欢迎指正：http://leakon.googlecode.com/svn/trunk/server/script/rsync/</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/697/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sudo: sorry, you must have a tty to run sudo</title>
		<link>http://www.leakon.com/archives/634?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sudo-sorry-you-must-have-a-tty-to-run-sudo</link>
		<comments>http://www.leakon.com/archives/634#comments</comments>
		<pubDate>Sat, 03 Apr 2010 04:06:18 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sudo]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=634</guid>
		<description><![CDATA[I was recently working on a Perl script that would SSH to another server and run a sudo command on the remote server that was failing. The error that was received is below.
Error: sudo: sorry, you must have a tty to run sudo
The reason for this is an update along the way with sudo locked it down  [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently working on a Perl script that would SSH to another server and run a sudo command on the remote server that was failing. The error that was received is below.</p>
<p><strong>Error: sudo: sorry, you must have a tty to run sudo</strong></p>
<p>The reason for this is an update along the way with sudo locked it down further by adding the below line to /etc/sudoers configuration file.</p>
<pre>Defaults requiretty</pre>
<p>To allow a remote script to login and run a command via sudo simply comment out that line as shown below.</p>
<pre># Commented out so remote script can login and run a command without a tty
# Defaults requiretty</pre>
<p>I would suggest making a comment in the sudoers file along with the actual script that is running just in case there is another systems administrator that is tasked with working on this server at a later date. Now when your script runs it will not throw that error and should be able to run the remote command that was initially required.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/634/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>su 环境变量 小发现</title>
		<link>http://www.leakon.com/archives/555?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=su-%25e7%258e%25af%25e5%25a2%2583%25e5%258f%2598%25e9%2587%258f-%25e5%25b0%258f%25e5%258f%2591%25e7%258e%25b0</link>
		<comments>http://www.leakon.com/archives/555#comments</comments>
		<pubDate>Mon, 30 Nov 2009 07:21:21 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[su]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=555</guid>
		<description><![CDATA[Linux 下普通用户 su 成 root 后，环境变量以及路径等都还使用原用户的，比如没法直接执行 ifconfig，必须要用 /sbin/ifconfig。
今天受 wangjun 提醒，原来 su &#8211; 可以解决问题，直接切换到 root 目录下，环境变量也一并切换。
记录一下，顺便谢谢 wangjun。
]]></description>
			<content:encoded><![CDATA[<p>Linux 下普通用户 su 成 root 后，环境变量以及路径等都还使用原用户的，比如没法直接执行 ifconfig，必须要用 /sbin/ifconfig。</p>
<p>今天受 wangjun 提醒，原来 su &#8211; 可以解决问题，直接切换到 root 目录下，环境变量也一并切换。</p>
<p>记录一下，顺便谢谢 wangjun。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/555/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VMware CentOS 网络中断</title>
		<link>http://www.leakon.com/archives/553?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=vmware-centos-%25e7%25bd%2591%25e7%25bb%259c%25e4%25b8%25ad%25e6%2596%25ad</link>
		<comments>http://www.leakon.com/archives/553#comments</comments>
		<pubDate>Fri, 27 Nov 2009 16:32:04 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Reminder]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[NAT]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=553</guid>
		<description><![CDATA[有时候在 VMware 下的 CentOS 无法访问外网，现象是可以 ping 通 IP 地址，但没法 ping 域名，最开始以为 DNS 的问题，实际上没那么复杂。
只要在 Edit -&#62; Virutal Network Editor -&#62; Nat -&#62; Restart 即可。
可能是我这个 6.5 版本的 VMware 的 Nat 有问题吧。
唉，上次就搞了半天没发现问题，重启我的电脑后才好的。这次遇到问题突然忘了怎么解决，运气好，试了下重启 Nat 服务。
记下来备忘。
]]></description>
			<content:encoded><![CDATA[<p>有时候在 VMware 下的 CentOS 无法访问外网，现象是可以 ping 通 IP 地址，但没法 ping 域名，最开始以为 DNS 的问题，实际上没那么复杂。</p>
<p>只要在 Edit -&gt; Virutal Network Editor -&gt; Nat -&gt; Restart 即可。</p>
<p>可能是我这个 6.5 版本的 VMware 的 Nat 有问题吧。</p>
<p>唉，上次就搞了半天没发现问题，重启我的电脑后才好的。这次遇到问题突然忘了怎么解决，运气好，试了下重启 Nat 服务。</p>
<p>记下来备忘。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/553/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>memcache PECL bug fix</title>
		<link>http://www.leakon.com/archives/525?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-docs-%25e8%25b0%25b7%25e6%25ad%258c%25e6%2596%2587%25e6%25a1%25a3-https-%25e8%25ae%25bf%25e9%2597%25ae-ssl-%25e5%258a%25a0%25e5%25af%2586</link>
		<comments>http://www.leakon.com/archives/525#comments</comments>
		<pubDate>Fri, 13 Nov 2009 02:37:31 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[MemCache]]></category>
		<category><![CDATA[PECL]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=525</guid>
		<description><![CDATA[使用 memcache 的过程中，遇到一个奇怪的问题，在 CentOS 环境下，PHP 的 memcache 扩展创建的客户端对象，在 delete 一个 key 的时候报错：
[25-Nov-2009 13:57:04] PHP Notice:  Memcache::delete(): Server 192.168.10.131 (tcp 11211) failed with: CLIENT_ERROR bad command line format.  Usage: delete &#60;key&#62; [noreply]
可是在 Windows 环境下，用的人家编译好的  [...]]]></description>
			<content:encoded><![CDATA[<p>使用 memcache 的过程中，遇到一个奇怪的问题，在 CentOS 环境下，PHP 的 memcache 扩展创建的客户端对象，在 delete 一个 key 的时候报错：</p>
<p>[25-Nov-2009 13:57:04] PHP Notice:  Memcache::delete(): Server 192.168.10.131 (tcp 11211) failed with: CLIENT_ERROR bad command line format.  Usage: delete &lt;key&gt; [noreply]</p>
<p>可是在 Windows 环境下，用的人家编译好的 <a title="memcache PECL extension" href="http://down.leakon.com/200911/php_memcache-cvs-20090703-5.3-VC6-x86.zip">php_memcache-cvs-20090703-5.3-VC6-x86.dll</a> (20KB) 却没问题！</p>
<p>在 Google 上找了半天，终于在 PHP 官方手册的评论中发现了线索：</p>
<p><a href="http://php.net/manual/en/function.memcache-delete.php">http://php.net/manual/en/function.memcache-delete.php</a></p>
<p>请看 10-Nov-2009 11:17 这条，简短翻译一下：</p>
<p>memcache 这个 PECL 扩展的 2.2.5 稳定版本有一个错误，导致在向 memcached 1.4.3 调用 delete 方法时返回 false。</p>
<p>用 -vvv 模式运行 memcached 将显示出为什么 delete 调用失败：</p>
<p>CLIENT_ERROR bad command line format.  Usage: delete &lt;key&gt; [noreply]</p>
<p>简单修改一下，在这个 PECL 扩展的 memcache.c 这个文件的 1494 行的 mmc_delete() 函数中。把 command_len 修改为下面这样：</p>
<p>command_len = spprintf(&amp;command, 0, &#8220;delete %s&#8221;, key);</p>
<p>去掉了弃用的第 3 个参数，然后 delete 就可以工作了。希望这个可以帮到你！</p>
<p>再提示一下改动前的代码：</p>
<p>//  command_len = spprintf(&amp;command, 0, &#8220;delete %s %d&#8221;, key, time);</p>
<p>修改完成后，重新编译出 memcache.so 即可。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/525/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion neon 诡异配置 一波三折</title>
		<link>http://www.leakon.com/archives/515?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=subversion-neon-%25e8%25af%25a1%25e5%25bc%2582%25e9%2585%258d%25e7%25bd%25ae-%25e4%25b8%2580%25e6%25b3%25a2%25e4%25b8%2589%25e6%258a%2598</link>
		<comments>http://www.leakon.com/archives/515#comments</comments>
		<pubDate>Mon, 02 Nov 2009 14:20:58 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[默认分类]]></category>
		<category><![CDATA[Neon]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=515</guid>
		<description><![CDATA[今天发现前几天装的 subversion 居然没法通过 http 协议访问版本库！
Subversion 出现 svn: Unrecognized URL scheme for &#8216;http://&#8230;..&#8217;  这样的错误提示。
检查 svn 客户端是否支持 http 协议，只需查看版本号：
shell&#62; svn &#8211;version
看看输出是否有如下输出：
* ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol.
- handles &#8216;http&#8217; scheme
- handles  [...]]]></description>
			<content:encoded><![CDATA[<p>今天发现前几天装的 subversion 居然没法通过 http 协议访问版本库！</p>
<p>Subversion 出现 svn: Unrecognized URL scheme for &#8216;http://&#8230;..&#8217;  这样的错误提示。</p>
<p>检查 svn 客户端是否支持 http 协议，只需查看版本号：</p>
<p>shell&gt; svn &#8211;version</p>
<p>看看输出是否有如下输出：</p>
<p>* ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol.<br />
- handles &#8216;http&#8217; scheme<br />
- handles &#8216;https&#8217; scheme</p>
<p>如果有，恭喜了，不用继续耽误您时间了。如果没有，后面告诉你怎么让它有。</p>
<p>我的 subversion 版本是 1.6.5，本来我看了 INSTALL 文件，预先编译了 neon，用的是最新的 0.29.0，然后指定了 neon 的路径。编译了 3 次，慢死了，结果还是没有，真邪门了。</p>
<p>后来 google 搜啊搜，注意到一个细节，说 configure 的时候，neon 配置出错，不会终止配置进程，只是给出几行提示信息，然后继续……</p>
<p>我重新 configure，看看 neon 的输出，居然看到下面几行：</p>
<p>checking neon library version&#8230; 0.29.0<br />
You have neon version 0.29.0,<br />
but Subversion needs neon 0.28.4.</p>
<p>An appropriate version of neon could not be found, so libsvn_ra_neon<br />
will not be built.  If you want to build libsvn_ra_neon, please either<br />
install neon 0.28.4 on this system</p>
<p>or</p>
<p>get neon 0.28.4 from:<br />
<a href="http://www.webdav.org/neon/neon-0.28.4.tar.gz" target="_blank">http://www.webdav.org/neon/neon-0.28.4.tar.gz</a><br />
unpack the archive using tar/gunzip and rename the resulting<br />
directory from ./neon-0.28.4/ to ./neon/</p>
<p>no suitable neon found</p>
<p>提示的意思是必须安装 0.28.4 版本的 neon，更高的版本都不行！</p>
<p>到此问题明朗，重新安装 0.28.4 版本的 neon ，然后重新编译 subversion 即可。</p>
<p>最后，我的 svn 也支持 http 和 https 协议啦！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/515/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>iptables 防火墙 firewall COMMIT Linux</title>
		<link>http://www.leakon.com/archives/496?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=iptables-%25e9%2598%25b2%25e7%2581%25ab%25e5%25a2%2599-firewall-commit-linux</link>
		<comments>http://www.leakon.com/archives/496#comments</comments>
		<pubDate>Tue, 27 Oct 2009 10:00:40 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[iptables]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=496</guid>
		<description><![CDATA[Applying iptables firewall rules: iptables-restore: line 20 failed [FAILED]
修改防火墙配置，然后重启 iptables，结果得到上面这个错误提示。
配置文件 20 行是一个 COMMIT，不是这行的问题。
跟内核有关系，但不要轻易重新编译内核，搞不好系统就没法用了。
找到上面问题原因，有其他方法可以解决的。
看了国外的一个论坛，有个人说是 -m 这个选项造成的。
因为当前系统内核中缺少一个 module，而 -m 这个选项刚好要加载这个 module。
这个 module 是 xt_state。
当然，重新编译  [...]]]></description>
			<content:encoded><![CDATA[<p>Applying iptables firewall rules: iptables-restore: line 20 failed [FAILED]</p>
<p>修改防火墙配置，然后重启 iptables，结果得到上面这个错误提示。</p>
<p>配置文件 20 行是一个 COMMIT，不是这行的问题。</p>
<p>跟内核有关系，但不要轻易重新编译内核，搞不好系统就没法用了。</p>
<p>找到上面问题原因，有其他方法可以解决的。</p>
<p>看了国外的一个论坛，有个人说是 -m 这个选项造成的。</p>
<p>因为当前系统内核中缺少一个 module，而 -m 这个选项刚好要加载这个 module。</p>
<p>这个 module 是 xt_state。</p>
<p>当然，重新编译 kernel，加上这个 module 可以解决问题，但我不敢，因为不会……</p>
<p>我可以不用 -m 这个选项。</p>
<p>其实我就是要求开放 22 和 80 这 2 个端口，其他的一律拒绝。</p>
<p>之前导致报错的写法：</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">-A INPUT -m state &#8211;state NEW -m tcp -p tcp &#8211;dport 22 -j ACCEPT</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">-A INPUT -m state &#8211;state NEW -m tcp -p tcp &#8211;dport 80 -j ACCEPT</div>
<p>-A INPUT -m state &#8211;state NEW -m tcp -p tcp &#8211;dport 22 -j ACCEPT<br />
-A INPUT -m state &#8211;state NEW -m tcp -p tcp &#8211;dport 80 -j ACCEPT</p>
<p>把 -m state &#8211;state NEW -m tcp 这段去掉：</p>
<p>-A INPUT -p tcp &#8211;dport 22 -j ACCEPT<br />
-A INPUT -p tcp &#8211;dport 80 -j ACCEPT</p>
<p>删除那个 -m state &#8211;state NEW 的意思是匹配状态，当新连接创建时应用过滤条件。</p>
<p>我估计这个是为了提升性能吧，连接创建时如果不匹配规则，就拒绝掉后续的请求，一旦连接建立，就不用对后续的包进行再次过滤检查。</p>
<p>如果是这样，我觉得可以接受，无非是服务器负载高一点而已，对流量小的网站来说没什么影响。等流量大了再研究编译内核吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/496/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSL negotiation failed: SSL error: parse tlsext</title>
		<link>http://www.leakon.com/archives/422?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ssl-negotiation-failed-ssl-error-parse-tlsext</link>
		<comments>http://www.leakon.com/archives/422#comments</comments>
		<pubDate>Fri, 23 Oct 2009 02:07:46 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=422</guid>
		<description><![CDATA[Apache/Subversion: SSL negotiation failed: SSL error: parse tlsext
在 CentOS 下配置 Apache + SSL + Subversion，一切都搞定后，提交原始代码到版本库，结果总是中途断掉，得到标题给出的提示。
查了下，是因为 TLSv1 协议的问题，不知是 openssl 的 bug 还是 subversion 的 bug，总之无法正常工作。
修改 Apache 配置文件，屏蔽掉 TLSv1 加密方式：
SSLProtocol -ALL +SSLv3
或
SSLProtocol +ALL -SSLv2  [...]]]></description>
			<content:encoded><![CDATA[<p>Apache/Subversion: SSL negotiation failed: SSL error: parse tlsext</p>
<p>在 CentOS 下配置 Apache + SSL + Subversion，一切都搞定后，提交原始代码到版本库，结果总是中途断掉，得到标题给出的提示。</p>
<p>查了下，是因为 TLSv1 协议的问题，不知是 openssl 的 bug 还是 subversion 的 bug，总之无法正常工作。</p>
<p>修改 Apache 配置文件，屏蔽掉 TLSv1 加密方式：</p>
<p>SSLProtocol -ALL +SSLv3</p>
<p>或</p>
<p>SSLProtocol +ALL -SSLv2 -TLSv1</p>
<p>或</p>
<p>SSLProtocol all -TLSv1</p>
<p>反正只要没有 TLSv1 就能正常工作，经测试，暂时还未发现新问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/422/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>libsvn_subr-1.so.0: undefined symbol: sqlite3_open_v2</title>
		<link>http://www.leakon.com/archives/428?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=libsvn_subr-1-so-0-undefined-symbol-sqlite3_open_v2</link>
		<comments>http://www.leakon.com/archives/428#comments</comments>
		<pubDate>Thu, 22 Oct 2009 15:04:02 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[CentOS]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=428</guid>
		<description><![CDATA[安装 subversion 到 CentOS 服务器上，编译了 OpenSSL、Apache 和 SQLite，subversion 也编译完了，用 httpd -t 查看 Apache 配置文件的时候报出错误：
httpd: Syntax error on line 106 of /xxx/yyy/apache2/conf/httpd.conf: Cannot load /xxx/yyy/apache2/modules/mod_dav_svn.so into server: /xxx/yyy/subversion/lib/libsvn_subr-1.so.0: undefined  [...]]]></description>
			<content:encoded><![CDATA[<p>安装 subversion 到 CentOS 服务器上，编译了 OpenSSL、Apache 和 SQLite，subversion 也编译完了，用 httpd -t 查看 Apache 配置文件的时候报出错误：</p>
<p>httpd: Syntax error on line 106 of /xxx/yyy/apache2/conf/httpd.conf: Cannot load /xxx/yyy/apache2/modules/mod_dav_svn.so into server: /xxx/yyy/subversion/lib/libsvn_subr-1.so.0: undefined symbol: sqlite3_open_v2</p>
<p>一下就晕了，在 Google 查不到几条信息，也都没说到点上，不过还算有些启发。</p>
<p>之前在本地 VMware 的 CentOS 上测试过，安装很顺利，这回失败，肯定跟 64 位服务器有关。</p>
<p>换了多种 subversion 的编译参数，反复编译了几次，问题依旧。</p>
<p>后来学会了用 ldd 查看链接库的依赖：</p>
<p>shell&gt; ldd /xxx/yyy/subversion/lib/libsvn_subr-1.so.0</p>
<p>libaprutil-1.so.0 =&gt; /xxx/yyy/apr-util/lib/libaprutil-1.so.0 (0x00002b4613bf5000)</p>
<p>libexpat.so.0 =&gt; /lib64/libexpat.so.0 (0x00002b4613e22000)</p>
<p>libapr-1.so.0 =&gt; /usr/lib64/libapr-1.so.0 (0x00002b4614044000)</p>
<p>libuuid.so.1 =&gt; /lib64/libuuid.so.1 (0x00002b461426c000)</p>
<p>librt.so.1 =&gt; /lib64/librt.so.1 (0x00002b4614470000)</p>
<p>libcrypt.so.1 =&gt; /lib64/libcrypt.so.1 (0x00002b4614679000)</p>
<p>libpthread.so.0 =&gt; /lib64/libpthread.so.0 (0x00002b46148b2000)</p>
<p>libdl.so.2 =&gt; /lib64/libdl.so.2 (0x00002b4614acd000)</p>
<p>libsqlite3.so.0 =&gt; /usr/lib64/libsqlite3.so.0 (0x00002b4614cd1000)</p>
<p>libc.so.6 =&gt; /lib64/libc.so.6 (0x00002b4614f2c000)</p>
<p>/lib64/ld-linux-x86-64.so.2 (0x00002b461376e000)</p>
<p>看到 libsqlite3.so.0 依赖的是用的系统自带的 64 位的 sqlite 链接库，这个链接库应该是没有定义 “sqlite3_open_v2”，因此 mod_dav_svn.so 是无法加载到 apache 中的。</p>
<p>虽然找到了有价值的线索，但让我开始更为迷惑，为什么 libsvn_subr-1.so.0 会依赖系统的库文件，不是我指定的 sqlite 的库文件地址呢？</p>
<p>又查看了 subversion 源码中附带的 INSTALL 说明文件，文中提及了 sqlite 的 3 种关联方式。</p>
<p>我指定了 sqlite 的安装路径，是第 1 种方式，但应该是使用 32 位方式编译的（不知道怎么设置强制 64 位编译），subversion 会忽略。</p>
<p>文中的第 2 种方式，把 sqlite3.c 复制到 subversion 的源码路径下：</p>
<p>/xxx/yyy/src/subversion-1.6.5/sqlite-amalgamation/sqlite3.c</p>
<p>然后重新编译，完成后再看 libsvn_subr-1.so.0 的依赖，发现它已经不再依赖外部 sqlite 。</p>
<p>这样 subversion 的安装问题就解决了。</p>
<p>顺便再记录一下 64 位系统中安装其他软件时遇到的问题如何解决。</p>
<p>安装 apache 需要 zlib 和 openssl，如果用普通方式编译这 2 个软件，则 apache 编译出错：</p>
<p>&#8220;relocation R_X86_64_32 against `a local symbol&#8217; can not be used when making a shared object; recompile with -fPIC&#8221;</p>
<p>解决问题的方法，是在这 2 个软件进行 configure 之后，修改 Makefile 文件，找到 CFLAGS，加上 -fPIC 参数，如下：</p>
<p>CFLAGS=&#8221;-O3 -fPIC&#8221;</p>
<p>注意，这只是个例子，可能参数列表不一样，只要加入 -fPIC 就可以了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/428/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

