logstash grok使用案例:php-slow日志的匹配

在 logstash 的使用中,我遇到最多的问题是通过 grok 对日志清洗的正则规则使用了,把案例记录一下,以便存档吧。

logstash 本身提供了一个 grok 预定义常用表达式的文件,包括%{USER}、%{IP}、%{NUMBER} 、%{DATA}等,可以通过这来了解一下基本的正则写法。路径如下:
/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns/grok-patterns

这是我们要处理的PHP的slow日志,经过filebeats多行合并之后,我们可以把每一个日志事件部分作为一个完整记录来处理。当然,这是前提,否者我们把每一行作为一条记录来处理的话,就无法得到完整的信息了。如果你的一个日志事件只有一行,那就无视多行合并吧。

[01-Apr-2017 09:03:59] [pool zy.dodoedu.com] pid 29923
script_filename = /data/webapp/wenku.dodoedu.com/index.php
[0x00007fa57ffee260] query() /data/webapp/wenku.dodoedu.com/Cola/Com/Db/Pdo/Abstract.php:83
[0x00007fa57ffee130] query() /data/webapp/wenku.dodoedu.com/Cola/Com/Db/Abstract.php:228
[0x00007fa57ffedf60] col() /data/webapp/wenku.dodoedu.com/Cola/Model.php:583
[0x00007fa57ffedd50] getListBySql() /data/webapp/wenku.dodoedu.com/Models/Index.php:285
[0x00007fa57ffedb88] get_resource_list() /data/webapp/wenku.dodoedu.com/Controllers/List.php:113
[0x00007ffff565c0d0] jsonDataAction() unknown:0
[0x00007fa57ffeda10] call_user_func() /data/webapp/wenku.dodoedu.com/Cola/Cola.php:459
[0x00007fa57ffed8d0] dispatch() /data/webapp/wenku.dodoedu.com/index.php:34

因为php-slow日志的事件内容是非常规范一致的,所以grok语句还比较简单,如下:

(?m)^\[%{MONTHDAY}-%{MONTH}-%{YEAR}\s%{TIME}\]\s\s\[(pool)\s(%{DATA:poolname})\]\s(pid\s%{NONNEGINT:pid})\n%{DATA:filename}\n(?<info>.*)$

通过分解来解释一下 grok 语句: 继续阅读

ELKtrack日志收集分析的实验

实验结构
filebeat –> logstash –> elasticsearch –> kibana

说明:
ELK是实时日志处理领域的第一开源选择,基于实时全文索引,统一的配置语言,支持集群线性扩展,这次实验设计的各种软件均属于ELK的套件工具。
filebeat 是一个轻量的日志采集器,安装在各应用服务器,其实logstash也可以实现此功能不过过于笨重,其监控所定义的日志文件,然后根据配置统一输出到logstash,当然也可直接输出到elasticsearch或redis,但是filebeat只支持多行合并和简单过滤控制,我们需要logstash更高级的日志处理功能;
logstash 是一个丰富的日志收集和处理工具,这里我们主要用来监听日志管道,并对日志进行清洗处理成我们想要的json数据,输出保存到elasticsearch 索引库;
elasticsearch 是一个强大的java分布式开源搜索引擎,它基于lucene实现索引和搜索的功能,使用RESTful API处理所有请求,这里我们主要用于日志数据存储和检索查询;
kibana 是一个针对elasticsearch的web工具,基于nodejs开发,这里我们用于web查询和统计界面定制;

一、系统环境

服务器系统统一都是 CentOS6.6,日志采集的 应用服务器 如下,安装 filebeat-5.2.1 并分别定义不同的采集策略。
PHP server 192.168.100.191
:采集PHP-fpm的异常日志
:采集PHP-slow的慢速日志
mysql server 192.168.100.195
:采集mysql-slow的慢速日志

日志服务器 只部署了一台,安装 logstash/elasticsearch/kibana在一起,不过都是可分开,且前两者可集群部署。
logs server 192.168.100.120
:logstash-5.2.1 监听TCP-5044端口,用于收集filebeat发送过来的日志
:elasticsearch-5.2.1 监听TCP-9200端口,用于存储 logstash 输出的日志数据
:kibana-5.2.1 监听TCP-5601端口,用于日志web数据查询

二、安装

在应用服务器上安装 filebeat 采集器

使用rpm安装包
# rpm -ivh filebeat-5.2.1-x86_64.rpm
基本配置文件路径
# vim /etc/filebeat/filebeat.yml
启动和停止filebeat的方法
# /etc/init.d/filebeat start
最后一次日志采集的定位,这个文件别修改了
# ls -l /var/lib/filebeat/registry
采集操作日志
# ls -l /log/log/filebeat/filebeat

在日志服务器上安装 elasticsearch

elasticsearch需要java运行环境支持
# yum install java-1.8.0-openjdk
# rpm -ivh elasticsearch-5.2.1.rpm
默认的安装路径
# ls -l /usr/share/elasticsearch
默认配置目录和文件
# ls -l /etc/elasticsearch/elasticsearch.yml
在配置文件中指定的数据目录和日志目录
# ls -l /data/elasticsearch
默认启动和停止elasticsearch的方法
# /etc/init.d/elasticsearch start

在安装中遇到的一个问题,其他的 sysctl 参数问题可以 google下

报错:
ERROR: bootstrap checks failed
system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk

原因:
这是在因为Centos6不支持SecComp,而ES5.2.0默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动。

解决:
在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false

在日志服务器上安装 logstash

logstash需要 java的运行环境
# rpm -ivh logstash-5.2.1.rpm
默认的安装路径
# ls -l /usr/share/logstash
默认的配置路径,指定配置文件目录、日志目录
# more /etc/logstash/logstash.yml
path.data: /var/lib/logstash
path.config: /etc/logstash/conf.d
path.logs: /var/log/logstash
作为filebeat接收器的配置文件,实验中很重的一个规则配置文件
# ls -l /etc/logstash/conf.d/filebeat.conf
默认启动和停止logstash的方法
# initctl start logstash

在日志服务器上安装 kibana

通过源码方式下载和安装kibana5
# tar zxvf kibana-5.2.1-linux-x86_64.tar.gz
# mv kibana-5.2.1-linux-x86_64 /usr/local/
# ln -s /usr/local/kibana-5.2.1-linux-x86_64 /usr/local/kibana
基本配置文件,主要是设定端口和elasticsearch的连接参数
# more /usr/local/kibana/config/kibana.yml
server.port: 5601
server.host: "192.168.100.120"
elasticsearch.url: "http://192.168.100.120:9200"
这里通过nohup启动kibana后台运行,源码包里自带nodejs运行环境,可以通过nohup.out观察输出
# nohup /usr/local/kibana/bin/kibana &

web浏览:http://192.168.100.120:5601

三、配置

1、在应用服务器上的 filebeat 配置

采集 mysql-slow 日志:/etc/filebeat/filebeat.yml

filebeat:
  prospectors:
    -
      #设置输入的类型为日志文件,以及日志路径
      input_type: log
      document_type: "mysql-slow"
      paths:
        -  /data/app/mysql/data/test08-slow.log
      #设置多行合并匹配规则,反向匹配,匹配行首不是# User@host 或者# Time:的行合并,根据slow日志的格式来调整吧
      multiline.pattern: '^[#][ ][User@Host:]i|[#][ ][Time:]'
      #multiline.pattern: '[#][ ][Time:]'
      multiline.negate: true
      multiline.match: after
      #过滤设置,黑名单。包含“Time:”的行,这个过滤是为了把不符合规则的日志清洗,但它只能对合并之后的数据进行
      exclude_lines: ["Time:"]
output:
  # 输出到 logstash,指定后端的连接参数,和logstash的设置匹配
  logstash:
    hosts: ["192.168.100.120:5044"]
logging:
  level: debug

采集 php的php-fpm和slow日志:/etc/filebeat/filebeat.ym

filebeat:
  prospectors:
    #定义第一个输入,针对php-fpm日志
    -
      input_type: log
      document_type: "php-fpm"
      paths:
        -  /data/app/php5.5.20/var/log/php-fpm.log
      #定义多行匹配规则,这里有3个正向条件(包含Stack strace:的行、包含空格+数字+.的行、包含空格+thrown in的行)
      multiline.pattern: '(Stack\strace:)|(\s[0-9]\.)|(#[0-9]{2}\s)|(\"\")|(\s\sthrown\sin)'
      multiline.negate: false
      multiline.match: after
      #过滤设置,白名单。包含WARNING的汗
      include_lines: ["WARNING"]
    #定义第二个输入,针对slow日志,因为每个pool是单独的slow日志,所以通配符多个日志
    -
      input_type: log
      document_type: "php-slow"
      paths:
        -  /data/app/php5.5.20/var/log/*.log.slow
      #定义多行匹配规则,反向匹配,把[数字]的行向上合并
      multiline.pattern: '[\[][0-9]{2}'
      multiline.negate: true
      multiline.match: after
output:
  logstash:
    hosts: ["192.168.100.120:5044"]
logging:
  level: debug

2、在日志服务器上 elasticsearch 的配置

单节点基础配置,如果配置集群请参考其他文档

root# more /etc/elasticsearch/elasticsearch.yml
#定义es集群名称
cluster.name: bosheng_logs
#定义该节点的名称,各个节点不能重复
node.name: node1
#配置数据目录,注意elasticsearch会有自己的运行用户,要赋予目录此用户的权限
path.data: /data/elasticsearch/data
#配置日志目录
path.logs: /data/elasticsearch/logs
#关闭锁定内存
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
#指定本机IP地址
network.host: 192.168.100.120
#指定http访问端口
http.port: 9200

3、在日志服务器上配置 logstach

主要是filebeat.conf 的配置,因为涉及到日志的收集和清洗,这是最主要的配置,包括对各种应用日志的规则匹配后输出指定变量的json数据给elasticsearch
值得注意的是,logstash的启动很慢(相当的慢,几分钟你不要吃惊),在调试grok规则语法的时候不是很方便,可以使用在线调试器先测试通过
https://grokdebug.herokuapp.com/

#定义logstash的一个输入源,这里定义的是beats,以及监听的端口,用来接收filebeat传输过来的数据
input {
    beats {
        port => "5044"
    }
}
filter {
    #对于type是php-fpm(和filebeat的document_type设置匹配)的日志用此规则处理
    if[type] == "php-fpm" {
        grok {
            match => [
                #和下面的比对,会发现这个正则匹配规则的写法有点特殊,这是一种多条件匹配的格式,如果日志存在多种格式的话
                "message", "(?m)^\[%{MONTHDAY}-%{MONTH}-%{YEAR}\s%{TIME}\]\s(%{WORD:level})\:\s\[(%{WORD})\s(%{WORD:poolname})\]\s(child)\s%{NONNEGINT}\s(said\sinto\sstderr:\s)%{DATA:info}(?:\n%{GREEDYDATA})?$",
                "message", "^\[%{MONTHDAY}-%{MONTH}-%{YEAR}\s%{TIME}\]\s(%{WORD:level})\:\s\[(%{WORD})\s(%{DATA:poolname})\]\s(child)\s%{NONNEGINT},\s%{DATA:info}(\s\(%{NONNEGINT}%{DATA})$",
                "message", "^\[%{MONTHDAY}-%{MONTH}-%{YEAR}\s%{TIME}\]\s(%{WORD:level})\:\s\[(%{WORD})\s(%{DATA:poolname})\]\s(child)\s%{NONNEGINT}\s%{DATA:info}$"
            ]
        }
    }
    #对于type是php-slow(和filebeat的document_type设置匹配)的日志用此规则处理
    if[type] == "php-slow" {
        grok {
            match => ["message", "(?m)^\[%{MONTHDAY}-%{MONTH}-%{YEAR}\s%{TIME}\]\s\s\[(pool)\s(%{DATA:poolname})\]\s(pid\s%{NONNEGINT})\n%{DATA:filename}\n%{GREEDYDATA}$"]
        }
    }
    #对于type是mysql-slow(和filebeat的document_type设置匹配)的日志用此规则处理
    if[type] == "mysql-slow" {
        grok {
            match => ["message", "(?m)^#\s+User@Host:\s+%{USER:user}\[[^\]]+\]\s+@\s+\[(?:%{IP:clientip})?\]\n#\s+Query_time:\s+%{NUMBER:query_time:float}\s+Lock_time:\s+%{NUMBER:lock_time:float}\s+Rows_sent:\s+%{NUMBER:rows_sent:int}\s
+Rows_examined:\s+%{NUMBER:rows_examined:int}(?:\n+use\s+%{USER};)?\nSET\s+timestamp=%{NUMBER:timestamp};\n\s*(?<query>(?<action>\w+)\b.*)\s*(?:\n#\s+Time)?.*$"]
        }
    }
}
#为每一种不同type设置的日志配置不同的索引集,并传递document_type
output {
    if[type] == "php-fpm" {
        elasticsearch {
            hosts => ["192.168.100.120:9200"]
            index => "php-%{+YYYY.MM.dd}"
            document_type => "%{[@metadata][type]}"
        }
    }
    if[type] == "php-slow" {
        elasticsearch {
            hosts => ["192.168.100.120:9200"]
            index => "phpslow-%{+YYYY.MM.dd}"
            document_type => "%{[@metadata][type]}"
        }
    }
    if[type] == "mysql-slow" {
        elasticsearch {
            hosts => ["192.168.100.120:9200"]
            index => "mysql-%{+YYYY.MM.dd}"
            document_type => "%{[@metadata][type]}"
        }
    }
}

logstash提供了一个默认正则变量定义文件,包括%{USER}、%{IP}、%{NUMBER} 、%{DATA}等,路径如下,同目录下也可以看到其他的一些默认规则定义
/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns/grok-patterns

在上面我们所用到的logstash配置中,涉及到的一些正则匹配规则如下,可以作为参考,毕竟要更具自己的日志格式进行调整

(?m)
打开多行模式的开关
^#
以 # 字符顶头
\s+
匹配一个或多个空字符
\s*
0个或多个空字符
%{USER:user}
以 USER 模式进行正则匹配,结果放在user中
\[[^\]]+\]
以 [ 开头 以]结尾,内容是由一个或多个不是 ] 的字符填充而成
\[(?:%{IP:clientip})?\]
以 [ 开头 以]结尾,内容可能有,也可能无,如果有并且匹配 IP 的正则模式,结果放在clientip中
%{NUMBER:id:int}
以 NUMBER 模式进行正则匹配,为整数型,结果放在id中
\n
配换行符
%{NUMBER:query_time:float}
以 NUMBER 模式进行正则匹配,为浮点型,结果放在query_time中
(?:use\s+%{USER:usedatabase};\s*\n)?
这个匹配可能有,也可能无,如果有,就是以use开头,若干空字符,以 USER 模式进行正则匹配,结果放在usedatabase中,然后紧接着 ; ,后面是0个或多个空字符,然后是换行,注意:如果有是整体有,如果无,是整体无
\b
代表字单词边界不占位置,只用来指示位置
.*
尽可能多的任意匹配
(?<query>(?<action>\w+)\b.*)
整体匹配,存到query中,以一个或多个字符开头组成的单词,结果存到action中
(?:\n#\s+Time)?
内容可能有,也可能无,如果有,是接在一个换行之后,以 # 开头,隔着一个或多个空字符,然后是Time
.*$
任意匹配直到结尾

四、一些基本的调试方法

查看目前的索引库
http://192.168.100.120:9200/_cat/indices?v

通过 RESTful 查询索引库
http://192.168.100.120:9200/mysql-*/_search

通过RESTful删除一个elasticsearch的索引库
curl -XDELETE http://127.0.0.1:9200/phpslow-2015.06.0*

使用kibana查询,通过浏览器访问
http://192.168.100.120:5601

知乎:中小学教育社区产品问答

在知乎竟然有人邀请答题,好吧,正好把最近所想稍稍整理了一段,快媒体适应以后也很少发blog,就把这也作为一篇博文吧。

感觉在知乎上关注教育的人不少,但对中小学教育关注的貌似不多。
链接地址:http://www.zhihu.com/question/21438480 

谢邀,在回答问题之前,先谈谈我对互联网与中小学教育的一点点认识,也作为对于中小学社交系统的一点交流。以下教育特指中小学教育,这里不涉及大学和社会职业教育领域方面。

义务和高中教育是一个很复杂的领域,涉及的对象很多,从教育管理者(省市县区校各级行政从业人员)、研究者(教课教研部门的从业者)、教师(科目老师班主任等)、学生(小初高)以及家长(最终的金主),年龄、地域、认知能力、关注点等等各个方面都不相同,学生这个群体的年龄跨度都十分的大,小学生、初中生和高中生的社交行为和环境完全不同,义务教育阶段的学生以走读为主,社交活动集中在家庭、班级,高中生以住读为主而且面临升学压力,其社交环境相对单调,但其以及具备一定的社会化认知能力,各种不同角色和人生阶段的用户行为习惯也是不一样的。

现实中小学教育对象的生态链条很有趣,用户的现实教育活动是需要引导和驱动的,行政人员分部门逐级向下管理,行政管理的末梢实际在校长,但对老师的管理校长最有力,中小学阶段老师对学生有无上权威,班主任是家长绝对的指挥棒,这是教育关系和社会化社区中很大的一个不同。

教育关系的推送和保持也与社会化社交不同,学生每年要升级涉及到班级关系教师关系的变化,特别是在小学初中高中这种阶段性的变化,会很大程度上打散已经维持若干年的固定关系进行重组。同时,教育地域性分隔特别明显,不同省份之间的教材考题都不一样,不同学校之间还有竞争关系,这些都为社区平台的推广存在障碍。

社会化中小学教育市场目前主要有托管(主要是小学生,每日作业)、特长(艺术体育等方面,假期为主,主要是小学生)、培优(作文英语奥数之类,主要针对中小学,也以假期为主)、冲刺(主要面对中高考)若干个方面。教育行政这条线和社会市场这条线目前来讲交集很少(虽然很多社会市场的教师资源来源于行政体系),而且某些程度上是对立的竞争的,我们的学生和家长从这个围墙出来又被领到另一个院子,但从教育社交网站来看,这两种形态的用户是一致的,所以是可以统一的。

现在许多人在讲用互联网的方式来做教育,个人认为这种方式是有利有弊的,互联网因子能为用户提高更爽的科技体验(毕竟现在是一个体感时代),打破过去和现在许多教育产品死气沉沉的“怀旧”色彩。那就目前而言,中小学教育更多还是一种管理行为,是管理者和老师驱动的,单纯从终端用户角度来做教育产品(淘宝这种方式)目前很难(但我个人觉得是以后的趋势),特别是社区(这里的社区不是指学科类那种)这样的基础平台型产品,要达到完整覆盖,目前无法摆脱行政,某种程度上还需要依靠行政。最重要的是,教育本身是个长期积累的过程,不管是从用户成长、成效收益、数据积累哪个方面来说,而目前的互联网产品的理念是短平快,期待短期收益和爆发式增长。这么多年来我都非常讨厌那些期望在教育行业的短期投资行为,小学阶段六年初中三年高中三年,人生最少有12年最美好的时间在这个阶段,做教育本身就是一个教育的过程。

上面叽歪乱说一通,不好意思,下面回答问题:

1、强关系前期推动肯定是有利的,当时忧患在于会让用户产生这是一个管理平台而不是具有个人空间感的社交平台,毫无以为前者很难产生用户黏性价值。关于用户隐私性的问题,首先,教育社区最好具备较严格的实名环境,一方面规避内容风险,一方面打造诚信关系;其次,用户隐私必须严格保证,在利益面前老师也有可能泄漏学生信息,社区系统数据积累到一定程度是非常宝贵的,需要尽量保证不把用户的个人联系和关键信息泄漏给其他用户或第三方,对老师你可以给提供通讯管道,对第三方可以使用接口API控制。
2、线下用户导入线上必须要有一定的引导策略(可以考虑用现实活动、关键性应用等,根据自身优势条件吧),直接把线下关系数据库导入是最原始的做法,对于社交关系体验作用不大,不过可以作为用户基础社区关系构建的原始依据。
3、这个貌似和上面的问题差不多,上面也讲到了一些。
4、让用户来构建关系必须要有抓手,举个例子,如果让三年级的班主任老师通知学生家长,每天到这个平台来查看当天的家庭作业,这样是不是就可以把学生家长群体引导上来了(当然各省家校通有这个功能,举例而已不做考评),在具体的教育活动中有很多这样的点,管理者也有,这要看你们的具体的行业能力了。
5、你考虑到的这些业务,趣味学习应用、资源分享、名师影响、课程辅导、线上答疑等,我都把他们当作一种应用,对于教育社区来讲,都是作为增加平台黏性,功能的一种手段,每一种往深里做都是一片天地,而且每个方面现在线上都有成熟的范例,可以google一下。
6、补充:首先,教育社区平台绝对是一个很大的概念,怎么做取决你拥有的各种资源条件和能力考量,但一定要明确产品方向、具体的服务对象;其次,互联网产品体验的通用法则必须遵循。

最后的纠正一下你的问题:中小学教育社区产品其实国内有非常成熟的,那就是腾讯,你可以看看中小学各类用户用得最多的是什么,呵呵,我这里中小学注册用户90%使用的是qq邮箱,教育关系在他那都是现存的,只是腾讯目前好像还不愿意付出精力来做教育细分市场,缺乏投入、梳理和理念规划,也许已经在做,谁知道呢。

虽然已经在这个行业十几年了,但我们现在也还是在摸索,敲这么多字真是大累了。

在centos6上建立openvpn server

工作需要建个vpn,便于远程到内网环境来开发,内部设备也好维护。使用centos6自带的openvpn rpm包即可。

# yum install openvpn

# cd /etc/openvpn
# cp /usr/share/doc/openvpn-2.2.2/sample-config-files/server.conf ./
# mkdir -p easy-rsa/keys
# cd easy-rsa/
# cp /usr/share/openvpn/easy-rsa/2.0/* ./

# source ./vars
# ./clean-all
建立公用证书
# ./build-ca
建立服务器的私key
# ./build-key-server dev05
# ./build-dh
如果client要使用证书方式(非用户名密码)登录,建立client证书
# ./build-key wp-client

编辑openvpn server配置文件

# vim /etc/openvpn/server.conf
监听openvpn端口
port 1989
使用tcp or UDP,前者稳定
proto tcp
使用的设备
dev tap

证书key之类的,上面的操作建立的
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/dev05.crt
key /etc/openvpn/easy-rsa/keys/dev05.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem

允许执行外部脚本(openvpn2.1以上默认禁止执行外部脚本,这个很重要,让我纠结了很久,用户名密码验证的脚本需要这个)
script-security 3

是否允许一个用户同时登录多个session
duplicate-cn

验证方式(使用外部shell脚本验证用户密码)
auth-user-pass-verify /etc/openvpn/checkpw.sh via-env
client-cert-not-required
username-as-common-name

这个是用户名密码验证脚本

[root@dev05 openvpn]# more checkpw.sh
#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman
#
# This script will authenticate OpenVPN users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.

PASSFILE=”/etc/openvpn/pass”
LOG_FILE=”/etc/openvpn/openvpn-password.log”
TIME_STAMP=`date “+%Y-%m-%d %T”`

###########################################################
if [ ! -r “${PASSFILE}” ]; then
echo “${TIME_STAMP}: Could not open password file \”${PASSFILE}\” for reading.” >> ${LOG_FILE}
exit 1
fi

CORRECT_PASSWORD=`awk ‘!/^;/&&!/^#/&&$1==”‘${username}’”{print $2;exit}’ ${PASSFILE}`

if [ “${CORRECT_PASSWORD}” = “” ]; then
echo “${TIME_STAMP}: User does not exist: username=\”${username}\”, password=\”${password}\”.” >> ${LOG_FILE}
exit 1
fi

if [ “${password}” = “${CORRECT_PASSWORD}” ]; then
echo “${TIME_STAMP}: Successful authentication: username=\”${username}\”.” >> ${LOG_FILE}
exit 0
fi

echo “${TIME_STAMP}: Incorrect password: username=\”${username}\”, password=\”${password}\”.” >> ${LOG_FILE}
exit 1

最后用iptables加一条NAT

# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j SNAT –to-source 172.16.0.5

—————————————————————————————-
[root@dev05 openvpn]# more pass
wp1998 xxxxxxx
注意:中间是tab
—————————————————————————————-

客户端的配置 wp-client.ovpn

dev tap
proto tcp
ca ca.crt
如果使用证书登录就打开下面这两个,当然要下载服务器生成的
# cert wp-client.crt
# key wp-client.key
使用用户名密码需要,证书登录不需要这个
auth-user-pass

为什么选择教育社区

在教育信息中心的泥沼里沦陷了十多年,前五年应该属于学习成长期,互联网行业的发展远远没有如今的成熟,所有的一切工作都是从零开始,所有的一切都很刺激兴奋,让人很有成就感,所以很感激有这样的环境。但是后面的若干年,工作环境的发展已经远远落后于行业的发展,个人也陷于各种的事务,物质环境的成熟让人也逐渐懈怠和停滞,个人感觉这是一件挺可怕的事儿。

我不是决策层,所以仅就从业务层面来谈谈,我为什么要选择教育社区。

在去年底,那次头脑风暴的闭关中涌现出来的教育社区的想法,并不是一时兴起。就信息中心现有的网站来说,真正和教育相关的都是教育管理性的平台,其他一些更多的属于行政事务的资讯发布,并没有什么社会化的流量,从效益角度来说这属于湖北日报之类不可能创造广告价值的,从流量角度来说缺乏社会参与也不可能有用户价值。当然,里面也有一部分具有较高用户附加值的功能应用,但是却被行政化的分割切得七零八落,有价值的东西也变得没法卖了。

就拿用户流量来说吧,2010年zsxx的单站日PV最高达到了1500万,但是你问zsxx的用户有多少却没人能答得出来,用户上来逛了一圈就走了,没有任何流量引导也没有任何的附加价值体现,这就像站在街头卖艺的,虽然趁着生活娱乐枯燥乏味挣得了一些眼球,却不知道开个茶馆把老百姓领进来运营。所以,我一直觉得这是件很惋惜的事情,我们不仅仅错过了流量变现的机遇,更悲催的是失去了业务转型和产品创新的能力,更可惜的是把一批这么早踏入互联网的年轻人变成了现实主义中年人。

上面这段有点扯远,但是和教育是相关的。这样一个缺乏应用和数据挖掘的招生信息还能拉到几百万的广告费,这本就说明目前的教育消费市场远远要比其他的盲目,学校用户在这里做广告从来没有对广告价值和效果进行评估,他们相信的是管理者的牌匾,而不是真正的价值体现。但是,我不认为这样的盲目消费能长久下去,一方面,用户的资金投放会越来越规范;另一方面,但你能真正为这些用户创造价值,并让它得到价值收获,从长期发展来说,它会做出选择。

目前国内的中小学教育还是停留在行政事业管理的形态上,一级级的管理层次很明确,上级管下级,教育局管学校,学校管老师,老师管学生和家长,我们现在所做的管理系统都源于行政管理扁平化的需要,很多管理系统设计都是在压缩管理路径,网络是天然的缩短路径的方式,也因此,行政管理者也觉得这样和传统方式相比很过瘾,乐在其中。问题在于,教育教学的最原始目的是学生和教师的个人成长,从管理思维出发的各种系统各种平台却很少能满足这种需求。从运营角度来说,这种管理系统是无法转化成社会效应和经济利益的,只是,伴随管理系统的数据资源是有价值来利用的,也仅此而已。

目前火爆的社会教育市场上,大多数公司从某种程度来说更像是行政教育市场的附属品,他们销售的是更有效获取分数的捷径和产品,但从市场运作来说他们更社会化一些,比如口碑传销和品牌化,所以他们更能满足用户的直接需求。当然现在也有一些专注于个人发展的社会化公司,比如对于学生特长、兴趣培养方面的,但这些和正规的学校教育市场好比割裂的两个方向,对于学生和家长来说也只是甜品。对于最核心的正规学校教育市场来讲,目前仍在行政管理的掌控中,它和互联网行业还处在两个轨道上,但是它将向什么方向发展呢?因为在如今多元化平行的世界中,用户是有选择性的,面对不适应个人发展的教育环境,人们会用脚来投票。

学生、家长和老师这些基本教育用户不仅仅应该像现在这样被动的接受教育,他们应该能选择教育、能创造知识和能分享兴趣。就我接触的教育和互联网两个行业的人来看,相比互联网对电子商务的影响,教育特别是中小学教育和互联网并未紧密融合,互联网的发展并没对教育方式产生根本性的改变。同时,对基础教育和互联网都了解的专家极少,现在的中小学教育专家不能认知互联网对社会的影响程度,而互联网专家对教育这种以人为本的市场也无法认知。

教育大方向是目标更单调的分数化还是更多选择的个性化,这种选择决定了教育平台的形态,这也是社会发展潮流中的一条道路,而我选择后者。SNS这种平台是能够满足个性发展这种需求的,平等、自由、个性是社区的基本特征,谈到这些有些人就会觉得可怕。其实在这种环境的平台下通过适度的引导、挖掘和构建是能够满足个性化教育的需求的。

从某种程度来讲,选择教育社区也是在选择未来的一种教育发展方向。

(胡乱瞎想了一些,感觉没什么条理,更多的是从自我意识出发,后面会再加一篇对教育社区的问答分析。)