项目中需要构建一个图片裁切服务, 使用 thumbor + openresty 进行构建, 之前使用 ubuntu 构建的时候一切都挺顺利的,这次使用的是 centos, 遇到一些问题。

最主要的问题是 openresty 嵌入的 lua 脚本需要用到 magick 库,而这个库官方没有说明如何在 centos 下进行安装, 后台一番折腾终于搞定,具体的过程如下:

安装 imageMagick 库环境(重点)

官方在说明中提到, imageMagick 库依赖 luaJit 和 imageMagick 库 或者 GraphicsMagick 库,因为要使用 wand 接口,所以需要安装 devel 包。

yum install ImageMagick ImageMagick-devel  # imagemagick c 库
yum install GraphicsMagick-devel           # GraphicsMagick c 库

yum install luarocks
luarocks install magick
ln -sf luajit-2.1.0-beta2 /usr/local/bin/luajit

建立类库连接

关键的问题在这里, 通过 luarocks 安装好 magick 类库后, openresty 目录下的 luaJit 无法找到这个包, leafo 专门写了一篇文章将这个事情: http://leafo.net/guides/customizing-the-luarocks-tree.html, 参考这篇文章,我为openresy 做了两个软连接。

首先,找一下这两个库:

find / -name "magick.so"  # magick c 库
find / -name "magick.lua" # magick lua module

其次,建立软连接:(我是根据 nginx 的报错信息, 知道 openresty 的默认类库加载路径的)

cd /opt/verynginx/openresty/luajit/share/lua/5.1
ln -s /usr/share/lua/5.1/magick  
cd /opt/verynginx/openresty/lualib
ln -s /usr/lib64/ImageMagick-6.7.2/modules-Q16/coders/magick.so 

openresty 目前使用 opm 安装组件, 很可惜 magick 这个库并不在其中。

参考

之前一直是使用 ubuntu 来安装 thumbor 服务, 非常简单,可是最近要在一台 centos6.5 上部署这个服务,还是遇到一些问题,这里介绍一下流程。

升级 python2.6 to python 2.7

centos6.5 默认的 python 是 2.6 的, 首先需要升级一下 python

yum -y update
yum install centos-release-SCL 
yum install python27

为 shell 环境设定默认的 python, 我这里的 shell 环境是 zsh 如果你的是 bash 需要将 zsh 改成 bash。

scl enable python27 zsh

安装 pip

wget https://bootstrap.pypa.io/get-pip.py
sudo python27 get-pip.py

安装基础类库

在安装 thumbor 之前, 需要安装以下类库,否则会报错:

yum install python-pycurl python-devel libcurl-devel

安装 thumbor

pip install thumbor

配置 thumbor

LOADER = 'thumbor.loaders.file_loader'
STORAGE = 'thumbor.storages.file_storage'

FILE_LOADER_ROOT_PATH = '/data/www/cwzg.cn/upoload'
FILE_STORAGE_ROOT_PATH = '/data/thumbor/storage'

运行 thumbor 服务

thumbor -p 8888 -c /etc/thumbor/thumbor.conf

好了,到此为止,安装已经完成,如果需要开启多进程,还需要安装 supervisord 这里就不做赘述了。

安装依赖

apt-get install tcl make

下载安装

去 redis.io 最新版本的 redis 版本进行下载.

cd /usr/local/src
wget http://download.redis.io/releases/redis-3.2.2.tar.gz
tar -zxvf redis-3.2.2.tar.gz
cd redis-3.2.2/src
make
make test
make install

设置目录

将四个可执行文件redis-server、redis-benchmark、redis-cli和redis.conf 分别拷贝到/usr/redis下,和/etc下

mkdir -p /usr/redis/
cd /usr/local/src/redis-3.2.2/src
cp redis-server  /usr/redis
cp redis-benchmark /usr/redis
cp redis-cli  /usr/redis
cd ../
cp redis.conf  /etc

设置 service 脚本

touch /etc/init.d/redis
chmod u+x /etc/init.d/redis
vi init.d/redis

// cp content into it

#!/bin/bash
# chkconfig: 2345 10 90
# description: Start and Stop redis

REDISPORT=6379 
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
EXEC=/usr/redis/redis-server 
REDIS_CLI=/usr/redis/redis-cli 
 
PIDFILE=/var/run/redis.pid
CONF="/usr/redis/redis.conf" #ʵ¼ʻ·¾³¶ø
case "$1" in
        start)
                if [ -f $PIDFILE ]
                then
                        echo "$PIDFILE exists, process is already running or crashed."
                else
                        echo "Starting Redis server..."
                        $EXEC $CONF
                fi
                if [ "$?"="0" ]
                then
                        echo "Redis is running..."
                fi
                ;;
        stop)
                if [ ! -f $PIDFILE ]
                then
                        echo "$PIDFILE exists, process is not running."
                else
                        PID=$(cat $PIDFILE)
                        echo "Stopping..."
                        $REDIS_CLI -p $REDISPORT SHUTDOWN
                        while [ -x $PIDFILE ]
                        do
                                echo "Waiting for Redis to shutdown..."
                                sleep 1
                        done
                        echo "Redis stopped"
                fi
                ;;
        restart|force-reload)
                ${0} stop
                ${0} start
                ;;
        *)
                echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
                exit 1
esac
sysv-rc-conf redis on

取消warning

修改 sysctl.conf

echo 511 > /proc/sys/net/core/somaxconn
echo vm.overcommit_memory = 1 >> /etc/sysctl.conf
/sbin/sysctl -e -p /etc/sysctl.conf

设置文件打开数目

vi  /lib/systemd/system/redis-server.service

在 [serveice] 组中增加

LimitNOFILE=65536

然后,运行:

systemctl daemon-reload
systemctl restart redis-server
systemctl enable redis-server

配置 redis

vi /etc/redis.conf

daemonize yes
requirepass foobar
bind 127.0.0.1
unixsocket /tmp/redis.sock
dir /data/redis/
pidfile /var/run/redis.pid

iptables

// 根据情况开放 iptables 端口

iptables -p tcp -m tcp --dport 6379 -j ACCEPT

resource

原理非常简单:

在本地生成公钥私钥

ssh-keygen

输入命令后,一路回车,即可。

将本地的公钥传到服务器上

ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host

会提示你输入密码,成功之后,会帮助你把公钥放在服务器上,供登录使用。

把本地的私钥转为 pem 格式,供windows上的 ssh 客户端使用

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
chmod 700 id_rsa.pem

这样就导出了pem格式的私钥,因为公钥已经在服务器了,所以只要服务器上的公钥不删除,用这把私钥就能登录服务器,一般来说,经过这样设置之后,可以把ssh 密码登录的方式禁用掉,使得服务器更加安全。

关闭 ssh 密码登录

vi /etc/ssh/sshd_config

修改

PasswordAuthentication no

重启 ssh 服务

service sshd restart

over!