<?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>九王爷的府邸 &#187; Server</title>
	<atom:link href="http://www.9wy.net/archives/category/server/feed" rel="self" type="application/rss+xml" />
	<link>http://www.9wy.net</link>
	<description>王府重地，宵小回避</description>
	<lastBuildDate>Wed, 01 Sep 2010 03:41:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Linux webserver 常用维护命令</title>
		<link>http://www.9wy.net/archives/551</link>
		<comments>http://www.9wy.net/archives/551#comments</comments>
		<pubDate>Fri, 20 Mar 2009 01:03:22 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[GDB]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://9wy.net/?p=551</guid>
		<description><![CDATA[这里是维护时常用的一些命令，放在这里，备忘 注：大部分非原创，只是收集到这里而已 * 实时查看正在执行的sql语句 1./usr/sbin/tcpdump -i eth0 -s 0 -l -w &#8211; dst port 3306 &#124; strings &#124; egrep -i &#8216;SELECT&#124;UPDATE&#124;DELETE&#124;INSERT&#124;SET&#124;COMMIT&#124;ROLLBACK&#124;CREATE&#124;DROP&#124;ALTER&#124;CALL&#8217; * 查看http连接 1.netstat -n &#124; awk &#8216;/^tcp/ {++state[$NF]} END {for(key in state) print key,&#8221;\t&#8221;,state[key]}&#8217; * 查看SYN状态的http连接 1.netstat -an &#124; grep SYN &#124; awk &#8216;{print $5}&#8217; &#124; awk -F: &#8216;{print $1}&#8217; &#124; sort &#124; uniq [...]]]></description>
			<content:encoded><![CDATA[<p>这里是维护时常用的一些命令，放在这里，备忘</p>
<p><span style="color: #ff0000;">注：大部分非原创，只是收集到这里而已</span></p>
<p>* 实时查看正在执行的sql语句<br />
1./usr/sbin/tcpdump -i eth0 -s 0 -l -w &#8211; dst port 3306 | strings | egrep -i &#8216;SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL&#8217;</p>
<p>* 查看http连接<br />
1.netstat -n | awk &#8216;/^tcp/ {++state[$NF]} END {for(key in state) print key,&#8221;\t&#8221;,state[key]}&#8217;</p>
<p>* 查看SYN状态的http连接<br />
1.netstat -an | grep SYN | awk &#8216;{print $5}&#8217; | awk -F: &#8216;{print $1}&#8217; | sort | uniq -c | sort -nr | more</p>
<p>* 查看TIME_WAIT状态的http连接<br />
1.netstat -tna | cut -b 49- |grep TIME_WAIT | sort |more<br />
2.netstat -an | grep TIME_WAIT | awk &#8216;{print $5}&#8217; | awk -F: &#8216;{print $1}&#8217; | sort | uniq -c | sort -nr | more</p>
<p>* 查看ESTABLISHED状态的http连接<br />
1.netstat -an | grep ESTABLISHED | awk &#8216;{print $5}&#8217; | awk -F: &#8216;{print $1}&#8217; | sort | uniq -c | sort -nr | more<br />
2.netstat -an | grep &#8220;:80&#8243; | grep ESTABLISHED | sort | more</p>
<p>* 批量kill进程<br />
1.ps -efww|grep sqlr-listener|grep -v grep|cut -c 9-15|xargs kill -9</p>
<p>* 查看活动的php-cgi连接数<br />
1.netstat -anpo|grep php-cgi|wc -l</p>
<p>* 按ip查看httpd连接数<br />
1.netstat -anlp | grep 80 | grep tcp | awk {&#8216;print $5&#8242;} | awk -F: {&#8216;print $1&#8242;}| sort |uniq -c | sort -nr</p>
<p>* 禁IP<br />
1.iptables -A INPUT -s IP地址 -j REJECT<br />
2.iptables -A INPUT -s IP地址/24 -j REJECT<br />
3.route add -net IP地址 netmask 255.255.255.0 reject</p>
<p>* 调试命令<br />
1.strace -p pid</p>
<p>* 跟踪指定的进程pid.<br />
1.gdb -p pid</p>
<p>* 跟踪指定的进程pid.</p>
<p>* 批量查找文件并删除<br />
1.find . -name test.php -exec rm {} \;<br />
2.find . -name test.php | xargs rm -rf</p>
<p>* 更改某一目录下所有目录的权限, 不包括文件, aaa 是目录名<br />
1.find aaa -type d -exec chmod 755 {} \;</p>
<p>* 替换文件内容<br />
1.sed -i &#8216;s/b/strong/g&#8217; index.html</p>
<p>此命令搜索 index.html 文件中的 b 并将其替换为 strong。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9wy.net/archives/551/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>调整SSHD的启动优先级别</title>
		<link>http://www.9wy.net/archives/548</link>
		<comments>http://www.9wy.net/archives/548#comments</comments>
		<pubDate>Fri, 20 Mar 2009 01:00:57 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[CMD]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[SSH]]></category>

		<guid isPermaLink="false">http://9wy.net/?p=548</guid>
		<description><![CDATA[在实际的服务器使用中，我们经常遇到的一个情况就是服务器无响应，有可能是由于apache或者是mysql等服务过载造成服务器无响应。九王爷就遇到过几次这种情况，好几次说服务器没响应，ssh也上不去，只好请机房的人员帮助重启机器。重启机器后发现log等服务还是在运行的，也就是说服务器不是真的死机了，而是反应不过来，如果当时能ssh上去看看的话就能找到原因了。所以希望能在apache等没反应以后还能ssh上服务器 这就需要将ssh的运行优先级给调高一些，而我又是个懒人，希望能每次重启后自动的就把优先级给调整了。查看sshd_conf里面没有相应的选项，就只好在启动脚本里面打主意了。 查看启动脚本/etc/init.d/sshd ，修改里面的 $SSHD $OPTIONS &#38;&#38; success &#124;&#124; failure 为 nice -n -2 $SSHD $OPTIONS &#38;&#38; success &#124;&#124; failure 使用-2优先级是希望sshd服务的优先级高于apache等的0，但低于log等的-5 sudo /etc/init.d/sshd restart 一下，然后 ps -aeo cmd,pid,nice &#124;grep sshd 看下优先级是不是变成-2了呢？]]></description>
			<content:encoded><![CDATA[<p>在实际的服务器使用中，我们经常遇到的一个情况就是服务器无响应，有可能是由于apache或者是mysql等服务过载造成服务器无响应。九王爷就遇到过几次这种情况，好几次说服务器没响应，ssh也上不去，只好请机房的人员帮助重启机器。重启机器后发现log等服务还是在运行的，也就是说服务器不是真的死机了，而是反应不过来，如果当时能ssh上去看看的话就能找到原因了。所以希望能在apache等没反应以后还能ssh上服务器<br />
<span><br />
这就需要将ssh的运行优先级给调高一些，而我又是个懒人，希望能每次重启后自动的就把优先级给调整了。查看sshd_conf里面没有相应的选项，就只好在启动脚本里面打主意了。<br />
查看启动脚本/etc/init.d/sshd ，修改里面的<br />
$SSHD $OPTIONS &amp;&amp; success || failure<br />
为<br />
nice -n -2 $SSHD $OPTIONS &amp;&amp; success || failure<br />
使用-2优先级是希望sshd服务的优先级高于apache等的0，但低于log等的-5</p>
<p>sudo /etc/init.d/sshd restart<br />
一下，然后<br />
ps -aeo cmd,pid,nice |grep sshd<br />
看下优先级是不是变成-2了呢？</p>
<p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.9wy.net/archives/548/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[linux服务器][进程管理]用fuser杀掉进程</title>
		<link>http://www.9wy.net/archives/546</link>
		<comments>http://www.9wy.net/archives/546#comments</comments>
		<pubDate>Thu, 19 Mar 2009 00:59:24 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://9wy.net/?p=546</guid>
		<description><![CDATA[转的CU上一条大牛的，转载这里备忘（以前是不转过来的，但是最近发现很多文章所在网站都死掉了，因为没保存，很多好文也没有了）原文地址 http://blog.chinaunix.net/u2/82938/showart_1839189.html 用fuser杀掉进程 一，为什么要使用fuser? 先说 fuser的作用， fuser能识别出正在对某个文件或端口访问的进程 大家想一下，还有哪个命令具备这个功能? 没错，是lsof, 我们前面讲过, lsof能够找出正在对指定文件访问的进程， 那么它们两者之间有何区别? fuser有一个特别的用法在于它可以一次杀死那些正在访问指定文件的进程 二，如何使用fuser? 1,如何用fuser得到正在使用指定文件的进程? 用法: fuser 文件 说明：它会把正在使用当前文件的进程id列出 [root@localhost lhd]# umount / umount: /: device is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) [root@localhost lhd]# fuser / /: 1rc 2rc 3rc 4rc 5rc [...]]]></description>
			<content:encoded><![CDATA[<p>转的CU上一条大牛的，转载这里备忘（以前是不转过来的，但是最近发现很多文章所在网站都死掉了，因为没保存，很多好文也没有了）原文地址 http://blog.chinaunix.net/u2/82938/showart_1839189.html<br />
用fuser杀掉进程</p>
<p>一，为什么要使用fuser?<br />
先说 fuser的作用，<br />
fuser能识别出正在对某个文件或端口访问的进程<br />
大家想一下，还有哪个命令具备这个功能?<br />
没错，是lsof,<br />
我们前面讲过, lsof能够找出正在对指定文件访问的进程，<br />
那么它们两者之间有何区别?<br />
fuser有一个特别的用法在于它可以一次杀死那些正在访问指定文件的进程<br />
<span></p>
<p>二，如何使用fuser?</p>
<p>1,如何用fuser得到正在使用指定文件的进程?<br />
用法: fuser 文件<br />
说明：它会把正在使用当前文件的进程id列出</p>
<p>[root@localhost lhd]# umount /<br />
umount: /: device is busy.<br />
(In some cases useful info about processes that use<br />
the device is found by lsof(8) or fuser(1))<br />
[root@localhost lhd]# fuser /<br />
/: 1rc 2rc 3rc 4rc 5rc 6rc 7rc 80rc 82rc 84rc 85rc 153rc 157rc 158rc<br />
160rc 165rc 168rc 203rc 204rc 205rc 253rc 441rc 444rc 516rc 521rc 524rc 582rc 583rc<br />
584rc 633rc 1052rc 1392rc 1394rc 1417rc 1597rc 1609rc 1617rc 1620rc 1683rc 1744rc 1783r 1785rc<br />
1788rc 1806r 1808r 1810rc 1811rc 1812rc 1813rc 1814rc 1815rc 1848rc 1886rc 1899rc 1900rc 2001rc<br />
&#8230;&#8230;太多不一一列出</p>
<p>说明:<br />
这些进程号后面的rc是什么意思?</p>
<p>c 将此文件作为当前目录使用。<br />
e 将此文件作为程序的可执行对象使用。<br />
r 将此文件作为根目录使用。<br />
s 将此文件作为共享库（或其他可装载对象）使用</p>
<p>2,如何列出进程的详细信息，而不仅仅是进程id?<br />
用 -v参数即可<br />
说明: -v: 含义是:verbose output,详细的输出信息<br />
例子:</p>
<p>[root@dev ~]# fuser /var/log<br />
/var/log: 4196c<br />
[root@dev ~]# fuser -v /var/log</p>
<p>USER PID ACCESS COMMAND<br />
/var/log: root 4196 ..c.. bash</p>
<p>3,如何列出进程所属的用户?<br />
用 -u参数即可<br />
说明: -u: 含义：display user IDs，显示用户id</p>
<p>例子:<br />
[root@dev ~]# fuser -u /var/log<br />
/var/log: 4196c(root)</p>
<p>4,如何杀死所有正在访问指定文件的进程?<br />
用 -k参数即可<br />
说明: -k：含义: kill processes accessing the named file</p>
<p>例子:</p>
<p>[root@localhost lhd]# fuser -v /root/install.log<br />
用户 进程号 权限 命令<br />
/root/install.log: root 3185 f&#8230;. tail<br />
[root@localhost lhd]# fuser -k /root/install.log<br />
/root/install.log: 3185<br />
[root@localhost lhd]# fuser -v /root/install.log</p>
<p>说明: -k参数能够杀死所有的正在访问指定文件的进程，所以用来杀进程时非常方便<br />
说明之二: fuser如何杀死的进程？<br />
它发送的是这个信号:SIGKILL</p>
<p>三，多学一点知识</p>
<p>1,fuser可以列出它所知的信号:<br />
用 -l参数即可</p>
<p>例子:<br />
[root@dev ~]# fuser -l<br />
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM<br />
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS<br />
UNUSED</p>
<p>2,fuser可以发送它已知的信号给访问的指定文件进程而代替-k参数默认发送的SIGKILL<br />
例如：只是挂起进程，那么发送HUP信号就可以了</p>
<p>例子:<br />
[root@localhost lhd]# fuser -v /root/install.log<br />
用户 进程号 权限 命令<br />
/root/install.log: root 3347 f&#8230;. tail<br />
[root@localhost lhd]# fuser -k -SIGHUP /root/install.log<br />
/root/install.log: 3347<br />
[root@localhost lhd]# fuser -v /root/install.log<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.9wy.net/archives/546/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>服务器备份一例</title>
		<link>http://www.9wy.net/archives/543</link>
		<comments>http://www.9wy.net/archives/543#comments</comments>
		<pubDate>Thu, 19 Mar 2009 00:58:02 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Server]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[CMD]]></category>
		<category><![CDATA[Font]]></category>

		<guid isPermaLink="false">http://9wy.net/?p=543</guid>
		<description><![CDATA[这两天服务器无故死机2次，查看log又没有看到有什么异常。只能怀疑是日常的备份让服务器给down掉了。然后今天就将日常备份脚本给删除了，希望这样能看出是不是备份的时候出的问题。 顺便做个全备份。万一是硬件问题也不至于有太大问题。 * 数据库备份时现成的（做了个小脚本，每3天都会自动备份一个），直接下载到本地机器上。 * 网站数据备份，因为看到log比较大，而我又不需要log资源，所以就去掉了log 语句如下： nohup nice -n 19 tar &#8211;exclude var/www/web*/log/* -czvf /home/csbde/backup/webbak20090319.tar.gz /var/www/ &#62; /home/csbde/backup/webbak20090319.log 语句简单解释： 退出终端以后还会继续执行（nohup),设置运行级为最低的19（nice -n 19），这样就不会因为运行这个程序而影响其他程序了。排除目录（&#8211;exclude var/www/web*/log/*）注意var前面没有/，好像有/也没关系，会自动帮你去掉。压缩/var/www/（我的网站目录）到webbak20090319.tar.gz，并写入log到webbak20090319.log * 备份/etc目录 sudo nohup nice -n 19 tar cvzf bak_etc_20090320.tar.gz /etc &#62; bak_etc_20090320.log * 备份apache设置 sudo nohup nice -n 19 tar cvzf bak_apache_config_20090320.tar.gz /usr/local/apache2/conf &#62; bak_apache_config_20090320.log 小知识点： 优先级范围-20~19,-20为最高优先级,19为最低 显示命令名，进程id即优先级 ps -eo [...]]]></description>
			<content:encoded><![CDATA[<p>这两天服务器无故死机2次，查看log又没有看到有什么异常。只能怀疑是日常的备份让服务器给down掉了。然后今天就将日常备份脚本给删除了，希望这样能看出是不是备份的时候出的问题。<br />
<span> </span></p>
<p>顺便做个全备份。万一是硬件问题也不至于有太大问题。<br />
* 数据库备份时现成的（做了个小脚本，每3天都会自动备份一个），直接下载到本地机器上。<br />
* 网站数据备份，因为看到log比较大，而我又不需要log资源，所以就去掉了log<br />
语句如下：<br />
nohup nice -n 19 tar &#8211;exclude var/www/web*/log/* -czvf /home/csbde/backup/webbak20090319.tar.gz /var/www/ &gt; /home/csbde/backup/webbak20090319.log</p>
<p>语句简单解释：<br />
退出终端以后还会继续执行（nohup),设置运行级为最低的19（nice -n 19），这样就不会因为运行这个程序而影响其他程序了。排除目录（&#8211;exclude var/www/web*/log/*）注意var前面没有/，好像有/也没关系，会自动帮你去掉。压缩/var/www/（我的网站目录）到webbak20090319.tar.gz，并写入log到webbak20090319.log<br />
* 备份/etc目录</p>
<p>sudo nohup nice -n 19 tar cvzf bak_etc_20090320.tar.gz /etc &gt; bak_etc_20090320.log</p>
<p>* 备份apache设置<br />
sudo nohup nice -n 19 tar cvzf bak_apache_config_20090320.tar.gz /usr/local/apache2/conf &gt; bak_apache_config_20090320.log</p>
<p><span>小知识点：</span></p>
<p><span> </span></p>
<blockquote style="color: #009900;"><p><span style="font-size: x-small;">优先级范围-20~19,-20为最高优先级,19为最低<br />
显示命令名，进程id即优先级</span></p>
<p>ps -eo cmd,pid,nice</p>
<p>按优先级N执行程序</p>
<p>nice -n N command</p>
<p>调整已执行程序的优先级</p>
<p>renice [+N/-N] process</p>
<p>或者使用top进行直观的调整（运行top然后按r）</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.9wy.net/archives/543/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>proftpd+mysql用户认证+quota磁盘限额</title>
		<link>http://www.9wy.net/archives/111</link>
		<comments>http://www.9wy.net/archives/111#comments</comments>
		<pubDate>Fri, 14 Mar 2008 02:44:56 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Server]]></category>
		<category><![CDATA[Proftpd]]></category>

		<guid isPermaLink="false">http://www.csbde.cn/archives/121.html</guid>
		<description><![CDATA[proftpd+mysql用户认证+quota磁盘限额  整理编辑：mars (mars_diy@21cn.com) 网上关于proftpd的安装文章实在是不少，我只是稍微整理了一下，并且使用了新的 quota磁盘限额模块 由于proftpd最新版1.2.8目前还是RC版，加上有些设置不能通用， 所以在这里还是使用1.2.7版  首先下载源码  proftpd1.2.7:  ftp://ftp.proftpd.org/distrib/sourc&#8230;d-1.2.7.tar.bz2  mod_quotatab-1.2.4 (1.2.5 版本的mod_quotatab是用在最新的1.2.8rc1上的)  http://www.castaglia.org/proftpd/mo&#8230;ab-1.2.4.tar.gz  假定你的机器上已经安装好了mysql  开始编译安装  将proftpd的源码包解压缩到某临时目录下：  localhost proftpd # tar -jxvf proftpd-1.2.7.tar.bz2  解压缩 mod_quotatab-1.2.4  localhost proftpd # tar -zxvf proftpd-mod-quotatab-1.2.4.tar.gz  进入 mod_quotatab 目录  localhost proftpd # cd mod_quotatab  把mod_quotatab中的文件拷贝到 proftpd 中的modules 目录中  localhost mod_quotatab # cp * ../proftpd-1.2.7/modules  在开始运行configure之前，我们要先改动一个文件  进入 proftpd-1.2.7/contrib 目录  localhost mod_quotatab # cd ../proftpd-1.2.7/contrib  修改 mod_sql_mysql.c  localhost contrib # vi mod_sql_mysql.c  找到#include &#60;mysql/mysql.h&#62;; 把他该为你实际路径  如果你的mysql 安装在 /usr/local/mysql 下，就把它修改为#include &#60;/usr/local/mysql/include/mysql/mysql.h&#62;;r  然后  localhost contrib # cd ..  localhost proftpd-1.2.7 # cd ..  localhost proftpd #./configure &#8211;prefix=DIR &#8211;with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql &#8211;with-includes=DIR &#8211;with-libraries=DIR  需要修改的三个地方  &#8211;prefix=DIR 你要安装到哪里  &#8211;with-includes=DIR mysql 的includes 目录  &#8211;with-libraries=DIR mysql 的lib 目录  然后  make  make install 完成安装  接下来，进入你安装好的proftpd目录 ，修改etc/proftpd.conf 文件开始配置  基本配置我就不多说了，网上这类文章有很多，实在不会的话，自己找找就是了，这里主要介绍如何配置mysql用户认证和磁盘限额  mysql 用户认证部分：  在proftpd.conf中加入以下内容  #设置MySQL认证：  #数据库联接的信息，DatabaseName是数据库名， HostName是主机名，  #Port是端口号，UserName是连接数据库的用户名，Password是密码。  SQLConnectInfo DatabaseName@HostName:port UserName Password  #数据库认证的类型：  SQLAuthTypes Backend Plaintext  #指定用来做用户认证的表的有关信息。(&#8220;FTPUSERS&#8221;和&#8221;FTPGRPS&#8221;是数据表名字，等一会而在下面建立)  SQLUserInfo FTPUSERS userid passwd uid gid homedir shell  SQLGroupInfo FTPGRPS groupname gid members  #设置如果shell为空时允许用户登录：  RequireValidShell off  #数据库的鉴别  SQLAuthenticate users groups usersetfast groupsetfast  #如果home目录不存在，则系统会为根据它的home项新建一个目录：  SQLHomedirOnDemand on  然后在这个数据库中建立一个用户表FTPUSERS，这个表是必须的：  [...]]]></description>
			<content:encoded><![CDATA[<p><font id="zoom" class="f14">proftpd+mysql用户认证+quota磁盘限额  </font><font id="zoom" class="f14">整理编辑：mars (mars_diy@21cn.com) </font><font id="zoom" class="f14">网上关于proftpd的安装文章实在是不少，我只是稍微整理了一下，并且使用了新的 quota磁盘限额模块 </font><font id="zoom" class="f14">由于proftpd最新版1.2.8目前还是RC版，加上有些设置不能通用， 所以在这里还是使用1.2.7版 </p>
<p><span id="more-111"></span></p>
<p>首先下载源码 <br />
proftpd1.2.7: <br />
ftp://ftp.proftpd.org/distrib/sourc&#8230;d-1.2.7.tar.bz2 </p>
<p>mod_quotatab-1.2.4 (1.2.5 版本的mod_quotatab是用在最新的1.2.8rc1上的) </p>
<p>http://www.castaglia.org/proftpd/mo&#8230;ab-1.2.4.tar.gz </p>
<p>假定你的机器上已经安装好了mysql <br />
开始编译安装 <br />
将proftpd的源码包解压缩到某临时目录下： <br />
localhost proftpd # tar -jxvf proftpd-1.2.7.tar.bz2 <br />
解压缩 mod_quotatab-1.2.4 <br />
localhost proftpd # tar -zxvf proftpd-mod-quotatab-1.2.4.tar.gz <br />
进入 mod_quotatab 目录 <br />
localhost proftpd # cd mod_quotatab <br />
把mod_quotatab中的文件拷贝到 proftpd 中的modules 目录中 <br />
localhost mod_quotatab # cp * ../proftpd-1.2.7/modules </p>
<p>在开始运行configure之前，我们要先改动一个文件 <br />
进入 proftpd-1.2.7/contrib 目录 <br />
localhost mod_quotatab # cd ../proftpd-1.2.7/contrib <br />
修改 mod_sql_mysql.c <br />
localhost contrib # vi mod_sql_mysql.c <br />
找到#include &lt;mysql/mysql.h&gt;; 把他该为你实际路径 <br />
如果你的mysql 安装在 /usr/local/mysql 下，就把它修改为#include &lt;/usr/local/mysql/include/mysql/mysql.h&gt;;r <br />
然后 <br />
localhost contrib # cd .. <br />
localhost proftpd-1.2.7 # cd .. <br />
localhost proftpd #./configure &#8211;prefix=DIR &#8211;with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql &#8211;with-includes=DIR &#8211;with-libraries=DIR <br />
需要修改的三个地方 <br />
&#8211;prefix=DIR 你要安装到哪里 <br />
&#8211;with-includes=DIR mysql 的includes 目录 <br />
&#8211;with-libraries=DIR mysql 的lib 目录 <br />
然后 <br />
make <br />
make install 完成安装 </p>
<p>接下来，进入你安装好的proftpd目录 ，修改etc/proftpd.conf 文件开始配置 <br />
基本配置我就不多说了，网上这类文章有很多，实在不会的话，自己找找就是了，这里主要介绍如何配置mysql用户认证和磁盘限额 </p>
<p>mysql 用户认证部分： <br />
在proftpd.conf中加入以下内容 </p>
<p>#设置MySQL认证： <br />
#数据库联接的信息，DatabaseName是数据库名， HostName是主机名， <br />
#Port是端口号，UserName是连接数据库的用户名，Password是密码。 <br />
SQLConnectInfo DatabaseName@HostName:port UserName Password </p>
<p>#数据库认证的类型： <br />
SQLAuthTypes Backend Plaintext </p>
<p>#指定用来做用户认证的表的有关信息。(&#8220;FTPUSERS&#8221;和&#8221;FTPGRPS&#8221;是数据表名字，等一会而在下面建立) <br />
SQLUserInfo FTPUSERS userid passwd uid gid homedir shell </p>
<p>SQLGroupInfo FTPGRPS groupname gid members </p>
<p>#设置如果shell为空时允许用户登录： <br />
RequireValidShell off </p>
<p>#数据库的鉴别 <br />
SQLAuthenticate users groups usersetfast groupsetfast </p>
<p>#如果home目录不存在，则系统会为根据它的home项新建一个目录： <br />
SQLHomedirOnDemand on </p>
<p>然后在这个数据库中建立一个用户表FTPUSERS，这个表是必须的： </p>
<p>use FTP; <br />
create table FTPUSERS ( <br />
userid TEXT NOT NULL, <br />
passwd TEXT NOT NULL, <br />
uid INT NOT NULL, <br />
gid INT NOT NULL, <br />
home TEXT, <br />
shell TEXT <br />
); <br />
此表格是为了用户认证所需要的，其中userid、passwd是必不可少的，userid是用做FTP服务的用户名；passwd是指此用户的 密码；uid是系统用户的ID，也就是所映射的系统用户；gid是所属系统组的ID；home是该用户所在的HOME目录；shell可以为该用户指定相 应的shell。当然你可以建立更多的字段，例如：用来记录用户登录次数的count，或者是日期的date，如果你对配置熟悉了之后，你可以根据自己的 喜欢添加更多的功能。在此就不多讲。 <br />
3、如果你想需要所有的功能，你还可以添加另外一个需要的表：FTPGRPS，也就是确定组的表格，当然也可以不用，这里讲一个它的格式： <br />
create table FTPGRPS ( <br />
grpname TEXT NOT NULL, <br />
gid SMALLINT NOT NULL, <br />
members TEXT NOT NULL, <br />
); <br />
其中grpname是组的名称，gid是系统组的ID，members是组的成员。注意：多成员，他们之间要用逗号隔开，不能使用空格。 </p>
<p>4、为空表格插入记录： <br />
INSERT INTO FTPUSERS (userid, passwd, uid, gid, home, shell) <br />
valueS (&#8216;user1&#8242;, &#8217;999999&#8242;, &#8217;1000&#8242;, &#8217;1000&#8242;, &#8217;/home/FTP/user1&#8242;, &#8221; ); </p>
<p>按此格式你可以插入这每一个用户添加一个记录。 <br />
如果你要想应用到更多的功能，且建立了组的表格，你也要为此添加记录，不过一定要注意在members的字段多个成员一定要用逗号隔开。 </p>
<p>INSERT INTO FTPGRPS VALUES (&#8216;FTPGRPS&#8217;, 1000, &#8217;FTPUSR&#8217;); <br />
四、为FTP用户建立相应的系统用户。 <br />
在本例中，只整个FTP服务只提供一个有效的系统用户FTPUSR和组FTPGRP，当然你也可以设置多个系统用户。但出于安全的考虑，我只设一个，用他来启动FTP daemon，并把所有的FTP用户映射过这个用户。 </p>
<p>先建立FTPGRP组： <br />
groupadd -g 1000 -r FTPGRP <br />
建立FTPUSR用户： <br />
adduser -u 1000 -g 1000 -d /home/FTP -s /bin/bash -r FTPUSR </p>
<p>为FTPUSR建立HOME，把所有的FTP user 活动空间全放在此目录下： <br />
mkdir /home/FTP <br />
chown FTPUSR /home/FTP <br />
chgrp FTPGRP /home/FTP </p>
<p>到这里MYSQL认证部分就算基本配置好了，接下来是磁盘限额部分 </p>
<p>首先，还是编辑proftpd文件 </p>
<p>#磁盘限额部分 <br />
QuotaDirectoryTally on </p>
<p>#磁盘限额单位 b&#8221;|&#8221;Kb&#8221;|&#8221;Mb&#8221;|&#8221;Gb&#8221; <br />
QuotaDisplayUnits &#8221;Kb&#8221; </p>
<p>QuotaEngine on </p>
<p>#磁盘限额日志记录 <br />
QuotaLog &#8221;你的LOG路径&#8221; </p>
<p># 打开磁盘限额信息，当登陆FTP帐户后，使用命令 &#8221;quote SITE QUOTA&#8221; 后可显示当前用户的磁盘限额 <br />
QuotaShowQuotas on </p>
<p>#以下是SQL调用语句，不用修改直接拷贝过去 </p>
<p>SQLNamedQuery get-quota-limit SELECT &#8221;name, quota_type, per_session, limit_type, bytes_in_avail, \ <br />
bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM quotalimits \ <br />
WHERE name = &#8217;%{0}&#8217; AND quota_type = &#8217;%{1}&#8217;&#8221; </p>
<p>SQLNamedQuery get-quota-tally SELECT &#8221;name, quota_type, bytes_in_used, bytes_out_used, \ <br />
bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM quotatallies \ <br />
WHERE name = &#8217;%{0}&#8217; AND quota_type = &#8217;%{1}&#8217;&#8221; </p>
<p>SQLNamedQuery update-quota-tally UPDATE &#8221;bytes_in_used = bytes_in_used + %{0}, \ <br />
bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, \ <br />
files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, \ <br />
files_xfer_used = files_xfer_used + %{5} \ <br />
WHERE name = &#8217;%{6}&#8217; AND quota_type = &#8217;%{7}&#8217;&#8221; quotatallies </p>
<p>SQLNamedQuery insert-quota-tally INSERT &#8221;%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}&#8221; quotatallies </p>
<p>QuotaLimitTable sql:/get-quota-limit <br />
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally </p>
<p>然后建立mysql 数据表 <br />
CREATE TABLE quotalimits ( <br />
name VARCHAR(30), <br />
quota_type ENUM(&#8220;user&#8221;, &#8221;group&#8221;, &#8221;class&#8221;, &#8221;all&#8221;) NOT NULL, <br />
per_session ENUM(&#8220;false&#8221;, &#8221;true&#8221;) NOT NULL, <br />
limit_type ENUM(&#8220;soft&#8221;, &#8221;hard&#8221;) NOT NULL, <br />
bytes_in_avail FLOAT NOT NULL, <br />
bytes_out_avail FLOAT NOT NULL, <br />
bytes_xfer_avail FLOAT NOT NULL, <br />
files_in_avail INT UNSIGNED NOT NULL, <br />
files_out_avail INT UNSIGNED NOT NULL, <br />
files_xfer_avail INT UNSIGNED NOT NULL <br />
); </p>
<p>CREATE TABLE quotatallies ( <br />
name VARCHAR(30) NOT NULL, <br />
quota_type ENUM(&#8220;user&#8221;, &#8221;group&#8221;, &#8221;class&#8221;, &#8221;all&#8221;) NOT NULL, <br />
bytes_in_used FLOAT NOT NULL, <br />
bytes_out_used FLOAT NOT NULL, <br />
bytes_xfer_used FLOAT NOT NULL, <br />
files_in_used INT UNSIGNED NOT NULL, <br />
files_out_used INT UNSIGNED NOT NULL, <br />
files_xfer_used INT UNSIGNED NOT NULL <br />
); </p>
<p>说明一下，quotatallies表不需要作修改，它记录了用户当前的磁盘使用情况，由程序自动记录 <br />
要注意的是quotalimits 表中一些字段的含意 <br />
quota_type 磁盘限额的鉴别,可以设置单各用户，也可以设置一各组中的全部用户，还可以设置全部用户 <br />
bytes_in_avail 上传最大字节数，就是FTP用户空间容量 (设置个字段的时候是以byte(字节)为单位，如果要限额在10M，那就是10240000,下面也一样) <br />
bytes_out_avail 下载最大字节数，需要注意的是，这个字段中记录的是用户总共能从服务器上下载多少数据，数据是累计的。 <br />
bytes_xfer_avail 总共可传输的文件的最大字节数(上传和下载流量)需要注意的是，这个字段中记录的是用户总共能传输文件的最大字节数，数据是累计的。 <br />
files_in_avail INT 总共能上传文件的数目 <br />
files_out_avail INT 能从服务器上下载文件的总数目 <br />
files_xfer_avail INT 总共可传输文件的数目(上传和下载) </p>
<p>好了，开始使用磁盘限额，我们要将上面建立的user1帐号给予10M空间，最多能上传500个文件到服务器上，文件传输流量为20M，只能传输10个文件。只要在MYSQL中 <br />
插入 <code><br />
INSERT INTO `quotalimits` ( `name` , `quota_type` , `per_session` , `limit_type` , </code></p>
<p><code>`bytes_in_avail` , `bytes_out_avail` , `bytes_xfer_avail` , `files_in_avail` , </code></p>
<p><code>`files_out_avail` , `files_xfer_avail` ) </code><br />
VALUES (&#8216;user1&#8242;, &#8217;user&#8217;, &#8217;false&#8217;, &#8217;soft&#8217;, &#8217;10240000&#8242;, &#8217;0&#8242;, &#8217;2048000&#8242;, &#8217;500&#8242;, &#8217;0&#8242;, &#8217;10&#8242;); <br />
就可以了，不需要设置的部分用0代替就可以了 <br />
现在运行proftpd，登陆到user1 ，使用quote SITE QUOTA 就会显示user1用户的磁盘使用情况 </p>
<p>ftp&gt;; quote SITE QUOTA <br />
200-The current quota for this session are [current/limit]: <br />
Name: user1 <br />
Quota Type: User <br />
Per Session: False <br />
Limit Type: Soft <br />
Uploaded Kb: 0.00/10000.00 <br />
Downloaded Kb: unlimited <br />
Transferred Kb: 0.00/2000.00 <br />
Uploaded files: 0/500 <br />
Downloaded files: unlimited <br />
Transferred files: 0/10 <br />
200 Please contact root@localhost if these entries are inaccurate </p>
<p>OK,安装完毕</p>
<p>具体可以参照
<a  href="http://www.chinaunix.net/jh/15/3028.html" onclick="javascript:pageTracker._trackPageview('/external/www.chinaunix.net/jh/15/3028.html');" >这里</a>的帖子</p>
<p></font></p>
]]></content:encoded>
			<wfw:commentRss>http://www.9wy.net/archives/111/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>proftpd + mysql 安装参考资料</title>
		<link>http://www.9wy.net/archives/110</link>
		<comments>http://www.9wy.net/archives/110#comments</comments>
		<pubDate>Fri, 14 Mar 2008 02:29:51 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Server]]></category>
		<category><![CDATA[Proftpd]]></category>

		<guid isPermaLink="false">http://www.csbde.cn/archives/120.html</guid>
		<description><![CDATA[proftpd + mysql 安装流水笔记 一。准备工做 1。你的机器上已调试好了apache+php+mysql环境 2。下载PROFTPD wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.10rc3.tar.bz2 因为发现1.2.10直接支持sql和quota 二。安装 tar -jxvf proftpd-1.2.10rc3.tar.bz2 cd proftpd* ./configure &#8211;prefix=/usr/local/proftpd \ &#8211;with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql \ &#8211;with-includes=/usr/local/mysql/include/mysql \ &#8211;with-libraries=/usr/local/mysql/lib/mysql make make install 修改proftpd配置 vim /usr/local/proftpd/etc/proftpd.conf 内容改为： ServerName &#8220;mail2004.3322.org&#8221; ServerType standalone DefaultServer on # 用户登陆时不显示ftp服务器版本信息 ServerIdent off # Port 21 is the standard FTP port. Port 21 # Umask 022 is [...]]]></description>
			<content:encoded><![CDATA[<h2>proftpd + mysql 安装流水笔记</h2>
<div id="postmessage_626939" class="t_msgfont">一。准备工做<br />
1。你的机器上已调试好了apache+php+mysql环境<br />
2。下载PROFTPD<br />
 wget 
<a  href="ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.10rc3.tar.bz2" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/ftp.proftpd.org/distrib/source/proftpd-1.2.10rc3.tar.bz2');" >ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.10rc3.tar.bz2</a><br />
因为发现1.2.10直接支持sql和quota<br />
二。安装<br />
tar -jxvf proftpd-1.2.10rc3.tar.bz2<br />
cd proftpd*
<div class="quote">
<blockquote>./configure &#8211;prefix=/usr/local/proftpd \<br />
&#8211;with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql \<br />
&#8211;with-includes=/usr/local/mysql/include/mysql \<br />
&#8211;with-libraries=/usr/local/mysql/lib/mysql<br />
make<br />
make install<br />
修改proftpd配置<br />
vim /usr/local/proftpd/etc/proftpd.conf<br />
内容改为：<br />
ServerName &#8220;mail2004.3322.org&#8221;<br />
ServerType standalone<br />
DefaultServer on<br />
# 用户登陆时不显示ftp服务器版本信息<br />
 ServerIdent off<br />
# Port 21 is the standard FTP port.<br />
 Port 21<br />
# Umask 022 is a good standard umask to prevent new dirs and files<br />
 # from being group and world writable.<br />
 Umask 022<br />
MaxLoginAttempts 3<br />
 TimeoutLogin 120<br />
 TimeoutIdle 600<br />
 TimeoutNoTransfer 900<br />
 TimeoutStalled 3600<br />
 MaxClients 100<br />
# 设置每台主机最多并发连接数<br />
 MaxClientsPerHost 3<br />
 AllowOverwrite no<br />
 AllowStoreRestart on<br />
 UseReverseDNS off<br />
# 设置如果shell为空时允许用户登录<br />
 RequireValidShell off<br />
# 将用户限制在自己的主目录下<br />
 DefaultRoot ~<br />
# To prevent DoS attacks, set the maximum number of child processes<br />
# to 30. If you need to allow more than 30 concurrent connections<br />
# at once, simply increase this value. Note that this ONLY works<br />
# in standalone mode, in inetd mode you should use an inetd server<br />
# that allows you to limit maximum number of processes per service<br />
# (such as xinetd).<br />
 MaxInstances 30<br />
# Set the user and group under which the server will run.<br />
 User nobody<br />
 Group nobody<br />
# Normally, we want files to be overwriteable.<br />
 &lt;Directory /&gt;<br />
 AllowOverwrite on<br />
 &lt;/Directory&gt;<br />
# A basic anonymous configuration, no upload directories.<br />
 # 匿名登录设置。匿名用户目录为/ftp<br />
 &lt;Anonymous /ftp&gt;<br />
 User ftp<br />
 Group ftp<br />
# We want clients to be able to login with &#8220;anonymous&#8221; as well as &#8220;ftp&#8221;<br />
# UserAlias anonymous ftp&nbsp; &nbsp; 停了它<br />
# Limit the maximum number of anonymous logins<br />
 MaxClients 10<br />
# We want &#8216;welcome.msg&#8217; displayed at login, and &#8216;.message&#8217; displayed<br />
 # in each newly chdired directory.<br />
 DisplayLogin welcome.msg<br />
 DisplayFirstChdir .message</p>
<p> # Limit WRITE everywhere in the anonymous chroot<br />
 #&lt;Limit WRITE&gt;<br />
 # DenyAll<br />
 #&lt;/Limit&gt;<br />
&lt;/Anonymous&gt;<br />
以上是PROFTPD.conf</p>
<p>下面加入sql和quota<br />
# 数据库联接的信息，proftpdb是数据库名，localhost是主机名，proftpd是连接数据库的用户名，<br />
#proftpdb是密码<br />
#（如果没有密码留空）<br />
SQLConnectInfo proftpdb@localhost proftp proftpdb&nbsp;&nbsp;<br />
# 数据库认证的类型<br />
SQLAuthTypes Backend Plaintext<br />
# 数据库的鉴别<br />
SQLAuthenticate users* groups*<br />
# 指定用来做用户认证的表的有关信息。<br />
SQLUserInfo ftpuser userid passwd uid gid homedir shell<br />
SQLGroupInfo ftpgroup groupname gid members<br />
# 如果home目录不存在，则系统会根据它的home项新建一个目录<br />
 SQLHomedirOnDemand on<br />
这是目录所有者，我觉得这个很重要。所以我用nobody来做，在此我的nobody为99.<br />
SQLDefaultGID&nbsp; &nbsp; &nbsp; &nbsp; 99<br />
SQLDefaultUID&nbsp; &nbsp; &nbsp; &nbsp; 99</p>
<p>SQLLog PASS updatecount<br />
SQLNamedQuery updatecount UPDATE &#8220;count=count+1,accessed=now() WHERE userid=&#8217;%u&#8217;&#8221; ftpuser<br />
# Update modified everytime user uploads or deletes a file<br />
SQLLog STOR,DELE modified<br />
SQLNamedQuery modified UPDATE &#8220;modified=now() WHERE userid=&#8217;%u&#8217;&#8221; ftpuser</p>
<p># 启用磁盘限额<br />
 QuotaDirectoryTally on<br />
# 磁盘限额单位 b&#8221;|&#8221;Kb&#8221;|&#8221;Mb&#8221;|&#8221;Gb&#8221;<br />
QuotaDisplayUnits &#8220;Kb&#8221;<br />
QuotaEngine on<br />
# 磁盘限额日志记录<br />
 QuotaLog &#8220;/var/log/quota.log&#8221;<br />
# 打开磁盘限额信息，当登陆FTP帐户后，使用命令 &#8220;quote SITE QUOTA&#8221; 后可显示当前用#户的磁盘限额<br />
QuotaShowQuotas on<br />
以下为sql语句：<br />
SQLNamedQuery get-quota-limit SELECT &#8220;name, quota_type, per_session, limit_type, bytes_in_avail,bytes_out_ava<br />
il, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = &#8216;%{0<br />
}&#8217;AND quota_type = &#8216;%{1}&#8217;&#8221;</p>
<p>SQLNamedQuery get-quota-tally SELECT &#8220;name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files<br />
_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = &#8216;%{0}&#8217; AND quota_type = &#8216;%{1}&#8217;&#8221;<br />
SQLNamedQuery update-quota-tally UPDATE &#8220;bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = &#8216;%{6}&#8217; AND quota_type = &#8216;%{7}&#8217;&#8221; ftpquotatallies</p>
<p>SQLNamedQuery insert-quota-tally INSERT &#8220;%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}&#8221; ftpquotatallies</p>
<p>QuotaLimitTable sql:/get-quota-limit<br />
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally</p>
<p>下面可以用phpmyadmin在mysql里加入，我的sql为以下<br />
CREATE TABLE `ftpgroup` (<br />
 `groupname` varchar(16) NOT NULL default &#8221;,<br />
 `gid` smallint(6) NOT NULL default &#8217;99&#8242;,<br />
 `members` varchar(16) NOT NULL default &#8221;,<br />
 KEY `groupname` (`groupname`)<br />
 ) TYPE=MyISAM COMMENT=&#8217;ProFTP group table&#8217;;</p>
<p>INSERT INTO `ftpgroup` VALUES (&#8216;nobody&#8217;, 99, &#8216;nobody&#8217;);</p>
<p>CREATE TABLE `ftpquotalimits` (<br />
 `name` varchar(30) default NULL,<br />
 `quota_type` enum(&#8216;user&#8217;,'group&#8217;,'class&#8217;,'all&#8217;) NOT NULL default &#8216;user&#8217;,<br />
 `per_session` enum(&#8216;false&#8217;,'true&#8217;) NOT NULL default &#8216;false&#8217;,<br />
 `limit_type` enum(&#8216;soft&#8217;,'hard&#8217;) NOT NULL default &#8216;soft&#8217;,<br />
 `bytes_in_avail` float NOT NULL default &#8217;0&#8242;,<br />
 `bytes_out_avail` float NOT NULL default &#8217;0&#8242;,<br />
 `bytes_xfer_avail` float NOT NULL default &#8217;0&#8242;,<br />
 `files_in_avail` int(10) unsigned NOT NULL default &#8217;0&#8242;,<br />
 `files_out_avail` int(10) unsigned NOT NULL default &#8217;0&#8242;,<br />
 `files_xfer_avail` int(10) unsigned NOT NULL default &#8217;0&#8242;<br />
 ) TYPE=MyISAM;</p>
<p>CREATE TABLE `ftpquotatallies` (<br />
 `name` varchar(30) NOT NULL default &#8221;,<br />
 `quota_type` enum(&#8216;user&#8217;,'group&#8217;,'class&#8217;,'all&#8217;) NOT NULL default &#8216;user&#8217;,<br />
 `bytes_in_used` float NOT NULL default &#8217;0&#8242;,<br />
 `bytes_out_used` float NOT NULL default &#8217;0&#8242;,<br />
 `bytes_xfer_used` float NOT NULL default &#8217;0&#8242;,<br />
 `files_in_used` int(10) unsigned NOT NULL default &#8217;0&#8242;,<br />
 `files_out_used` int(10) unsigned NOT NULL default &#8217;0&#8242;,<br />
 `files_xfer_used` int(10) unsigned NOT NULL default &#8217;0&#8242;<br />
 ) TYPE=MyISAM;</p>
<p>CREATE TABLE `ftpuser` (<br />
 `id` int(10) unsigned NOT NULL auto_increment,<br />
 `userid` varchar(32) NOT NULL default &#8221;,<br />
 `passwd` varchar(32) NOT NULL default &#8221;,<br />
 `uid` smallint(6) NOT NULL default &#8217;99&#8242;,<br />
 `gid` smallint(6) NOT NULL default &#8217;99&#8242;,<br />
 `homedir` varchar(255) NOT NULL default &#8221;,<br />
 `shell` varchar(16) NOT NULL default &#8216;/sbin/nologin&#8217;,<br />
 `count` int(11) NOT NULL default &#8217;0&#8242;,<br />
 `accessed` datetime NOT NULL default &#8217;0000-00-00 00:00:00&#8242;,<br />
 `modified` datetime NOT NULL default &#8217;0000-00-00 00:00:00&#8242;,<br />
 PRIMARY KEY (`id`)<br />
 ) TYPE=MyISAM COMMENT=&#8217;ProFTP user table&#8217; ；</p></blockquote>
</div>
<p>启动proftpd<br />
/usr/local/proftpd/sbin/proftpd start<br />
在数据数中的ftpuser中加入用户，密码他路径就可以了。<br />
以上只是一个流水笔记</p></div>
<div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;">Blogged with the 
<a  href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser" onclick="javascript:pageTracker._trackPageview('/external/www.flock.com/blogged-with-flock');" >Flock Browser</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.9wy.net/archives/110/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>修改MYSQL最大连接数</title>
		<link>http://www.9wy.net/archives/82</link>
		<comments>http://www.9wy.net/archives/82#comments</comments>
		<pubDate>Fri, 15 Feb 2008 00:33:00 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Server]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.csbde.cn/archives/92.html</guid>
		<description><![CDATA[MYSQL数据库安装完成后，默认最大连接数是100，一般流量稍微大一点的论坛或网站这个连接数是远远不够的，增加默认MYSQL连接数的方法有两个 方法一：进入MYSQL安装目录 打开MYSQL配置文件 my.ini 查找 max_connections=100 修改为 max_connections=1000 服务里重起MYSQL即可 如果在linux下面，就编辑/etc/my.cnf 找到[mysqld]一段，加入如下一行： set-variable=max_connections=1500 注意：该参数必须加入[mysqld]配置段内，加入别的地方无效。 方法二：MySQL的最大连接数默认是100客户端登录：mysql -uusername -ppassword 设置新的最大连接数为200：mysql&#62; set GLOBAL max_connections=200 显示当前运行的Query：mysql&#62; show processlist 显示当前状态：mysql&#62; show status 退出客户端：mysql&#62; exit 查看当前最大连接数：mysqladmin -uusername -ppassword variables 注：方法二是临时的，重启就又是100的连接数了 方法三：修改启动文件 mysql的最大连接数默认是100, 这个数值对于并发连接很多的数据库应用是远远不够 　　的，可以把它适当调大， 　　whereis safe_mysqld 　　找到safe_mysqld的位置，然后编辑它，找到mysqld启动的那两行，在后面加上参数 　　-O max_connections=1000 　　例如 　　&#8212; safe_mysqld.orig Mon Sep 25 09:34:01 2000 　　+++ safe_mysqld Sun Sep 24 [...]]]></description>
			<content:encoded><![CDATA[<p><coolcode>MYSQL数据库安装完成后，默认最大连接数是100，一般流量稍微大一点的论坛或网站这个连接数是远远不够的，增加默认MYSQL连接数的方法有两个</p>
<p>方法一：进入MYSQL安装目录 打开MYSQL配置文件 my.ini 查找 max_connections=100 修改为 max_connections=1000 服务里重起MYSQL即可</p>
<p>如果在linux下面，就编辑/etc/my.cnf</p>
<p>找到[mysqld]一段，加入如下一行：<br />
set-variable=max_connections=1500</p>
<p>注意：该参数必须加入[mysqld]配置段内，加入别的地方无效。</p>
<p>方法二：MySQL的最大连接数默认是100客户端登录：mysql -uusername -ppassword</p>
<p>设置新的最大连接数为200：mysql&gt; set GLOBAL max_connections=200</p>
<p>显示当前运行的Query：mysql&gt; show processlist</p>
<p>显示当前状态：mysql&gt; show status</p>
<p>退出客户端：mysql&gt; exit</p>
<p>查看当前最大连接数：mysqladmin -uusername -ppassword variables</p>
<p>注：方法二是临时的，重启就又是100的连接数了</p>
<p>方法三：修改启动文件</p>
<p>mysql的最大连接数默认是100, 这个数值对于并发连接很多的数据库应用是远远不够</p>
<p>　　的，可以把它适当调大，</p>
<p>　　whereis safe_mysqld</p>
<p>　　找到safe_mysqld的位置，然后编辑它，找到mysqld启动的那两行，在后面加上参数</p>
<p>　　-O max_connections=1000</p>
<p>　　例如</p>
<p>　　&#8212; safe_mysqld.orig Mon Sep 25 09:34:01 2000</p>
<p>　　+++ safe_mysqld Sun Sep 24 16:56:46 2000</p>
<p>　　@@ -109,10 +109,10 @@</p>
<p>　　if test &#8220;$#&#8221; -eq 0</p>
<p>　　then</p>
<p>　　nohup $ledir/mysqld &#8211;basedir=$MY_BASEDIR_VERSION &#8211;datadir=$DATADIR /</p>
<p>　　- &#8211;skip-locking &gt;&gt; $err_log 2&gt;&amp;1</p>
<p>　　+ &#8211;skip-locking -O max_connections=1000 &gt;&gt; $err_log 2&gt;&amp;1</p>
<p>　　else</p>
<p>　　nohup $ledir/mysqld &#8211;basedir=$MY_BASEDIR_VERSION &#8211;datadir=$DATADIR /</p>
<p>　　- &#8211;skip-locking &#8220;$@&#8221; &gt;&gt; $err_log 2&gt;&amp;1</p>
<p>　　+ &#8211;skip-locking &#8220;$@&#8221; -O max_connections=1000 &gt;&gt; $err_log 2&gt;&amp;1</p>
<p>　　fi</p>
<p>　　if test ! -f $pid_file # This is removed if normal shutdown</p>
<p>　　then</p>
<p>　　然后关闭mysql重启它，用</p>
<p>　　/mysqladmin所在路径/mysqladmin -uroot -p variables</p>
<p>　　输入root数据库账号的密码后可看到</p>
<p>　　　 max_connections 　 1000 　</p>
<p>注：方法三未进行测试，为直接转的，并且我觉得应该是mysqld_safe文件。不知道是不是我的是5.0版本的原因<br />
</coolcode></p>
]]></content:encoded>
			<wfw:commentRss>http://www.9wy.net/archives/82/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>extmail安装错误小结</title>
		<link>http://www.9wy.net/archives/80</link>
		<comments>http://www.9wy.net/archives/80#comments</comments>
		<pubDate>Mon, 04 Feb 2008 17:57:36 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[mail server]]></category>
		<category><![CDATA[ExtMail]]></category>

		<guid isPermaLink="false">http://www.csbde.cn/archives/90.html</guid>
		<description><![CDATA[错误 Can&#8217;t locate Ext/CGI.pm 解决办法 cd /var/www/extsuite/extman/libs/Ext ./buildlink.sh clean ./buildlink.sh build /var/www/extsuite/extmail/libs/Ext 新问题出现 Can&#8217;t locate Ext.pm in @INC (@INC contains: /var/www/extsuite/extman/libs 查看发现Ext.pm没有做好链接，可能是位置错误 # cp /var/www/extsuite/extmail/libs/Ext.pm /var/www/extsuite/extmail/libs/Ext/ 再出现新问题那肯定是跟我一样由于版本不正确造成的，重新下载修改版本为合适版本就OK了]]></description>
			<content:encoded><![CDATA[<p><coolcode><br />
错误<br />
Can&#8217;t locate Ext/CGI.pm<br />
解决办法<br />
cd /var/www/extsuite/extman/libs/Ext<br />
./buildlink.sh clean<br />
./buildlink.sh build /var/www/extsuite/extmail/libs/Ext</p>
<p>新问题出现<br />
Can&#8217;t locate Ext.pm in @INC (@INC contains: /var/www/extsuite/extman/libs<br />
查看发现Ext.pm没有做好链接，可能是位置错误<br />
# cp /var/www/extsuite/extmail/libs/Ext.pm /var/www/extsuite/extmail/libs/Ext/</p>
<p>再出现新问题那肯定是跟我一样由于版本不正确造成的，重新下载修改版本为合适版本就OK了<br />
</coolcode></p>
]]></content:encoded>
			<wfw:commentRss>http://www.9wy.net/archives/80/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>postfix配置过程</title>
		<link>http://www.9wy.net/archives/79</link>
		<comments>http://www.9wy.net/archives/79#comments</comments>
		<pubDate>Mon, 04 Feb 2008 10:01:13 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[mail server]]></category>
		<category><![CDATA[Postfix]]></category>

		<guid isPermaLink="false">http://www.csbde.cn/archives/89.html</guid>
		<description><![CDATA[一、配置postfix 1、建立配置文件 #postconf -n &#62; /etc/postfix/main2.cf #mv /etc/postfix/main.cf /etc/postfix/main.cf.old #mv /etc/postfix/main2.cf /etc/postfix/main.cf2、再编辑main.cf：#vim /etc/postfix/main.cf添加以下内容 ######################################## # hostname #mynetworks = 127.0.0.1 myhostname = mail.kkio.com mydestination = $mynetworks $myhostname# banner mail_name = Postfix - by KKIO.COM smtpd_banner = $myhostname ESMTP $mail_name# response immediately smtpd_error_sleep_time = 0s unknown_local_recipient_reject_code = 450# extmail config here virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><code><br />
一、配置postfix<br />
1、建立配置文件<br />
#postconf -n &gt; /etc/postfix/main2.cf<br />
#mv /etc/postfix/main.cf /etc/postfix/main.cf.old<br />
#mv /etc/postfix/main2.cf /etc/postfix/main.cf2、再编辑main.cf：#vim /etc/postfix/main.cf添加以下内容<br />
########################################<br />
# hostname<br />
#mynetworks = 127.0.0.1<br />
myhostname = mail.kkio.com<br />
mydestination = $mynetworks $myhostname# banner<br />
mail_name = Postfix - by KKIO.COM<br />
smtpd_banner = $myhostname ESMTP $mail_name# response immediately<br />
smtpd_error_sleep_time = 0s<br />
unknown_local_recipient_reject_code = 450# extmail config here<br />
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf<br />
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf<br />
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf<br />
virtual_transport = maildrop:<br />
######################################################</code></p>
<p>3、编辑mysql_virtual_alias_maps.cf</p>
<p>#vim /etc/postfix/mysql_virtual_alias_maps.cf</p>
<p>添加以下内容</p>
<p>###########################<br />
user = extmail<br />
password = extmail<br />
hosts = localhost<br />
dbname = extmail<br />
table = alias<br />
select_field = goto<br />
where_field = address<br />
#############################</p>
<p>4、编辑mysql_virtual_domains_maps.cf<br />
#vim /etc/postfix/mysql_virtual_domains_maps.cf</p>
<p>内容如下：</p>
<p>user = extmail<br />
password = extmail<br />
hosts = localhost<br />
dbname = extmail<br />
table = domain<br />
select_field = description<br />
where_field = domain<br />
#additional_conditions = and backupmx =&#8217;0&#8242; and active =&#8217;1&#8242;</p>
<p>5、编辑mysql_virtual_mailbox_maps.cf<br />
#vim /etc/postfix/mysql_virtual_mailbox_maps.cf</p>
<p>内容如下：</p>
<p>user = extmail<br />
password = extmail<br />
hosts = localhost<br />
dbname = extmail<br />
table = mailbox<br />
select_field = maildir<br />
where_field = username<br />
#additional_conditions = and active = &#8217;1&#8242;</p>
<p>二、配置Courier-Authlib<br />
安装Courier-Authlib</p>
<p>1、运行如下命令安装相关软件包</p>
<p>#rpm -ivh RPMS/libtool-libs-1.5.6-4.EL4.1.c4.3.i386.rpm<br />
//返回错误信息<br />
//warning: RPMS/libtool-libs-1.5.6-4.EL4.1.c4.3.i386.rpm: Header V3 DSA signature: NOKEY, key ID 443e1821<br />
//Preparing&#8230; ########################################### [100%]<br />
// file /usr/lib/libltdl.so.3 from install of libtool-libs-1.5.6-4.EL4.1.c4.3 conflicts with file from package libtool-ltdl-1.5.22-6.1</p>
<p>#rpm -ivh RPMS/courier-authlib-0.57-1hzq.i386.rpm<br />
#rpm -ivh RPMS/courier-authlib-devel-0.57-1hzq.i386.rpm<br />
#rpm -ivh RPMS/courier-authlib-mysql-0.57-1hzq.i386.rpm</p>
<p>2、编辑/etc/authlib/authmysqlrc文件，并将其内容清空，然后增加如下内容：</p>
<p>MYSQL_SERVER localhost<br />
MYSQL_USERNAME extmail<br />
MYSQL_PASSWORD extmail<br />
MYSQL_SOCKET /var/lib/mysql/mysql.sock<br />
MYSQL_PORT 3306<br />
MYSQL_OPT 0<br />
MYSQL_DATABASE extmail<br />
MYSQL_USER_TABLE mailbox<br />
MYSQL_CRYPT_PWFIELD password<br />
MYSQL_UID_FIELD uidnumber<br />
MYSQL_GID_FIELD gidnumber<br />
MYSQL_LOGIN_FIELD username<br />
MYSQL_HOME_FIELD homedir<br />
MYSQL_NAME_FIELD name<br />
MYSQL_MAILDIR_FIELD maildir<br />
MYSQL_QUOTA_FIELD quota<br />
MYSQL_SELECT_CLAUSE SELECT username,password,&#8221;",uidnumber,gidnumber,\<br />
CONCAT(&#8216;/home/domains/&#8217;,homedir), \<br />
CONCAT(&#8216;/home/domains/&#8217;,maildir), \<br />
quota, \<br />
name \<br />
FROM mailbox \<br />
WHERE username = &#8216;$(local_part)@$(domain)&#8217;</p>
<p>3、存盘退出后启动courier-authlib：<br />
#/etc/init.d/courier-authlib start</p>
<p>如一切正常，命令行将返回如下信息：<br />
Starting Courier authentication services: authdaemond</p>
<p>4、修改authdaemon socket目录权限</p>
<p>如果该目录权限不正确修改，maildrop及postfix等将无法正确获取用户的信息及密码认证：<br />
chmod 755 /var/spool/authdaemon/</p>
<p>5、配置使用maildrop</p>
<p>编辑main.cf，增加：<br />
virtual_transport = maildrop:<br />
maildrop_destination_recipient_limit = 1</p>
<p>其次编辑master.cf，找到定义maildrop的那行，原来默认的内容：<br />
maildrop unix &#8211; n n &#8211; - pipe<br />
flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}</p>
<p>改为：<br />
maildrop unix &#8211; n n &#8211; - pipe<br />
flags=DRhu user=vuser argv=maildrop -w 90 -d ${recipient}</p>
<p>增加投递用户</p>
<p>很多邮件系统文档都使用postfix这个用户（一般是uid=125）作为邮件存储，在使用<br />
系统的virtual等投递时不存在问题，如果是改为maildrop则postfix会报错。不允许<br />
通过pipe来以user=postfix来投递。</p>
<p>因此从长远角度考虑（参见1），专门开一个帐户来保存邮件比较好。这里：</p>
<p>groupadd -r -g 1000 vgroup<br />
useradd -u 1000 -d /home/domains -s /bin/true -g vgroup vuser</p>
<p>这样就增加了一个uid=1000, gid=1000的用户vuser，组属于vgroup的。</p>
<p>以后如果要使用suexec也不会因为uid太低而造成问题了！</p>
<p>保存好所有修改，重新启动postfix</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.9wy.net/archives/79/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于suexec的FAQ</title>
		<link>http://www.9wy.net/archives/78</link>
		<comments>http://www.9wy.net/archives/78#comments</comments>
		<pubDate>Mon, 04 Feb 2008 08:48:55 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Server]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[ExtMail]]></category>
		<category><![CDATA[Postfix]]></category>

		<guid isPermaLink="false">http://www.csbde.cn/archives/88.html</guid>
		<description><![CDATA[今天安装postfix和extmail的时候发现不能正常运行CGI，赶紧检查log，发现是suexec出现错误了，我就说前几天的论坛附件怎么会出问题，赶紧查找原因，看suexec的log发现是user mismatch，上网一查原因，原来是配置APACHE的时候就出错了，好像只有重新编译了，又练手了 apache编译支持suexec功能 ./configure &#8211;enable-suexec &#8211;with-suexec-logfile=/www/logs/suexec.log &#8211;with-suexec-uidmin=500 &#8211;with-suexec-gidmin=100 &#8211;with-suexec-caller=daemon &#8211;with-suexec-docroot＝/www 关于suexec的FAQ 1.出现以下错误 command not in docroot 编译的时候加入&#8211;with-suexec-docroot 以后虚拟主机运行suexec的目录必须包含指定的目录里,通过suexec -V 可以察看docroot目录是哪儿 2.出现以下错误 user mismatch (daemon instead of www) 编译的时候加入&#8211;with-suexec-caller=daemon 默认是www，但一般apache的运行用户是nobody或者daemon，这里我们是httpd2.2.2，用户是daemon，所以指定这个参数，否则suexec不能被运行。 3.出现以下错误 cannot run as forbidden uid (1001/index.cgi) 在虚拟主机配置SuexecUserGroup时，指定的用户和组，必须高于&#8211;with-suexec-uidmin &#8211;with-suexec-gidmin 指定的用户uid和gid，否则被限制使用。]]></description>
			<content:encoded><![CDATA[<p>今天安装postfix和extmail的时候发现不能正常运行CGI，赶紧检查log，发现是suexec出现错误了，我就说前几天的论坛附件怎么会出问题，赶紧查找原因，看suexec的log发现是user mismatch，上网一查原因，原来是配置APACHE的时候就出错了，好像只有重新编译了，又练手了</p>
<p>apache编译支持suexec功能</p>
<p>./configure &#8211;enable-suexec &#8211;with-suexec-logfile=/www/logs/suexec.log &#8211;with-suexec-uidmin=500 &#8211;with-suexec-gidmin=100 &#8211;with-suexec-caller=daemon &#8211;with-suexec-docroot＝/www</p>
<p>关于suexec的FAQ<br />
1.出现以下错误  command not in docroot<br />
编译的时候加入&#8211;with-suexec-docroot    以后虚拟主机运行suexec的目录必须包含指定的目录里,通过suexec -V 可以察看docroot目录是哪儿</p>
<p>2.出现以下错误  user mismatch (daemon instead of www)<br />
编译的时候加入&#8211;with-suexec-caller=daemon  默认是www，但一般apache的运行用户是nobody或者daemon，这里我们是httpd2.2.2，用户是daemon，所以指定这个参数，否则suexec不能被运行。</p>
<p>3.出现以下错误  cannot run as forbidden uid (1001/index.cgi)<br />
在虚拟主机配置SuexecUserGroup时，指定的用户和组，必须高于&#8211;with-suexec-uidmin &#8211;with-suexec-gidmin 指定的用户uid和gid，否则被限制使用。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9wy.net/archives/78/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
