为CentOS升级OpenSSL 让Nginx支持TLS 1.2

最近在调试微信小程序时,发现wx.request请求总是无法正确获取服务器端的数据,经过检查发现是因为服务器端https不支持微信要求的TLS 1.2版本。

登录到服务器上,用openssl version -a命令查询,发现版本是0.9.8e,查阅文档得知OpenSSL从1.0.1开始才支持TLS 1.2,那么我们就来对OpenSSL进行个升级。

准备工作:
1.下载新版OpenSSL源码包https://www.openssl.org/source/openssl-1.0.1u.tar.gz
2.开启主机的telnet,以防升级过程中遇到问题,可通过telnet补救。

阅读更多

在CentOS 5.x中部署LVS-DR模式

LVS是Linux Virtual Server的简写,即Linux虚拟服务器,是一个虚拟的服务器集群系统。

在下面的案例中,我们用了3台主机,IP地址分别为:

192.168.1.100
192.168.1.101
192.168.1.102

其中,192.168.1.100将安装LVS做为负载均衡器来分发请求,另外2台做为真实提供服务的主机,以DR模式进行部署。

首先,我们应先在192.168.1.101和192.168.1.102上部署好Apache或是Nginx,还有PHP,这里就不详细说明了,可以参考本站的《Nginx + PHP(FastCGI)安装配置笔记》(http://www.sunbloger.com/article/242.html)。

为了便于测试,我们在192.168.1.101上放置一个test.php,代码如下:

<?php
echo '101';
?>

并在192.168.1.102上也放置一个同名文件test.php,代码如下:

<?php
echo '102';
?>

分别通过浏览器访问http://192.168.1.101:80/test.php和http://192.168.1.102:80/test.php,正常的话会分别显示101和102。

接下来,我们分别在192.168.1.101和192.168.1.102上添加用于LVS的脚本,我们可以将脚本添加到/etc/rc.d/init.d下,作为系统服务随Linux一起启动,方法如下:

vi /etc/rc.d/init.d/lvs-rs //创建名为lvs-rs的脚本
chmod +x /etc/rc.d/init.d/lvs-rs //添加执行权限
chkconfig --add lvs-rs //加入到系统服务中

lvs-dr脚本代码如下:

#!/bin/bash
# chkconfig: 35 90 10
# description: LVS of RealServer

VIP=192.168.1.100

. /etc/init.d/functions

case "$1" in
start)
    ifconfig lo:0 $VIP netmask 255.255.255.255
    /sbin/route add -host $VIP dev lo:0
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    sysctl -p >/dev/null 2>&1
    echo "LVS of RealServer Start."
    ;;
stop)
    ifconfig lo:0 down
    route del $VIP >/dev/null 2>&1
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    echo "LVS of RealServer Stoped."
    ;; 
*) 
    echo "Usage: $0 {start|stop}"
    exit 1
esac
exit 0

 

接下来,我们开始为192.168.1.100安装LVS。

yum install ipvsadm

在CentOS下推荐采用yum安装,可以避免内核版本对LVS的影响。

ipvsadm安装完毕后,我们为192.168.1.100添加一个名为lvs-ds的服务启停脚本,代码如下:

#!/bin/bash
# chkconfig: 35 90 10
# description: LVS of DirectorServer

VIP=192.168.1.100
RIP1=192.168.1.101
RIP2=192.168.1.102

. /etc/init.d/functions

case "$1" in
start)
    /sbin/ipvsadm -A -t $VIP:80 -s wlc
    /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g -w 1
    /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g -w 1
    touch /var/lock/subsys/ipvsadm >/dev/null 2>&1
    echo "LVS of DirectorServer start."
    ;;
stop)
    /sbin/ipvsadm -C
    rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1
    echo "LVS of DirectorServer stoped."
    ;;
status)
    if [ ! -e /var/lock/subsys/ipvsadm ];then
        echo "LVS of DirectorServer stoped."
        exit 1
    else
        echo "LVS of DirectorServer OK."
    fi
    ;;
*)
   echo "Usage: $0 {start|stop|status}"
   exit 1
esac
   exit 0

将lvs-ds添加到系统服务中:

vi /etc/rc.d/init.d/lvs-ds //创建名为lvs-rs的脚本
chmod +x /etc/rc.d/init.d/lvs-ds //添加执行权限
chkconfig --add lvs-ds //加入到系统服务中

至此,3台主机部署完毕,开始测试

首先在192.168.1.101和192.168.1.102上分别启动lvs-rs

service lvs-rs start

然后在192.168.1.100上启动lvs-ds

service lvs-ds start

通过http://192.168.1.100:80/test.php来测试LVS工作是否正常,反复刷新页面会看到随机显示101或102就代码部署成功了。

阳光部落原创,更多内容请访问 http://www.sunbloger.com/

PHP利用FFmpeg读取视频播放时长和码率等信息

代码如下:

<?php
define('FFMPEG_PATH', '/usr/local/ffmpeg2/bin/ffmpeg -i "%s" 2>&1');

function getVideoInfo($file) {
    
    $command = sprintf(FFMPEG_PATH, $file);
    
    ob_start();
    passthru($command);
    $info = ob_get_contents();
    ob_end_clean();
    
    $data = array();
    if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $match)) {
        $data['duration'] = $match[1]; //播放时间
        $arr_duration = explode(':', $match[1]);
        $data['seconds'] = $arr_duration[0] * 3600 + $arr_duration[1] * 60 + $arr_duration[2]; //转换播放时间为秒数
        $data['start'] = $match[2]; //开始时间
        $data['bitrate'] = $match[3]; //码率(kb)
    }
    if (preg_match("/Video: (.*?), (.*?), (.*?)[,\s]/", $info, $match)) {
        $data['vcodec'] = $match[1]; //视频编码格式
        $data['vformat'] = $match[2]; //视频格式
        $data['resolution'] = $match[3]; //视频分辨率
        $arr_resolution = explode('x', $match[3]);
        $data['width'] = $arr_resolution[0];
        $data['height'] = $arr_resolution[1];
    }
    if (preg_match("/Audio: (\w*), (\d*) Hz/", $info, $match)) {
        $data['acodec'] = $match[1]; //音频编码
        $data['asamplerate'] = $match[2]; //音频采样频率
    }
    if (isset($data['seconds']) && isset($data['start'])) {
        $data['play_time'] = $data['seconds'] + $data['start']; //实际播放时间
    }
    $data['size'] = filesize($file); //文件大小
    return $data;
}

//用法
$video_info = getVideoInfo('video.mp4');
print_r($video_info);
?>

本例中,会用到passthru,可能部分虚拟主机会将此命令禁用。

用PHP实现URL转换短网址的算法

短网址(Short URL) ,顾名思义就是在形式上比较短的网址。在Web 2.0的今天,不得不说,这是一个潮流。目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接。

下面是用PHP实现短网址转换的算法,代码如下:

<?php
//短网址生成算法
class ShortUrl {
    
    //字符表
    public static $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    public static function encode($url)
    {
        $key = 'abc'; //加盐
        $urlhash = md5($key . $url);
        $len = strlen($urlhash);

        //将加密后的串分成4段,每段4字节,对每段进行计算,一共可以生成四组短连接
        for ($i = 0; $i < 4; $i++) {
            $urlhash_piece = substr($urlhash, $i * $len / 4, $len / 4);
            
            //将分段的位与0x3fffffff做位与,0x3fffffff表示二进制数的30个1,即30位以后的加密串都归零
            //此处需要用到hexdec()将16进制字符串转为10进制数值型,否则运算会不正常
            $hex = hexdec($urlhash_piece) & 0x3fffffff;

            //域名根据需求填写
            $short_url = "http://t.cn/";
            
            //生成6位短网址
            for ($j = 0; $j < 6; $j++) {
                
                //将得到的值与0x0000003d,3d为61,即charset的坐标最大值
                $short_url .= self::$charset[$hex & 0x0000003d];
                
                //循环完以后将hex右移5位
                $hex = $hex >> 5;
            }

            $short_url_list[] = $short_url;
        }

        return $short_url_list;
    }
}

$url = "http://www.sunbloger.com/";
$short = ShortUrl::encode($url);
print_r($short);
?>

通常我们用四组网址中的第一组即可。

这里需要注意的是,这个算法是不可逆的,因此,通常的做法是将短网址和对应的原网址存入数据库,当访问时,从数据库中取出匹配的原网址,通过301或header进行跳转。

PHP通过反射方法调用执行类中的私有方法

PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。

下面我们演示一下如何通过反射,来调用执行一个类中的私有方法:

<?php

//MyClass这个类中包含了一个名为myFun的私有方法
class MyClass {
    
    private $tmp = 'hello';
    
    private function myFun()
    {
        echo $this->tmp . ' ' . 'world!';
    }
}

//通过类名MyClass进行反射
$ref_class = new ReflectionClass('MyClass');

//通过反射类进行实例化
$instance  = $ref_class->newInstance();

//通过方法名myFun获取指定方法
$method = $ref_class->getmethod('myFun');

//设置可访问性
$method->setAccessible(true);

//执行方法
$method->invoke($instance);
?>

阳光部落原创,更多内容请访问 http://www.sunbloger.com/

在PHP中将图片转换为base64编码的方法

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。

这里我们分享一个将图片转换为base64编码格式的方法:

<?php
$img = 'test.jpg';
$base64_img = base64EncodeImage($img);

echo '<img src="' . $base64_img . '" />';

function base64EncodeImage ($image_file) {
    $base64_image = '';
    $image_info = getimagesize($image_file);
    $image_data = fread(fopen($image_file, 'r'), filesize($image_file));
    $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
    return $base64_image;
}
?>

通过上面的方法转换后得到的base64编码字符串,可以存放到数据库中,需要时可以直接从数据库中读取,减少访问图片时的请求数量。

另:这个方法已经包含进MiniFramework的全局函数库中了。

阳光部落原创,更多内容请访问 http://www.sunbloger.com/

关于Memcached对key和value的限制

Memcached中对于键(key)的限制为最大不超过250个字符。同时,对于存储的value最大可以接受的数据不能超过1MB。

我们可以通过修改源代码的方式来改变对于key的长度限制。

方法为:

修改memcached.h文件,找到 #define KEY_MAX_LENGTH 250,将250修改为其他数值,例如:#define KEY_MAX_LENGTH 512

而关于value的1M的限制,可以在启动命令中增加-I 2m这样的参数,就可以将原本1M的限制提升至2M。

升级CentOS的OpenSSH 搭建SFTP Server

SFTP是 Secure File Transfer Protocol 的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

OpenSSH 4.8p1以上的版本才支持SFTP所需的chroot等指令,我的CentOS 5.X服务器的OpenSSH版本过低,需要先对OpenSSH升级。

提示:在升级OpenSSH前,为防止意外出现,我临时开启了telnet,通过telnet连接到服务器后再进行操作(升级完记得关闭telnet)。

service sshd stop #关闭sshd
mv /etc/ssh/sshd_config /etc/ssh/sshd_config_bak #将原有的设置文件改名
wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-4.9p1.tar.gz
tar zxvf openssh-4.9p1.tar.gz
cd openssh-4.9p1
./configure --prefix=/usr --sysconfdir=/etc/ssh
make
make install

 

如果上面的过程很顺利的话,下面这行命令应该可以正常启动sshd

service sshd start

 

接下来配置sshd_config,设置SFTP的用户和目录

#Subsystem      sftp    /usr/libexec/sftp-server
Subsystem       sftp    internal-sftp

Match User xxxxxx
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
ChrootDirectory /var/htdocs

上面设置中“xxxxxx”替换为你系统中专门用于SFTP的用户名即可,这里我用的是User,也可以用Group来指定一个用户组。

设置好后重启sshd即可。

用SS5在Linux上搭建Socks5 Proxy代理服务器

SOCKS5 是一个代理协议,通过将前端发来的请求转发给真正的目标服务器, 模拟了一个前端的行为。在这里,前端和SOCKS5之间也是通过TCP/IP协议进行通讯,前端将原本要发送给真正服务器的请求发送给SOCKS5服务器,然后SOCKS5服务器将请求转发给真正的服务器。

下面我们将用SS5在Linux上搭建一个Socks5 Proxy Server,具体过程如下:

首先,编译安装SS5需要先安装一些依赖组件

yum -y install gcc gcc-c++ automake make pam-devel openldap-devel cyrus-sasl-devel

接下来,我们从 http://ss5.sourceforge.net/ 下载SS5最新版本的源代码后,开始编译安装:

tar zxvf ./ss5-3.8.9-8.tar.gz
cd ss5-3.8.9
./configure
make
make install

让SS5随系统一起启动

chmod +x /etc/init.d/ss5
chkconfig --add ss5
chkconfig --level 345 ss5 on

开启用户名密码验证机制

vi /etc/opt/ss5/ss5.conf

在ss5.conf中找到auth和permit两行,按照下面的格式进行修改

auth      0.0.0.0/0       -         u
permit u        0.0.0.0/0       -       0.0.0.0/0       -       -       -       -       -

设置用户名和密码

vi /etc/opt/ss5/ss5.passwd

一行一个账号,用户名和密码之间用空格间隔,例如:

user1 123
user2 234

设置端口

vi /etc/sysconfig/ss5

在/etc/sysconfig/ss5这个文件中,添加下面这一行命令,-b后面的参数代表监听的ip地址和端口号

# Add startup option here
SS5_OPTS=" -u root -b 0.0.0.0:8080"

启动

service ss5 start

阳光部落原创,更多内容请访问 http://www.sunbloger.com/