龚哥哥 - 山里男儿 爱生活、做自己!
Python中文转拼音
发表于 2016-11-2 | 浏览(13210) | Python

最近写一个项目的时候,需要将汉字转化成拼音,在github上找到一个现成的库。

Python汉字转拼音 GitHub地址

1、使用如下

from pinyin import PinYin

test = PinYin()
test.load_word()
print test.hanzi2pinyin(string='钓鱼岛是中国的')
print test.hanzi2pinyin_split(string='钓鱼岛是中国的', split="-")

输出
['diao', 'yu', 'dao', 'shi', 'zhong', 'guo', 'de']
'diao-yu-dao-shi-zhong-guo-de'

2、在中文与英文混合的时候英文会丢失,所以我们需要对库进行一点调整。

2.1、hanzi2pinyin方法调整

# 原始
    def hanzi2pinyin(self, string=""):
        result = []
        if not isinstance(string, unicode):
            string = string.decode("utf-8")

        for char in string:
            key = '%X' % ord(char)
            result.append(self.word_dict.get(key, char).split()[0][:-1].lower())

        return result

# 调整后
    def hanzi2pinyin(self, string=""):
        result = []
        if not isinstance(string, unicode):
            string = string.decode("utf-8")
        en = ''
        for char in string:
            key = '%X' % ord(char)
            if not self.word_dict.get(key) :
                # 为字母或数字才进入(排除特殊字符)
                if(char.isalpha() == True or char.isdigit() == True) :
                    en += char
                else :
                    # 空格则分割数据
                    if(char.isspace() == True) :
                        result.append(en)
                        en = ''
            else:
                # en有数据则先处理
                if(len(en) > 0) :
                    result.append(en)
                    en = ''
                # 中文转拼音
                result.append(self.word_dict.get(key, char).split()[0][:-1].lower())
        # 防止全是英文或数字
        if(len(en) > 0) :
            result.append(en)
            en = ''

        return result

2.2、hanzi2pinyin_split方法调整

# 原始
    def hanzi2pinyin_split(self, string="", split=""):
        result = self.hanzi2pinyin(string=string)
        if split == "":
            return result
        else:
            return split.join(result)

# 调整后
    def hanzi2pinyin_split(self, string="", split=""):
        return split.join(self.hanzi2pinyin(string=string))

3、调整后的效果

print test.hanzi2pinyin(string='钓鱼岛是hello中国的')
print test.hanzi2pinyin_split(string='钓鱼岛是hello中国world的', split="-")

输出
['diao', 'yu', 'dao', 'shi', 'hello', 'zhong', 'guo', 'de']
diao-yu-dao-shi-hello-zhong-guo-world-de

阅读全文

Linux内核参数优化
发表于 2016-10-16 | 浏览(8498) | 服务器

1、修改   vim /etc/sysctl.conf   文件

# 值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开
net.ipv4.ip_forward = 0

# 多网卡接收多播
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0

# 验证设置
kernel.sysrq = 0
kernel.core_uses_pid = 1

# 开启SYN Cookies,当出现SYN 等待队列溢出时,启用cookies 来处理
net.ipv4.tcp_syncookies = 1

# 确定一个消息队列的容量。该参数的取值存储在消息队列标识符结构的某个域中,用于确定是否存在着对新消息进行排队的空间。msgmnb 值可以动态修改,默认为16384。修改其取值会影响到所有新的消息队列的容量。用户可以通过 Msgctl()系统调用来增加现有消息队列的容量
kernel.msgmnb = 65536

# 限制进程可以发送的消息长度。该参数由 Msgsnd()函数加以应用。如果待发送消息的长度超过该值,则返回一个错误。该参数可以在运行时调整
kernel.msgmax = 65536

# 最大共享内存段大小。取物理内存大小的一半,单位为字节(此处为8G)
kernel.shmmax = 8589934592

# 整个系统共享内存段的最大数目
kernel.shmmni = 4096

# 可以使用的共享内存的总量
kernel.shmall = 4294967296

# 每个信号对象集的最大信号对象数;系统范围内最大信号对象数;每个信号对象支持的最大操作数;系统范围内最大信号对象集数
kernel.sem = 250 32000 100 128

# timewait 的数量,默认是180000
net.ipv4.tcp_max_tw_buckets = 204800

# web 应用中listen 函数的backlog 默认会给我们内核参数的net.core.somaxconn 限制到128,而nginx 定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值
net.core.somaxconn = 262144

# 该参数标识是否启用选择性确认SACKS选项。默认值为1(true)
net.ipv4.tcp_sack = 1

# 设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到 65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力
net.ipv4.tcp_window_scaling = 1

# tcp_rmem:min表示为TCP socket预留用于接收缓冲的最小内存数量,default为TCP socket预留用于接收缓冲的缺省内存数量,max用于TCP socket接收缓冲的内存最大值
net.ipv4.tcp_rmem = 4096 87380 4194304

# tcp_wmem:min表示为TCP socket预留用于发送缓冲的内存最小值,default为TCP socket预留用于发送缓冲的缺省内存值,max用于TCP socket发送缓冲的内存最大值
net.ipv4.tcp_wmem = 4096 16384 4194304

# 系统套接字写默认缓冲区
net.core.wmem_default = 8388608

# 系统套接字读默认缓冲区
net.core.rmem_default = 8388608

# 系统套接字读最大缓冲区
net.core.rmem_max = 16777216

# 系统套接字写最大缓冲区
net.core.wmem_max = 16777216

# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 262144

# 统中最多有多少个TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
net.ipv4.tcp_max_orphans = 3276800

# 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M 内存的系统而言,缺省值是1024,小内存的系统则是128
net.ipv4.tcp_max_syn_backlog = 262144

# 时间戳可以避免序列号的卷绕。一个1Gbps 的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉
net.ipv4.tcp_timestamps = 0

# 为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量
net.ipv4.tcp_synack_retries = 1

# 在内核放弃建立连接之前发送SYN 包的数量
net.ipv4.tcp_syn_retries = 1

# 启用timewait 快速回收
net.ipv4.tcp_tw_recycle = 1

# 开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接
net.ipv4.tcp_tw_reuse = 1

# 确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB)
net.ipv4.tcp_mem = 94500000 915000000 927000000

# 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2 状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180 秒,3你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2 的危险性比FIN-WAIT-1 要小,因为它最多只能吃掉1.5K 内存,但是它们的生存期长些
net.ipv4.tcp_fin_timeout = 15

# 当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时
net.ipv4.tcp_keepalive_time = 15

# 允许系统打开的端口范围
net.ipv4.ip_local_port_range = 1024 65000

# 系统中所允许的文件句柄最大数目
fs.file-max = 204800

1.1、让参数生效

/sbin/sysctl -p

2、修改文件句柄数量,修改   vim /etc/security/limits.conf

* soft nofile 204800
* hard nofile 204800

2.1、重启生效,查看参数

ulimit -a

阅读全文

CentOS下使用Ansible自动部署
发表于 2016-10-16 | 浏览(9619) | 服务器

一、服务器准备

Master        10.0.82.55
Node1       10.0.82.56
Node2       10.0.82.37

二、配置Master SSH免密码登录节点服务器

具体方法,搜索本博客中的文章

三、Master安装Ansible服务

1、yum安装

yum -y install ansible

2、配置文件   vim /etc/ansible/hosts 添加node的ip

10.0.82.56
10.0.82.37

# 可以分组 如:
[web]
10.0.82.56

[db]
10.0.82.37

四、测试

1、在远程服务器根目录创建hello目录

ansible all -a "mkdir /hello"

运行结果
10.0.82.37 | SUCCESS | rc=0 >>
10.0.82.56 | SUCCESS | rc=0 >>

2、把Master本地文件拷贝到远程服务器

ansible all -m copy -a "src=/data/www/test.txt dest=/data/www"

报错了
10.0.82.56 | FAILED! => {
    "changed": false, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "failed": true, 
    "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"

解决方案(如果受控机开启SELinux,则必须在受控机上安装libselinux-python)
ansible all -k -m yum -a "name=libselinux-python state=installed"

再次运行 ansible all -m copy -a "src=/data/www/test.txt dest=/data/www"

运行结果
10.0.82.37 | SUCCESS => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "dest": "/data/www/test.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "src": "/root/.ansible/tmp/ansible-tmp-1476215949.6-127742282482280/source", 
    "state": "file", 
    "uid": 0
}
10.0.82.56 | SUCCESS => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "dest": "/data/www/test.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:default_t:s0", 
    "size": 0, 
    "src": "/root/.ansible/tmp/ansible-tmp-1476215949.96-237849415762054/source", 
    "state": "file", 
    "uid": 0
}

3、查看节点服务器的某个进程

ansible all -m shell -a "ps -ef | grep nginx"

运行结果
172.17.0.4 | SUCCESS | rc=0 >>
root         68      1  0 09:55 ?        00:00:00 nginx: master process /data/soft/nginx/nginx -c /data/soft/nginx/nginx.conf
nobody       69     68  0 09:55 ?        00:00:00 nginx: worker process
root        298    293  0 09:58 pts/0    00:00:00 /bin/sh -c ps -ef | grep nginx
root        300    298  0 09:58 pts/0    00:00:00 grep nginx

172.17.0.3 | SUCCESS | rc=0 >>
root         71      1  0 08:18 ?        00:00:00 nginx: master process /data/soft/nginx/nginx -c /data/soft/nginx/nginx.conf
nobody       72     71  0 08:18 ?        00:00:00 nginx: worker process
root       1816   1811  0 09:58 pts/0    00:00:00 /bin/sh -c ps -ef | grep nginx
root       1818   1816  0 09:58 pts/0    00:00:00 grep nginx

4、更改节点服务器文件权限

ansible all -m file -a "dest=/data/www/gong.txt mode=777"

运行结果
172.17.0.4 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "path": "/data/www/gong.txt", 
    "size": 6, 
    "state": "file", 
    "uid": 0
}
172.17.0.3 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "path": "/data/www/gong.txt", 
    "size": 6, 
    "state": "file", 
    "uid": 0
}

4、在节点服务器上拉取一个git库

ansible all -m shell -a "cd /data/www; git clone git@git.coding.net:gongfuxiang/hello.git"

运行结果
172.17.0.4 | SUCCESS | rc=0 >>
Cloning into 'hello'...

172.17.0.3 | SUCCESS | rc=0 >>
Cloning into 'hello'...

Ansible更多使用方法 Ansible中文使用权威指南

阅读全文

CentOS安装Munin监控服务器
发表于 2016-10-13 | 浏览(7829) | 服务器

效果图


作为一个网络资源监控工具,Munin能够帮助分析资源趋势和查看薄弱环节以及导致产生性能问题的原因。开发此软件的团队希望它能够易用和用户体验友好。该软件是用Perl开发的,并采用rrdtool来绘制图形,使用了web界面进行呈现。开发人员推广此应用时声称当前已有500多个监控插件可以“即插即用*”。

一、安装web服务器 nginx或apache都可以(搜索本博客中有nginx的安装教程)

服务器列表
Master  192.168.1.100
Node1   192.168.1.200
Node2   192.168.1.201

二、Master安装Munin

1、安装EPEL源(已安装可跳过)

rpm -Uvh https://mirrors.tuna.tsinghua.edu.cn/epel/6/i386/epel-release-6-8.noarch.rpm

2、Master 安装munin服务

yum -y install munin

3、修改配置文件  vim /etc/munin/munin.conf

将以下几行的注释去掉(分别是 数据路径,wab路径,日志路径,运行run路径,模板文件路径)
dbdir  /var/lib/munin
htmldir /var/www/html/munin
logdir /var/log/munin
rundir  /var/run/munin
tmpldir /etc/munin/templates

将以下监控本机的代码注释掉
#[localhost]
#    address 127.0.0.1
#    use_node_name yes
同时添加被监控机地址
[node1]
    address 192.168.1.200
    use_node_name yes
[node2]
    address 192.168.1.201
    use_node_name yes

use_node_name命令控制munin命名节点的方式,如果后面跟的参数为yes就是用括号中的值来命名,如果是no则将执行一个DNS查询。

4、配置服务需要用户名和密码才能访问,apache中自带htpasswd,nginx中没,可以搜索本博客中的教程

htpasswd -c /etc/munin/munin-htpasswd 用户名
然后输入密码

5、在nginx中或apache中添加htpasswd用户认证(这里nginx做演示 server中)

auth_basic "Authorized users only";
auth_basic_user_file /etc/munin/munin-htpasswd;

6、安装完munin服务端后,程序会自动创建一个计划任务,可以看到是每5分钟获取一次数据(可以根据自己的需求修改定时任务时间)

cat /etc/cron.d/munin

*/5 * * * * munin test -x /usr/bin/munin-cron && /usr/bin/munin-cron

7、启动crond服务

service crond start

三、Node服务器安装Munin

1、安装EPEL源(已安装可跳过)

rpm -Uvh https://mirrors.tuna.tsinghua.edu.cn/epel/6/i386/epel-release-6-8.noarch.rpm

yum -y install munin-node

2、修改配置文件   vim /etc/munin/munin-node.conf

找到 allow ^127\.0\.0\.1$
这里是表示允许谁来获取信息,在下面加上监控机IP:
allow ^192\.168\.1\.100$

3、防火墙配置   vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 4949 -j ACCEPT

4、启动munin-node

service munin-node start

四、进入Master测试看看

telnet 192.168.1.200 4949

访问Master配置的尾部服务器查看节点服务的监控数据

阅读全文

CentOS编译安装MySQL5.7
发表于 2016-10-12 | 浏览(9308) | 数据库

1、准备

mkdir /data
cd /data
mkdir soft src dbdata
cd soft
mkdir mysql

2、安装cmake

cd /data/src
wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz
tar -zxvf cmake-2.8.10.2.tar.gz
cd cmake-2.8.10.2
./bootstrap
gmake
gmake install

3、下载boost源码包,从5.7开始boost包是必须的

cd /data/src
wget http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
mkdir /usr/local/boost
tar -zxvf boost_1_59_0.tar.gz -C /usr/local/boost

4、安装mysql

cd /data/src
wget http://dev.mysql.com/get/archives/mysql-5.7/mysql-5.7.15.tar.gz
tar -zxvf mysql-5.7.15.tar.gz
cd mysql-5.7.15
cmake . -DCMAKE_INSTALL_PREFIX=/data/soft/mysql -DMYSQL_DATADIR=/data/dbdata -DSYSCONFDIR=/data/soft/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DMYSQL_USER=mysql -DWITH_DEBUG=0 -DMYSQL_TCP_PORT=3306 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=1 -DWITH_SSL=yes -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost
make
make install

5、初始化操作

cd /data/soft/mysql
bin/mysqld --initialize --user=mysql --basedir=/data/soft/mysql --datadir=/dbdata --explicit_defaults_for_timestamp=1
/data/soft/mysql/support-files
这里会给出默认的随机密码,请一定要记下来一会儿登录使用(mysql从5.7开始密码不再默认空了)

6、mysql配置文件

cd support-files
cp my-default.cnf /etc/my.cnf

7、配置mysql服务开机自动启动

cp mysql.server /etc/init.d/mysql
chmod 755 /etc/init.d/mysql

8、检查自启动项列表中没有mysql这个,如果没有就添加mysql

chkconfig --list mysql
chkconfig --add mysql

9、设置MySQL在345等级自动启动

chkconfig --level 345 mysql on
chkconfig mysql on

10、创建mysql命令路径

ln -s /data/soft/mysql/bin/mysql /usr/bin

11、mysql操作命令

service mysql start
service mysql stop
service mysql restart

12、登录mysql

mysql -uroot -p
输入安装完成的时候给的随机密码,如:123456

13、修改root的密码

alter user 'root'@'localhost' identified by '123456';

退出后重新登录使用新密码即可

阅读全文

Nginx+Lua+Redis搭建高并发服务
发表于 2016-10-2 | 浏览(11797) | 服务器

架构图


一、准备

1、服务器首先是需要安装redis服务,查看本博客中的另一篇文章
2、安装nginx+luq服务,查看本博客中的另一篇文章

二、下载lua redis库

lua-redis库地址 https://github.com/openresty/lua-resty-redis
cd /data/www/lua/vendor
git clone https://github.com/openresty/lua-resty-redis.git

三、vim nginx.conf,http中添加

lua_package_path "/data/www/lua/vendor/lua-resty-redis/lib/?.lua;;";

四、nginx server中操作redis

1、在nginx.conf中嵌入lua代码

location /hello {
    default_type 'text/json';
    local redis = require "resty.redis";
    local instance = redis:new();
    local host = "127.0.0.1";
    local port = 6379;
    local ok,err = instance:connect(host,port);
    if not ok then
       ngx.log(ngx.ERR,err);
       ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE);
    end
    local suc, err instance:set('devil', 'hello world')
    f not suc then
        ngx.say("error")
    else
        ngx.say(instance:get('instance'))
    end
}

2、在实际业务中,独立lua代码(下面是一个redis简单的demo)

location /hello {
    default_type 'text/json';
    lua_need_request_body on;
    content_by_lua_file /data/www/lua/www/redis.lua;
}

2.1、lua文件的代码   vim /data/www/lua/www/redis.lua

#!/usr/local/bin/lua

--[[
    redis操作demo
    Devil
    http://gongfuxiang.com
--]]

-- 引入redis库
local redis = require "resty.redis";

-- 实例化redis
local instance = redis:new();

-- redis配置参数
local host = "127.0.0.1";
local port = 6379;

-- 创建redis连接
local ok,err = instance:connect(host,port);
if not ok then
   ngx.log(ngx.ERR,err);
   ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE);
end

-- 获取客户端post过来的body数据
local request_body = ngx.req.get_body_data() or nil
if( request_body ~= nil )
then
    -- 客户端ip
    local client_ip =ngx.req.get_headers()["X-Real-IP"]
    if client_ip == nil then
            client_ip = ngx.req.get_headers()["x_forworded_for"]
    end
    if client_ip == nil then
            client_ip = ngx.var.remote_addr
    end

    -- 当前时间戳
    local time = os.time()

    -- 拼接redis数据
    local data = client_ip.."{-}"..time.."{-}"..request_body

    -- 队列方式存储redis数据
    local suc, err = instance:lpush('key_list', data)
    if not suc then
        ngx.say('{"code":-2, "msg":"操作失败"}')
    end
    ngx.say('{"code":0, "msg":"操作成功"}')
else
    ngx.say('{"code":-1, "msg":"数据有误"}')
end

五、测试,访问 http://localhost/hello

hello world

阅读全文

Nginx结合Lua模块
发表于 2016-10-2 | 浏览(6625) | 服务器

一、准备(软件存放目录创建)

mkdir /data
cd /data
mkdir src soft www
cd www
mkdir lua vendor
cd lua www 

二、常用库安装

yum -y install automake autoconf libtool make gcc gcc-c++ libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel

三、nginx依赖库安装

1、安装PCRE库

ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包:
cd /data/src
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
tar -zxvf pcre-8.38.tar.gz
./configure
make && make install

2、安装zlib库

http://zlib.net/zlib-1.2.8.tar.gz 下载最新的 zlib 源码包,使用下面命令下载编译和安装 zlib包:
cd /data/src
wget http://zlib.net/zlib-1.2.8.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8
./configure
make && make install

3、安装ssl(某些vps默认没装ssl)

cd /data/src
wget http://www.openssl.org/source/openssl-1.0.2.tar.gz
tar -zxvf openssl-1.0.2.tar.gz
./config
make && make install
cp apps/openssl /usr/bin/
如果提示覆盖,确认就OK了,再查看openssl version版本就是最新版了

4、nginx lua扩展库

cd /data/src
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.6.tar.gz
wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
mv v0.3.0.tar.gz ngx_devel_kit-0.3.0.tar.gz
mv v0.10.6.tar.gz lua-nginx-module-0.10.6.tar.gz
tar -zxvf ngx_devel_kit-0.3.0.tar.gz
tar -zxvf lua-nginx-module-0.10.6.tar.gz

5、LuaJIT安装

cd /data/src
wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
tar -zxvf LuaJIT-2.0.4.tar.gz 
cd LuaJIT-2.0.4
make && make install

四、安装nginx

1、安装nginx

Nginx 一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把 Nginx 安装到 /data/soft/nginx 目录下的详细步骤:
cd /data/src
wget http://nginx.org/download/nginx-1.9.9.tar.gz
tar -zxvf nginx-1.9.9.tar.gz
cd nginx-1.9.9
./configure --sbin-path=/data/soft/nginx/nginx \--conf-path=/data/soft/nginx/nginx.conf \--pid-path=/data/soft/nginx/nginx.pid \--with-http_realip_module \--with-http_ssl_module \--with-pcre=/data/src/pcre-8.38 \--with-zlib=/data/src/zlib-1.2.8 \--with-http_stub_status_module \--add-module=/data/src/ngx_cache_purge-2.3 \--add-module=/data/src/ngx_devel_kit-0.3.0 \--add-module=/data/src/lua-nginx-module-0.10.6
make && make install

2、告诉nginxlua库路径

export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0

3、查看nginx是否正常

nginx -v
可能会出现下面的错误
./objs/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
解决方法:
ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2

8、nginx常用操作

cp /data/soft/nginx/nginx /etc/init.d/
/etc/init.d/nginx               启动nginx
/etc/init.d/nginx -s reload     重启nginx
/etc/init.d/nginx -s stop       关闭nginx

9、进入nginx目录校验lua是否能够正常运行

cd /data/soft/nginx
vim nginx.conf(server中添加以下代码)
location /hello { 
    default_type 'text/plain'; 
    content_by_lua 'ngx.say("hello, lua")'; 
}
重启nginx即可,访问 http://localhost/hello 会出现 hello,lua

阅读全文

PHP采用Swoole扩展开发高性能WebSocket
发表于 2016-9-17 | 浏览(17006) | PHP

需要安装PHP Swoole扩展,官网地址:http://www.swoole.com/

安装教程可查看本博客中swoole安装

1、index.html 内容如下

<!DOCTYPE html>
<head>
<title>socket demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="./jquery-2.1.3.min.js"></script>
</head>
<body>
<input type="text" id="msg" />
<button id="send">发送</button>
</body>
</html>
<script>
$(function()
{
    // 创建socket对象
    var socket = new WebSocket('ws://'+document.domain+':9501');

    // 打开Socket 
    socket.onopen = function(event)
    {

        $('#send').on('click', function()
        {
            var msg = $('#msg').val();
            socket.send(msg);
            console.log(msg);
        });
        // 发送一个初始化消息
        socket.send("客户端初始化!"); 

        // 监听消息
        socket.onmessage = function(event) { 
            console.log("客户端监听到的消息:", event); 
        }; 

        // 监听Socket的关闭
        socket.onclose = function(event) { 
        console.log("Socket关闭了", event); 
        }; 

      // 关闭Socket.... 
      //socket.close() 
    };
});
</script>

2、web_socket.php 内容如下

<?php

// 本机的ip
// 通过命令行运行 cli
$server = new swoole_websocket_server("192.168.0.110", 9501);

// 握手成功回调
$server->on('open', function(swoole_websocket_server $server, $request)
{
    echo "server: handshake success with fd{$request->fd}\n";
});

// 消息监听
$server->on('message', function(swoole_websocket_server $server, $frame)
{
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
    $server->push($frame->fd, "this is server {$frame->data}");
});

// 关闭监听
$server->on('close', function($ser, $fd)
{
    echo "client {$fd} closed\n";
});

// http请求监听, 如果监听了Request则可以通过http访问
// 通过 http://192.168.0.110:9501 访问
$server->on('Request', function($req, $respone)
{
    // $req->get, $req->post
    if(!empty($req->get))
    {
        // 使用全局变量
        global $server;

        // 服务器推送消息给客户端
        // 参数1 socketID, 参数2 推送内容
        $server->push(1, "this is server hello request {$req->get['msg']}");

        // 响应完成
        $respone->end("success");
    }
});

// 开始
$server->start();

?>

3、在命令行运行web_socket.php

php web_socket

4、客户端在浏览器上访问,可发送消息到服务器并且响应服务器推送的消息

http://192.168.0.110/index.html

5、服务器端推送消息给客户端,在客户端页面可看见推送的消息

http://192.168.0.110:9501?msg=hello

6、测试结果,这里输入什么就给返回什么,在项目中根据自己项目做fid与用户的关联即可。

阅读全文

CentOS搭建FTP服务器
发表于 2016-9-16 | 浏览(6137) | 服务器

1、查看是否已经安装vsftpd

rpm -qa | grep vsftpd

2、安装vsftpd

yum -y install vsftpd

2.1、将vsftpd加入开机启动

chkconfig vsftpd on

3、vsftpd配置  vim /etc/vsftpd/vsftpd.conf

# 设定不允许匿名访问
anonymous_enable=NO

# 设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为NO的情况下所有虚拟用户将无法访问
local_enable=YES

# 使用户不能离开主目录
chroot_list_enable=YES
ascii_upload_enable=YES

# 设定支持ASCII模式的上传和下载功能
ascii_download_enable=YES

# 启用“倾听”指令时,vsftpd在独立模式和运行,监听IPv4的套接字。这个指令不能一起使用, listen_ipv6指令
listen=YES

# PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证以下这些是关于vsftpd虚拟用户支持的重要配置项,默认vsftpd.conf中不包含这些设定项目,需要自己手动添加
pam_service_name=vsftpd

# 设定启用虚拟用户功能
guest_enable=YES

# 指定虚拟用户的宿主用户,CentOS中已经有内置的ftp用户了
guest_username=ftp

# 设定虚拟用户个人vsftp的CentOS FTP服务文件存放路径。存放虚拟用户个性的CentOS FTP服务文件(配置文件名=虚拟用户名进行认证
user_config_dir=/etc/vsftpd/vuser_conf
chroot_list_file=/etc/vsftpd/vuser_passwd.txt

# 授权用户权限(新版本需要设置此参数)
#allow_writeable_chroot=YES

# 开启PASV模式
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40080
pasv_promiscuous=YES

# 阻止特定的本地用户登录ftp
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list

4、创建用户和密码文本  vim /etc/vsftpd/vuser_passwd.txt,注意奇行是用户名,偶行是密码

devil
123456

4.1、生成虚拟用户认证的db文件

db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db

4.2、安装Berkeley DB工具,很多人找不到db_load的问题就是没有安装这个包(已安装则跳过)

yum install db4 db4-utils

5、编辑认证文件  vim /etc/pam.d/vsftpd,全部注释掉原来语句,再增加以下两句

auth       required     pam_userdb.so db=/etc/vsftpd/vuser_passwd
account    required     pam_userdb.so db=/etc/vsftpd/vuser_passwd

6、创建虚拟用户配置文件目录

mkdir /etc/vsftpd/vuser_conf

6.1、创建虚拟用户配置文件  vim /etc/vsftpd/vuser_conf/devil

local_root=/data/ftp/devil #虚拟用户根目录,根据实际情况修改
write_enable=YES
anon_umask=022 #掩码
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

7、设置Selinux(如果你的selinux是开启的话)

setsebool -P ftp_home_dir=1   #设置ftp可以使用home目录
sersebool -P allow_ftpd_full_access=1   #设置ftp用户可以有所有权限

8、设置FTP根目录权限

mkdir -p /data/ftp/devil
chmod 755 /data/ftp
chmod -R 777 /data/ftp/devil

9、配置防火墙  vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 40000:40080 -j ACCEPT

10、查看selinux安全模式(如果显示 Enforcing ,则需要改成 Disabled 模式)

getenforce

10.1、selinux模式为Disabled则跳过,vim /etc/selinux/config

SELINUX=disabled
默认是enforcing  把他修改为 disabled

11、启动vsftpd服务

service vsftpd start

12、重启防火墙(如果防火墙不想配置,则关闭防火墙即可,线上建议开启防火墙)

service iptables restart

13、测试 在客户端使用

ip 当前服务器的ip(ifconfig查看当前ip)
用户 devli
密码 123456

阅读全文

rsync+inotify搭建多台服务器之间文件实时同步
发表于 2016-8-31 | 浏览(10080) | 服务器

一、准备

Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而Inotify-tools就是这样的一个第三方软件。

1、服务器

操作系统     CentOS-6.5-x86_64 6.5
Linux内核 2.6.32

master      192.168.0.200   客户端(数据服务器)
slave1      192.168.0.110   数据同步服务器(备份服务器1)
slave2      192.168.0.111   数据同步服务器(备份服务器2)

2、基础命令安装(所有服务器都需要安装,已经安装可跳过)

yum install -y gcc gcc-c++ make wget

二、数据同步服务端配置(备份服务器)

1、检查是否已安装rsync

rpm -qa | grep rsync

2、安装rsync和xinetd超级守护进程

yum -y install xinetd rsync

3、创建rsync用户及模块目录并更改其用户组(用户运行rsync的用户,不建议使用root)

useradd rsync -s /sbin/nologin  -M
grep rsync /etc/passwd
mkdir -p /data/www
chown -R rsync:rsync /data

4、配置rsync认证文件 /etc/rsync.password(格式 用户:密码)

echo "rsync:rsync" > /etc/rsync.password

4.1、为密码文件提权,增加安全性,文件权限修改成600

chmod 600 /etc/rsync.password

5、为rsync服务提供配置文件,vim  /etc/rsyncd.conf 文件默认不存在,手动创建即可

# 工作中指定用户(需要指定用户)
uid = rsync
gid = rsync

# 相当于黑洞.出错定位
use chroot = no

# 有多少个客户端同时传文件
max connections = 200

# 超时时间
timeout = 600

# 进程号文件
pid file = /var/run/rsyncd.pid

# 锁文件
lock file = /var/run/rsync.lock

# 日志文件
log file = /var/log/rsyncd.log

# 模块配置
# 这个模块对应的是推送目录,模块名称随便起
[rsync]

# 需要同步的目录
path = /data/www/

# 表示出现错误忽略错误
ignore errors

# 表示网络权限可写(本地控制真正可写)
read only = false

# 这里设置IP或让不让同步
list = false

# 白名单,可以访问此模块的主机
hosts allow = 192.168.0.200

# 黑名单,*表示任何主机
hosts deny = *

# 认证此模块的用户名,虚拟用户
auth users = rsync

# 虚拟用户的密码文件
secrets file = /etc/rsync.password

6、配置rsync操作脚本

A、启动脚本

echo "rsync --daemon --config=/etc/rsyncd.conf" > /etc/init.d/rsync-start
chmod +x /etc/init.d/rsync-start

B、停止脚本

echo "killall -9 rsync > /dev/null 2>&1; rm -rf /var/run/rsyncd.pid" > /etc/init.d/rsync-stop
chmod +x /etc/init.d/rsync-stop

C、重启脚本

echo "/etc/init.d/rsync-stop; /etc/init.d/rsync-start" > /etc/init.d/rsync-restart
chmod +x /etc/init.d/rsync-restart

6.1、以后服务器启动后,手动启动rsync脚本即可

/etc/init.d/rsync-start      启动
/etc/init.d/rsync-stop          停止
/etc/init.d/rsync-restart       重启

7、启动xinetd超级守护进程服务

service xinetd start

8、配置防火墙允许873端口通信  vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT

9、查看rsync服务是否成功开启

ps -ef | grep rsync

10、检查873端口是否成功监听

netstat -ntlp | grep 873

三、客户端配置

1、检查是否已安装rsync

rpm -qa | grep rsync

1.1、安装rsync服务

yum -y install rsync

2、创建本地监控的目录

mkdir -p /data/www

3、配置rsync认证文件 /etc/rsync.password(这里只要写密码即可,切记)

echo "rsync" > /etc/rsync.password

3.1、为密码文件提权,增加安全性,文件权限修改成600

chmod 600 /etc/rsync.password

4、测试一下,进入 /data/www

cd /data/www
touch test.txt
rsync -avz test.txt rsync@192.168.0.110::rsync --password-file=/etc/rsync.password

5、inotify-tools实现实时同步

mkdir /data/soft
cd /data/soft
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar -zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify
make && make install

6、编写rsync脚本,添加一下内容  vim /etc/rsync.sh

#!/bin/bash

# 数据同步监控脚本
# @author   Devil
# @version  0.0.1

# inotify-slave的ip地址(多个ip空格分割)
host="192.168.0.110 192.168.0.111"

# 本地监控的目录
src=/data/www/

# inotify-slave的rsync服务的模块名
dst=rsync

# inotify-slave的rsync服务的虚拟用户
user=rsync

# 本地调用rsync服务的密码文件
rsync_passfile=/etc/rsync.password

# inotify的安装目录
inotify_home=/usr/local/inotify

# 参数校验
if [ ! -e "$src" ] \
|| [ ! -e "${rsync_passfile}" ] \
|| [ ! -e "${inotify_home}/bin/inotifywait" ] \
|| [ ! -e "/usr/bin/rsync" ];
then
    echo "Check File and Folder"
    exit 9
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \
| while read file
do
    cd $src
    for tmp_host in $host
    do
        rsync -aruz -R --delete ./  --timeout=100 $user@$tmp_host::$dst --password-file=${rsync_passfile} > /dev/null 2>&1
    done
done
exit 0

6.1、给rsync.sh执行权限

chmod +x /etc/rsync.sh

6.2、配置操作rsync脚本文件,添加以下内容  vim /etc/init.d/rsync

# 脚本名称
name="rsync"

# 拉取正在运行的脚本进程号
PROCESS=`ps -ef | grep $name | grep -v grep | grep -v PPID | awk '{ print $2}'`

# 输出正在停止脚本的提示
if [ -n "$PROCESS" ]
then
    echo "正在停止"
fi

# 停止脚本
for i in $PROCESS
do
    kill -9 $i > /dev/null 2>&1
done

# 是否停止成功
if [ $? != 0 ]
then
    echo "停止失败"
    exit 0
fi

# 启动脚本
/etc/rsync.sh &

# 等待2秒
sleep 2

# 判断脚本是否启动成功
is_rsync=$(ps -ef | grep "$name" | grep -v grep | wc -l)
if [ $is_rsync != 0 ]
then
    echo "启动成功"
else
    echo "启动失败"
fi

6.3、给rsync服务脚本执行权限

chmod +x /etc/init.d/rsync

7、以后每次只需运行rsync脚本即可,停止启动合并

/etc/init.d/rsync

8、进入监控目录操作文件试试看效果

cd /data/www
touch test.txt
echo "hello" > test.txt
touch world.txt

9、查看备份服务器 192.168.0.100,192.168.0.110

cd /data/www
ls
文件都同步过来了

阅读全文

TOP