用 Monit 监测 Linux 服务器

Monit 是一个用来监测系统状态的工具,不但可以用来监视进程、服务、文件、目录、文件系统,还可以在服务 down 掉的时候自动重启服务或者当某个进程占用过多的资源的时候自动停掉进程,并且支持 Email 报警功能、远程服务器监测、web 管理界面等,功能很多很强大。VPSee 用 monit 来监测多个 VPS 和独立服务器,如果某个 VPS down 了、某个服务器资源紧张,就能第一时间知道,而且某个服务停了的话可以自动重启服务。

安装 monit

在 CentOS 下安装和配置文件:

# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
# rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.i386.rpm

# yum install monit

# vi /etc/monit.conf

在 Debian 下安装和配置文件:

# apt-get install monit

# vi /etc/monit/monitrc

配置 monit


继续阅读 »

一个用来匹配 URL 的正则表达式

mastering regular expressions

很早就买了 Mastering Regular Expressions 这本书,可惜却从没认认真真看完过一遍,虽然平时会经常遇到、用到一些正则表达式,但是都是比较简单的表达式,容易理解,所以这本书就一直都躺在书架上当作工具书在用,没有动力读下去:),那些奇怪的符号确实很难记,看了几天不用就忘了。这里有个简单的正则表达式用来匹配基本的 URL:

^https?://[\d\-a-zA-Z]+(\.[\d\-a-zA-Z]+)*/?$

一点解释:

“a-z”:匹配所有小写字母字符
“A-Z”:匹配所有大写字母字符
“\d”:匹配1个十进制数字
“\D”:匹配1个非十进制数字

“?”:重复出现0次或者1次
“*”:重复出现0次或者多次
“+”:重复出现1次或者多次
“X{n}”:重复出现n次

“^”:从一行的开始匹配
“$”:从一行的结束开始匹配

匹配 Email 地址,匹配日期,匹配信用卡卡号,更多的正则表达式例子看这里:Regular-Expressions.info

SSH Login 太慢的问题

SSH 登录太慢可能是 DNS 解析的问题,默认配置下 sshd 初次接受 ssh 客户端连接的时候会自动反向解析客户端 IP 以得到 ssh 客户端的域名或主机名。如果这个时候 DNS 的反向解析不正确,sshd 就会等到 DNS 解析超时后才提供 ssh 连接,这样就造成连接时间过长、ssh 客户端等待的情况,一般为10-30秒左右。有个简单的解决办法就是在 sshd 的配置文件(sshd_config)里取消 sshd 的反向 DNS 解析。

# vi /etc/ssh/sshd_config
UseDNS no
# /etc/init.d/sshd restart

丢失 root 的默认 shell

今天犯了一个愚蠢的错误,修改 /etc/passwd 文件把 root 的默认 csh shell(/bin/csh)改成 bash shell(/bin/bash),退出后 root 就 su 不进去了,提示找不到 /bin/bash。

% su root
Password:
su: /bin/bash: No such file or directory

看了提示信息才回过神来,刚在 FreeBSD上 装的 bash shell 的路径是 /usr/local/bin/bash,不是 /bin/bash,我想当然的以为 FreeBSD 会把 bash 装到 /bin/bash。

在 Linux 下遇到这种问题可以这样解决,su 时指定一个 shell 登陆:

$ su --shell=/bin/sh -

或者

$ su -s /bin/sh

在 FreeBSD,Solaris,AIX,以及达到 C2 安全标准的 Unix 上面遇到这种问题就只能重装系统了,让 VPS 管理员重新 load 一个操作系统。或者如果管理员能 physical access 你的服务器的话,应该可以用 cdrom 启动你的系统后恢复,不过太麻烦了,还要给管理员 root 密码,没有重要数据丢失的话不如重新 load 一下。看看FreeBSD 对安全性的要求:

继续阅读 »

用 root 安全登录 VPS 的方法

VPS 好比一个 Internet 上的独立服务器,有 root 权限,有独立 IP,完全暴露在 Internet上,所以用 root 登录 VPS 操作时要特别注意安全问题,这年头无聊的人太多了,如果你对安全问题还有犹豫,抱有“我这个小站没人理”的想法,那么打开 /var/log/secure 看看有多少 IP 多少次企图登录你的服务器?

我刚开通的一个 VPS 还来不及用,过几天打开 /var/log/secure 一看,发现 n 个 IP 访问了 n 次。一个 IP 地址为 213.115.115.113 的机器1天内2600多次猜测用户名/密码企图登录。这是 log 文件片段:

Jun 28 13:49:23 blog sshd[3462]: Received disconnect from 213.115.115.113: 11: Bye Bye
Jun 28 13:49:24 blog sshd[3695]: Invalid user radu from 213.115.115.113
Jun 28 13:49:24 blog sshd[3703]: input_userauth_request: invalid user radu
Jun 28 13:49:24 blog sshd[3695]: pam_unix(sshd:auth): check pass; user unknown
Jun 28 13:49:24 blog sshd[3695]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=static-213-115-115-113.sme.bredbandsbolaget.se
Jun 28 13:49:26 blog sshd[3695]: Failed password for invalid user radu from 213.115.115.113 port 51310 ssh2
Jun 28 13:49:26 blog sshd[3703]: Received disconnect from 213.115.115.113: 11: Bye Bye
Jun 28 13:49:27 blog sshd[3910]: Invalid user raducu from 213.115.115.113
Jun 28 13:49:27 blog sshd[3921]: input_userauth_request: invalid user raducu
Jun 28 13:49:27 blog sshd[3910]: pam_unix(sshd:auth): check pass; user unknown
Jun 28 13:49:27 blog sshd[3910]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=static-213-115-115-113.sme.bredbandsbolaget.se
Jun 28 13:49:30 blog sshd[3910]: Failed password for invalid user raducu from 213.115.115.113 port 52740 ssh2
Jun 28 13:49:30 blog sshd[3921]: Received disconnect from 213.115.115.113: 11: Bye Bye
Jun 28 13:49:31 blog sshd[5280]: Invalid user raul from 213.115.115.113
Jun 28 13:49:31 blog sshd[5293]: input_userauth_request: invalid user raul
Jun 28 13:49:31 blog sshd[5280]: pam_unix(sshd:auth): check pass; user unknown
Jun 28 13:49:31 blog sshd[5280]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=static-213-115-115-113.sme.bredbandsbolaget.se
Jun 28 13:49:33 blog sshd[5280]: Failed password for invalid user raul from 213.115.115.113 port 54742 ssh2
Jun 28 13:49:34 blog sshd[5293]: Received disconnect from 213.115.115.113: 11: Bye Bye
Jun 28 13:49:35 blog sshd[5540]: Invalid user robert from 213.115.115.113
Jun 28 13:49:35 blog sshd[5570]: input_userauth_request: invalid user robert
Jun 28 13:49:35 blog sshd[5540]: pam_unix(sshd:auth): check pass; user unknown
Jun 28 13:49:35 blog sshd[5540]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=static-213-115-115-113.sme.bredbandsbolaget.se
Jun 28 13:49:37 blog sshd[5540]: Failed password for invalid user robert from 213.115.115.113 port 56483 ssh2

所以安全问题不可小觑。有2种方式可以增加 root 登录 VPS 时的安全性,这2种方式绑在一起用最好,如果怕麻烦的话至少要用其中的1种。

禁止 root 直接登录 sshd


继续阅读 »

Nginx 上配置 WordPress Mu 的重写规则

wordpressmu

WordPress Mu 可以看作是一款多用户版的 WordPress,可以方便架设自己的 BSP,像 blogbus.com,yo2.cn 做的那样。 后台和 WP 差不多,多了一个 Site Admin 用来管理整个 blog, 其他部分和独立的 WP 大同小异。最方便的是 WPMU 和 WP 的部分插件和主题可以通用,基于 WP 丰富的主题和插件,可以很好的应用到 WPMU 上。这样,节约了重新定制主题和寻找插件的时间和资源。

首先需要安装和配置好 Nginx+PHP5+Mysql+FastCGI,然后从官方网站下载 WPMU,安装完毕后打开 nginx.conf,配置 Nginx 以支持 WordPress MU 的 rewrite rules。注意:需要把下面的 vpsee.com 和路径换成你自己的域名和路径;如果不用 WP SuperCache 插件可以把相关部分注释掉。

继续阅读 »

FreeBSD 上安装配置 Nginx+PHP+FastCGI+MySQL

freebsd

在 VPS 里很少看见 FreeBSD 的踪影,主要原因是因为两大开源虚拟系统 Xen 和 OpenVZ 对 FreeBSD 都不是那么友好:(,OpenVZ 不能支持非 Linux 内核的操作系统,Xen 对 FreeBSD 的支持不太好(也可以说FreeBSD 对 Xen 的支持不好)。最近 VPSee 从 Advantagecom 订了一个 256MB 的 Xen VPS,想在上面试试 FreeBSD 先,Advantagecom 不提供换操作系统的面板,每次都要提交 ticket 换系统好麻烦,而且一个月只能换一次系统。VPSee 打算先用一个月的 FreeBSD,然后再换成 Linux。就目前 VPS 的状况来说,VPSee 还是推荐使用 Linux,对于 VDS 或者自己的服务器来说,Linux 和 FreeBSD 都是很棒的操作系统。

安装所需软件

FreeBSD上 有2种安装软件的方法:一种是二进制安装;另一种是源代码安装(Ports collection)。

二进制安装所需软件:

# /usr/sbin/pkg_add -r -v mysql51-server
# /usr/sbin/pkg_add -r -v nginx
# /usr/sbin/pkg_add -r -v php5
# /usr/sbin/pkg_add -r -v php5-mysql
# /usr/sbin/pkg_add -r -v lighttpd

源代码安装所需软件:

# cd /usr/ports/databases/mysql51-server
# make install clean

# cd /usr/ports/lang/php5
# make install clean

# cd /usr/ports/lang/php5-extensions
# make config
# make install clean

# cd /usr/ports/databases/php5-mysql
# make install clean

# cd /usr/ports/www/lighttpd
# make install clean

实际上我们只需要 lighttpd 里面的 spawn-fcgi,所以先把 spawn-fcgi 拷出来再删除 lighttpd。

# cp /usr/local/bin/spawn-fcgi /root/
# /usr/sbin/pkg_delete -v lighttpd-1.4.22
# cp /root/spawn-fcgi /usr/local/bin/spawn-fcgi

配置 MySQL

# cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf
# chown -R mysql:mysql /var/db/mysql
# /usr/local/bin/mysqld_safe &
# /usr/local/bin/mysqladmin -u root password ‘newpass’

配置 PHP

# cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini

配置 FastCGI

启动 PHP FastCGI:

# /usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www -g www -f /usr/local/bin/php-cgi

-a 127.0.0.1 : PHP FastCGI 绑定IP地址
-p 9000: PHP FastCGI 指定端口
-u www : PHP FastCGI 用户名
-g www : PHP FastCGI 用户组
-f /usr/local/bin/php-cgi : 指向 PHP5 fastcgi

检查 FastCGI 是否启动:

# sockstat -4 | grep 9000
www      php-cgi    33475 0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    33474 0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    33473 0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    33472 0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    33471 0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    33470 0  tcp4   127.0.0.1:9000        *:*

如果不想每次重启 FreeBSD 都打一边上面的命令的话,把下面 PHP FastCGI 启动/自动代码保存到 FreeBSD 的启动目录(/usr/local/etc/rc.d/phpfcgi)里:

#!/bin/sh
# NGINX FastCGI php5 startup shell script
# Feedback 
# http://bash.cyberciti.biz/web-server/fastcgi-php-server-start-stop-script/
# Set ME #
PROVIDES=php-cgi
LIGHTTPD_FCGI=/usr/local/bin/spawn-fcgi
SERVER_IP=127.0.0.1
SERVER_PORT=9000
SERVER_USER=www
SERVER_GROUP=www
PHP_CGI=/usr/local/bin/php-cgi
PGREP=/bin/pgrep
KILLALL=/usr/bin/killall
### No editing below ####
cmd=$1
 
pcgi_start(){
  	echo "Starting $PROVIDES..."
 	$LIGHTTPD_FCGI -a $SERVER_IP -p $SERVER_PORT -u $SERVER_USER -g 
$SERVER_GROUP -f $PHP_CGI
}
 
pcgi_stop(){
	echo "Killing $PROVIDES..."
	$KILLALL $PROVIDES
}
 
pcgi_restart(){
	pcgi_stop
	pcgi_start
}
 
pcgi_status(){
        $PGREP $PROVIDES > /dev/null
	[ $? -eq 0  ] && echo "$PROVIDES running" || echo "$PROVIDES NOT 
running" 
 
}
 
pcgi_help(){
  	echo "Usage: $0 {start|stop|restart|status}"
}
 
case ${cmd} in
[Ss][Tt][Aa][Rr][Tt]) pcgi_start;;
[Ss][Tt][Oo][Pp]) pcgi_stop;;
[Rr][Ee][Ss][Tt][Aa][Rr][Tt]) pcgi_restart;;
[Ss][Tt][Aa][Tt][Uu][Ss]) pcgi_status ;;
*)      pcgi_help ;;
esac

注意要改成可执行文件:

# chmod +x /usr/local/etc/rc.d/phpfcgi

现在可以用 shell 脚本启动并查看 PHP FastCGI了:

# /usr/local/etc/rc.d/phpfcgi start
# sockstat -4 | less

配置 Nginx

打开 nginx.conf 配置 Nginx:

# vi /usr/local/etc/nginx/nginx.conf

user  www;

 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /www/vpsee$fastcgi_script_name;
            include        fastcgi_params;
        }

启动 Nginx:

# /usr/local/etc/rc.d/nginx start

如果启动不了,打开 /etc/rc.conf,加入

# vi /etc/rc.conf
nginx_enable="YES"

# /usr/local/etc/rc.d/nginx restart

测试

用文本写个 php 文件,用 phpinfo() 测试一下 PHP 是否可以运行。

Unix 家谱

Unix的 历史很繁杂,如果不跳出来看森林的话,会被一堆单词 Unix/HP-UX/AIX/BSD/Minix/SunOS/Solaris 迷惑,了解一点 Unix 的历史对整个计算机行业和历史会有帮助。简单的说 Unix 才是计算机/互联网技术行业的基石。从老牌的 IBM/SUN/HP/Oracle/Cisco/Apple 到 Google/Yahoo/YouTube/Digg/Flickr/Amazon/PayPal/Facebook 等后来者,要不就是其产品和 Unix 相关,如:IBM/SUN/HP 卖操作系统和服务器,Oracle 卖 Unix 数据库,Cisco 的路由器多少也和某个 Unix 分支有关连,Apple 的 MacOS X 是基于 FreeBSD 的(内核是 Mach)。Google/Yahoo 等就不用说了,整个公司的平台都是建立在 Linux/FreeBSD 上的。

这张 Unix 家谱图详细的列出了 Unix 各分支的发展和演变。(图片来自 Wikimedia,点击可以放大)

unix history

如何查看 OpenVZ 的内存状态?

openvz

有了 VPS 以后第一件事情就是登录上去看看软硬件配置信息,操作系统版本,CPU,内存等。在 Xen 下看内存使用和在 OpenVZ 下有点不同,主要是因为它们使用的虚拟技术不同。在 Xen 的 VPS 可以用 free 得到 mem,swap,buffer 等有用信息,就和在独立机器上一样。如下面所示:

$ free
             total       used       free     shared    buffers     cached
Mem:         65704      57628       8076          0       3016      17664
-/+ buffers/cache:      36948      28756
Swap:       131064      43464      87600

不过如果是 OpenVZ VPS 主机的话,free 给出的信息不是很有用,如下面 swap,buffer,cached 显示是0:

# free
             total       used       free     shared    buffers     cached
Mem:        364544     247764     116780          0          0          0
-/+ buffers/cache:     247764     116780
Swap:            0          0          0

/proc/user_beancounters

这个时候需要查看 /proc/user_beancounters 以获得更多信息。user_beancounters 包括了 OpenVZ VPS 的系统资源分配和使用信息。下面列出我的一个 228M VPS 主机上的 user_beancounters:

继续阅读 »

yum update 升级报错解决办法

今天在一个 CentOS VPS 上升级系统时遇到一个问题,yum 报错:

# yum update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in ?
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 229, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 104, in main
    result, resultmsgs = base.doCommands()
  File "/usr/share/yum-cli/cli.py", line 339, in doCommands
    self._getTs(needTsRemove)
  File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 101, in _getTs
    self._getTsInfo(remove_only)
  File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 112, in _getTsInfo
    pkgSack = self.pkgSack
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 591, in 
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 434, in _getSacks
    self.repos.populateSack(which=repos)
  File "/usr/lib/python2.4/site-packages/yum/repos.py", line 223, in populateSack
    self.doSetup()
  File "/usr/lib/python2.4/site-packages/yum/repos.py", line 71, in doSetup
    self.ayum.plugins.run('postreposetup')
  File "/usr/lib/python2.4/site-packages/yum/plugins.py", line 176, in run
    func(conduitcls(self, self.base, conf, **kwargs))
  File "/usr/lib/yum-plugins/fastestmirror.py", line 181, in postreposetup_hook
    all_urls = FastestMirror(all_urls).get_mirrorlist()
  File "/usr/lib/yum-plugins/fastestmirror.py", line 333, in get_mirrorlist
    self._poll_mirrors()
  File "/usr/lib/yum-plugins/fastestmirror.py", line 376, in _poll_mirrors
    pollThread.start()
  File "/usr/lib/python2.4/threading.py", line 416, in start
    _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

yum 在启动 fastestmirror 插件时出错,是 yum 的一个 bug(http://yum.baseurl.org/ticket/70)。如果停掉 mysqld,yum 一切工作正常。临时解决办法是 yum update 时禁止启动 fastestmirror 插件。

yum --disableplugin=fastestmirror update