since.2006  

这几天打开另一个网站频繁出现500错误,上VPS看nginx日志,错误主要有“No space left on device”和“24: Too many open files”。

现学现卖一个一个问题的解决:
No space left on device
看起来像是没有剩余空间了
  1. 执行“df -m”后,发现可用空间为0%
  2. 使用“du -sh /*”可以查看指定目录下哪个文件占用空间最大
  3. 一路追踪下去“du -sh /srv/www/*”发现nginx log文件占用了20多G。
  4. “tail -n 30 error.log”看下log最近到底报的是什么错,结果全是“24: Too many open files”

再来解决:
24: Too many open files
Linux系统对一个进程打开的文件句柄数量的限制,默认只有1024,并发高一点就达到这个限制了。

  1. “ulimit -a”可以看到当前的设置open files (-n) 1024
  2. 编辑“/etc/security/limits.conf”,在末尾加入“* soft nofile 65535”和“* hard nofile 65535”
  3. 编辑“/etc/nginx/nginx.conf”文件,加入“worker_rlimit_nofile 65535;”

搞定,重启nginx,观察几天看看。

 

Posted by hee at 10:12 AM | Permalink | 评论(0)

有时出于安全考虑,可以添加一个SSH登录提醒功能,当用户登录SSH后收到提醒。

提醒功能可以通过邮件或其它功能发送,俺使用的是一个iOS使用“推送信使”提供了URL回调接口,设置好参数后用curl请求一下,一条报警信息就推送到手机。

user=$USER
ip=${SSH_CLIENT%% *}
date=$(date "+%Y-%m-%d_%H:%M")
title="用户$user登录了系统"
content="时间:${date}%0dIP地址:$ip"
app="SSH监控"
url="http://whois.pconline.com.cn/ip.jsp?ip=$ip"

pushMessage() {       
        params="uid=1&secret=6Y2FN7&app=$app&title=$title&content=$content&slient=1&url=$url"
        url="http://ipush.me/api-push?$params"
        curl --connect-timeout 3 -m 3 -s $url
}

pushMessage

 

Posted by hee at 11:12 AM | Permalink | 评论(0)

现在大部分VPS都是Unmanaged的,虽然都宣称做了RAID10但在论坛上偶尔还是有看到数据丢失的事情,更多的情况是碰到不符合VPS商的服务条款而被关闭了帐号没及时备份造成的。

正好有一个15刀/年的VPS,由于拿来放网站线路经常抽风所以一直空在那里,现在可以派上用场了。

首先确保正式服务器上安装了lftp(ftp命令行客户端),备份服务器上安装了ftp服务端(任意)。

第一次折腾bash,现学现卖,功能是备份mysql中一个或多个数据库并打包传送到远程ftp服务器中去:

#!/bin/bash

# --------------- 配置项 -------------
# 数据库用户
DB_USER="root"
# 数据库密码
DB_PASSWD="123456"
# 要备份的数据库名,多个用空格分开
DB_BACKUP_DATABASE_LIST="db1 db2"
# 备份文件本地存放路径
DB_BACKUP_DIR="/home/hee/backup/db"
# 远程FTP配置信息,格式:用户名:密码@服务器地址
REMOTE_FTP_DSN="user:passwd@ip"

# ------------ 以下内容无需编辑 -------------
YYYYMMDD=$(date +%Y-%m-%d)

# -----------------------------------
DB_BACKUP_FILE="$DB_BACKUP_DIR/$YYYYMMDD.sql.gz"

# -----------------------------------
mkdir -p $DB_BACKUP_DIR
cd $DB_BACKUP_DIR

mysqldump --user=$DB_USER --password=$DB_PASSWD --lock-all-tables --databases $DB_BACKUP_DATABASE_LIST | gzip > $DB_BACKUP_FILE

lftp $REMOTE_FTP_DSN -e "put $DB_BACKUP_FILE;exit;"

然后设置一个定时任务,按想要的时间定时执行一下就OK了。

vi /etc/crontab

01 13 * * * elliott /home/username/bak.sh

每天中午1点1分执行备份操作。


Posted by hee at 09:11 AM | Permalink | 评论(1)

eAccelerator是一个免费开源的PHP加速、优化、编译和动态缓存的项目,它可以通过缓存PHP代码编译后的结果来提高PHP脚本的性能,使得一向很复杂和离我们很远的PHP脚本编译问题完全得到解决。通过使用eAccelerator,可以优化你的PHP代码执行速度,降低服务器负载,可以提高PHP应用执行速度最高达10倍。

eAccelerator通过把经过编译后的PHP代码缓存到共享内存中,并在用户访问的时候直接调用从而起到高效的加速作用。它的效率非常高,从创建共享内存到查找编译后的代码都在非常短的时间内完成,对于不能缓存到共享内存中的文件和代码,eAccelerator还可以把他们缓存到系统磁盘上。

参照linode安装指南上的方法,默认是没有安装eAccelerator的,得自己把这功能加上。安装前先了解下另一个东东:phpize。

phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块。比如你想在原来编译好的php中加入eAccelerator或者memcached等扩展模块,可以使用phpize。

基础知识了解完了后,开始安装:

# 安装phpize
yum install php-devel
# 下载eaccelerator
wget http://soft.vpser.net/web/eaccelerator/eaccelerator-0.9.6.1.zip
unzip eaccelerator-0.9.6.1.zip
cd eaccelerator-0.9.6.1
phpize
./configure --enable-eaccelerator=shared --with-php-config=/usr/bin/php-config
make
make install

如果在make时出现:error: "zend_property_info" has no member named "ce" 错误,做如下修改:

vi ea_store.c
#用//注释掉683行return (child_info->ce != from)
#然后重新make 和 make install

编辑php.ini:

vi /etc/php.ini

# 在结尾加入
zend_extension="/usr/lib/php/modules/eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

创建eAccelerator缓存目录:

mkdir /tmp/eaccelerator
chmod 0777 /tmp/eaccelerator

重启php-fastcgi:/etc/init.d/php-fastcgi restart

查看一下phpinfo吧 :-)

 

Posted by hee at 20:11 PM | Permalink | 评论(0)

记忆力越来越差了。偶尔维护使用一下,过几天就忘了。

显示系统进程资源占用状况

[hee@TokyoHot ~]$ top
# M键:按内存使用大小排序(从大到小)
# 1键:显示每个具体CPU核心使用率情况

各VPS间通过SSH互相复制文件(无需FTP、WEB服务器)

# 获取远程服务器上的文件,-P为远程服务器ssh端口
scp -P 22 root@vps.since2006.com:/root/backup.tar.gz /home/backup.tar.gz

# 获取远程服务器上的目录
scp -P 22 -r root@vps.since2006.com:/root/backups/ /home/backups/

vi 跳到文件起始和结尾处

# 跳到文件起始处
[[

# 跳到文件结尾处
]]

vi 中查找字符串

# 向下查找pattern匹配字符串
/pattern
# 向上查找pattern匹配字符串
?pattern

# 使用了查找命令之后,可以使用:
# 按照同一方向继续查找
n
# 按照反方向查找
N

vi中字符串替换功能

# 使用:s命令进行查找替换

# 例1:将内容中第一次出现的abc替换成123
:%s/abc/123

# 例1:将内容中所有abc替换成123
:%s/abc/123/g

批量更改目录下文件所属组及文件权限

# 更改目录及目录下所有文件所属用户组
chgrp -R groupName directoryName

# 更改目录及目录下所有文件组用户权限可写
chmod -R g+w directoryName

 

Posted by hee at 21:11 PM | Permalink | 评论(0)

折腾了N天,结果发现是测试网络环境下是禁用PPTP VPN的,在家试了下完全没问题。

没有使用网上的一键安装包,一键安装包中大多有重复安装过一些不必要的装的组件,如MPPE。

Kernel version 2.6.15 or above has MPPE built-in which is required for MSCHAPv2.


1、确定内核是否支持MPPE:

modprobe ppp-compress-18 && echo ok

如果显示“ok”表明内核已经具备了mppe支持。

2、然后检查PPP是否支持MPPE:

strings '/usr/sbin/pppd' |grep -i mppe | wc –l

如果以上命令输出为“0”则表示不支持;输出为“30”或更大的数字就表示支持。

3、安装iptables

yum install iptables

4、安装pptp:

# 32位系统使用
rpm -ivh http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.3.4-2.rhel5.i386.rpm

# 64位系统使用
rpm -ivh http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.3.4-2.rhel5.x86_64.rpm

5、配置pptp:

vi /etc/pptpd.conf
去掉下面代码前的#号:
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245

6、编辑options.pptpd

vi /etc/ppp/options.pptpd

去掉ms-dns前面的#,并修改成如下字段:

ms-dns 8.8.8.8
ms-dns 8.8.4.4

7、创建vpn帐号

vi /etc/ppp/chap-secrets

内容分别为:用户名 pptpd 密码 IP范围

kaede pptpd 123456 *
8、修改内核设置,使其支持转发
vi /etc/sysctl.conf
将文本中的相似内容替换为:
net.ipv4.ip_forward=1
#net.ipv4.tcp_syncookies=1
9、保存退出,并执行下面的命令来生效:
sysctl -p
10、添加iptables转发规则:
# xen 适用
# kvm 适用
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

11、保存重启:

# 保存iptables规则
/etc/init.d/iptables save

# 重启iptables
/etc/init.d/iptables restart

# 重启pptp服务
/etc/init.d/pptpd restart

# 设置开机自动运行服务
chkconfig pptpd on
chkconfig iptables on
12、测试 :-)
Posted by hee at 21:11 PM | Permalink | 评论(0)