<?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>Ren的Linux大杂坛</title>
	<atom:link href="http://blog.renhao.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.renhao.org</link>
	<description>一天一步，迈出脚步！</description>
	<lastBuildDate>Sun, 06 May 2012 16:44:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Ubuntu 12.04 中自定义DNS服务器设置</title>
		<link>http://blog.renhao.org/2012/05/ubuntu-12-04-add-dns-nameservers/</link>
		<comments>http://blog.renhao.org/2012/05/ubuntu-12-04-add-dns-nameservers/#comments</comments>
		<pubDate>Sun, 06 May 2012 16:44:08 +0000</pubDate>
		<dc:creator>Ren</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[resolvconf]]></category>

		<guid isPermaLink="false">http://blog.renhao.org/?p=251</guid>
		<description><![CDATA[随着Ubuntu 12.04 LTS版的发布，我自然要体验下最新的Ubuntu 12.04 Server版了。习惯性的安装配置好了之后，开始配置静态IP设置。别的配置都没有什么问题，但是在配置DNS服务器的时候出了问题。 大家都知道，要修改Linux系统的DNS服务器，只需要编辑/etc/resolv.conf文件即可。然而在Ubuntu 12.04里面，打开这个文件后，虽然可以看到配置信息，但是同时也看到了文件头里醒目的两行注释： #Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN 大意是这个文件是由resolvconf程序进行动态生成的，请不要手动修改，修改的信息将会被覆盖。这究竟是怎么回事呢？ 首先当然是不死心了，往里面添加了自己的DNS服务器地址后保存退出，发现能生效。看上去似乎没有什么问题了。 然而，在重启后，我添加的信息果然没有了！被系统自动覆盖了。 但是我真的很需要自己配置DNS服务器，Ubuntu Desktop版中可以借助图形界面的工具，进行手动配置，这个没有什么问题。但是对于Ubuntu Server版来说，没有图形工具了，必须要自己修改文件进行配置才行，这下这个文件每次启动后都会被覆盖了，要怎么样才能让我自己的DNS服务器信息能保存到系统里呢？ 网上搜索了一下，发现了解决办法，原来只需要往resolvconf这个程序的目录里写入一个新配置文件就可以解决。让我们一起看看怎么样在Ubuntu 12.04 LTS Server版中配置自己的DNS服务器吧！ 首先我们需要创建一个文件/etc/resolvconf/resolv.conf.d/tail： #vim /etc/resolvconf/resolv.conf.d/tail 然后我们在这个文件里写入自己要添加的DNS服务器，格式与以前的/etc/resolv.conf文件一致： nameserver 8.8.8.8 nameserver 8.8.4.4 然后输入wq保存退出。接下来我们重启下resolvconf程序，让配置生效： #/etc/init.d/resolvconf restart 再去看看/etc/resolv.conf文件，自己添加的DNS服务器果然乖乖的写进去了！至此问题完美解决！ 资料参考：http://askubuntu.com/questions/130452/how-do-i-add-a-dns-server-via-resolv-conf-ubuntu-12-04]]></description>
			<content:encoded><![CDATA[<p>随着Ubuntu 12.04 LTS版的发布，我自然要体验下最新的Ubuntu 12.04 Server版了。习惯性的安装配置好了之后，开始配置静态IP设置。别的配置都没有什么问题，但是在配置DNS服务器的时候出了问题。</p>
<p>大家都知道，要修改Linux系统的DNS服务器，只需要编辑/etc/resolv.conf文件即可。然而在Ubuntu 12.04里面，打开这个文件后，虽然可以看到配置信息，但是同时也看到了文件头里醒目的两行注释：</p>
<blockquote>
<pre>#Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN</pre>
</blockquote>
<p>大意是这个文件是由resolvconf程序进行动态生成的，请不要手动修改，修改的信息将会被覆盖。这究竟是怎么回事呢？<span id="more-251"></span></p>
<p>首先当然是不死心了，往里面添加了自己的DNS服务器地址后保存退出，发现能生效。看上去似乎没有什么问题了。</p>
<p>然而，在重启后，我添加的信息果然没有了！被系统自动覆盖了。</p>
<p>但是我真的很需要自己配置DNS服务器，Ubuntu Desktop版中可以借助图形界面的工具，进行手动配置，这个没有什么问题。但是对于Ubuntu Server版来说，没有图形工具了，必须要自己修改文件进行配置才行，这下这个文件每次启动后都会被覆盖了，要怎么样才能让我自己的DNS服务器信息能保存到系统里呢？</p>
<p>网上搜索了一下，发现了解决办法，原来只需要往resolvconf这个程序的目录里写入一个新配置文件就可以解决。让我们一起看看怎么样在Ubuntu 12.04 LTS Server版中配置自己的DNS服务器吧！</p>
<p>首先我们需要创建一个文件/etc/resolvconf/resolv.conf.d/tail：</p>
<blockquote><p>#vim /etc/resolvconf/resolv.conf.d/tail</p></blockquote>
<p>然后我们在这个文件里写入自己要添加的DNS服务器，格式与以前的/etc/resolv.conf文件一致：</p>
<blockquote><p>nameserver 8.8.8.8<br />
nameserver 8.8.4.4</p></blockquote>
<p>然后输入wq保存退出。接下来我们重启下resolvconf程序，让配置生效：</p>
<blockquote><p>#/etc/init.d/resolvconf restart</p></blockquote>
<p>再去看看/etc/resolv.conf文件，自己添加的DNS服务器果然乖乖的写进去了！至此问题完美解决！</p>
<p><em>资料参考：<a href="http://askubuntu.com/questions/130452/how-do-i-add-a-dns-server-via-resolv-conf-ubuntu-12-04" target="_blank">http://askubuntu.com/questions/130452/how-do-i-add-a-dns-server-via-resolv-conf-ubuntu-12-04</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.renhao.org/2012/05/ubuntu-12-04-add-dns-nameservers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>解决远程配置Linux网卡IP失败会断网的命令</title>
		<link>http://blog.renhao.org/2012/01/resolve-remote-ssh-configure-network-failed/</link>
		<comments>http://blog.renhao.org/2012/01/resolve-remote-ssh-configure-network-failed/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 19:44:26 +0000</pubDate>
		<dc:creator>Ren</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[远程]]></category>

		<guid isPermaLink="false">http://blog.renhao.org/?p=244</guid>
		<description><![CDATA[很多时候，购买的服务器都不在本地，没有办法直接通过接鼠标键盘的方式进行维护。而Linux下的服务器，有的时候需要增加绑定的IP等操作，这个时候需要配置Linux的网卡属性等参数，达到绑定新的IP的目的。 当然这个操作并不是本文要说明的。本文要说明的一个问题是：在远程配置了Linux的网络参数后（比如使用ssh连接），一般需要重启Linux的network服务来令其生效。然而一旦这些配置文件中的一个出了问题，那么很有可能服务器的网络就起不来了，也就是说就算想改也无法远程连接服务器了！ 很多时候我们也没有办法直观的检测网络参数是否正确，而且有的时候本来也是一些尝试性的修改，出错的几率还是比较大的。有没有办法能够即使我们配置出错了，也能保证网络不会被中断呢？ 实际上，这个办法是有的。不过这里也有一个前提，就是说服务器的主IP配置一定要正确，如果这个都错了那就真的没办法了（至少在我知道的范围内是无解的）。如果只是添加额外的IP之类的操作，因为不会改动主IP，所以用下面的方法就可行了。 其实这个方法很简单，就是在重启网络的命令后面加上“ &#124;&#124; ifup eth0”这条指令。其中eth0可以换成你任何一块配置正确的网卡编号，当然如果服务器只有一块物理网卡，那就只有eth0了。 所以结合重启网络的命令，就成了下面这条指令： # service network restart &#124;&#124; ifup eth0 用这条指令远程重启Linux服务器的网络服务，能够保证即便后面的文件配置有错，也能够维持主IP连通，可以让你有机会修改了。这条指令同时适用于Ubuntu和CentOS，其他的Linux发行版应该也是可用的。 资料参考：http://baiqiuyi.com/linux/debian-and-centos-configure-multiple-ips.html]]></description>
			<content:encoded><![CDATA[<p>很多时候，购买的服务器都不在本地，没有办法直接通过接鼠标键盘的方式进行维护。而Linux下的服务器，有的时候需要增加绑定的IP等操作，这个时候需要配置Linux的网卡属性等参数，达到绑定新的IP的目的。</p>
<p>当然这个操作并不是本文要说明的。本文要说明的一个问题是：在远程配置了Linux的网络参数后（比如使用ssh连接），一般需要重启Linux的network服务来令其生效。然而一旦这些配置文件中的一个出了问题，那么很有可能服务器的网络就起不来了，也就是说就算想改也无法远程连接服务器了！<span id="more-244"></span></p>
<p>很多时候我们也没有办法直观的检测网络参数是否正确，而且有的时候本来也是一些尝试性的修改，出错的几率还是比较大的。有没有办法能够即使我们配置出错了，也能保证网络不会被中断呢？</p>
<p>实际上，这个办法是有的。不过这里也有一个前提，就是说服务器的主IP配置一定要正确，如果这个都错了那就真的没办法了（至少在我知道的范围内是无解的）。如果只是添加额外的IP之类的操作，因为不会改动主IP，所以用下面的方法就可行了。</p>
<p>其实这个方法很简单，就是在重启网络的命令后面加上<strong>“ || ifup eth0”</strong>这条指令。其中eth0可以换成你任何一块配置正确的网卡编号，当然如果服务器只有一块物理网卡，那就只有eth0了。</p>
<p>所以结合重启网络的命令，就成了下面这条指令：</p>
<blockquote><p># service network restart || ifup eth0</p></blockquote>
<p>用这条指令远程重启Linux服务器的网络服务，能够保证即便后面的文件配置有错，也能够维持主IP连通，可以让你有机会修改了。这条指令同时适用于Ubuntu和CentOS，其他的Linux发行版应该也是可用的。</p>
<p><em>资料参考：<a href="http://baiqiuyi.com/linux/debian-and-centos-configure-multiple-ips.html" target="_blank">http://baiqiuyi.com/linux/debian-and-centos-configure-multiple-ips.html</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.renhao.org/2012/01/resolve-remote-ssh-configure-network-failed/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>解决PHP的mail函数无法发送邮件的问题</title>
		<link>http://blog.renhao.org/2011/09/resolve-php-mail-function-could-not-send-a-mail/</link>
		<comments>http://blog.renhao.org/2011/09/resolve-php-mail-function-could-not-send-a-mail/#comments</comments>
		<pubDate>Tue, 13 Sep 2011 00:37:57 +0000</pubDate>
		<dc:creator>Ren</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[邮件]]></category>

		<guid isPermaLink="false">http://blog.renhao.org/?p=238</guid>
		<description><![CDATA[在上次编译LNMP环境的文章《CentOS 6.0 x64编译LNMP环境》发布之后，我又购买了一台新的VPS并按照这个步骤进行了安装。但是却碰到一件该文章中没有碰到的问题，经过多次折腾后终于解决之。 这个问题就是，编译好的LNMP环境下，WordPress的WP Tread Comment插件的自动发送回复邮件功能失效了！！然后我又安装了个PHP探针，测试mail函数是存在的，但是发邮件死活发不出去。 怪哉了，之前我的独立服务器和VPS编译LNMP环境都没有出现这样的问题，一时间丈二的和尚摸不着头脑了。 冷静下来之后，我试着对比了能发邮件和不能发邮件的PHP配置文件，答案是相同的，也就是说没有设置上的问题导致不能发送邮件。试着用Linux下的Shell命令mail发送邮件，新的VPS提示这个命令不存在！！ 再做进一步的检查，发现这个VPS默认没有安装sendmail这个Linux下的基本邮件组件。看来问题就在这里了！！通过重新安装sendmail（我用的CentOS，则是使用yum install sendmail来安装）之后，重启php-fpm进程，结果还是发送失败。 用Shell下的mail命令进行测试，能够正常发出E-Mail，没有任何问题。但是PHP下的mail()函数就是死活不行。 继续网上搜索资料，结果发现编译PHP的时候，需要确保sendmail组件是已经安装好了的，不然发送邮件就不行。但是我又不想重新编译一次PHP（太费时间了），有没有别的办法呢？——答案当然是有的。 只需要在php.ini文件中，找到mail部分的设置，将下面这个参数设置下即可： sendmail_path = /usr/sbin/sendmail -t -i 也就是说让系统找到sendmail的绝对路径，这样就不会有问题啦！重启PHP，测试发送邮件，成功！！ 资料参考：http://blog.csdn.net/zeropool/article/details/6760915]]></description>
			<content:encoded><![CDATA[<p>在上次编译LNMP环境的文章《<a title="CentOS 6.0 x64编译LNMP环境" href="http://blog.renhao.org/2011/09/centos-6-x64-compile-lnmp-environment/" target="_blank">CentOS 6.0 x64编译LNMP环境</a>》发布之后，我又购买了一台新的VPS并按照这个步骤进行了安装。但是却碰到一件该文章中没有碰到的问题，经过多次折腾后终于解决之。</p>
<p>这个问题就是，编译好的LNMP环境下，WordPress的WP Tread Comment插件的自动发送回复邮件功能失效了！！然后我又安装了个PHP探针，测试mail函数是存在的，但是发邮件死活发不出去。</p>
<p>怪哉了，之前我的独立服务器和VPS编译LNMP环境都没有出现这样的问题，一时间丈二的和尚摸不着头脑了。<span id="more-238"></span></p>
<p>冷静下来之后，我试着对比了能发邮件和不能发邮件的PHP配置文件，答案是相同的，也就是说没有设置上的问题导致不能发送邮件。试着用Linux下的Shell命令mail发送邮件，新的VPS提示这个命令不存在！！</p>
<p>再做进一步的检查，发现这个VPS默认没有安装sendmail这个Linux下的基本邮件组件。看来问题就在这里了！！通过重新安装sendmail（我用的CentOS，则是使用yum install sendmail来安装）之后，重启php-fpm进程，结果还是发送失败。</p>
<p>用Shell下的mail命令进行测试，能够正常发出E-Mail，没有任何问题。但是PHP下的mail()函数就是死活不行。</p>
<p>继续网上搜索资料，结果发现编译PHP的时候，需要确保sendmail组件是已经安装好了的，不然发送邮件就不行。但是我又不想重新编译一次PHP（太费时间了），有没有别的办法呢？——答案当然是有的。</p>
<p>只需要在php.ini文件中，找到mail部分的设置，将下面这个参数设置下即可：</p>
<blockquote><p>sendmail_path = /usr/sbin/sendmail -t -i</p></blockquote>
<p>也就是说让系统找到sendmail的绝对路径，这样就不会有问题啦！重启PHP，测试发送邮件，成功！！</p>
<p><em>资料参考：<a href="http://blog.csdn.net/zeropool/article/details/6760915">http://blog.csdn.net/zeropool/article/details/6760915</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.renhao.org/2011/09/resolve-php-mail-function-could-not-send-a-mail/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>带黑名单和白名单的DDOS防御Shell脚本</title>
		<link>http://blog.renhao.org/2011/09/anti-ddos-shell-script-with-blacklist-and-whitelist/</link>
		<comments>http://blog.renhao.org/2011/09/anti-ddos-shell-script-with-blacklist-and-whitelist/#comments</comments>
		<pubDate>Tue, 13 Sep 2011 00:20:28 +0000</pubDate>
		<dc:creator>Ren</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[DDOS]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[脚本]]></category>
		<category><![CDATA[防御]]></category>

		<guid isPermaLink="false">http://blog.renhao.org/?p=232</guid>
		<description><![CDATA[由于有的时候服务器会被DDOS攻击，经过几次实际的处理后，我制作了一套防御DDOS的脚本。比起一般的DDOS防御脚本来说，我可以设置白名单，来让自己的IP不受干扰。 此外，这个防御DDOS的脚本还会记录下每个被封的IP的连接数信息，方便后期的分析。被封杀的IP也会有日志记录可查。 这套脚本需要cron的支持，1分钟执行一次，检查当前的连接情况并对超过设置的连接进行屏蔽处理。而屏蔽方面则依赖于iptables。如果Linux Server上安装有这两个支持，那么就可以使用我的这个脚本来进行DDOS防御了。 默认情况下，脚本的防御为连接数超过40个的IP。如果您需要请调整注释处的数字符合您的需求。此外，这套脚本默认放在/usr/local/ddos下，脚本名称为ddos.sh。如果需要更改目录，请对脚本中的路径进行对应的修改即可。 脚本如下： #!/bin/bash netstat -an&#124; grep :80 &#124;awk '{ print $5 }' &#124; sort&#124;awk -F: '{print $1}' &#124; uniq -c &#124; awk '$1 &#38;gt;40' &#124; awk '$2 != &#34;&#34;' &#38;gt; /usr/local/ddos/black.txt netstat -an&#124; grep :80 &#124;awk '{ print $5 }' &#124; sort&#124;awk -F: '{print $4}' &#124; uniq -c &#124; awk '$1 [...]]]></description>
			<content:encoded><![CDATA[<p>由于有的时候服务器会被DDOS攻击，经过几次实际的处理后，我制作了一套防御DDOS的脚本。比起一般的DDOS防御脚本来说，我可以设置白名单，来让自己的IP不受干扰。</p>
<p>此外，这个防御DDOS的脚本还会记录下每个被封的IP的连接数信息，方便后期的分析。被封杀的IP也会有日志记录可查。</p>
<p>这套脚本需要cron的支持，1分钟执行一次，检查当前的连接情况并对超过设置的连接进行屏蔽处理。而屏蔽方面则依赖于iptables。如果Linux Server上安装有这两个支持，那么就可以使用我的这个脚本来进行DDOS防御了。<span id="more-232"></span></p>
<p>默认情况下，脚本的防御为连接数超过40个的IP。如果您需要请调整注释处的数字符合您的需求。此外，这套脚本默认放在/usr/local/ddos下，脚本名称为ddos.sh。如果需要更改目录，请对脚本中的路径进行对应的修改即可。</p>
<p>脚本如下：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #c20cb9; font-weight: bold;">netstat</span> <span style="color: #660033;">-an</span><span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> :<span style="color: #000000;">80</span> <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{ print $5 }'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sort</span><span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">awk</span> -F: <span style="color: #ff0000;">'{print $1}'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">uniq</span> <span style="color: #660033;">-c</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'$1 &amp;gt;40'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'$2 != &quot;&quot;'</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>ddos<span style="color: #000000; font-weight: bold;">/</span>black.txt
<span style="color: #c20cb9; font-weight: bold;">netstat</span> <span style="color: #660033;">-an</span><span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> :<span style="color: #000000;">80</span> <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{ print $5 }'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sort</span><span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">awk</span> -F: <span style="color: #ff0000;">'{print $4}'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">uniq</span> <span style="color: #660033;">-c</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'$1 &amp;gt;40'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'$2 != &quot;&quot;'</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>ddos<span style="color: #000000; font-weight: bold;">/</span>black.txt
<span style="color: #007800;">cnt</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print $2}'</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>ddos<span style="color: #000000; font-weight: bold;">/</span>black.txt<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #660033;">-z</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>;
	<span style="color: #000000; font-weight: bold;">then</span>
        	<span style="color: #007800;">COUNT</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #007800;">$i</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>ddos<span style="color: #000000; font-weight: bold;">/</span>black.txt <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print \$1}'</span><span style="color: #000000; font-weight: bold;">`</span>
        	<span style="color: #007800;">DEFINE</span>=<span style="color: #ff0000;">&quot;40&quot;</span>
        	<span style="color: #007800;">ZERO</span>=<span style="color: #ff0000;">&quot;0&quot;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$COUNT</span> <span style="color: #660033;">-gt</span> <span style="color: #007800;">$DEFINE</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>;
        	<span style="color: #000000; font-weight: bold;">then</span>
                	<span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #007800;">$i</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>ddos<span style="color: #000000; font-weight: bold;">/</span>white.txt <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null
                	<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$?</span> <span style="color: #660033;">-gt</span> <span style="color: #007800;">$ZERO</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>;
                	<span style="color: #000000; font-weight: bold;">then</span>
				<span style="color: #007800;">IPEX</span>=<span style="color: #000000; font-weight: bold;">`</span>iptables <span style="color: #660033;">-nL</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-z</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$IPEX</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>;
				<span style="color: #000000; font-weight: bold;">then</span>
                			<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$COUNT</span> <span style="color: #007800;">$i</span>&quot;</span>
                			iptables <span style="color: #660033;">-I</span> INPUT <span style="color: #660033;">-s</span> <span style="color: #007800;">$i</span> <span style="color: #660033;">-j</span> DROP
					<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;[<span style="color: #780078;">`date &quot;+%Y-%m-%d %T&quot;`</span>] IP: <span style="color: #007800;">$i</span><span style="color: #000099; font-weight: bold;">\t</span>COUNT: <span style="color: #007800;">$COUNT</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>ddos<span style="color: #000000; font-weight: bold;">/</span>banned.log
				<span style="color: #000000; font-weight: bold;">fi</span>
                	<span style="color: #000000; font-weight: bold;">fi</span>
        	<span style="color: #000000; font-weight: bold;">fi</span>
		<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">cnt</span>=cnt+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">done</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;[<span style="color: #780078;">`date &quot;+%Y-%m-%d %T&quot;`</span>] Script runned, found <span style="color: #007800;">$cnt</span>.&quot;</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>ddos<span style="color: #000000; font-weight: bold;">/</span>run.log</pre></div></div>

<p>脚本的设置如下，编辑cron的配置文件/etc/crontab，添加下列信息进去：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">*/</span><span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">*</span>   <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span>   root    <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>ddos<span style="color: #000000; font-weight: bold;">/</span>ddos.sh
<span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">*</span>    <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span>   root    iptables <span style="color: #660033;">--flush</span></pre></div></div>

<p>第一条是1分钟执行一次防御脚本，第二条是每小时清理一次IP禁止列表。第二条是可选的，主要是为了将已经封杀的IP解禁，避免过多的封杀或者误杀。一个小时的禁止时间也已经足够了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.renhao.org/2011/09/anti-ddos-shell-script-with-blacklist-and-whitelist/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CentOS 6.0 x64编译LNMP环境</title>
		<link>http://blog.renhao.org/2011/09/centos-6-x64-compile-lnmp-environment/</link>
		<comments>http://blog.renhao.org/2011/09/centos-6-x64-compile-lnmp-environment/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 06:47:17 +0000</pubDate>
		<dc:creator>Ren</dc:creator>
				<category><![CDATA[CentOS]]></category>
		<category><![CDATA[LNMP]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[编译]]></category>

		<guid isPermaLink="false">http://blog.renhao.org/?p=224</guid>
		<description><![CDATA[前段时间换VPS，在选择系统的时候，抛弃掉了Ubuntu Server而选择最新的CentOS 6.0 64bit。选择之后自然就涉及到安装环境的问题了。自己有点不想用LAMP环境了，于是大胆的选择了LNMP。 然而yum源里默认是没有nginx的，要安装LNMP就只有两个选择：要么添加第三方源来实现，要么自己编译。 对于Linux环境下的编译感兴趣的我，决定使用最新的LNMP环境，于是就选择了后者——自己编译。 经过几次尝试之后，把发现的各类问题和总结都基本归纳好了，于是写了这么一篇总结性的文章，以便今后参考。 需要注意的是：64位里面有些软链接的操作是32位系统不需要或者不相同的，因此这里请注意文章里的描述，以免出现问题。 （一）准备必要的组件 这一步将安装系统里缺失的组件，以便后面的编译过程顺利。VPS由于都是精简过的系统，因此大部分的组件都有缺失，因此这一步是相当重要的。 这步操作可以通过yum源来完成，简单方便。在控制台里敲入下面的命令： yum install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel  ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel libtool  libtool-libs libevent-devel libevent openldap openldap-devel nss_ldap openldap-clients openldap-servers libtool-ltdl libtool-ltdl-devel [...]]]></description>
			<content:encoded><![CDATA[<p>前段时间换VPS，在选择系统的时候，抛弃掉了Ubuntu Server而选择最新的CentOS 6.0 64bit。选择之后自然就涉及到安装环境的问题了。自己有点不想用LAMP环境了，于是大胆的选择了LNMP。</p>
<p>然而yum源里默认是没有nginx的，要安装LNMP就只有两个选择：要么添加第三方源来实现，要么自己编译。</p>
<p>对于Linux环境下的编译感兴趣的我，决定使用最新的LNMP环境，于是就选择了后者——自己编译。<span id="more-224"></span></p>
<p>经过几次尝试之后，把发现的各类问题和总结都基本归纳好了，于是写了这么一篇总结性的文章，以便今后参考。</p>
<p><strong><span style="color: #ff0000;">需要注意的是：64位里面有些软链接的操作是32位系统不需要或者不相同的，因此这里请注意文章里的描述，以免出现问题。</span></strong></p>
<h3>（一）准备必要的组件</h3>
<p>这一步将安装系统里缺失的组件，以便后面的编译过程顺利。VPS由于都是精简过的系统，因此大部分的组件都有缺失，因此这一步是相当重要的。</p>
<p>这步操作可以通过yum源来完成，简单方便。在控制台里敲入下面的命令：</p>
<blockquote><p>yum install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel  ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel libtool  libtool-libs libevent-devel libevent openldap openldap-devel nss_ldap openldap-clients openldap-servers libtool-ltdl libtool-ltdl-devel bison</p></blockquote>
<p>然后让系统自己安装就好了。</p>
<h3>（二）准备必要的软件源码包</h3>
<p>接下来我们要准备各个软件的源码包，以便编译安装。</p>
<p>首先我们创建下载目录：</p>
<blockquote><p>mkdir -p /data0/software<br />
cd /data0/software</p></blockquote>
<p>接下来使用wget依次将以下软件包下载好：</p>
<blockquote><p>wget http://nginx.org/download/nginx-1.0.6.tar.gz<br />
wget http://au2.php.net/get/php-5.3.8.tar.gz/from/de.php.net/mirror<br />
wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.15.tar.gz/from/http://mysql.easynet.be/<br />
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz<br />
wget &#8220;http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&amp;big_mirror=0&#8243;<br />
wget &#8220;http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz?modtime=1194463373&amp;big_mirror=0&#8243;<br />
wget http://pecl.php.net/get/memcache-2.2.6.tgz<br />
wget &#8220;http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz?modtime=1175740843&amp;big_mirror=0&#8243;<br />
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.12.tar.gz<br />
wget http://acelnmp.googlecode.com/files/eaccelerator-0.9.6.1.tar.bz2<br />
wget http://www.cmake.org/files/v2.8/cmake-2.8.5.tar.gz</p></blockquote>
<p>这样源码包的准备工作就结束了。</p>
<h3>（三）安装CMake</h3>
<p>由于最新的MySQL使用CMake编译，因此我们首先要把CMake编译安装好：</p>
<blockquote><p>tar zxvf cmake-2.8.5.tar.gz<br />
cd cmake-2.8.5<br />
./configure &#8211;prefix=/usr<br />
make<br />
make install<br />
cd ..</p></blockquote>
<h3>（四）安装MySQL</h3>
<p>首先我们建立mysql用户组和用户：</p>
<blockquote><p>groupadd mysql<br />
useradd -g mysql mysql</p></blockquote>
<p>然后解包并编译安装MySQL:</p>
<blockquote><p>tar xvf mysql-5.5.15.tar.gz<br />
cd mysql-5.5.15<br />
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql/ -DMYSQL_DATADIR=/data0/mysql/data -DMYSQL_UNIX_ADDR=/data0/mysql/mysqld.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_TCP_PORT=3306 -DWITH_EXTRA_CHARSETS:STRING=utf8,gbk -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_UNIX_ADDR=/data0/mysql/mysql.sock -DWITH_DEBUG=0 -DWITH_READLINE=1 -DWITH_SSL=yes -DSYSCONFDIR=/data0/mysql<br />
make<br />
make install</p></blockquote>
<p>接下来给MySQL的目录赋予权限：</p>
<blockquote><p>chmod +w /usr/local/webserver/mysql<br />
chown -R mysql:mysql /usr/local/webserver/mysql</p></blockquote>
<p>创建一系列的MySQL需要用到的目录：</p>
<blockquote><p>mkdir -p /data0/mysql/data/<br />
mkdir -p /data0/mysql/binlog/<br />
mkdir -p /data0/mysql/relaylog/<br />
chown -R mysql:mysql /data0/mysql/</p></blockquote>
<p>接着我们以mysql帐号身份建立数据库：</p>
<blockquote><p>/usr/local/webserver/mysql/scripts/mysql_install_db &#8211;basedir=/usr/local/webserver/mysql &#8211;datadir=/data0/mysql/data &#8211;user=mysql</p></blockquote>
<p>然后我们复制mysql的启动脚本到/etc/init.d/目录方便启动：</p>
<blockquote><p>cd support-files<br />
cp mysql.server /etc/init.d/mysqld<br />
chmod +x /etc/init.d/mysqld</p></blockquote>
<p>然后我们将my.cnf复制到正确的地方：</p>
<blockquote><p>cp <span style="color: #0000ff;">my-medium.cnf</span> /data0/mysql/my.cnf<br />
cd ../../</p></blockquote>
<p>注意这里根据自己服务器的应用需要，选择support-files下对应的预设配置文件替换掉上面命令中蓝色的部分。我这里选择的是中等压力的配置文件my-medium.cnf。</p>
<p>接下来我们编辑下MySQL的配置文件，做些设置：</p>
<blockquote><p>vim /data0/mysql/my.cnf</p></blockquote>
<p>然后在“[mysqld]”这一节的最后添加下面的内容：</p>
<blockquote><p>basedir = /usr/local/webserver/mysql<br />
datadir = /data0/mysql/data<br />
log-error = /data0/mysql/mysql_error.log<br />
pid-file = /data0/mysql/mysql.pid<br />
relay-log-index = /data0/mysql/relaylog/relaylog<br />
relay-log-info-file = /data0/mysql/relaylog/relaylog<br />
relay-log = /data0/mysql/relaylog/relaylog<br />
log-slow-queries = /data0/mysql/slow.log</p></blockquote>
<p>然后我们启动MySQL服务：</p>
<blockquote><p>/etc/init.d/mysqld start</p></blockquote>
<p>如果无问题的话应该显示SUCCESS的提示。</p>
<p>然后我们设置下root的密码，安装后默认root是空密码，这样很不安全：</p>
<blockquote><p>/usr/local/webserver/mysql/bin/mysql -u root<br />
GRANT ALL PRIVILEGES ON *.* TO &#8216;root&#8217;@'localhost&#8217; IDENTIFIED BY &#8216;<span style="color: #0000ff;">000000</span>&#8216;;<br />
GRANT ALL PRIVILEGES ON *.* TO &#8216;root&#8217;@&#8217;127.0.0.1&#8242; IDENTIFIED BY &#8216;<span style="color: #0000ff;">000000</span>&#8216;;</p></blockquote>
<p>注意把蓝色部分替换为你要设置的密码。</p>
<p>接下来我们创建libmysqlclient的软链接，以免编译其它依赖Mysql软件时出现libmysqlclient.so.18: cannot open shared object file的错误：</p>
<blockquote><p>ln -s /usr/local/webserver/mysql/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18 （64位系统使用）<br />
ln -s /usr/local/webserver/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18 （32位系统使用）</p></blockquote>
<p>就此MySQL编译安装工作结束。</p>
<h3>（五）安装PHP所需要的一些库</h3>
<p>接下来为了后面编译PHP的顺利进行，先需要将一些必要的库编译安装好。</p>
<p>首先是libiconv库的编译安装：</p>
<blockquote><p>tar zxvf libiconv-1.13.1.tar.gz<br />
cd libiconv-1.13.1/<br />
./configure &#8211;prefix=/usr/local<br />
make<br />
make install<br />
cd ..</p></blockquote>
<p>然后是libmcrypt库的编译安装：</p>
<blockquote><p>tar zxvf libmcrypt-2.5.8.tar.gz<br />
cd libmcrypt-2.5.8<br />
./configure<br />
make<br />
make install<br />
/sbin/ldconfig</p>
<p>cd libltdl/<br />
./configure &#8211;enable-ltdl-install<br />
make<br />
make install<br />
cd ../../</p></blockquote>
<p>接下来我们要建立libmcrypt库的软链接：</p>
<blockquote><p>#64位系统使用</p>
<p>ln -sf /usr/local/lib/libmcrypt.la /usr/lib64/libmcrypt.la<br />
ln -sf /usr/local/lib/libmcrypt.so /usr/lib64/libmcrypt.so<br />
ln -sf /usr/local/lib/libmcrypt.so.4 /usr/lib64/libmcrypt.so.4<br />
ln -sf /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib64/libmcrypt.so.4.4.8<br />
ln -sf /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config<br />
ln -sf /usr/local/lib/libiconv.so.2 /usr/lib64/libiconv.so.2<br />
ldconfig</p>
<p>#32位系统使用</p>
<p>ln -sf /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la<br />
ln -sf /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so<br />
ln -sf /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4<br />
ln -sf /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8<br />
ln -sf /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config<br />
ln -sf /usr/local/lib/libiconv.so.2 /usr/lib/libiconv.so.2<br />
ldconfig</p></blockquote>
<p>接下来编译安装mhash：</p>
<blockquote><p>tar zxvf mhash-0.9.9.9.tar.gz<br />
cd mhash-0.9.9.9<br />
./configure<br />
make<br />
make install<br />
cd ..</p></blockquote>
<p>建立libmhash相关的软链接：</p>
<blockquote><p>#64位系统使用<br />
ln -sf /usr/local/lib/libmhash.a /usr/lib64/libmhash.a<br />
ln -sf /usr/local/lib/libmhash.la /usr/lib64/libmhash.la<br />
ln -sf /usr/local/lib/libmhash.so /usr/lib64/libmhash.so<br />
ln -sf /usr/local/lib/libmhash.so.2 /usr/lib64/libmhash.so.2<br />
ln -sf /usr/local/lib/libmhash.so.2.0.1 /usr/lib64/libmhash.so.2.0.1<br />
ldconfig</p>
<p>#32位系统使用<br />
ln -sf /usr/local/lib/libmhash.a /usr/lib/libmhash.a<br />
ln -sf /usr/local/lib/libmhash.la /usr/lib/libmhash.la<br />
ln -sf /usr/local/lib/libmhash.so /usr/lib/libmhash.so<br />
ln -sf /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2<br />
ln -sf /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1<br />
ldconfig</p></blockquote>
<p>接下来编译安装mcrypt：</p>
<blockquote><p>tar zxvf mcrypt-2.6.8.tar.gz<br />
cd mcrypt-2.6.8/<br />
/sbin/ldconfig<br />
./configure<br />
make<br />
make install<br />
cd ..</p></blockquote>
<p>这样PHP编译所依赖的一些库就准备好了。</p>
<h3>（六）安装PHP</h3>
<p>首先我们再做几个软链接，<strong><span style="color: #ff0000;">这些软链接只是64位系统需要，32位系统不需要做</span></strong>：</p>
<blockquote><p>ln -s /usr/lib64/libjpeg.so /usr/lib/libjpeg.so<br />
ln -s /usr/lib64/libldap.so /usr/lib/libldap.so<br />
ln -s /usr/lib64/libpng.so /usr/lib/libpng.so</p></blockquote>
<p>然后我们开始解包PHP并以FastCGI模式（PHP-FPM）编译安装：</p>
<blockquote><p>tar xvf php-5.3.8.tar.gz<br />
cd php-5.3.8</p>
<p>./configure &#8211;prefix=/usr/local/webserver/php &#8211;with-config-file-path=/usr/local/webserver/php/etc &#8211;with-mysql=/usr/local/webserver/mysql &#8211;with-mysqli=/usr/local/webserver/mysql/bin/mysql_config &#8211;with-iconv-dir=/usr/local &#8211;with-freetype-dir &#8211;with-jpeg-dir &#8211;with-png-dir &#8211;with-zlib &#8211;with-libxml-dir=/usr &#8211;enable-xml &#8211;disable-rpath &#8211;enable-safe-mode &#8211;enable-bcmath &#8211;enable-shmop &#8211;enable-sysvsem &#8211;enable-inline-optimization &#8211;with-curl &#8211;with-curlwrappers &#8211;enable-mbregex &#8211;enable-fpm &#8211;enable-mbstring &#8211;with-mcrypt &#8211;with-gd &#8211;enable-gd-native-ttf &#8211;with-openssl &#8211;with-mhash &#8211;enable-pcntl &#8211;enable-sockets &#8211;with-ldap &#8211;with-ldap-sasl &#8211;with-xmlrpc &#8211;enable-zip &#8211;enable-soap &#8211;without-pear</p>
<p>make ZEND_EXTRA_LIBS=&#8217;-liconv&#8217;<br />
make install</p></blockquote>
<p>创建PHP的配置文件：</p>
<blockquote><p>cp -f php.ini-production /usr/local/webserver/php/etc/php.ini<br />
cd ..</p></blockquote>
<p>由于刚才安装的时候试用了without-pear参数没有安装PEAR（因为直接安装会报错），现在我们再来补上：</p>
<blockquote><p>wget http://pear.php.net/go-pear.phar<br />
/usr/local/webserver/php/bin/php go-pear.phar</p></blockquote>
<p>至此PHP的编译安装完毕。</p>
<h3>（七）安装PHP的扩展模块及配置PHP</h3>
<p>接下来我们安装一些PHP常用的模块来优化系统：</p>
<p>首先是memcache的编译安装：</p>
<blockquote><p>tar xvf memcache-2.2.6.tgz<br />
cd memcache-2.2.6<br />
/usr/local/webserver/php/bin/phpize<br />
./configure &#8211;with-php-config=/usr/local/webserver/php/bin/php-config<br />
make<br />
make install<br />
cd ..</p></blockquote>
<p>然后我们编译安装eAccelerator加速器：</p>
<blockquote><p>tar jxvf eaccelerator-0.9.6.1.tar.bz2<br />
cd eaccelerator-0.9.6.1/<br />
/usr/local/webserver/php/bin/phpize<br />
./configure &#8211;enable-eaccelerator=shared &#8211;with-php-config=/usr/local/webserver/php/bin/php-config<br />
make<br />
make install<br />
cd ..</p></blockquote>
<p>然后我们将编译好的这两个扩展模块添加到PHP配置文件中：</p>
<blockquote><p>sed -i &#8216;s#; extension_dir = &#8220;./&#8221;#extension_dir = &#8220;/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/&#8221;\nextension = &#8220;memcache.so&#8221;\n#&#8217; /usr/local/webserver/php/etc/php.ini<br />
sed -i &#8220;s#;always_populate_raw_post_data = On#always_populate_raw_post_data = On#g&#8221; /usr/local/webserver/php/etc/php.ini<br />
sed -i &#8220;s#;cgi.fix_pathinfo=1#cgi.fix_pathinfo=0#g&#8221; /usr/local/webserver/php/etc/php.ini</p></blockquote>
<p>创建eAccelerator所需的缓存目录：</p>
<blockquote><p>mkdir -p /usr/local/webserver/eaccelerator_cache</p></blockquote>
<p>然后我们到php.ini中配置eaccelerator加速器：</p>
<blockquote><p>vim /usr/local/webserver/php/etc/php.ini</p></blockquote>
<p>然后到文件的最后添加下面的内容：</p>
<blockquote><p>[eaccelerator]<br />
zend_extension=&#8221;/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/eaccelerator.so&#8221;<br />
eaccelerator.shm_size=&#8221;32&#8243;<br />
eaccelerator.cache_dir=&#8221;/usr/local/webserver/eaccelerator_cache&#8221;<br />
eaccelerator.enable=&#8221;1&#8243;<br />
eaccelerator.optimizer=&#8221;1&#8243;<br />
eaccelerator.check_mtime=&#8221;1&#8243;<br />
eaccelerator.debug=&#8221;0&#8243;<br />
eaccelerator.filter=&#8221;"<br />
eaccelerator.shm_max=&#8221;0&#8243;<br />
eaccelerator.shm_ttl=&#8221;3600&#8243;<br />
eaccelerator.shm_prune_period=&#8221;3600&#8243;<br />
eaccelerator.shm_only=&#8221;0&#8243;<br />
eaccelerator.compress=&#8221;1&#8243;<br />
eaccelerator.compress_level=&#8221;9&#8243;</p></blockquote>
<p>然后我们建立PHP存放日志的目录：</p>
<blockquote><p>mkdir -p /usr/local/webserver/php/logs</p></blockquote>
<p>然后我们建立php-fpm的配置文件：</p>
<blockquote><p>vim /usr/local/webserver/php/etc/php-fpm.conf</p></blockquote>
<p>然后在里面写入下面的内容：</p>
<blockquote><p>[global]<br />
pid = /usr/local/webserver/php/logs/php-fpm.pid<br />
error_log = /usr/local/webserver/php/logs/php-fpm.log<br />
log_level = notice<br />
emergency_restart_threshold = 10<br />
emergency_restart_interval = 1m<br />
process_control_timeout = 5s<br />
daemonize = yes<br />
[www]<br />
listen = 127.0.0.1:9000<br />
listen.backlog = -1<br />
listen.allowed_clients = 127.0.0.1<br />
user = www<br />
group = www<br />
listen.mode=0666<br />
pm = static<br />
pm.max_children = 64<br />
pm.start_servers = 20<br />
pm.min_spare_servers = 5<br />
pm.max_spare_servers = 35<br />
pm.max_requests = 1024</p>
<p>request_terminate_timeout = 0s<br />
request_slowlog_timeout = 0s<br />
slowlog = logs/slow.log<br />
rlimit_files = 65535<br />
rlimit_core = 0<br />
chroot =<br />
chdir =<br />
catch_workers_output = yes<br />
env[HOSTNAME] = $HOSTNAME<br />
env[PATH] = /usr/local/bin:/usr/bin:/bin<br />
env[TMP] = /tmp<br />
env[TMPDIR] = /tmp<br />
env[TEMP] = /tmp</p>
<p>php_flag[display_errors] = off</p></blockquote>
<p>然后我们添加www用户组和帐号信息，以便后面的php-fpm和nginx能够正常工作：</p>
<blockquote><p>groupadd www<br />
useradd -g www www</p></blockquote>
<p>接下来，让我们测试下php-fpm配置文件是否正确：</p>
<blockquote><p>/usr/local/webserver/php/sbin/php-fpm -t</p></blockquote>
<p>如果出现“NOTICE: configuration file /usr/local/webserver/php/etc/php-fpm.conf test is successful”字样则表示配置正确。否则需要检查配置文件。</p>
<h3>（八）安装Nginx</h3>
<p>首先我们创建网页存放的根目录：</p>
<blockquote><p>mkdir -p <span style="color: #0000ff;">/var/www</span></p></blockquote>
<p>这里可以根据需要建立你自己喜欢的Web根目录地址，不过注意后面的配置文件相应地方需要做修改。第一次进行编译操作或者初学者建议保持这里的配置不改动，以便顺利完成编译安装工作。</p>
<p>然后创建Nginx所需的日志目录并分配权限：</p>
<blockquote><p>mkdir -p /var/log/nginx<br />
chmod +w /var/log/nginx<br />
chown -R www:www /var/log/nginx</p></blockquote>
<p>然后编译安装Nginx所需的pcre库：</p>
<blockquote><p>tar zxvf pcre-8.12.tar.gz<br />
cd pcre-8.12/<br />
./configure<br />
make<br />
make install<br />
cd ..</p></blockquote>
<p>接下来，编译安装Nginx：</p>
<blockquote><p>tar xvf nginx-1.0.6.tar.gz<br />
cd nginx-1.0.6/<br />
./configure &#8211;user=www &#8211;group=www &#8211;prefix=/usr/local/webserver/nginx &#8211;with-http_stub_status_module &#8211;with-http_ssl_module<br />
make<br />
make install<br />
cd ..</p></blockquote>
<p>然后编辑Nginx的配置文件：</p>
<blockquote><p>vim /usr/local/webserver/nginx/conf/nginx.conf</p></blockquote>
<p>将对应的内容改为如下：</p>
<blockquote><p>user www www;<br />
<span style="color: #0000ff;">worker_processes 2;</span></p>
<p>error_log /var/log/nginx/error.log;</p></blockquote>
<p>注意蓝色文字部分根据服务器的配置选择不同的值。512M以下内存为1~2；1G内存4；2G内存8；4G内存16，以此类推。</p>
<p>然后在配置文件的“http {”这节里面增加下面的内容以便优化：</p>
<blockquote><p>fastcgi_connect_timeout 300;<br />
fastcgi_send_timeout 300;<br />
fastcgi_read_timeout 300;<br />
fastcgi_buffer_size 64k;<br />
fastcgi_buffers 4 64k;<br />
fastcgi_busy_buffers_size 128k;<br />
fastcgi_temp_file_write_size 128k;</p></blockquote>
<p>接下来我们运行下面的命令测试Nginx的配置文件是否正确：</p>
<blockquote><p>/usr/local/webserver/nginx/sbin/nginx -t</p></blockquote>
<p>如果出现下面提示的一种则表示配置文件无误，否则需要做进一步修改：</p>
<blockquote><p>nginx: the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok<br />
nginx: configuration file /usr/local/webserver/nginx/conf/nginx.conf test is successf</p></blockquote>
<p>这样Nginx的安装与配置也就完成。</p>
<h3>（九）设置开机启动</h3>
<p>我们编译好了的软件默认是不会开机自动启动的，我们需要处理下以便实现开机自启动。</p>
<p>首先是MySQL：</p>
<blockquote><p>chkconfig &#8211;add mysqld<br />
chkconfig &#8211;level 345 mysqld on</p></blockquote>
<p>然后php-fpm和Nginx的启动我们放到/etc/rc.local启动文件中：</p>
<blockquote><p>vim /etc/rc.local</p></blockquote>
<p>在文件的末尾增加下面的内容：</p>
<blockquote><p>ulimit -SHn 65535<br />
/usr/local/webserver/php/sbin/php-fpm<br />
/usr/local/webserver/nginx/sbin/nginx</p></blockquote>
<p>保存退出后即可。</p>
<p>至此，所有的编译安装工作都结束。让我们启动php-fpm和Nginx来做测试吧！（MySQL在上面已经启动了）在控制台里面输入下面命令：</p>
<blockquote><p>ulimit -SHn 65535<br />
/usr/local/webserver/php/sbin/php-fpm<br />
/usr/local/webserver/nginx/sbin/nginx</p></blockquote>
<p>即可启动php-fpm和nginx。</p>
<h3>（十）各项服务的启动与停止</h3>
<p>1、MySQL：</p>
<blockquote><p>启动：/etc/init.d/mysqld start<br />
停止：/etc/init.d/mysqld stop<br />
重启：/etc/init.d/mysqld restart</p></blockquote>
<p>2、php-fpm：</p>
<blockquote><p>启动： /usr/local/webserver/php/sbin/php-fpm<br />
停止：killall php-fpm</p></blockquote>
<p>3、Nginx：</p>
<blockquote><p>启动： /usr/local/webserver/nginx/sbin/nginx<br />
停止：killall nginx</p></blockquote>
<p>如果你有更多的Linux知识，可以考虑将php-fpm和Nginx的启动做成启动脚本放在/etc/init.d/下。</p>
<h3>（十一）遇到的问题</h3>
<p>在我编译安装的时候，Nginx在启动之后报错：</p>
<blockquote><p>[emerg] 1552#2780: could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32</p></blockquote>
<p>网上查了一下资料，这个错误表示无法构建server_names_hash，应该增加server_names_hash_bucket_size的值。</p>
<p>解决办法很简单，在Nginx的配置文件的“http {”这一节加上下面的内容即可：</p>
<blockquote><p>server_names_hash_bucket_size 64;</p></blockquote>
<p>至此，全部的安装和配置工作结束。</p>
<p>事实上，经过我几次实战，编译安装也不是什么深不可测的操作。只要耐心，以及按照步骤来操作，基本会一路顺畅的走下来。只是编译的过程会比较枯燥，机器配置不好要等很久，而且涉及到的命令也挺多。因为系统各种不同可能会碰到各种怪异的问题，需要有一定处理问题和查询问题解决方案的能力。</p>
<p>通过这次安装实践，我对Linux的了解会更深一些吧！</p>
<p><strong><span style="color: #008000;">经过实验，本文的全部编译操作指令在CentOS 5.x和6.0下测试均通过。其他系统安装时可能无法适用本文的一些指令。</span></strong></p>
<p><em>资料参考：<a href="http://www.linuxidc.com/Linux/2011-07/38107.htm" target="_blank">http://www.linuxidc.com/Linux/2011-07/38107.htm<br />
</a>资料参考：<a href="http://b332.com/post/63" target="_blank">http://b332.com/post/63</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.renhao.org/2011/09/centos-6-x64-compile-lnmp-environment/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>理解php-fpm的两种执行方式</title>
		<link>http://blog.renhao.org/2011/09/about-two-of-php-fpm-execute-methods/</link>
		<comments>http://blog.renhao.org/2011/09/about-two-of-php-fpm-execute-methods/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 06:46:31 +0000</pubDate>
		<dc:creator>Ren</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[php-fpm]]></category>
		<category><![CDATA[执行方式]]></category>

		<guid isPermaLink="false">http://blog.renhao.org/?p=215</guid>
		<description><![CDATA[前段时间配置php-fpm的时候，无意间发现原来他还有两种执行方式。与Apache一样，他的进程数也是可以根据设置分为动态和静态的。关于Apache的工作方式及对应的设置方法，我已经在《Ubuntu下配置Apache的Worker模式》一文中写出，这里不再多说。 而php-fpm也是同样存在两种方式，一种是直接开启指定数量的php-fpm进程，不再增加或者减少；另一种则是开始的时候开启一定数量的php-fpm进程，当请求量变大的时候，动态的增加php-fpm进程数到上限，当空闲的时候自动释放空闲的进程数到一个下限。 这两种不同的执行方式，可以根据服务器的实际需求来进行调整。 这里先说一下涉及到这个的几个参数吧，他们分别是pm、pm.max_children、pm.start_servers、pm.min_spare_servers和pm.max_spare_servers。 pm表示使用那种方式，有两个值可以选择，就是static（静态）或者dynamic（动态）。在更老一些的版本中，dynamic被称作apache-like。这个要注意看配置文件给出的说明了。 下面4个参数的意思分别为： pm.max_children：静态方式下开启的php-fpm进程数量。 pm.start_servers：动态方式下的起始php-fpm进程数量。 pm.min_spare_servers：动态方式下的最小php-fpm进程数量。 pm.max_spare_servers：动态方式下的最大php-fpm进程数量。 如果dm设置为static，那么其实只有pm.max_children这个参数生效。系统会开启设置的数量个php-fpm进程。 如果dm设置为dynamic，那么pm.max_children参数失效，后面3个参数生效。系统会在php-fpm运行开始的时候启动pm.start_servers个php-fpm进程，然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。 那么，对于我们的服务器，选择哪种执行方式比较好呢？事实上，跟Apache一样，我们运行的PHP程序在执行完成后，或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存，运行一段时间后就会上升到20-30M的原因了。所以，动态方式因为会结束掉多余的进程，可以回收释放一些内存，所以推荐在内存较少的服务器或者VPS上使用。具体最大数量根据 内存/20M 得到。比如说512M的VPS，建议pm.max_spare_servers设置为20。至于pm.min_spare_servers，则建议根据服务器的负载情况来设置，比较合适的值在5~10之间。 然后对于比较大内存的服务器来说，设置为静态的话会提高效率。因为频繁开关php-fpm进程也会有时滞，所以内存够大的情况下开静态效果会更好。数量也可以根据 内存/30M 得到。比如说2GB内存的服务器，可以设置为50；4GB内存可以设置为100等。 本博客建立在512M的VPS上，因此我设置的参数如下： pm=dynamic pm.max_children=20 pm.start_servers=5 pm.min_spare_servers=5 pm.max_spare_servers=20 这样就可以最大的节省内存并提高执行效率。 资料参考：http://comdeng.com/blog/article/10007.html]]></description>
			<content:encoded><![CDATA[<p>前段时间配置php-fpm的时候，无意间发现原来他还有两种执行方式。与Apache一样，他的进程数也是可以根据设置分为动态和静态的。关于Apache的工作方式及对应的设置方法，我已经在《<a title="直接连接 Ubuntu下配置Apache的Worker模式" href="http://blog.renhao.org/2010/06/ubuntu-set-apache2-mpm-worker/" rel="bookmark" target="_blank">Ubuntu下配置Apache的Worker模式</a>》一文中写出，这里不再多说。</p>
<p>而php-fpm也是同样存在两种方式，一种是直接开启指定数量的php-fpm进程，不再增加或者减少；另一种则是开始的时候开启一定数量的php-fpm进程，当请求量变大的时候，动态的增加php-fpm进程数到上限，当空闲的时候自动释放空闲的进程数到一个下限。</p>
<p>这两种不同的执行方式，可以根据服务器的实际需求来进行调整。<span id="more-215"></span></p>
<p>这里先说一下涉及到这个的几个参数吧，他们分别是<strong>pm</strong>、<strong>pm.max_children</strong>、<strong>pm.start_servers</strong>、<strong>pm.min_spare_servers</strong>和<strong>pm.max_spare_servers</strong>。</p>
<p><strong>pm表示使用那种方式</strong>，有两个值可以选择，就是<strong>static</strong>（静态）或者<strong>dynamic</strong>（动态）。在更老一些的版本中，dynamic被称作apache-like。这个要注意看配置文件给出的说明了。</p>
<p>下面4个参数的意思分别为：</p>
<blockquote><p>pm.max_children：静态方式下开启的php-fpm进程数量。<br />
pm.start_servers：动态方式下的起始php-fpm进程数量。<br />
pm.min_spare_servers：动态方式下的最小php-fpm进程数量。<br />
pm.max_spare_servers：动态方式下的最大php-fpm进程数量。</p></blockquote>
<p>如果dm设置为static，那么其实只有pm.max_children这个参数生效。系统会开启设置的数量个php-fpm进程。</p>
<p>如果dm设置为dynamic，那么pm.max_children参数失效，后面3个参数生效。系统会在php-fpm运行开始的时候启动pm.start_servers个php-fpm进程，然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。</p>
<p>那么，对于我们的服务器，选择哪种执行方式比较好呢？事实上，跟Apache一样，我们运行的PHP程序在执行完成后，或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存，运行一段时间后就会上升到20-30M的原因了。所以，动态方式因为会结束掉多余的进程，可以回收释放一些内存，所以推荐在内存较少的服务器或者VPS上使用。具体最大数量根据 内存/20M 得到。比如说512M的VPS，建议pm.max_spare_servers设置为20。至于pm.min_spare_servers，则建议根据服务器的负载情况来设置，比较合适的值在5~10之间。</p>
<p>然后对于比较大内存的服务器来说，设置为静态的话会提高效率。因为频繁开关php-fpm进程也会有时滞，所以内存够大的情况下开静态效果会更好。数量也可以根据 内存/30M 得到。比如说2GB内存的服务器，可以设置为50；4GB内存可以设置为100等。</p>
<p>本博客建立在512M的VPS上，因此我设置的参数如下：</p>
<blockquote><p>pm=dynamic<br />
pm.max_children=20<br />
pm.start_servers=5<br />
pm.min_spare_servers=5<br />
pm.max_spare_servers=20</p></blockquote>
<p>这样就可以最大的节省内存并提高执行效率。</p>
<p><em>资料参考：<a href="http://comdeng.com/blog/article/10007.html" target="_blank">http://comdeng.com/blog/article/10007.html</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.renhao.org/2011/09/about-two-of-php-fpm-execute-methods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>带自动清理功能的MySQL备份到FTP的Shell脚本</title>
		<link>http://blog.renhao.org/2011/09/automatic-backup-mysql-to-ftp-shell-script-with-old-file-cleanup/</link>
		<comments>http://blog.renhao.org/2011/09/automatic-backup-mysql-to-ftp-shell-script-with-old-file-cleanup/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 06:21:30 +0000</pubDate>
		<dc:creator>Ren</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[FTP]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[备份]]></category>
		<category><![CDATA[脚本]]></category>

		<guid isPermaLink="false">http://blog.renhao.org/?p=209</guid>
		<description><![CDATA[以前公司用的一个网上找的MySQL自动备份到FTP的Shell脚本，一直用着不错。但是问题就是随着备份文件的越来越多，不得不定期清理FTP上的老备份文件，十分的不便。 实际上MySQL备份无需保留太长时间的，如果能有自动清理旧的备份文件的功能就好了。不过网上找了一下，虽然也有这方面的脚本，不过可能不太符合我的需求吧。于是只能自己手动改下以前的那个Shell脚本来实现咯。 首先我们要确定保留备份的时间，我觉得一个月的备份保留就足够了。因为基本不会出现1个月后要恢复1个月之前备份的情况。（如果有请自己手动备份，毕竟自动备份还是不能取代手动备份的部分）。那么我们的思路就出来了：在上传以当天日期为文件名的备份的时候，顺便删除下一个月之前的同日期备份，就可以确保服务器上保留的是最近一个月的备份了。 然后我们需要知道Linux下的一个命令：date。这是个可以查看当前服务器的时间日期信息的命令。当然这里我们需要知道的是这个命令的参数，毕竟我们需要得到的是日期部分。 输入下面这个命令，可以看到“年-月-日”的输入，类似“2011-09-09”： date +%Y-%m-%d 那么，如果我们要得到1个月之前的日期怎么办呢？使用下面的这条命令就可以得到： date -d last-month +%Y-%m-%d 怎么样？简单吧。实际备份的时候，因为之前脚本使用的是“m-d-Y”的形式，也就是“月-日-年”的形式，所以我稍微做了下调整。但是下面这个Shell脚本中的是按照“年-月-日”来产生文件名的。 于是，给出整个备份Shell脚本，需要的朋友只需要填写下有中文说明的部分，即可在自己的Linux服务器上使用。使用办法：复制到某个目录下，然后给予执行权限，再在cron中设置每天指定时间运行即可。（关于这部分，请自行查找相关说明，这里不再复述） 带自动清理功能的MySQL备份到FTP的Shell脚本如下： #!/bin/bash &#160; MyUSER=&#34;db_username&#34; # 数据库用户名，建议使用root账户或者拥有全局权限的用户名 MyPASS=&#34;db_password&#34; # 数据库密码 MyHOST=&#34;localhost&#34; # 数据库服务器 &#160; # Linux bin paths, change this if it can't be autodetected via which command MYSQL=&#34;$(which mysql)&#34; MYSQLDUMP=&#34;$(which mysqldump)&#34; CHOWN=&#34;$(which chown)&#34; CHMOD=&#34;$(which chmod)&#34; GZIP=&#34;$(which gzip)&#34; &#160; # 数据库备份的路径 DEST=&#34;/home/backup&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>以前公司用的一个网上找的MySQL自动备份到FTP的Shell脚本，一直用着不错。但是问题就是随着备份文件的越来越多，不得不定期清理FTP上的老备份文件，十分的不便。</p>
<p>实际上MySQL备份无需保留太长时间的，如果能有自动清理旧的备份文件的功能就好了。不过网上找了一下，虽然也有这方面的脚本，不过可能不太符合我的需求吧。于是只能自己手动改下以前的那个Shell脚本来实现咯。<span id="more-209"></span></p>
<p>首先我们要确定保留备份的时间，我觉得一个月的备份保留就足够了。因为基本不会出现1个月后要恢复1个月之前备份的情况。（如果有请自己手动备份，毕竟自动备份还是不能取代手动备份的部分）。那么我们的思路就出来了：在上传以当天日期为文件名的备份的时候，顺便删除下一个月之前的同日期备份，就可以确保服务器上保留的是最近一个月的备份了。</p>
<p>然后我们需要知道Linux下的一个命令：<em><strong>date</strong></em>。这是个可以查看当前服务器的时间日期信息的命令。当然这里我们需要知道的是这个命令的参数，毕竟我们需要得到的是日期部分。</p>
<p>输入下面这个命令，可以看到“年-月-日”的输入，类似“2011-09-09”：</p>
<blockquote><p>date +%Y-%m-%d</p></blockquote>
<p>那么，如果我们要得到1个月之前的日期怎么办呢？使用下面的这条命令就可以得到：</p>
<blockquote><p>date -d last-month +%Y-%m-%d</p></blockquote>
<p>怎么样？简单吧。实际备份的时候，因为之前脚本使用的是“m-d-Y”的形式，也就是“月-日-年”的形式，所以我稍微做了下调整。但是下面这个Shell脚本中的是按照“年-月-日”来产生文件名的。</p>
<p>于是，给出整个备份Shell脚本，需要的朋友只需要填写下有中文说明的部分，即可在自己的Linux服务器上使用。使用办法：复制到某个目录下，然后给予执行权限，再在cron中设置每天指定时间运行即可。（关于这部分，请自行查找相关说明，这里不再复述）</p>
<p>带自动清理功能的MySQL备份到FTP的Shell脚本如下：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">MyUSER</span>=<span style="color: #ff0000;">&quot;db_username&quot;</span>     <span style="color: #666666; font-style: italic;"># 数据库用户名，建议使用root账户或者拥有全局权限的用户名</span>
<span style="color: #007800;">MyPASS</span>=<span style="color: #ff0000;">&quot;db_password&quot;</span>       <span style="color: #666666; font-style: italic;"># 数据库密码</span>
<span style="color: #007800;">MyHOST</span>=<span style="color: #ff0000;">&quot;localhost&quot;</span>          <span style="color: #666666; font-style: italic;"># 数据库服务器</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Linux bin paths, change this if it can't be autodetected via which command</span>
<span style="color: #007800;">MYSQL</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$(which mysql)</span>&quot;</span>
<span style="color: #007800;">MYSQLDUMP</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$(which mysqldump)</span>&quot;</span>
<span style="color: #007800;">CHOWN</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$(which chown)</span>&quot;</span>
<span style="color: #007800;">CHMOD</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$(which chmod)</span>&quot;</span>
<span style="color: #007800;">GZIP</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$(which gzip)</span>&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># 数据库备份的路径</span>
<span style="color: #007800;">DEST</span>=<span style="color: #ff0000;">&quot;/home/backup&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Main directory where backup will be stored</span>
<span style="color: #007800;">MBD</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$DEST</span>/mysql&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Get hostname</span>
<span style="color: #007800;">HOST</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$(hostname)</span>&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Get data in dd-mm-yyyy format</span>
<span style="color: #007800;">NOW</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$(date +%d-%m-%Y)</span>&quot;</span>
<span style="color: #007800;">OLD</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$(date -d last-month +%d-%m-%Y)</span>&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># File to store current backup file</span>
<span style="color: #007800;">FILE</span>=<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #666666; font-style: italic;"># Store list of databases</span>
<span style="color: #007800;">DBS</span>=<span style="color: #ff0000;">&quot;&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># DO NOT BACKUP these databases</span>
<span style="color: #007800;">IGGY</span>=<span style="color: #ff0000;">&quot;test&quot;</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span> <span style="color: #007800;">$MBD</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #660033;">-d</span> <span style="color: #007800;">$MBD</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> <span style="color: #007800;">$MBD</span> <span style="color: #000000; font-weight: bold;">||</span> :
&nbsp;
<span style="color: #666666; font-style: italic;"># Only root can access it!</span>
<span style="color: #007800;">$CHOWN</span> <span style="color: #000000;">0.0</span> <span style="color: #660033;">-R</span> <span style="color: #007800;">$DEST</span>
<span style="color: #007800;">$CHMOD</span> 0600 <span style="color: #007800;">$DEST</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Get all database list first</span>
<span style="color: #007800;">DBS</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases')</span>&quot;</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">&gt;</span> ftpcc.sh <span style="color: #cc0000; font-style: italic;">&lt;&lt;EOF
cd $MBD
ftp -i -n&lt;&lt;!
open blog.renhao.org #在这里填写FTP服务器的域名或IP
user ftp_user ftp_pass #在这里填写FTP用户名和密码，注意空格分隔
binary
mput *.gz
EOF</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> db <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #007800;">$DBS</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #007800;">skipdb</span>=-<span style="color: #000000;">1</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$IGGY</span>&quot;</span> <span style="color: #000000; font-weight: bold;">!</span>= <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>;
    <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #007800;">$IGGY</span>
        <span style="color: #000000; font-weight: bold;">do</span>
            <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$db</span>&quot;</span> = <span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #007800;">skipdb</span>=<span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">||</span> :
        <span style="color: #000000; font-weight: bold;">done</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$skipdb</span>&quot;</span> = <span style="color: #ff0000;">&quot;-1&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #007800;">FILE</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$MBD</span>/<span style="color: #007800;">$db</span>.<span style="color: #007800;">$HOST</span>.<span style="color: #007800;">$NOW</span>.gz&quot;</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;delete <span style="color: #007800;">$db</span>.<span style="color: #007800;">$HOST</span>.<span style="color: #007800;">$OLD</span>.gz&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> ftpcc.sh
        <span style="color: #666666; font-style: italic;"># do all inone job in pipe,</span>
        <span style="color: #666666; font-style: italic;"># connect to mysql using mysqldump for select mysql database</span>
        <span style="color: #666666; font-style: italic;"># and pipe it out to gz file in backup dir :)</span>
        <span style="color: #007800;">$MYSQLDUMP</span> <span style="color: #660033;">-u</span> <span style="color: #007800;">$MyUSER</span> <span style="color: #660033;">-h</span> <span style="color: #007800;">$MyHOST</span> -p<span style="color: #007800;">$MyPASS</span> <span style="color: #007800;">$db</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #007800;">$GZIP</span> <span style="color: #660033;">-9</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #007800;">$FILE</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> ftpcc.sh <span style="color: #cc0000; font-style: italic;">&lt;&lt;EOF
close
bye
!
EOF</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">sh</span> ftpcc.sh
<span style="color: #c20cb9; font-weight: bold;">rm</span> ftpcc.sh</pre></div></div>

<p>这样的Shell脚本运行后，可以得到每个MySQL库的独立备份文件，且以gz格式压缩以便节省空间。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.renhao.org/2011/09/automatic-backup-mysql-to-ftp-shell-script-with-old-file-cleanup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在CentOS下安装php的json扩展</title>
		<link>http://blog.renhao.org/2011/01/install-php-json-on-centos/</link>
		<comments>http://blog.renhao.org/2011/01/install-php-json-on-centos/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 08:55:20 +0000</pubDate>
		<dc:creator>Ren</dc:creator>
				<category><![CDATA[CentOS]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[yum]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[扩展]]></category>

		<guid isPermaLink="false">http://blog.renhao.org/?p=198</guid>
		<description><![CDATA[今天给一台CentOS系统的服务器上传了一个新的程序之后，发现部分页面显示不出来，或者不完整。查看Apache的错误日志的时候发现了大量的PHP报错提示： PHP Fatal error:  Call to undefined function json_decode() 这是典型的PHP组件未安装出现的提示，错误信息就是找不到某个函数XXX。经查，这个函数是PHP的json扩展包含的。接下来就简单了，只需要安装好json扩展即可消除这个错误，从而使网页恢复正常。 首先尝试最简单的方法，输入yum指令进行安装：yum install php-json，结果提示没有这个扩展包；再次尝试输入yum install json也不行。于是输入yum search php-，列出所有的PHP扩展包进行查找。结果还是没有找到跟json有关的扩展包。 既然yum自己不带，那么就得拿出Linux下的杀手锏——编译了。网上搜索了下相关的文章并自己实战操作了下，发现其实编译个json也并不是很难的事情。于是整理心得如下： 1、切换到tmp目录下载json源码包。进行临时的下载操作进入到tmp目录是个很好的习惯，因为Linux系统在开机的时候会自动清空tmp目录，从而保持硬盘文件的整洁。当然如果你要保留这个源码包的话，可以下载到自己喜欢的目录。 #cd /tmp #wget http://www.aurore.net/projects/php-json/php-json-ext-1.2.1.tar.bz2 2、解压缩下载得到的文件： #tar xvjf php-json-ext-1.2.1.tar.bz2 3、进入源码目录： #cd php-json-ext-1.2.1 4、准备编译环境。这一步可以先不做直接进行第5步操作，如果遇到问题后再进行本步检查也无所谓。不过为了避免不必要的麻烦，我们还是检查下编译环境是否准备好了吧！ #yum install php-devel automake autoconf libtool gcc 5、准备PHP模块的编译环境： #phpize 6、开始编译json模块： #./configure #make #make install 7、配置php.ini。首先打开php.ini文件： #vim /etc/php.ini 注：这里我的php.ini是在/etc目录下，如果你的php.ini不在这里，请修改路径为你的php.ini所在的路径。 直接在最后一行加上下面这段话： extension=json.so 然后输入:wq保存退出。 8、重启Apache服务： #/etc/init.d/httpd restart [...]]]></description>
			<content:encoded><![CDATA[<p>今天给一台CentOS系统的服务器上传了一个新的程序之后，发现部分页面显示不出来，或者不完整。查看Apache的错误日志的时候发现了大量的PHP报错提示：</p>
<blockquote><p><strong>PHP Fatal error:  Call to undefined function json_decode()</strong></p></blockquote>
<p>这是典型的PHP组件未安装出现的提示，错误信息就是找不到某个函数XXX。经查，这个函数是PHP的json扩展包含的。接下来就简单了，只需要安装好json扩展即可消除这个错误，从而使网页恢复正常。<span id="more-198"></span></p>
<p>首先尝试最简单的方法，输入yum指令进行安装：yum install php-json，结果提示没有这个扩展包；再次尝试输入yum install json也不行。于是输入yum search php-，列出所有的PHP扩展包进行查找。结果还是没有找到跟json有关的扩展包。</p>
<p>既然yum自己不带，那么就得拿出Linux下的杀手锏——编译了。网上搜索了下相关的文章并自己实战操作了下，发现其实编译个json也并不是很难的事情。于是整理心得如下：</p>
<p><strong>1、切换到tmp目录下载json源码包。</strong>进行临时的下载操作进入到tmp目录是个很好的习惯，因为Linux系统在开机的时候会自动清空tmp目录，从而保持硬盘文件的整洁。当然如果你要保留这个源码包的话，可以下载到自己喜欢的目录。</p>
<blockquote><p>#cd /tmp</p>
<p>#wget http://www.aurore.net/projects/php-json/php-json-ext-1.2.1.tar.bz2</p></blockquote>
<p><strong>2、解压缩下载得到的文件：</strong></p>
<blockquote><p>#tar xvjf php-json-ext-1.2.1.tar.bz2</p></blockquote>
<p><strong>3、进入源码目录：</strong></p>
<blockquote><p>#cd php-json-ext-1.2.1</p></blockquote>
<p><strong>4、准备编译环境。</strong>这一步可以先不做直接进行第5步操作，如果遇到问题后再进行本步检查也无所谓。不过为了避免不必要的麻烦，我们还是检查下编译环境是否准备好了吧！</p>
<blockquote><p>#yum install php-devel automake autoconf libtool gcc</p></blockquote>
<p><strong>5、准备PHP模块的编译环境：</strong></p>
<blockquote><p>#phpize</p></blockquote>
<p><strong>6、开始编译json模块：</strong></p>
<blockquote><p>#./configure</p>
<p>#make</p>
<p>#make install</p></blockquote>
<p><strong>7、配置php.ini。</strong>首先打开php.ini文件：</p>
<blockquote><p>#vim /etc/php.ini</p></blockquote>
<p>注：这里我的php.ini是在/etc目录下，如果你的php.ini不在这里，请修改路径为你的php.ini所在的路径。</p>
<p>直接在最后一行加上下面这段话：</p>
<blockquote><p>extension=json.so</p></blockquote>
<p>然后输入:wq保存退出。</p>
<p><strong>8、重启Apache服务</strong>：</p>
<blockquote><p>#/etc/init.d/httpd restart</p></blockquote>
<p>成功重启之后，可以利用phpinfo()去查看是否有json的信息。我试着打开之前报错的页面，已经完全能正常打开了，一切OK。</p>
<p><em>资料参考：<a href="http://hi.baidu.com/zhujinyu/blog/item/3d2915121ed51659f919b852.html" target="_blank">http://hi.baidu.com/zhujinyu/blog/item/3d2915121ed51659f919b852.html</a><br />
资料参考：<a href="http://zhangpeng.me/?p=210" target="_blank">http://zhangpeng.me/?p=210</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.renhao.org/2011/01/install-php-json-on-centos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>解决Linux数据库导出到Windows下乱码的问题</title>
		<link>http://blog.renhao.org/2011/01/resolve-the-coding-error-of-mysqldump-from-linux-to-windows/</link>
		<comments>http://blog.renhao.org/2011/01/resolve-the-coding-error-of-mysqldump-from-linux-to-windows/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 08:30:21 +0000</pubDate>
		<dc:creator>Ren</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[乱码]]></category>
		<category><![CDATA[导出]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[编码]]></category>

		<guid isPermaLink="false">http://blog.renhao.org/?p=195</guid>
		<description><![CDATA[前段时间公司服务器做平台迁移，需要将Linux下的MySQL数据库导出到Windows的服务器下。很自然的用了mysqldump指令导出了SQL文件，然后在Windows下进行了MySQL导入操作。导入结束后检查了表数量等等都没问题，于是很自然的以为导入工作顺利完成。 结果哪知道后来发现出来了乱码的问题，多次尝试mysqldump导出后导入都不行。于是，只能是编码的问题导致这样的情况了。 Linux系统安装的MySQL，默认的语言是latin1；而Windows下的MySQL在图形化界面安装过程中已经设置默认编码为UTF-8了。看来应该就是这样的问题了，编码问题害死人，经常乱码不说还折腾人 于是网上搜索了一圈，很简单的就解决了，记录解决步骤如下： 1、以Linux下的MySQL默认编码导出数据： #mysqldump -u USERNAME -pPASSWORD &#8211;default-character-set=latin1 [DBname] &#62; [filepath/filename.sql] 其中USERNAME为数据库用户名，一般为root。PASSWORD为密码，也可以不填写，只带上-p标记。最关键的就要数“&#8211;default-character-set=latin1”这部分了，一定要跟Linux系统下的编码设置一致。然后DBName为数据库名，后面就是导出的文件路径了。 2、在Windows下用NotePad++、UltraEdit之类的支持多编码格式的文本编辑器打开这个导出的SQL文件，看看有没有乱码。如果没有乱码的话，进行下面的操作。 找到： CREATE TABLE `table` ( &#8230;略&#8230; ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 将其改为： CREATE TABLE `table` ( &#8230;略&#8230; ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 3、将改好的文件保存成UTF8格式，注意不要添加BOM信息，这样就得到一个UTF8的SQL文档了！ 4、执行MySQL导入命令： mysql -u USERNAME -pPASSWORD [DBname] &#60; [filepath/filename.sql] 5、用phpMyAdmin检查下，现在终于不乱码了，问题解决！ 资料参考：http://blog.roga.tw/2008/11/05/1127]]></description>
			<content:encoded><![CDATA[<p>前段时间公司服务器做平台迁移，需要将Linux下的MySQL数据库导出到Windows的服务器下。很自然的用了mysqldump指令导出了SQL文件，然后在Windows下进行了MySQL导入操作。导入结束后检查了表数量等等都没问题，于是很自然的以为导入工作顺利完成。</p>
<p>结果哪知道后来发现出来了乱码的问题，多次尝试mysqldump导出后导入都不行。于是，只能是编码的问题导致这样的情况了。<span id="more-195"></span></p>
<p>Linux系统安装的MySQL，默认的语言是latin1；而Windows下的MySQL在图形化界面安装过程中已经设置默认编码为UTF-8了。看来应该就是这样的问题了，编码问题害死人，经常乱码不说还折腾人</p>
<p>于是网上搜索了一圈，很简单的就解决了，记录解决步骤如下：</p>
<p>1、以Linux下的MySQL默认编码导出数据：</p>
<blockquote><p>#mysqldump -u USERNAME -pPASSWORD <span style="color: #ff0000;">&#8211;default-character-set=latin1</span> [DBname] &gt; [filepath/filename.sql]</p></blockquote>
<p>其中USERNAME为数据库用户名，一般为root。PASSWORD为密码，也可以不填写，只带上-p标记。最关键的就要数“&#8211;default-character-set=latin1”这部分了，一定要跟Linux系统下的编码设置一致。然后DBName为数据库名，后面就是导出的文件路径了。</p>
<p>2、在Windows下用NotePad++、UltraEdit之类的支持多编码格式的文本编辑器打开这个导出的SQL文件，看看有没有乱码。如果没有乱码的话，进行下面的操作。</p>
<p>找到：</p>
<blockquote><p>CREATE TABLE `table` (<br />
&#8230;略&#8230;<br />
) ENGINE=MyISAM DEFAULT CHARSET=<strong><span style="color: #0000ff;">latin1</span></strong> AUTO_INCREMENT=1 ;</p></blockquote>
<p>将其改为：</p>
<blockquote><p>CREATE TABLE `table` (<br />
&#8230;略&#8230;<br />
) ENGINE=MyISAM DEFAULT CHARSET=<strong><span style="color: #0000ff;">utf8</span></strong> AUTO_INCREMENT=1 ;</p></blockquote>
<p>3、将改好的文件保存成UTF8格式，<span style="color: #ff0000;">注意不要添加BOM信息</span>，这样就得到一个UTF8的SQL文档了！</p>
<p>4、执行MySQL导入命令：</p>
<blockquote><p>mysql -u USERNAME -pPASSWORD [DBname] &lt; [filepath/filename.sql]</p></blockquote>
<p>5、用phpMyAdmin检查下，现在终于不乱码了，问题解决！</p>
<p><em>资料参考：<a href="http://blog.roga.tw/2008/11/05/1127" target="_blank">http://blog.roga.tw/2008/11/05/1127</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.renhao.org/2011/01/resolve-the-coding-error-of-mysqldump-from-linux-to-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>解决samba升级后无法访问软连接的问题</title>
		<link>http://blog.renhao.org/2010/09/solution-can-not-access-the-soft-links-after-updated-samba/</link>
		<comments>http://blog.renhao.org/2010/09/solution-can-not-access-the-soft-links-after-updated-samba/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 07:31:03 +0000</pubDate>
		<dc:creator>Ren</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[samba]]></category>
		<category><![CDATA[共享]]></category>
		<category><![CDATA[无法访问]]></category>
		<category><![CDATA[软连接]]></category>
		<category><![CDATA[软链接]]></category>

		<guid isPermaLink="false">http://blog.renhao.org/?p=190</guid>
		<description><![CDATA[今天公司里Ubuntu服务器搬迁，搬好了之后习惯性的输入apt-get upgrade进行了一次软件升级。结果升级之后发现samba共享给Windows的部分文件夹打不开了，提示没有权限访问。 尝试了重装samba、检查配置文件、重新添加samba用户，结果统统都不行。 冷静下来仔细研究了一下，发现有些文件夹可以进入，进不去的文件夹都是我用ln -s命令软连接上去的！难道升级之后软连接还需要单独加参数设置才能生效？ 立马上网搜索了一下，果不其然，新版本的samba里想要正常访问软连接，还需要在配置文件里动手脚。知道问题的原因就好办了，立马进行处理，编辑samba的配置文件： sudo vim /etc/samba/smb.conf 在配置文件的“[global]”节的最后，加上下面三条设置： follow symlinks = yes wide links = yes unix extensions = no 然后保存退出，最后重启下samba即可： sudo /etc/init.d/samba restart 至此问题解决，可以正常访问软连接的文件了。 资料参考：http://www.cppblog.com/tx7do/archive/2010/07/06/119499.html]]></description>
			<content:encoded><![CDATA[<p>今天公司里Ubuntu服务器搬迁，搬好了之后习惯性的输入apt-get upgrade进行了一次软件升级。结果升级之后发现samba共享给Windows的部分文件夹打不开了，提示没有权限访问。</p>
<p>尝试了重装samba、检查配置文件、重新添加samba用户，结果统统都不行。</p>
<p>冷静下来仔细研究了一下，发现有些文件夹可以进入，进不去的文件夹都是我用ln -s命令软连接上去的！难道升级之后软连接还需要单独加参数设置才能生效？<span id="more-190"></span></p>
<p>立马上网搜索了一下，果不其然，新版本的samba里想要正常访问软连接，还需要在配置文件里动手脚。知道问题的原因就好办了，立马进行处理，编辑samba的配置文件：</p>
<blockquote><p>sudo vim /etc/samba/smb.conf</p></blockquote>
<p>在配置文件的“[global]”节的最后，加上下面三条设置：</p>
<blockquote><p>follow symlinks = yes<br />
wide links = yes<br />
unix extensions = no</p></blockquote>
<p>然后保存退出，最后重启下samba即可：</p>
<blockquote><p>sudo /etc/init.d/samba restart</p></blockquote>
<p>至此问题解决，可以正常访问软连接的文件了。</p>
<p><em>资料参考：<a href="http://www.cppblog.com/tx7do/archive/2010/07/06/119499.html" target="_blank">http://www.cppblog.com/tx7do/archive/2010/07/06/119499.html</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.renhao.org/2010/09/solution-can-not-access-the-soft-links-after-updated-samba/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

