<?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>蓝色数据</title>
	<atom:link href="http://bluedata.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://bluedata.org</link>
	<description>奋斗是幸福的……</description>
	<lastBuildDate>Mon, 14 Sep 2009 01:53:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Cacti 获取 SNMP 发送的自定义信息绘图</title>
		<link>http://bluedata.org/2009/09/10/cacti-snmp-custom/</link>
		<comments>http://bluedata.org/2009/09/10/cacti-snmp-custom/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 01:37:24 +0000</pubDate>
		<dc:creator>Bluedata</dc:creator>
				<category><![CDATA[应用技术]]></category>
		<category><![CDATA[cacti]]></category>
		<category><![CDATA[snmp]]></category>

		<guid isPermaLink="false">http://bluedata.org/?p=295</guid>
		<description><![CDATA[本文以获取 squid 内存缓存命中率为例。
在 /etc/snmp/snmpd.conf 可以看到这样的样例：
# exec .1.3.6.1.4.1.2021.50 shelltest /bin/sh /tmp/shtest
可以使用自己编写的脚本，比如：
exec .1.3.6.1.4.1.2021.50 squidmemhits /usr/local/bin/squidmemhits.sh
vi /usr/local/bin/squidmemhits.sh
#!/bin/sh
PATH=$PATH:/usr/local/squid/bin
export PATH
squidclient -t 1 -h localhost -p 3128 mgr:info &#124; grep "Memory hits" &#124; cut -d "%" -f 2 &#124; awk '{print $5}'
squidclient -t 1 -h localhost -p 3128 mgr:info &#124; grep "Memory hits" &#124; cut -d "%" -f 3 &#124; awk [...]]]></description>
			<content:encoded><![CDATA[<p>本文以获取 squid 内存缓存命中率为例。</p>
<p>在 /etc/snmp/snmpd.conf 可以看到这样的样例：<br />
# exec .1.3.6.1.4.1.2021.50 shelltest /bin/sh /tmp/shtest<br />
可以使用自己编写的脚本，比如：<br />
exec .1.3.6.1.4.1.2021.50 squidmemhits /usr/local/bin/squidmemhits.sh</p>
<p>vi /usr/local/bin/squidmemhits.sh<br />
<coolcode linenum="off">#!/bin/sh<br />
PATH=$PATH:/usr/local/squid/bin<br />
export PATH<br />
squidclient -t 1 -h localhost -p 3128 mgr:info | grep "Memory hits" | cut -d "%" -f 2 | awk '{print $5}'<br />
squidclient -t 1 -h localhost -p 3128 mgr:info | grep "Memory hits" | cut -d "%" -f 3 | awk '{print $3}'</coolcode></p>
<p>/etc/init.d/snmpd restart</p>
<p>检查一下能否读取到数据：<br />
snmpwalk -v 2c 192.168.0.200 -c public .1.3.6.1.4.1.2021.50<br />
<coolcode linenum="off">UCD-SNMP-MIB::ucdavis.50.1.1 = INTEGER: 1<br />
UCD-SNMP-MIB::ucdavis.50.2.1 = STRING: "squidmemhits"<br />
UCD-SNMP-MIB::ucdavis.50.3.1 = STRING: "/usr/local/bin/squidmemhits.sh"<br />
UCD-SNMP-MIB::ucdavis.50.100.1 = INTEGER: 0<br />
UCD-SNMP-MIB::ucdavis.50.101.1 = STRING: "86.0"<br />
UCD-SNMP-MIB::ucdavis.50.101.2 = STRING: "86.6"<br />
UCD-SNMP-MIB::ucdavis.50.102.1 = INTEGER: 0<br />
UCD-SNMP-MIB::ucdavis.50.103.1 = ""</coolcode></p>
<p>其中<br />
UCD-SNMP-MIB::ucdavis.50.101.1 = STRING: "86.0"<br />
UCD-SNMP-MIB::ucdavis.50.101.2 = STRING: "86.6"<br />
这两行就是所需要的。<br />
<coolcode linenum="off">snmpwalk -v 1 192.168.0.200 -c public .1.3.6.1.4.1.2021.50.101.1<br />
UCD-SNMP-MIB::ucdavis.50.101.1 = STRING: "86.0"<br />
snmpwalk -v 1 192.168.0.200 -c public .1.3.6.1.4.1.2021.50.101.2<br />
UCD-SNMP-MIB::ucdavis.50.101.2 = STRING: "86.6"</coolcode></p>
<p>能采集到数据，就可以配置 Cacti 来接收了。<br />
先创建数据模板：<br />
<coolcode linenum="off">console -> Templates -> Data Templates -> Add -><br />
Data Templates Name: ucd/net - Squid - Memory Hits - 5 Minute<br />
Data Source Name: |host_description| - Squid - Memory Hits - 5 Minute<br />
Data Input Method: GET SNMP Data<br />
Associated RRA's: remove Hourly (1 Minute Average)<br />
Internal Data Source Name: squid_memhits_5min<br />
create -><br />
OID: .1.3.6.1.4.1.2021.50.101.1<br />
Save<br />
</coolcode><br />
同样再创建一个 Squid - Memory Hits - 60 Minute 的数据模板。</p>
<p>再创建图形模板：<br />
<coolcode linenum="off">console -> Templates -> Graph Templates -> Add -><br />
Name: ucd/net - Squid Memory Hits<br />
Title: |host_description| - Squid Memory Hits<br />
Vertical Label: percent<br />
create</p>
<p>Graph Template Items -> Add<br />
Data Source: ucd/net - Squid - Memory Hits - 5 Minute - (squid_memhits_5min)<br />
Color: FFC73B<br />
Graph Item Type: AREA<br />
Consolidation Function: AVERAGE<br />
Text Format: 5 Minute<br />
create -><br />
Graph Template Items -> Add<br />
Graph Item Type: GPRINT<br />
Consolidation Function: LAST<br />
Text Format: Current:<br />
Insert Hard Return<br />
create -></p>
<p>Graph Template Items -> Add<br />
Data Source: ucd/net - Squid - Memory Hits - 60 Minute - (squid_memhits_60min)<br />
Color: FF0000<br />
Graph Item Type: LINE1<br />
Consolidation Function: AVERAGE<br />
Text Format: 60 Minute<br />
create -><br />
Graph Template Items -> Add<br />
Graph Item Type: GPRINT<br />
Consolidation Function: LAST<br />
Text Format: Current:<br />
Insert Hard Return<br />
create -> Save</coolcode></p>
<p>然后就可以选择主机，添加图形了。</p>
<p>样例图：<br />
<img src="http://bluedata.org/wp-content/uploads/2009/09/squidmemhits.jpg" alt="squidmemhits" /></p>
]]></content:encoded>
			<wfw:commentRss>http://bluedata.org/2009/09/10/cacti-snmp-custom/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>nginx 使用 logrotate 回滚日志</title>
		<link>http://bluedata.org/2009/09/04/nginx-logrotate/</link>
		<comments>http://bluedata.org/2009/09/04/nginx-logrotate/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 07:28:49 +0000</pubDate>
		<dc:creator>Bluedata</dc:creator>
				<category><![CDATA[应用技术]]></category>
		<category><![CDATA[logrotate]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://bluedata.org/?p=293</guid>
		<description><![CDATA[vi /usr/local/nginx/conf/logrotate.conf
/var/log/nginx/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 640 www-data adm
    sharedscripts
    prerotate
    sleep 59
    endscript
    [...]]]></description>
			<content:encoded><![CDATA[<p>vi /usr/local/nginx/conf/logrotate.conf<br />
<coolcode linenum="off">/var/log/nginx/*.log {<br />
    daily<br />
    missingok<br />
    rotate 7<br />
    compress<br />
    delaycompress<br />
    notifempty<br />
    create 640 www-data adm<br />
    sharedscripts<br />
    prerotate<br />
    sleep 59<br />
    endscript<br />
    postrotate<br />
        if [ -f /var/run/nginx.pid ]; then<br />
          kill -USR1 `cat /var/run/nginx.pid`<br />
        fi<br />
    endscript<br />
}</coolcode></p>
<p>调试：<br />
logrotate -d /usr/local/nginx/conf/logrotate.conf</p>
<p>执行：<br />
logrotate -f /usr/local/nginx/conf/logrotate.conf</p>
<p>定期执行：<br />
vi /etc/crontab<br />
59 23 * * * root logrotate -f /usr/local/nginx/conf/logrotate.conf</p>
]]></content:encoded>
			<wfw:commentRss>http://bluedata.org/2009/09/04/nginx-logrotate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用 PSSH 在多主机上同时执行命令</title>
		<link>http://bluedata.org/2009/09/01/pssh/</link>
		<comments>http://bluedata.org/2009/09/01/pssh/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 10:40:38 +0000</pubDate>
		<dc:creator>Bluedata</dc:creator>
				<category><![CDATA[应用技术]]></category>
		<category><![CDATA[pscp]]></category>
		<category><![CDATA[pssh]]></category>

		<guid isPermaLink="false">http://bluedata.org/?p=283</guid>
		<description><![CDATA[先要配置好 ssh 的 key ，然后安装：
apt-get install pssh
为了方便输入，设置一下别名和环境变量（ CentOS 安装后的程序文件名直接就是短格式的）：
vi ~/.bashrc
alias pssh='parallel-ssh'
alias pscp='parallel-scp'
alias prsync='parallel-rsync'
export PSSH_HOSTS="/root/servers.txt"
export PSSH_USER="root"
export PSSH_PAR="32"
export PSSH_OUTDIR="/tmp"
export PSSH_VERBOSE="0"
export PSSH_OPTIONS="UserKnownHostsFile /root/.ssh/known_hosts"
source ~/.profile
创建主机列表文件：
vi servers.txt
192.168.6.101
192.168.6.102
192.168.6.103
192.168.6.104
测试：
pssh hostname
Success on 192.168.6.101:22
Success on 192.168.6.102:22
Success on 192.168.6.103:22
Success on 192.168.6.104:22
cat /tmp/192.168.6.*
web1
web2
web3
web4
重启 Nginx:
pssh killall -HUP nginx
批量复制文件：
pscp /etc/hosts /etc/hosts
为了便于管理，可以使用 -h 参数指定主机列表文件，给主机分组。
]]></description>
			<content:encoded><![CDATA[<p>先要配置好 ssh 的 key ，然后安装：<br />
apt-get install pssh</p>
<p>为了方便输入，设置一下别名和环境变量（ CentOS 安装后的程序文件名直接就是短格式的）：<br />
vi ~/.bashrc<br />
<coolcode linenum="off">alias pssh='parallel-ssh'<br />
alias pscp='parallel-scp'<br />
alias prsync='parallel-rsync'</p>
<p>export PSSH_HOSTS="/root/servers.txt"<br />
export PSSH_USER="root"<br />
export PSSH_PAR="32"<br />
export PSSH_OUTDIR="/tmp"<br />
export PSSH_VERBOSE="0"<br />
export PSSH_OPTIONS="UserKnownHostsFile /root/.ssh/known_hosts"</coolcode></p>
<p>source ~/.profile</p>
<p>创建主机列表文件：<br />
vi servers.txt<br />
192.168.6.101<br />
192.168.6.102<br />
192.168.6.103<br />
192.168.6.104</p>
<p>测试：<br />
<coolcode linenum="off">pssh hostname<br />
Success on 192.168.6.101:22<br />
Success on 192.168.6.102:22<br />
Success on 192.168.6.103:22<br />
Success on 192.168.6.104:22</p>
<p>cat /tmp/192.168.6.*<br />
web1<br />
web2<br />
web3<br />
web4</coolcode></p>
<p>重启 Nginx:<br />
pssh killall -HUP nginx</p>
<p>批量复制文件：<br />
pscp /etc/hosts /etc/hosts</p>
<p>为了便于管理，可以使用 -h 参数指定主机列表文件，给主机分组。</p>
]]></content:encoded>
			<wfw:commentRss>http://bluedata.org/2009/09/01/pssh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux 下使用 NMON 分析系统性能</title>
		<link>http://bluedata.org/2009/08/31/linux-nmon/</link>
		<comments>http://bluedata.org/2009/08/31/linux-nmon/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 11:06:20 +0000</pubDate>
		<dc:creator>Bluedata</dc:creator>
				<category><![CDATA[操作系统]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nmon]]></category>

		<guid isPermaLink="false">http://bluedata.org/?p=275</guid>
		<description><![CDATA[下载相应 CPU 类型的版本：
http://nmon.sourceforge.net/pmwiki.php?n=Site.Download
wget http://sourceforge.net/projects/nmon/files/download/nmon_x86_12a.zip/download
unzip nmon_x86_12a.zip
Archive:  nmon_x86_12a.zip
  inflating: nmon_x86_rhel45
  inflating: nmon_x86_rhel52
  inflating: nmon_x86_sles9
  inflating: nmon_x86_sles10
  inflating: nmon_x86_ubuntu810
  inflating: nmon_x86_fedora10
  inflating: nmon_x86_opensuse10
使用对应的操作系统文件：
chmod +x nmon_x86_ubuntu810
mv nmon_x86_ubuntu810 /usr/local/bin/nmon
对于 Debian 还要做以下操作（不做也同样能运行）：
apt-get install lsb-release
lsb_release -d &#124; sed 's/Description:\t//' > /etc/debian_release
然后直接运行 nmon 即可。
采集数据并生成报表：
采集数据:
nmon -s10 -c60 -f -m /home/
参数解释：
-s10 每 10 秒采集一次数据。
-c60 采集 60 次，即为采集十分钟的数据。
-f [...]]]></description>
			<content:encoded><![CDATA[<p>下载相应 CPU 类型的版本：<br />
<a href="http://nmon.sourceforge.net/pmwiki.php?n=Site.Download" target="_blank">http://nmon.sourceforge.net/pmwiki.php?n=Site.Download</a><br />
<coolcode linenum="off">wget http://sourceforge.net/projects/nmon/files/download/nmon_x86_12a.zip/download<br />
unzip nmon_x86_12a.zip<br />
Archive:  nmon_x86_12a.zip<br />
  inflating: nmon_x86_rhel45<br />
  inflating: nmon_x86_rhel52<br />
  inflating: nmon_x86_sles9<br />
  inflating: nmon_x86_sles10<br />
  inflating: nmon_x86_ubuntu810<br />
  inflating: nmon_x86_fedora10<br />
  inflating: nmon_x86_opensuse10</coolcode></p>
<p>使用对应的操作系统文件：<br />
chmod +x nmon_x86_ubuntu810<br />
mv nmon_x86_ubuntu810 /usr/local/bin/nmon</p>
<p>对于 Debian 还要做以下操作（不做也同样能运行）：<br />
apt-get install lsb-release<br />
lsb_release -d | sed 's/Description:\t//' > /etc/debian_release</p>
<p>然后直接运行 nmon 即可。</p>
<p>采集数据并生成报表：<br />
采集数据:<br />
nmon -s10 -c60 -f -m /home/</p>
<p>参数解释：<br />
-s10 每 10 秒采集一次数据。<br />
-c60 采集 60 次，即为采集十分钟的数据。<br />
-f 生成的数据文件名中包含文件创建的时间。<br />
-m 生成的数据文件的存放目录。</p>
<p>这样就会生成一个 nmon 文件，并每十秒更新一次，直到十分钟后。<br />
生成的文件名如： hostname_090824_1306.nmon ，"hostname" 是这台主机的主机名。</p>
<p>生成报表：<br />
下载 nmon analyser （生成性能报告的免费工具）：<br />
http://www.ibm.com/developerworks/wikis/display/Wikiptype/nmonanalyser</p>
<p>把之前生成的 nmon 数据文件传到 Windows 机器上，用 Excel 打开分析工具 nmon analyser v33C.xls 。点击 Excel 文件中的 "Analyze nmon data" 按钮，选择 nmon 数据文件，这样就会生成一个分析后的结果文件： hostname_090824_1306.nmon.xls ，用 Excel 打开生成的文件就可以看到结果了。</p>
<p>如果宏不能运行，需要做以下操作：<br />
工具 -> 宏 -> 安全性 -> 中，然后再打开文件并允许运行宏。</p>
<p>自动按天采集数据：<br />
在 crontab 中增加一条记录：<br />
0 0 * * * root nmon -s300 -c288 -f -m /home/ > /dev/null 2>&#038;1</p>
<p>300*288=86400 秒，正好是一天的数据。</p>
<p>参考资料：<br />
nmon for Linux:<br />
<a href="http://nmon.sourceforge.net/pmwiki.php" target="_blank">http://nmon.sourceforge.net/pmwiki.php</a></p>
<p>nmon 性能：分析 AIX 和 Linux 性能的免费工具：<br />
<a href="http://www.ibm.com/developerworks/cn/aix/library/analyze_aix/index.html" target="_blank">http://www.ibm.com/developerworks/cn/aix/library/analyze_aix/index.html</a></p>
<p>nmon analyser —— 生成 AIX 性能报告的免费工具：<br />
<a href="http://www.ibm.com/developerworks/cn/aix/library/nmon_analyser/index.html" target="_blank">http://www.ibm.com/developerworks/cn/aix/library/nmon_analyser/index.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bluedata.org/2009/08/31/linux-nmon/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>使用 DenyHosts 阻止 SSH 暴力破解</title>
		<link>http://bluedata.org/2009/08/29/denyhosts-block-ssh-brute-force-password-cracker/</link>
		<comments>http://bluedata.org/2009/08/29/denyhosts-block-ssh-brute-force-password-cracker/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 09:34:48 +0000</pubDate>
		<dc:creator>Bluedata</dc:creator>
				<category><![CDATA[操作系统]]></category>
		<category><![CDATA[denyhosts]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://bluedata.org/?p=273</guid>
		<description><![CDATA[项目主页：
http://denyhosts.sourceforge.net/
安装：
CentOS:
yum install denyhosts
Debian:
apt-get install denyhosts
配置：
vi /etc/denyhosts.conf
# 用户登录的日志文件
SECURE_LOG = /var/log/auth.log
# 禁止登陆的主机文件
HOSTS_DENY = /etc/hosts.deny
# 清除已禁止主机的时间
PURGE_DENY = 5d
# 禁止的服务名
BLOCK_SERVICE = sshd
# 允许无效用户登录失败的次数
DENY_THRESHOLD_INVALID = 1
# 允许普通用户登陆失败的次数
DENY_THRESHOLD_VALID = 3
# 允许 root 用户登陆失败的次数
DENY_THRESHOLD_ROOT = 3
# 是否做域名反解
HOSTNAME_LOOKUP=NO
# 管理员邮件地址
ADMIN_EMAIL = admin@domain.com
# SMTP 的相关设置
SMTP_HOST = mail.domain.com
SMTP_PORT = 25
SMTP_USERNAME=denyhosts@domain.com
SMTP_PASSWORD=password
SMTP_FROM = DenyHosts 
SMTP_SUBJECT = DenyHosts Report from domain.com
# DenyHosts 的日志文件
DAEMON_LOG = /var/log/denyhosts
]]></description>
			<content:encoded><![CDATA[<p>项目主页：<br />
http://denyhosts.sourceforge.net/</p>
<p>安装：<br />
CentOS:<br />
yum install denyhosts</p>
<p>Debian:<br />
apt-get install denyhosts</p>
<p>配置：<br />
vi /etc/denyhosts.conf<br />
# 用户登录的日志文件<br />
SECURE_LOG = /var/log/auth.log</p>
<p># 禁止登陆的主机文件<br />
HOSTS_DENY = /etc/hosts.deny</p>
<p># 清除已禁止主机的时间<br />
PURGE_DENY = 5d</p>
<p># 禁止的服务名<br />
BLOCK_SERVICE = sshd</p>
<p># 允许无效用户登录失败的次数<br />
DENY_THRESHOLD_INVALID = 1</p>
<p># 允许普通用户登陆失败的次数<br />
DENY_THRESHOLD_VALID = 3</p>
<p># 允许 root 用户登陆失败的次数<br />
DENY_THRESHOLD_ROOT = 3</p>
<p># 是否做域名反解<br />
HOSTNAME_LOOKUP=NO</p>
<p># 管理员邮件地址<br />
ADMIN_EMAIL = admin@domain.com</p>
<p># SMTP 的相关设置<br />
SMTP_HOST = mail.domain.com<br />
SMTP_PORT = 25<br />
SMTP_USERNAME=denyhosts@domain.com<br />
SMTP_PASSWORD=password<br />
SMTP_FROM = DenyHosts <denyhosts@domain.com><br />
SMTP_SUBJECT = DenyHosts Report from domain.com</p>
<p># DenyHosts 的日志文件<br />
DAEMON_LOG = /var/log/denyhosts</p>
]]></content:encoded>
			<wfw:commentRss>http://bluedata.org/2009/08/29/denyhosts-block-ssh-brute-force-password-cracker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在 Debian Nginx 上安装 Nagios 3.2</title>
		<link>http://bluedata.org/2009/08/23/install_nagios_on_debian_nginx/</link>
		<comments>http://bluedata.org/2009/08/23/install_nagios_on_debian_nginx/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 14:01:50 +0000</pubDate>
		<dc:creator>Bluedata</dc:creator>
				<category><![CDATA[应用技术]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[nagios]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://bluedata.org/?p=267</guid>
		<description><![CDATA[下载所需软件：
http://www.nagios.org/download/
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.0.tar.gz
创建 nagios 用户和组：
groupadd nagios
useradd -g nagios -d /usr/local/nagios -s /bin/bash nagios
创建一个 nagcmd 组用于从 Web 接口执行外部命令，并将 nagios 用户和 Web 用户都加到这个组中：
groupadd nagcmd
usermod -G nagcmd nagios
usermod -G nagcmd www-data
安装 Nagios:
apt-get install libgd2-xpm-dev
The following NEW packages will be installed:
  defoma fontconfig-config libfontconfig1 libfreetype6 libgd2-xpm libjpeg62 libxpm4 ttf-dejavu ttf-dejavu-core ttf-dejavu-extra
tar zxvf nagios-3.2.0.tar.gz
cd nagios-3.2.0
./configure \
--prefix=/usr/local/nagios \
--with-command-group=nagcmd
make all
make install
make install-init
make [...]]]></description>
			<content:encoded><![CDATA[<p>下载所需软件：<br />
http://www.nagios.org/download/<br />
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.0.tar.gz</p>
<p>创建 nagios 用户和组：<br />
groupadd nagios<br />
useradd -g nagios -d /usr/local/nagios -s /bin/bash nagios</p>
<p>创建一个 nagcmd 组用于从 Web 接口执行外部命令，并将 nagios 用户和 Web 用户都加到这个组中：<br />
groupadd nagcmd<br />
usermod -G nagcmd nagios<br />
usermod -G nagcmd www-data</p>
<p>安装 Nagios:<br />
apt-get install libgd2-xpm-dev<br />
The following NEW packages will be installed:<br />
  defoma fontconfig-config libfontconfig1 libfreetype6 libgd2-xpm libjpeg62 libxpm4 ttf-dejavu ttf-dejavu-core ttf-dejavu-extra</p>
<p>tar zxvf nagios-3.2.0.tar.gz<br />
cd nagios-3.2.0<br />
./configure \<br />
--prefix=/usr/local/nagios \<br />
--with-command-group=nagcmd</p>
<p>make all</p>
<p>make install<br />
make install-init<br />
make install-config<br />
make install-commandmode</p>
<p><a href="http://bluedata.org/2009/08/21/nginx-cgi/" target="_blank">配置 Nginx 支持 CGI</a> ，然后在 Nginx 添加 Nagios 的配置如下：</p>
<p><coolcode linenum="off">server {<br />
    listen  80;<br />
    server_name  nagios.domain.com;<br />
    root  /usr/local/nagios/share;<br />
    index  index.php index.html;<br />
    location ~ .*\.php?$ {<br />
        fastcgi_pass  127.0.0.1:9000;<br />
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;<br />
        include  fastcgi_params;<br />
    }<br />
    location ~ .*\.cgi$ {<br />
        rewrite  ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;<br />
        fastcgi_pass  127.0.0.1:8999;<br />
        fastcgi_param  SCRIPT_FILENAME  /usr/local/nagios/sbin$fastcgi_script_name;<br />
        include  fastcgi_params;<br />
        auth_basic  "Nagios Access";<br />
        auth_basic_user_file  /usr/local/nagios/etc/htpasswd.users;<br />
    }<br />
    location /nagios {<br />
        alias  /usr/local/nagios/share;<br />
    }<br />
    location / {<br />
        auth_basic  "Nagios Access";<br />
        auth_basic_user_file  /usr/local/nagios/etc/htpasswd.users;<br />
    }<br />
}</coolcode></p>
<p>创建 Nagios Web 接口登录的用户：<br />
apt-get install apache2-utils<br />
The following NEW packages will be installed:<br />
  apache2-utils libapr1 libaprutil1 libldap-2.4-2 libpq5 libsqlite3-0</p>
<p>htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin</p>
<p>重启 Nginx:<br />
/etc/init.d/nginx restart</p>
<p>安装 Nagios 插件：<br />
wget http://prdownloads.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.13.tar.gz<br />
tar zxvf nagios-plugins-1.4.13.tar.gz<br />
cd nagios-plugins-1.4.13<br />
./configure \<br />
--prefix=/usr/local/nagios \<br />
--with-nagios-group=nagcmd</p>
<p>make<br />
make install</p>
<p>添加 nagios 服务：<br />
sysv-rc-conf</p>
<p>检查配置文件是否有错误：<br />
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg</p>
<p>cgi 的权限验证问题：<br />
vi /usr/local/nagios/etc/cgi.cfg<br />
use_authentication=0</p>
<p>启动：<br />
/etc/init.d/nagios start</p>
<p>打开 http://nagios.domain.com 输入之前设置的用户名和密码就可以查看 nagios 的页面了。不过此时还只能看到 localhost 的状态。</p>
]]></content:encoded>
			<wfw:commentRss>http://bluedata.org/2009/08/23/install_nagios_on_debian_nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RHEL5 使用 ISO 文件作为 YUM 源</title>
		<link>http://bluedata.org/2009/08/22/rhel5-yum-iso/</link>
		<comments>http://bluedata.org/2009/08/22/rhel5-yum-iso/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 14:10:31 +0000</pubDate>
		<dc:creator>Bluedata</dc:creator>
				<category><![CDATA[操作系统]]></category>
		<category><![CDATA[rhel]]></category>
		<category><![CDATA[yum]]></category>

		<guid isPermaLink="false">http://bluedata.org/?p=264</guid>
		<description><![CDATA[1. 设置 iso 文件的自动挂载并安装 createrepo
mkdir /media/rhel
mount -o loop rhel-5-server-i386-dvd.iso /media/rhel
vi /etc/fstab
/dev/cdrom              /media/rhel             iso9660 ro              0 0
mount -a
rpm [...]]]></description>
			<content:encoded><![CDATA[<p>1. 设置 iso 文件的自动挂载并安装 createrepo<br />
mkdir /media/rhel<br />
mount -o loop rhel-5-server-i386-dvd.iso /media/rhel<br />
vi /etc/fstab<br />
/dev/cdrom              /media/rhel             iso9660 ro              0 0<br />
mount -a<br />
rpm -ivh /media/rhel/Server/createrepo-0.4.11-3.el5.noarch.rpm</p>
<p>2. 配置 repo<br />
cd /etc/yum.repos.d<br />
mv rhel-debuginfo.repo rhel-debuginfo.repo~<br />
vi rhel-media.repo</p>
<p><coolcode linenum="off">[Cluster]<br />
name=Red Hat Enterprise Linux $releasever - $basearch - Cluster<br />
baseurl=file:///media/rhel/Cluster<br />
enabled=1<br />
gpgcheck=1<br />
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release</p>
<p>[ClusterStorage]<br />
name=Red Hat Enterprise Linux $releasever - $basearch - ClusterStorage<br />
baseurl=file:///media/rhel/ClusterStorage<br />
enabled=1<br />
gpgcheck=1<br />
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release</p>
<p>[Server]<br />
name=Red Hat Enterprise Linux $releasever - $basearch - Server<br />
baseurl=file:///media/rhel/Server<br />
enabled=1<br />
gpgcheck=1<br />
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release</p>
<p>[VT]<br />
name=Red Hat Enterprise Linux $releasever - $basearch - VT<br />
baseurl=file:///media/rhel/VT<br />
enabled=1<br />
gpgcheck=1<br />
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release</coolcode></p>
<p>3. 创建所需目录<br />
mkdir -p /var/rhel/{Cluster,ClusterStorage,Server,VT}</p>
<p>4. createrepo:<br />
createrepo -o /var/rhel/Cluster -g /media/rhel/Cluster/repodata/comps-rhel5-cluster.xml /media/rhel/Cluster<br />
createrepo -o /var/rhel/ClusterStorage -g /media/rhel/ClusterStorage/repodata/comps-rhel5-cluster-st.xml /media/rhel/ClusterStorage<br />
createrepo -o /var/rhel/Server -g /media/rhel/Server/repodata/comps-rhel5-server-core.xml /media/rhel/Server<br />
createrepo -o /var/rhel/VT -g /media/rhel/VT/repodata/comps-rhel5-vt.xml /media/rhel/VT</p>
<p>5. 避免无谓的“下载”<br />
mount --bind /var/rhel/Cluster/repodata /media/rhel/Cluster/repodata<br />
mount --bind /var/rhel/ClusterStorage/repodata /media/rhel/ClusterStorage/repodata<br />
mount --bind /var/rhel/Server/repodata /media/rhel/Server/repodata<br />
mount --bind /var/rhel/VT/repodata /media/rhel/VT/repodata</p>
<p>可加入 /etc/rc.local 开机自动绑定。</p>
<p>6. 清除缓存<br />
yum clean all</p>
]]></content:encoded>
			<wfw:commentRss>http://bluedata.org/2009/08/22/rhel5-yum-iso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配置 Nginx 支持 CGI</title>
		<link>http://bluedata.org/2009/08/21/nginx-cgi/</link>
		<comments>http://bluedata.org/2009/08/21/nginx-cgi/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 10:19:17 +0000</pubDate>
		<dc:creator>Bluedata</dc:creator>
				<category><![CDATA[应用技术]]></category>
		<category><![CDATA[程序设计]]></category>
		<category><![CDATA[cgi]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://bluedata.org/?p=258</guid>
		<description><![CDATA[安装所需的 perl fcgi 模块：
apt-get install libfcgi-perl libfcgi-procmanager-perl
用 perl 写一个 daemon 程序来处理 cgi 文件：
vi /usr/local/bin/cgiwrap-fcgi.pl
#!/usr/bin/perl -w
use FCGI;
use Socket;
use FCGI::ProcManager;
sub shutdown { FCGI::CloseSocket($socket); exit; }
sub restart  { FCGI::CloseSocket($socket); &main; }
use sigtrap 'handler', \&#038;shutdown, 'normal-signals';
use sigtrap 'handler', \&#038;restart,  'HUP';
require 'syscall.ph';
use POSIX qw(setsid);
#&daemonize; we don't daemonize when running under runsv
#this keeps the program alive or something after [...]]]></description>
			<content:encoded><![CDATA[<p>安装所需的 perl fcgi 模块：<br />
apt-get install libfcgi-perl libfcgi-procmanager-perl</p>
<p>用 perl 写一个 daemon 程序来处理 cgi 文件：</p>
<p>vi /usr/local/bin/cgiwrap-fcgi.pl<br />
<coolcode linenum="off" lang="perl">#!/usr/bin/perl -w<br />
use FCGI;<br />
use Socket;<br />
use FCGI::ProcManager;<br />
sub shutdown { FCGI::CloseSocket($socket); exit; }<br />
sub restart  { FCGI::CloseSocket($socket); &main; }<br />
use sigtrap 'handler', \&#038;shutdown, 'normal-signals';<br />
use sigtrap 'handler', \&#038;restart,  'HUP';<br />
require 'syscall.ph';<br />
use POSIX qw(setsid);</p>
<p>#&daemonize; we don't daemonize when running under runsv<br />
#this keeps the program alive or something after exec'ing perl scripts<br />
END()   { }<br />
BEGIN() { }<br />
{<br />
    no warnings;<br />
    *CORE::GLOBAL::exit = sub { die "fakeexit\nrc=" . shift() . "\n"; };<br />
};<br />
eval q{exit};<br />
if ($@) {<br />
    exit unless $@ =~ /^fakeexit/;<br />
}<br />
&main;</p>
<p>sub daemonize() {<br />
    chdir '/' or die "Can't chdir to /: $!";<br />
    defined( my $pid = fork ) or die "Can't fork: $!";<br />
    exit if $pid;<br />
    setsid() or die "Can't start a new session: $!";<br />
    umask 0;<br />
}</p>
<p>sub main {</p>
<p>#$socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 ); #use IP sockets<br />
#$socket = FCGI::OpenSocket( "/var/run/nginx/perl_cgi-dispatch.sock", 10 ); #use UNIX sockets - user running this script must have w access to the 'nginx' folder!!<br />
#foreach $item (keys %ENV) { delete $ENV{$item}; }<br />
    $proc_manager = FCGI::ProcManager->new( {n_processes => 5} );<br />
    $socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 )<br />
        ; #use UNIX sockets - user running this script must have w access to the 'nginx' folder!!<br />
    $request =<br />
        FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket,<br />
        &#038;FCGI::FAIL_ACCEPT_ON_INTR );<br />
    $proc_manager->pm_manage();<br />
    if ($request) { request_loop() }<br />
    FCGI::CloseSocket($socket);<br />
}</p>
<p>sub request_loop {<br />
    while ( $request->Accept() >= 0 ) {<br />
        $proc_manager->pm_pre_dispatch();</p>
<p>        #processing any STDIN input from WebServer (for CGI-POST actions)<br />
        $stdin_passthrough = '';<br />
        { no warnings; $req_len = 0 + $req_params{'CONTENT_LENGTH'}; };<br />
        if ( ( $req_params{'REQUEST_METHOD'} eq 'POST' ) &#038;& ( $req_len != 0 ) )<br />
        {<br />
            my $bytes_read = 0;<br />
            while ( $bytes_read < $req_len ) {<br />
                my $data = '';<br />
                my $bytes = read( STDIN, $data, ( $req_len - $bytes_read ) );<br />
                last if ( $bytes == 0 || !defined($bytes) );<br />
                $stdin_passthrough .= $data;<br />
                $bytes_read += $bytes;<br />
            }<br />
        }</p>
<p>        #running the cgi app<br />
        if (<br />
            ( -x $req_params{SCRIPT_FILENAME} ) &#038;&    #can I execute this?<br />
            ( -s $req_params{SCRIPT_FILENAME} ) &#038;&    #Is this file empty?<br />
            ( -r $req_params{SCRIPT_FILENAME} )       #can I read this file?<br />
            )<br />
        {<br />
            pipe( CHILD_RD,   PARENT_WR );<br />
            pipe( PARENT_ERR, CHILD_ERR );<br />
            my $pid = open( CHILD_O, "-|" );<br />
            unless ( defined($pid) ) {<br />
                print("Content-type: text/plain\r\n\r\n");<br />
                print<br />
"Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n";<br />
                next;<br />
            }<br />
            $oldfh = select(PARENT_ERR);<br />
            $|     = 1;<br />
            select(CHILD_O);<br />
            $| = 1;<br />
            select($oldfh);<br />
            if ( $pid > 0 ) {<br />
                close(CHILD_RD);<br />
                close(CHILD_ERR);<br />
                print PARENT_WR $stdin_passthrough;<br />
                close(PARENT_WR);<br />
                $rin = $rout = $ein = $eout = '';<br />
                vec( $rin, fileno(CHILD_O),    1 ) = 1;<br />
                vec( $rin, fileno(PARENT_ERR), 1 ) = 1;<br />
                $ein    = $rin;<br />
                $nfound = 0;</p>
<p>                while ( $nfound =<br />
                    select( $rout = $rin, undef, $ein = $eout, 10 ) )<br />
                {<br />
                    die "$!" unless $nfound != -1;<br />
                    $r1 = vec( $rout, fileno(PARENT_ERR), 1 ) == 1;<br />
                    $r2 = vec( $rout, fileno(CHILD_O),    1 ) == 1;<br />
                    $e1 = vec( $eout, fileno(PARENT_ERR), 1 ) == 1;<br />
                    $e2 = vec( $eout, fileno(CHILD_O),    1 ) == 1;</p>
<p>                    if ($r1) {<br />
                        while ( $bytes = read( PARENT_ERR, $errbytes, 4096 ) ) {<br />
                            print STDERR $errbytes;<br />
                        }<br />
                        if ($!) {<br />
                            $err = $!;<br />
                            die $!;<br />
                            vec( $rin, fileno(PARENT_ERR), 1 ) = 0<br />
                                unless ( $err == EINTR or $err == EAGAIN );<br />
                        }<br />
                    }<br />
                    if ($r2) {<br />
                        while ( $bytes = read( CHILD_O, $s, 4096 ) ) {<br />
                            print $s;<br />
                        }<br />
                        if ( !defined($bytes) ) {<br />
                            $err = $!;<br />
                            die $!;<br />
                            vec( $rin, fileno(CHILD_O), 1 ) = 0<br />
                                unless ( $err == EINTR or $err == EAGAIN );<br />
                        }<br />
                    }<br />
                    last if ( $e1 || $e2 );<br />
                }<br />
                close CHILD_RD;<br />
                close PARENT_ERR;<br />
                waitpid( $pid, 0 );<br />
            } else {<br />
                foreach $key ( keys %req_params ) {<br />
                    $ENV{$key} = $req_params{$key};<br />
                }</p>
<p>                # cd to the script's local directory<br />
                if ( $req_params{SCRIPT_FILENAME} =~ /^(.*)\/[^\/]+$/ ) {<br />
                    chdir $1;<br />
                }<br />
                close(PARENT_WR);</p>
<p>                #close(PARENT_ERR);<br />
                close(STDIN);<br />
                close(STDERR);</p>
<p>                #fcntl(CHILD_RD, F_DUPFD, 0);<br />
                syscall( &#038;SYS_dup2, fileno(CHILD_RD),  0 );<br />
                syscall( &#038;SYS_dup2, fileno(CHILD_ERR), 2 );</p>
<p>                #open(STDIN, "<&#038;CHILD_RD");<br />
                exec( $req_params{SCRIPT_FILENAME} );<br />
                die("exec failed");<br />
            }<br />
        } else {<br />
            print("Content-type: text/plain\r\n\r\n");<br />
            print<br />
"Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n";<br />
        }<br />
    }<br />
}</coolcode></p>
<p>注意文件中的这两行：<br />
#$socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 );<br />
#$socket = FCGI::OpenSocket( "/var/run/nginx/perl_cgi-dispatch.sock", 10 );<br />
这两行都表示监听来自 perl CGI 的请求。<br />
其中 perl_cgi-dispatch.sock 表示使用 unix socket 响应 CGI 请求。<br />
127.0.0.1:8999 表示使用 TCP/IP 协议响应请求。<br />
需要使用哪种方式就在下面的 FCGI::OpenSocket 中填入相对应的内容。</p>
<p>启动：<br />
chmod +x /usr/local/bin/cgiwrap-fcgi.pl<br />
/usr/local/bin/cgiwrap-fcgi.pl > /dev/null 2>&#038;1 &#038;</p>
<p>配置 Nginx 的 location 处理 cgi 文件：<br />
<coolcode linenum="off">location ~ .*\.cgi$ {<br />
    fastcgi_pass  127.0.0.1:8999;<br />
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;<br />
    include  fastcgi_params;<br />
}</coolcode></p>
<p>测试：<br />
在 web 的根目录下创建一个 cgi 文件：<br />
vi test.cgi<br />
#!/usr/bin/perl<br />
print "Content-type: text/html\n\n";<br />
print "<html><body>Hello, world.</body></html>";</p>
<p>文件需要有可执行权限：<br />
chmod +x test.cgi</p>
<p>访问 http://www.domain.com/test.cgi 看看有没有输出。</p>
<p>cgiwrap-fcgi.pl 随 nginx 一起启动/关闭：<br />
修改 nginx 启动脚本：<br />
在 start 段加入：<br />
/usr/local/bin/cgiwrap-fcgi.pl > /dev/null 2>&#038;1 &#038;</p>
<p>在 stop 段加入：<br />
<coolcode linenum="off">PID=`/bin/netstat -npl | grep "127.0.0.1:8999" | awk '{print $7}' | cut -d "/" -f 1`<br />
while [ -n "$PID" ]<br />
do<br />
kill -9 "$PID"<br />
PID=`/bin/netstat -npl | grep "127.0.0.1:8999" | awk '{print $7}' | cut -d "/" -f 1`<br />
done</coolcode></p>
]]></content:encoded>
			<wfw:commentRss>http://bluedata.org/2009/08/21/nginx-cgi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MySQL 复制集群动态添加 slave</title>
		<link>http://bluedata.org/2009/08/13/mysql-replication-cluster-add-slave/</link>
		<comments>http://bluedata.org/2009/08/13/mysql-replication-cluster-add-slave/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 01:37:01 +0000</pubDate>
		<dc:creator>Bluedata</dc:creator>
				<category><![CDATA[存储备份]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[lvm]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[快照]]></category>
		<category><![CDATA[集群]]></category>

		<guid isPermaLink="false">http://bluedata.org/?p=241</guid>
		<description><![CDATA[MySQL 数据文件需要存放在 LVM 逻辑卷上才能进行如下操作。
创建快照：
master 作为源：
## 对 master 进行读锁定
mysql> flush tables with read lock;
## 在新终端中（退出锁会失效）创建 MySQL 数据 逻辑卷 的快照
modprobe dm-snapshot
lvcreate -l 486 -s -n mysql_snap /dev/vg/mysql
## 记录当前 binlog 名称及 POS
mysql> show master status;
+------------------+-----------+
&#124; File             &#124; Position  &#124;
+------------------+-----------+
&#124; mysql-bin.000018 &#124; 235667001 &#124;
+------------------+-----------+
## 解锁
mysql> unlock [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL 数据文件需要存放在 LVM 逻辑卷上才能进行如下操作。</p>
<p>创建快照：<br />
master 作为源：<br />
<coolcode linenum="off">## 对 master 进行读锁定<br />
mysql> flush tables with read lock;</p>
<p>## 在新终端中（退出锁会失效）创建 MySQL 数据 逻辑卷 的快照<br />
modprobe dm-snapshot<br />
lvcreate -l 486 -s -n mysql_snap /dev/vg/mysql</p>
<p>## 记录当前 binlog 名称及 POS<br />
mysql> show master status;<br />
+------------------+-----------+<br />
| File             | Position  |<br />
+------------------+-----------+<br />
| mysql-bin.000018 | 235667001 |<br />
+------------------+-----------+</p>
<p>## 解锁<br />
mysql> unlock tables;</coolcode></p>
<p>slave 作为源：</p>
<p><coolcode linenum="off">## 停止 slave 复制进程<br />
mysql -e 'slave stop'</p>
<p>## 创建 MySQL 数据 逻辑卷 的快照<br />
modprobe dm-snapshot<br />
lvcreate -l 486 -s -n mysql_snap /dev/vg/mysql</p>
<p>## 记录当前 master binlog 名称及 POS<br />
mysql -e 'show slave status\G'<br />
Master_Log_File: mysql-bin.000018<br />
Read_Master_Log_Pos: 235667001</p>
<p>## 启动 slave 复制进程<br />
mysql -e 'slave start'</coolcode></p>
<p>## 同步数据库文件<br />
mount /dev/vg/mysql_snap /mnt<br />
rsync -ae ssh --delete --exclude "mysql-bin.*" /mnt/ mysql2:/mysql/ &#038;</p>
<p>## 在源上删除快照<br />
umount /mnt<br />
lvremove -f /dev/vg/mysql_snap<br />
rmmod dm-snapshot</p>
<p>## 在新的 slave 上启动数据库及复制进程<br />
<coolcode linenum="off">/etc/init.d/mysqld start<br />
mysql -e 'slave stop'<br />
mysql -e 'change master to master_host="192.168.0.201", master_user="slave", master_password="slave", master_log_file="mysql-bin.000018", master_log_pos=235667001'<br />
mysql -e 'slave start'</coolcode></p>
]]></content:encoded>
			<wfw:commentRss>http://bluedata.org/2009/08/13/mysql-replication-cluster-add-slave/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vsFTPD 快速安装配置</title>
		<link>http://bluedata.org/2009/08/13/vsftpd/</link>
		<comments>http://bluedata.org/2009/08/13/vsftpd/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 17:01:38 +0000</pubDate>
		<dc:creator>Bluedata</dc:creator>
				<category><![CDATA[应用技术]]></category>
		<category><![CDATA[vsftpd]]></category>

		<guid isPermaLink="false">http://bluedata.org/?p=236</guid>
		<description><![CDATA[安装：
CentOS:
yum install vsftpd
Debian:
apt-get install vsftpd
配置：
vi /etc/vsftpd.conf
禁止匿名用户登录：
anonymous_enable=NO
允许系统用户登录：
local_enable=YES
开启写权限：
write_enable=YES
设置掩码：
local_umask=022
如果觉得默认的空闲时间太短，可以设置的久一点：
idle_session_timeout=3600
data_connection_timeout=3600
把 ftp 用户限制在自己的主目录：
chroot_local_user=YES
未指定用户 shell 会导致 "530 Login incorrect" 错误：
vi /etc/passwd
www-data:x:33:33:www-data:/home:/bin/false
把 shell 改为 /bin/sh
]]></description>
			<content:encoded><![CDATA[<p>安装：<br />
CentOS:<br />
yum install vsftpd</p>
<p>Debian:<br />
apt-get install vsftpd</p>
<p>配置：<br />
vi /etc/vsftpd.conf</p>
<p>禁止匿名用户登录：<br />
anonymous_enable=NO</p>
<p>允许系统用户登录：<br />
local_enable=YES</p>
<p>开启写权限：<br />
write_enable=YES</p>
<p>设置掩码：<br />
local_umask=022</p>
<p>如果觉得默认的空闲时间太短，可以设置的久一点：<br />
idle_session_timeout=3600<br />
data_connection_timeout=3600</p>
<p>把 ftp 用户限制在自己的主目录：<br />
chroot_local_user=YES</p>
<p>未指定用户 shell 会导致 "530 Login incorrect" 错误：<br />
vi /etc/passwd<br />
www-data:x:33:33:www-data:/home:/bin/false<br />
把 shell 改为 /bin/sh</p>
]]></content:encoded>
			<wfw:commentRss>http://bluedata.org/2009/08/13/vsftpd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

