关于 九月, 2013 的文章

坑爹的nextgen-gallery插件导致MySQL binlog暴涨

我的Blog在优化过后,一直运行良好,速度也很快。可是从昨天开始突然就变得很卡,登陆到服务器上一看,我擦,磁盘空间占用率100%。仔细一看MySQL binlog占据了绝大部分空间,增长速度迅猛,每10分钟500M的节奏。

fuckedbyng1

这肯定不正常啊,我去。我平均每个月才更新1-3文章。而且前来评论的人也不多,就算是Spam也不会有这么大的量啊。为了找出到底是什么SQL的干活,我停掉了Nginx,然后登陆到mysql中,选定一个binlog文件,执行"mysql -uroot -p -e 'show binlog events in 'binlog.000041' limit 10;' > /tmp/fuckedbyng.log",然后就看到了不断重复的那个坑爹的SQL。

fuckedbyng2

通过这个SQL中的相关内容,Google到了问题的原因,那就是坑爹的刚刚更新过的nextgen-gellery插件的一个Bug。
http://wordpress.org/support/topic/a-warning-ngg_delete_expired_transients-cronjob

fuckedbyng3

在上面的论坛中,有人给出了解决方案,就是注释掉一部分更新后产生的新的相关代码。
因为我已经被激怒了,所以我首先按照以上方法修正了这个bug,再重新启动了我的Nginx,接着直接删除了这个坑爹的插件。其实我本身也不太用得上这个相册插件,呵呵。

, ,

2 Comments

Ansible实战之 自动安装部署MooseFS 以及 与Salt的相关比较

前段时间,了解并学习了Salt,感觉非常不错,于是有了想法和打算要替换掉线上的Puppet。
可是最近情况不妙,一名新加入的同事,极力推荐Ansible,并列举了很多Ansible比Salt优越的地方。当时我对Ansible还不了解,因此不能与其争论,到底谁好谁坏也无法做出判断。
于是,我就选择了之前在Salt上实现过的同一个案例 “自动安装部署MooseFS”,来将它用Ansible实现一遍。在经历了一段时间的学习和填坑的过程之后,终于完成了,同时也有了一些心得。

我参考的是官方文档,从 Getting Started 开始,接着重点参考了 ModulesPractices ,以及 官方的Hadoop示例

我的相关Ansible代码都放在了GitHub上,具体结构如下:
$ tree

.
|-- group_vars
|   |-- all
|   `-- moosefs_all
|-- moosefs.hosts
|-- moosefs.yml
|-- roles
|   |-- common
|   |   `-- tasks
|   |       `-- main.yml
|   |-- moosefs_chunkserver
|   |   |-- handlers
|   |   |   `-- main.yml
|   |   |-- tasks
|   |   |   `-- main.yml
|   |   `-- templates
|   |       |-- mfschunkserver.cfg.j2
|   |       `-- mfshdd.cfg.j2
|   |-- moosefs_client
|   |   `-- tasks
|   |       `-- main.yml
|   |-- moosefs_common
|   |   `-- tasks
|   |       `-- main.yml
|   |-- moosefs_master
|   |   |-- files
|   |   |   `-- index.html
|   |   |-- handlers
|   |   |   `-- main.yml
|   |   |-- tasks
|   |   |   `-- main.yml
|   |   `-- templates
|   |       |-- httpd.conf.j2
|   |       |-- mfsexports.cfg.j2
|   |       |-- mfsmaster.cfg.j2
|   |       `-- mfsmetalogger.cfg.j2
|   `-- moosefs_metalogger
|       |-- handlers
|       |   `-- main.yml
|       |-- tasks
|       |   `-- main.yml
|       `-- templates
|           `-- mfsmetalogger.cfg.j2
`-- site.yml

阅读全文 »

,

5 Comments

SFTP配置与用户管理脚本分享[原创]

公司需要建立一个FTP来管理客户的文件上传,为了安全性我们打算采用SFTP,并要求每个客户通过SSHKEY登陆。
或许你会说:“SFTP不需要配置啊,有SSH直接就可以用了”。的确,但是我们不希望用户能够通过SSH登陆到我们的服务器上,我们希望每个客户只能通过SFTP来管理自己的文件,同时我们还想统一的来管理所有客户的目录。有了这样的需求,默认的SSH配置就不能满足了。

下面,是SFTP的配置步骤,以及我编写的一个用户管理脚本:
1.修改SFTP相关配置
$ sudo vim /etc/ssh/sshd_config

# override default of no subsystems
#Subsystem	sftp	/usr/libexec/openssh/sftp-server
Subsystem	sftp	internal-sftp

Match Group sftpusers
        ChrootDirectory /home/sftp/%u
        ForceCommand internal-sftp

$ sudo /etc/init.d/sshd restart

2.创建用户管理脚本
$ sudo vim sftpusers.sh

#!/bin/bash
#
# Manage sftp users for customers
#  
# Author: Dong Guo
# Last Modified: 2013/09/06 by Dong Guo

userfile=/etc/passwd
groupfile=/etc/group
homedir=/home/sftp
loginshell=/sbin/nologin
groupname=sftpusers
username=$2

function check_root()
{
  if [ $EUID -ne 0 ]; then
    echo "This script must be run as root" 1>&2
    exit 1
  fi
}

function print_help(){
  #Print help messages then exit
  echo "Usage: $0 {create|disable|enable|passwd|sshkey|delete} {username}" >&2
  exit 1
}

function check_usergroup(){
  #Create usergroup if NOT exist
  cut -d : -f 1 $groupfile | grep -wq $groupname
  if [ $? -ne 0 ];then
    groupadd $groupname
  fi
}

function check_homedir(){
  #Create homedir if NOT exist
  if [ ! -d "$homedir" ];then
    mkdir $homedir
  fi
}

function check_username_exist(){
  #Check if user already exist
  cut -d : -f 1 $userfile | grep -wq $username
  if [ $? -eq 0 ];then
    echo "User $username ALREADY exist." && exit
  fi
}

function check_username_notexist() {
  #Check if user not exist
  cut -d : -f 1 $userfile | grep -wq $username
  if [ $? -ne 0 ];then
    echo "User $username NOT exist." && exit
  fi
}

function check_user_disabled(){
  #Check if user ALREADY disabled
  lockfile=$homedir/$username/sftpuser.locked
  if [ -a "$lockfile" ]; then
    echo "User $username ALREADY disabled." && exit
  fi
}

function update_sshkey(){
  #Get the sshkey
  echo -n "Input ssh public key: "
  read sshkey
  #Check if sshkey is empty
  if [ -z "$sshkey" ];then
    echo "Empty ssh public key." && exit
  fi
  #Check if sshkey not correct
  echo $sshkey | grep -Ewq '^ssh-rsa|^ssh-dss'
  if [ $? -ne 0 ];then
    echo "String \"ssh-rsa\" or \"ssh-dss\" NOT found." && exit
  fi
  mkdir $homedir/$username/.ssh
  chmod 700 $homedir/$username/.ssh
  echo "$sshkey" > $homedir/$username/.ssh/authorized_keys
  chmod 600 $homedir/$username/.ssh/authorized_keys
  chown -R $username:$groupname $homedir/$username/.ssh
}


if [ $# != 2 ];then
  print_help
fi

check_root
check_usergroup
check_homedir

case "$1" in
  'create')
    check_username_exist
    useradd -m -d "$homedir/$username" -g $groupname -s $loginshell -c "$username sftp" $username
    chmod 755 $homedir/$username
    chown $username:$groupname $homedir/$username
    if [ $? -eq 0 ]; then
      echo "User $username was created."
    fi
    ;;
   
  'disable')
    check_username_notexist
    passwd -l $username
    touch $homedir/$username/sftpuser.locked
    authfile=$homedir/$username/.ssh/authorized_keys
    if [ -a "$authfile" ]; then
      mv $authfile $authfile.disabled
    fi
    if [ $? -eq 0 ]; then
      echo "User $username was disabled."
    fi
    ;;
  
  'enable')
    check_username_notexist
    passwd -u $username
    rm -f $homedir/$username/sftpuser.locked
    authfile=$homedir/$username/.ssh/authorized_keys
    if [ -a "$authfile.disabled" ]; then
      mv $authfile.disabled $authfile
    fi
    if [ $? -eq 0 ]; then
      echo "User $username was enabled."
    fi
    ;;
   
  'delete')
    check_username_notexist
    echo -n "Delete all the data and account of user $username? [yes|no] "
    read yesorno
    if [ "$yesorno" == "yes" ];then
      userdel -rf $username
      if [ $? -eq 0 ]; then
        echo "User $username was deleted."
      fi
    fi
    ;;

  'passwd')
    check_username_notexist
    check_user_disabled
    passwd $username
    ;;
   
  'sshkey')
    check_username_notexist
    check_user_disabled
    update_sshkey
    if [ $? -eq 0 ]; then
      echo "The sshkey of user $username was updated."
    fi
    ;;
       
  *)
    print_help
    ;;
esac

$ sudo chmod +x sftpusers.sh

3.创建SFTP用户并测试
$ ./sftpusers.sh

Usage: ./sftpusers.sh {create|disable|enable|passwd|sshkey|delete} {username}

阅读全文 »

2 Comments