0

我的帖子

个人中心

设置

  发新话题

ELKR分布式搭建nginx日志分析系统

一.名词介绍
1、什么是elk
ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,Elasticsearch,Logstash 和 Kibana。这三款软件都是开源软件,通常是配合使用。
2、Elasticsearch
2.1.Elasticsearch介绍
Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写。
2.2Elasticsearch特点
(1)实时分析
(2)分布式实时文件存储,并将每一个字段都编入索引
(3)文档导向,所有的对象全部是文档
(4)高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards和 Replicas)
(5)接口友好,支持 JSON
3、Logstash
3.1Logstash介绍
Logstash 是一个具有实时渠道能力的数据收集引擎。
3.2Logstash特点
(1)几乎可以访问任何数据
(2)可以和多种外部应用结合
(3)支持弹性扩展
3.3Logstash它组件
(1)Shipper-发送日志数据
(2)Broker-收集数据,缺省内置 Redis
(3)Indexer-数据写入
4、Kibana
4.1Kibana介绍
Kibana 是一款基于 Apache 开源协议,使用JavaScript 语言编写,为 Elasticsearch 提供分析和可视化的 Web 平台。它可以在 Elasticsearch 的索引中查找,交互数据,并生成各种维度的表图。

二.环境介绍

环境介绍:Ubuntu 14.04
elasticsearch-5.2.2.deb  kibana-5.2.2-amd64.deb logstash_2.1.3-1_all.deb  java1.8  redis2.8.4
2.1ELK 组件的作用
Elasticsearch 抓取日志分析
Logstash 日志格式处理
Kibana 前端数据可视化展示
2.2 ELK
ELK(R) = Elasticsearch + Logstash + Kibana (+ Redis) 是一套完整的工业级日志分析工具。
拓扑图:


总的来说,ELK(R) 这套技术栈提供了一套完整的日志分析解决方案。
三.ELK安装
3.1 安装3.1.1 系统环境检查要安装
ELK(R),首先需要检查自身系统环境:

检查当前系统的版本。
root@6ae60c614623:/home/hao# cat /etc/issue
Ubuntu 14.04.5 LTS \n \l
其次,
Elasticsearch 还依赖 Java 的环境,因此还需要确保 Java 环境:
复制内容到剪贴板
代码:
root@6ae60c614623:/home/hao# java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
此外,正如前面所说,
Redis 自身并不属于 ELK 技术栈,而是 Logstash 具备的一个插件,属于 Logstash 的依赖。所以我们还要检查 Redis 环境。
复制内容到剪贴板
代码:
root@6ae60c614623:/home/hao# redis-server -v
Redis server v=2.8.4 sha=00000000:0 malloc=jemalloc-3.4.1 bits=64 build=a44a05d76f06a5d9
如果没有启动,则可以
root@6ae60c614623:/home/hao# netstat -antulp | grep 6379
root@6ae60c614623:/home/hao# service redis-server start
Starting redis-server: redis-server.
关闭redis,最好的办法就是直接杀掉 redis 的所在进程:
复制内容到剪贴板
代码:
root@6ae60c614623:/home/hao# ps -u root -o pid,rss,command | grep redis
  363   648 grep --color=auto redisThen
kill -9 the_pid


3.1.2
用deb包的方式下载和安装可以使用wget命令下载,这些包可以官网去下载,但是非常的慢,dpkg -i安装,就可以不用管下面的安装方法了
复制内容到剪贴板
代码:
#下载
wget http://labfile.oss.aliyuncs.com/courses/562/elasticsearch-5.2.2.deb
wget http://labfile.oss.aliyuncs.com/courses/562/kibana-5.2.2-amd64.deb
wget http://labfile.oss.aliyuncs.com/courses/562/logstash_2.1.3-1_all.deb
#安装
dpkg -i elasticsearch-5.2.2.deb
dpkg -i kibana-5.2.2-amd64.deb
dpkg -i logstash_2.1.3-1_all.deb



3.1.3用apt-get的方式下载安装
1.安装 Elasticsearch
无论是 ELK 中的哪个部分,他们都还在快速迭代当中,所以我们要竟可能的选择最新的版本。
安装有很多方式让我们选择,比如自行下载源码安装,比如向软件包源中添加软件源使用 apt-get 来安装。
无论如何,我们都推荐使用 apt-get 进行安装,因为这种方式的安装便于管理和维护。
首先我们需要添加 Key:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
然后添加官方的安装源:
echo "deb https://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
复制内容到剪贴板
代码:
root@6ae60c614623:/home/hao# sudo apt-get update
Ign http://mirrors.aliyuncs.com trusty InRelease
Get:1 http://mirrors.aliyuncs.com trusty-updates InRelease [65.9 kB]
Get:2 http://mirrors.aliyuncs.com trusty-security InRelease [65.9 kB]
Hit http://mirrors.aliyuncs.com trusty Release.gpg   
Hit http://mirrors.aliyuncs.com trusty Release      
Get:3 http://mirrors.aliyuncs.com trusty-updates/main Sources [496 kB]
Get:4 http://mirrors.aliyuncs.com trusty-updates/restricted Sources [6470 B]
Get:5 http://mirrors.aliyuncs.com trusty-updates/universe Sources [235 kB]
Get:6 http://mirrors.aliyuncs.com trusty-updates/main amd64 Packages [1249 kB]
Get:7 https://packages.elastic.co stable InRelease   
Ign https://packages.elastic.co stable InRelease
Get:8 http://mirrors.aliyuncs.com trusty-updates/restricted amd64 Packages [21.2 kB]
Get:9 http://mirrors.aliyuncs.com trusty-updates/universe amd64 Packages [541 kB]
Get:10 https://packages.elastic.co stable Release      
Get:11 http://mirrors.aliyuncs.com trusty-security/main Sources [176 kB]      
Get:12 http://mirrors.aliyuncs.com trusty-security/restricted Sources [5068 B]
Get:13 http://mirrors.aliyuncs.com trusty-security/universe Sources [72.1 kB]
Get:14 https://packages.elastic.co stable/main amd64 Packages
Get:15 http://mirrors.aliyuncs.com trusty-security/main amd64 Packages [799 kB]
Get:16 http://mirrors.aliyuncs.com trusty-security/restricted amd64 Packages [17.9 kB]
Get:17 http://mirrors.aliyuncs.com trusty-security/universe amd64 Packages [228 kB]
Hit http://mirrors.aliyuncs.com trusty/main Sources     
Hit http://mirrors.aliyuncs.com trusty/restricted Sources
Hit http://mirrors.aliyuncs.com trusty/universe Sources
Hit http://mirrors.aliyuncs.com trusty/multiverse Sources
Hit http://mirrors.aliyuncs.com trusty/main amd64 Packages
Hit http://mirrors.aliyuncs.com trusty/restricted amd64 Packages
Hit http://mirrors.aliyuncs.com trusty/universe amd64 Packages
Hit http://mirrors.aliyuncs.com trusty/multiverse amd64 Packages
Fetched 3985 kB in 15s (265 kB/s)                                             
Reading package lists... Done
W: Size of file /var/lib/apt/lists/mirrors.aliyuncs.com_ubuntu_dists_trusty-updates_restricted_binary-amd64_Packages.gz is not what the server reported 21216 23469
W: Size of file /var/lib/apt/lists/mirrors.aliyuncs.com_ubuntu_dists_trusty-security_restricted_binary-amd64_Packages.gz is not what the server reported 17859 20228
接下来就可以开始安装了:
sudo apt-get install elasticsearch
安装完成后,我们就可以运行 Elasticsearch 服务了:
sudo service elasticsearch start

2.安装 logstash
echo "deb https://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list
同样的方法:
sudo apt-get update
安装:
sudo apt-get install logstash
运行服务:
sudo service logstash start

3.安装 Kibana
同理,在 /etc/apt/sources.list 中添加 Kibana 的安装源:
echo "deb http://packages.elastic.co/kibana/4.5/debian stable main" | sudo tee -a /etc/apt/sources.list
更新:
sudo apt-get update
安装:
sud apt-get install kibana
运行服务:
sudo service kibana start

报错:
root@6ae60c614623:/home/hao# sudo service kibana start
kibana started
root@6ae60c614623:/home/hao# sudo service logstash start
/etc/init.d/logstash: 68: ulimit: error setting limit (Operation not permitted)
logstash started.
root@6ae60c614623:/home/hao# sudo service elasticsearch start
* Starting Elasticsearch Server                                                                              /etc/init.d/elasticsearch: line 139: ulimit: open files: cannot modify limit: Operation not permitted
sysctl: setting key "vm.max_map_count": Read-only file system
在启动Logstash 和 Elasticsearch 的时候,有这样几个警告:
Elasticsearch,『ulimit和只读文件系统错误』
Logstash,『ulimit 错误』

第一步:解决 Elasticsearch:
sudo vim /etc/init.d/elasticsearch
在 vim 中使用 :set nu 来开启行号,注释掉 138行至 148行:
其实只需要注释掉报错的部分就好了,可能版本有些不同,所以行号不一定一样,主要看注释掉的内容

重启服务:
sudo service elasticsearch stop
sudo service elasticsearch start

第二步:解决 Logstash:
同理,注释掉 /etc/init.d/logstash 中 68 行 和 69 行的内容:

并重启服务:
sudo service logstash stop
sudo service logstash start

这时候访问 localhost:5601 就能够看到 Kibana 已经在运行,但现在还不能正式使用:
四.部署日志
既然我们要构建日志分析系统,日志是必不可少的,我们所熟知的提供 Web 服务的工具,有 apache 和 nginx。
我们这里以 nginx 为例来部署产生日志的环境。
首先我们需要安装 nginx 环境,同样只需要使用 apt-get 即可。
复制内容到剪贴板
代码:
sudo service nginx start

我们需要配置 nginx 来获得用户访问的日志:

而nginx 的配置文件位于:
vi /etc/nginx/sites-available/default
下面修改将nginx 的配置添加:
复制内容到剪贴板
代码:
access_log /home/hao/Code/elk/access.log;
注意, 如果这个路径不存在,Nginx 服务会启动失败,这是权限原因造成的,最好的解决方法就是:root@6ae60c614623:/etc/nginx/sites-available# mkdir -p /home/hao/Code/elk/
root@6ae60c614623:/etc/nginx/sites-available# touch /home/hao/Code/elk/access.log
这时候重启 nginx 服务:
sudo service nginx stop
sudo service nginx start
然后在浏览器中访问:
http://localhost/
这时候我们可以看到刚才配置的 nginx 日志有新纪录了。每次访问这里就会多一条记录出来

# 检查服务状态
复制内容到剪贴板
代码:
sudo service redis-server status
sudo service elasticsearch status
sudo service logstash status
sudo service kibana status


五.logstash和elasticsearch配置
Logstash 配置基础
要确保每个服务都开启状态
Logstash 是打通日志文件和 Elasticsearch 之间的一个枢纽。和各种服务一样,Logstash 也有着自己的一套配置规则。
Logstash 的配置主要分为三大部分:input, filter, output。
Logstash 的主要命令都安装在了 /opt/logstash/bin 目录下,在这个目录下中,我们先执行:
sudo ./logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
Logstash 的 -e 参数为立即执行的意思
这时,终端会等待输入,我们可以简单的输入 Hello Logstash! 这时会看到有如下输出:


这说明 Logstash 已经顺利工作了。
这里可能等待的比较久,希望大家能够耐心一点,使用 ctrl+c
关闭当前 Logstash 执行的配置。
配置语法
我们先来观察刚才命令中的字符串:
'input{stdin{}}output{stdout{codec=>rubydebug}}'
将其格式化后:
input {
    stdin {}            
}
output {
    stdout {
        codec => rubydebug
    }
}
stdin {} 就是从标准输入
stdout {} 就是从标准输出
在这个字符串中,其实定义了 Logstash 的两个行为input和output。
在 input 中,我们定义了一个标准输入,由于什么都没有,所以 Logstash 会从终端的标准输入中读取字符串,这也是为什么刚才在输入完命令后会出现等待输入的情况。
在 output 中,我们定义了一个标准输出,也就是说 Logstash 在处理完后会将结果从标准输出(终端)中输出,而 codec 字段,则说明了输出会遵循什么样的格式,这里定义的 codec 为 rubydebug,所以我们刚才看到了一套标准的输出格式。

有了对 Logstash 配置语法的基本认识,我们可以开始配置 从 Log 到 Logstash 到 Elasticsearch 的配置文件了。
配置 Log->Logstash->Elasticsearch
由于 Logstash 的配置很长,所以我们不太可能在一行命令中吧整个配置写好,所以我们先在 /etc/logstash/conf.d/logstash-shipper.conf 创建 Logstash 的配置文件:
我们现在要将日志文件作为输入,将日志分析系统elasticsearch作为输出
复制内容到剪贴板
代码:
input {
  stdin {}
  file {
    path => "/home/hao/Code/elk/access.log"
    start_position => beginning
    codec =>  multiline {
      'negate' => true
      'pattern' => '^\d'
      'what' => 'previous'
    }
  }
}
output {
    stdout {
        codec => rubydebug
    }
    elasticsearch {
        hosts=>["localhost:9200"]
        index=>"logstash-%{+YYYY.MM.dd}"
    }
  }
在这份配置中,我们加入了文件输入的配置,加入了elaticsearch分析系统的输入。
我们将 input 定义加入 file (文件)输入,并设置 start_position 从第一行开始,保证能够导入旧数据。
输出,此种举动一方面可以方便我们日后进行调试,另一方面可以将其作为 Logstash 的日志进行输出。
而 elasticsearch 则给出了向 elasticsearch 输入数据的申明。
配置完成后,我们可以使用 -t 参数来测试配置脚本是否配置正确:
/opt/logstash/bin/logstash -t -f /etc/logstash/conf.d/logstash-shipper.conf

但是一旦我们 ctrl+c 便会停止执行,Logstash 不会再向 elasticsearch 传送数据。
这时,我们需要将其挂在后台执行:
nohup /opt/logstash/bin/logstash -t -f /etc/logstash/conf.d/logstash-shipper.conf &

六.Kibana 可视化工具
我们成功的将日志数据写入了 Elasticsearch,配置Kibana 使得我们能够在前端页面上查看并分析这些数据。
创建 Kibana 索引模式
我们已经将 Logstash 进程跑在了后台,现在我们打开浏览器,访问 localhost:5601 便能看到 Kibana 的界面和以往有所不同,Kibana 提示我们可以创建索引模式,这里我们不做过多干涉,直接以时间戳创建索引模式:

看到 Kibana 为我们创建了 18 个字段(Fields)

我们点击顶部的 Discover ,便能来到 Kibana 的全局搜索界面,并能够看到在选定的时段内有多少记录被写入 Elasticsearch:

高级查询
在Kibana 中如果要进行更加精确的查询,则需要使用 Lucene。
例如,我们要在某个字段中搜索某个字符串是否存在。首先我们在终端中构造数据,在 一个 sudo /opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-shipper.conf 进程下,依次输入 hello world、how do you do、what's wrong with you,chenhao。
这时候 Logstash 会输出四条记录:



下面我们准备搜索在所有的记录中,出现单词 you 的记录。
这时我们可以输入:message: *you*。这里的 message:是指明要搜索的字段,you是要搜索的字符,* 是通配符。
这时我们可以看到,刚才插入的 what's worng with you 和 how do you do 这两个满足条件的结果均已被高亮在了下方:

我们搞定了 Kibana 的可视化部分。
将启用 Redis 作为缓存,搭建的分布式 ELK+Redis 日志环境

七.用redis部署分布式ELK
署环境简化为了 nginx Log->Logstash->Elasticsearch->Kibana
5.1 Logstash Redis 插件及其配置
Redis 本身并不属于 ELK 技术栈里的一份子,而是作为一个插件存在于 ELK 技术栈中。Redis 提供了一个很好的缓冲区,它能够很好的帮助我们在主节点上屏蔽掉多个从节点之间不同日志文件的差异,负责管理日志端(从节点)的人可以专注于向 Redis 里生产数据,而负责数据分析聚合端的人则可以专注于从 Redis 内消费数据,达到分层目的。
幸运的是 Redis 插件在最新版的 Logstash 中已经被集成,我们只需要简单的配置 Logstash 的相关文件即可。
首先我们要配置具备日志节点的 Logstash Shipper 的配置文件:
复制内容到剪贴板
代码:
input {
  stdin { }
  file {
    path => "/home/hao/Code/elk/access.log"
    start_position => beginning
    codec =>  multiline {
      'negate' => true
      'pattern' => '^\d'
      'what' => 'previous'
    }
  }
}
output {
  stdout {
    codec => rubydebug
  }
  redis {
    host => "localhost"
    data_type => "list"
    key => "logstash"
  }
}

这里配置了 output 的相关逻辑,将 output 指定到 redis 中,输出的数据类型为 list, redis 数据库中的 key 为 logstash。

3.2 配置Logstash Indexer
新建一个配置文件,它的输入是redis数据库,输出是elasticsearch分析系统
然后我们再配置 Logstash Indexer:
复制内容到剪贴板
代码:
input {
  redis {
    host => "localhost"
    type => "redis"
    data_type => "list"
    key => "logstash"
  }
}
output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    hosts=>["localhost:9200"]
    index=>"logstash-%{+YYYY.MM.dd}"
  }
}


当 Shipper 产生新的数据时候(输入hello chenhao),可以看到 Indexer 也会产生新的数据:
sudo /opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-shipper.conf
sudo /opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-indexer.conf

当这两个配置文件运行在不同服务器上时,便能做到真正的分布式了,唯一需要修改的地方就是 redis 的 host 字段值,其中 Logstash Shipper 中的地址应该填写 Logstash Indexer 所在地址,而 Logstash Indexer 中的 redis host 字段不需要修改,因为 redis 和 Loststash Indexer 运行在同一台机器上。

八.总结
收集nginx日志,集中展示。
不少人对 ELK 的第一印象,容易觉得它这个工具组合似乎挺难上手的,错!只需动手试试就知道啦!
目标分解:
1)熟悉 logstash 的安装和基本操作
2)熟悉 elasticsearch 的安装和基本操作,然后结合 logstash 使用
3)熟悉 kibana 的安装和基本操作,然后结合 elasticsearch 使用
Elasticsearch 是整个日志分析系统的核心,它负责对日志数据进行分析、索引等重要工作;Logstash 则主要用于对日志数据进行初步的过滤和筛选,例如,Logstash 可以将拥有日志数据的从节点(Slave Node)服务器内的日志数据发送到 Elasticsearch 的主服务器。
Kibana 则是为了让 Elasticsearch 更好的与用户进行交互而设计的一个 Web 前端工具,具备强大的数据可视化功能。Redis 本身并不属于 ELK 技术栈里的一份子,而是作为一个插件存在于 ELK 技术栈中。
Redis 提供了一个很好的缓冲区,它能够很好的帮助我们在主节点上屏蔽掉多个从节点之间不同日志文件的差异,负责管理日志端(从节点)的人可以专注于向 Redis 里生产数据,而负责数据分析聚合端的人则可以专注于从 Redis 内消费数据,达到分层目的。

九.报错解析
1.Kibana Unable to connect to Elasticsearch
若是此处显示的是警告没有看到上图所示的画面的话,注意看下方警告中访问的 elasticsearch 的地址与端口是否正确,因为 elasticsearch 默认是绑定在本地 localhost 端口上,所以地址应该是 localhost:9200 或者是 127.0.0.1。若不是可以修改一下 /etc/kibana/kibana.yml 中 elasticsearch 对应的地址与端口,然后重启试试。
2.max virtual memory areas vm.max_map_count[65530]is too low

vi /etc/security/limits.conf
添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
vi /etc/sysctl.conf  #添加一条
vm.max_map_count=655360
sysctl -p #执行

3. logstash Configuration Contains a Syntax Error
logstash 语法错误,这个问题一般各种各样的。主要是logstash配置文件不对导致的。
解决方法:
在启动logstash前,先检查下logstash配置文件是否有问题,可通过下面命令检测:
/opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/
后面指定你自己的配置文件。

十.参考文档
Logstash Redis 配置参考
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-redis.html
Kibana 用户指南
https://www.elastic.co/guide/en/kibana/current/index.html
配置 Logstash
https://www.elastic.co/guide/en/logstash/current/configuration.html



本帖最近评分记录
  • Shell_2015 无忧币 +14 精品文章 2017-8-5 21:40
  • 咖啡 无忧币 +20 厉害了我的哥~ 2017-8-4 17:28



期待后续 Grok 的介绍。



看得云里雾里的



引用:
原帖由 大头哈哈 于 2017-8-4 22:21 发表
看得云里雾里的
有什么不懂得可以直接在帖子下进行回复,楼主会尽快给您解答问题的呢



提示: 作者被禁止或删除 内容自动屏蔽
写的好细



ELK越来越火



提示: 作者被禁止或删除 内容自动屏蔽
引用:
原帖由 唛片 于 2017-8-8 16:27 发表
ELK越来越火
是的啊功能挺强大的!



提示: 作者被禁止或删除 内容自动屏蔽
大部分没问题,logstash有些问题
{"agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) \x09\x09\x09Chrome/55.0.2883.95 Safari/537.36","retime":"0.001"}
比如json转换的时候,这种就会转换失败 主要是\x09导致的
然后我看百度说nginx 日志选项那边有个参数可以避免这个问题 奈何要nginx11.8以上,我这边用的是lua的一个开源版本 最新版都没到11.8 所以打算在logstash filter模块里做我在filter {
mutate {
gsub => [ "message","\\x09","" ]
}
}
这里加了过滤后 发现 input 里的json是优先在这个过滤前面的,所以他会提示转换失败再显示删除\x09之后的字符串。。。有点小奔溃啊!
现在尝试把codec =>json 放在output, 让它先过滤再转json。。。

实验失败,把codec放output \x09是删掉了,但到kibana上看 就不是json了

最终还是解决了,附上logstash解决转json遇到\的问题filter {
    mutate {
    gsub => [ "message","\\x","16" ]
   }
    json {
         source => "message"
         remove_field => [ "message" ]
    }
}

先将\x转换为16,再转JSON 再移除message(如不移除转json后原先的message会被保存)


本帖最近评分记录
  • cs312779641 无忧币 +6 热心广援 2017-8-14 17:27
  • Shell_2015 无忧币 +10 感谢分享 2017-8-14 15:14



本帖最后由 项俊杰 于 2017-8-14 13:46 编辑
感觉有必要介绍下Elasticsearch的存储数据方式,我这边通常情况下5台web 每天日志数据大概是10G,而到了ELK 大概只有2-3G的样子。   这是个大优势,光是说汇总查询日志 其实会给人一种没什么特点的感觉。  我接触之前听朋友说 觉得没什么特点,也就没去用。  后来朋友详细介绍了下 说它的存储方式很有特点 数据量汇总后压缩率很高 才用的。   最后用着用着就爱上了,如5台web跑相同的站点 可以快速精准定位 50x错误出在哪一台上 , UV PV    每个站点 具体URL的访问量(以此判断是否有刷动态页的攻击), 都能事先编辑好条件,快速查询。



‹‹ 上一贴:cacti流量图问题   |   下一贴:linux运维面试题 ››
  发新话题
快速回复主题
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 友情链接 |意见反馈 | 网站地图
Copyright©2005-2017 51CTO.COM
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系:bbs@51cto.com