2.2.1 网站需求(完善中)
最后更新于:2022-04-02 07:47:43
## 静态服务需求
### 性能需求
- 满足PV 2000万/天
- 满足静态访问并发 1万次/秒
- 在高并发下,尽量提升网络传输性能
### 功能需求
- Web服务使用非默认端口发布
- Web服务使用普通用户启动和管理
- 设置Web返回客户端的编码类型为UTF-8
- 网站响应静态资源时,进行数据压缩,减少带宽占用
- 网站相应静态资源时,合并发送请求,减少传递次数
- 网站设置防盗链功能
- 网站能够根据客户端类型,浏览器类型,将请求转向不同页面(手机/电脑)
- 网站能够根据业务的不同完成动静分离
- 静态资源可以在反向代理服务器端缓存,只允许内网清理缓存
- 限制网站HTTP请求方法
- 根据资源分类,设置浏览器客户端缓存时间
- 网站首页禁止爬虫
- 对40x和50x相关错误,跳转到指定页面
- 网站访问日志按天切分
- 不显示Web服务版本号
- 能够监控Web服务,只允许内网地址访问
- 在业务流量大的情况下,能够对TCP层连接请求和HTTP连接请求做限制
- 在业务流量大的情况下,能够对客户端流量进行限制
- 设置用户body大小最大为10M
- 不包含在mime.types类型中的文件,默认启用下载
- Web服务器的日志中,要记录真实的客户端IP地址
- 优化反向代理和后端服务的请求
- 设置网站日志为Json格式,要求记录反向代理与后端交互的响应数据
- 对配置文件进行分层管理,简化配置文件
- Web服务进行平滑升级
- 网站pay域名支持HTTPS访问
安全
运维
功能
### 业务需求
- 网站未来会上线商城功能,支付部分要使用HTTPS
- 考虑1年后网站更换域名,需要将访问全部转到新域名
## 动态服务需求
- 满足动态读请求并发 5000次/秒
- 满足动态写请求并发 1000次/秒
## 数据库服务需求
';
2.2 高性能Web项目
最后更新于:2022-04-02 07:47:40
[2.2.1 网站需求(完善中)](2.2.1%E7%BD%91%E7%AB%99%E9%9C%80%E6%B1%82.md)
';
9. 项目总结
最后更新于:2022-04-02 07:47:38
### 后续工作
1. Kafka的部署和整合
2. Elasticsearch 升级(2.x -> 5.x)[参考文档,感谢网易乐得技术团队](http://tech.lede.com/2017/10/25/rd/server/ElasticSearch_migration_upgrade/?utm_source=tuicool&utm_medium=referral "感谢网易乐得技术团队")
3. ELK stack性能优化
4. Elasticsearch 备份和恢复
5. Elasticsearch 压测
6. 完善拓扑图
7. MySQL 慢日志等其他日志的收集
由于Elasticsearch是一个很有深度的技术,需要投入很大精力研究,目前先研究到这里。
';
8. ELK安全配置(下)
最后更新于:2022-04-02 07:47:36
### 本节讲解内容如下
1.Search Guard的权限设置
2.searchguard索引的管理
3.Kibana、Logstash的设置
#### Search Guard的基本原理
Search Guard的基本组成
- 用户
- 角色
- 权限(权限组)
- 全局配置
#### 配置文件(权限管理)
这里我饶了很久才明白相互之间的关系,最难的就是角色、用户和权限的关系
- ##### sg_internal_users.yml(重点)
定义用户名、密码、**所属角色**,如果没有LDAP等外部外部身份验证系统,则使用此数据库
注意,该文件中的role不是定义用户和权限的关系,是给这个用户定义一个角色,可以理解为把这个用户划分到了某个部门(分组)里
用户和权限的定义是在sg_roles_mapping.yml中,一个用户可以有多个角色(读角色,写角色)
- ##### sg_roles_mapping.yml(重点)
作用一、为某个用户指定权限,这类用户一般就是需要定制权限(比如只能访问某个索引)
作用二、为某个角色(分组)指定权限,ELKStack权威指南中(第二版)中,定义基层角色
- ##### sg_roles.yml
设置权限名称及该名称所设置权限,引用sg_action_groups.yml中设置的权限分组
- ##### sg_action_groups.yml
定义权限组,多个权限组成一个权限分组
- ##### sg_config.yml
全局设置(我没有配置)
##### 脚本
sgadmin.sh
```shell
创建和更新searchguard索引片的配置
```
hash.sh
```shell
生成加密逻辑用户(登录ES和Kibana)的密码
用法 hash.sh -p 123456
```
install_demo_configuration.sh
```shell
生成Demo数据,不推荐使用
```
#### 默认用户
默认已经有了用户和权限配置,都是弱口令,将Example的数据全部删除,保留测试用户,出于演示目的,下面这些用户先统一设置 JnKtaCb1zKdr13I7,生产请自行修改
|Username|Password|Description|
| :------------: | :------------: | ------------|
|admin|admin|Full access to the cluster and all indices, but no access to the Search Guard configuration. Use an admin certificate for that.|
|kibanaserver|kibanaserver|Internal Kibana server user, for configuring elasticsearch.username and elasticsearch.passwordin kibana.yml. Has all permissions on the .kibana index.|
|kibanaro|kibanaro|Regular Kibana user, has READ access to all indices and all permissions on the .kibana index.|
|logstash|logstash|Logstash and Beats user, has CRUD and CREATE_INDEXpermissions on all logstash and beats indices|
|readall|readall|Has read access to all indices|
##### 默认权限
|Role name|Description|
| :------------: | ------------ |
|sg_all_access|All cluster permissions and all index permissions on all indices|
|sg_readall|Read permissions on all indices, but no write permissions|
|sg_readonly_and_monitor|Read and monitor permissions on all indices, but no write permissions|
|sg_kibana_server|Role for the internal Kibana server user, please refer to the Kibana setup chapter for explanation|
|sg_kibana|Role for regular Kibana users, full access to the .kibana index and read permissions on all other indices.|
|sg_logstash|Role for logstash and beats users, grants full access to all logstash and beats indices.|
|sg_manage_snapshots|Grants full permissions on snapshots and repositories.|
|sg_own_index|Grants full permissions on an index named after the authenticated user’s username.|
|sg_monitor|Role for X-Pack Monitoring. Users who wish to use X-Pack Monitoring need this role in addition to the sg_kibana role|
|sg_alerting|Role for X-Pack Alerting. Users who wish to use X-Pack Alerting need this role in addition to the sg_kibana role|
#### 修改默认密码,并新建用户
##### 自定义用户
|Username|Password|Description|
| :------------: | :------------: | ------------|
|dinghe|VpsnrgU5mrvQFLtK|只可以查看logstash-iislog的索引片|
生成强密码
```shell
#生成默认用户密码
sh /usr/share/elasticsearch/plugins/search-guard-5/tools/hash.sh -p JnKtaCb1zKdr13I7
$2a$12$HOTSUMRfL1FBa68Z8opIQu.J43GlOoWZ1lu14hACRZkcc.TsRGatu
#生成自定义用户密码
sh /usr/share/elasticsearch/plugins/search-guard-5/tools/hash.sh -p VpsnrgU5mrvQFLtK
$2a$12$gWI0A0YZYY56Gccl5Cv1KOcpNrSodyCKgvDtxAN9N09iBE8d7guwG
```
修改sg_internal_users.yml,并设置dinghe的角色为ops
```shell
admin:
hash: $2a$12$HOTSUMRfL1FBa68Z8opIQu.J43GlOoWZ1lu14hACRZkcc.TsRGatu
logstash:
hash: $2a$12$HOTSUMRfL1FBa68Z8opIQu.J43GlOoWZ1lu14hACRZkcc.TsRGatu
kibanaserver:
hash: $2a$12$HOTSUMRfL1FBa68Z8opIQu.J43GlOoWZ1lu14hACRZkcc.TsRGatu
kibanaro:
hash: $2a$12$HOTSUMRfL1FBa68Z8opIQu.J43GlOoWZ1lu14hACRZkcc.TsRGatu
roles:
- kibanarole
readall:
hash: $2a$12$HOTSUMRfL1FBa68Z8opIQu.J43GlOoWZ1lu14hACRZkcc.TsRGatu
dinghe:
hash:$2a$12$gWI0A0YZYY56Gccl5Cv1KOcpNrSodyCKgvDtxAN9N09iBE8d7guwG
roles:
- ops
```
关于admin用户的权限这里多说一下,虽然是admin,对索引有全部控制权限,虽然他可以删除searchguard索引分片,但是,不可以维护和修改searchguard索引内的数据。
##### 为不同规则名称配置权限sg_roles.yml
添加需要的权限
```yaml
sg_kibana_iisindex:
cluster:
- CLUSTER_COMPOSITE_OPS_RO
indices:
'logstash-iislog-*':
'*':
- READ
- indices:admin/mappings/fields/get*
'?kibana':
'*':
- INDICES_ALL
```
由于Elasticsearch内部原理复杂,所以我现在还是先设置的比较宽,比如默认给出的readall权限,就可以给查看用户使用,后期了解Elasticsearch后,再来补充。
##### 修改sg_roles_mapping.yml
删除Example,增加
```shell
#sg_own_index:
# users:
# - '*'
sg_kibana_iisindex:
backendroles:
- ops
#sg_kibana_iisindex:
# user:
# -dinghe
```
上文两种授权方式均可,自行理解一下
sg_own_index我认为权限很大,注释掉
##### (示例)设置分组权限sg_action_groups.yml
这个只是一个示例,仅供参考,由于还不是很理解Elasticsearch的内部原理和操作,就先不设置了。
```shell
KIBANA_SERVER:
- "indices:admin/exists*"
- "indices:admin/mapping/put*"
- "indices:admin/mappings/fields/get*"
- "indices:admin/refresh*"
- "indices:admin/validate/query*"
- "indices:data/read/get*"
- "indices:data/read/mget*"
- "indices:data/read/field_caps"
- "indices:data/read/search*"
- "indices:data/write/delete*"
- "indices:data/write/index*"
- "indices:data/write/update*"
```
sg_roles.yml
```yaml
sg_kibana:
cluster:
- CLUSTER_COMPOSITE_OPS_RO
indices:
'*':
'*':
- READ
'?kibana':
'*':
- KIBANA_SERVER
```
Elasticsearch并不公布所有权限的更新列表了。最后一个已知的发布列表是[shield 2.1](https://www.elastic.co/guide/en/shield/2.1/reference.html#ref-actions-list "shield 2.1")
##### 修改后,更新searchguard索引分片
```shell
sh /usr/share/elasticsearch/plugins/search-guard-5/tools/sgadmin.sh -h 192.168.0.230 -p 9300 -tspass siCPVLDYN2BwuYKo -kspass CNByuENniEtkHRfs -cd /usr/share/elasticsearch/plugins/search-guard-5/sgconfig -ks /etc/elasticsearch/admin-keystore.jks -ts /etc/elasticsearch/truststore.jks -nhnv -cn es-cluster
```
#### 配置Logstash
```yaml
output {
if [type] == "iislog" {
elasticsearch {
hosts => ["192.168.0.231:9200"]
index => "logstash-iislog-%{+YYYY.MM.dd}"
user => "logstash"
password => "JnKtaCb1zKdr13I7"
}
}
}
```
配置后,可以测试写入了
#### 配置Kibana
```yaml
elasticsearch.url: "http://192.168.0.230:9200"
elasticsearch.username: "kibanaserver"
elasticsearch.password: "JnKtaCb1zKdr13I7"
```
[Kibana用户相关信息](http://floragunncom.github.io/search-guard-docs/kibana.html "Kibana用户相关")
这里要多说两句了,这里配置了kibanaserver用户,Kibana并没有用户登录验证功能,这个用户是Search Guard内置的用户,是为了你可以正常使用kibana前端的功能。
##### 为Kibana增加用户登录功能
[search-guard-kibana-plugin对应版本下载](https://github.com/floragunncom/search-guard-kibana-plugin/releases)
```shell
/usr/share/kibana/bin/kibana-plugin install file:///opt/searchguard-kibana-5.6.4-5.zip
```
安装完成后,重启Kibana,就能够实现用户登录功能了,如果ES集群不被Search Guard所保护,Kibana将无法登陆ES集群
### 总结
截至到现在,Search Guard已经初步部署完成,通过2天的研究,主要还是在于原理的理解,配置上比较简单
#### 后续可研究的东西
1. Kibana和Logstash,使用SSL/TLS加密与ES之间的通讯
2. 备份和恢复
3. Search Guard对性能的影响
4. Kibana多租户 search-guard-module-kibana-multitenancy
5. 关联LDAP
';
7. ELK安全配置(上)
最后更新于:2022-04-02 07:47:33
> ##### [感谢江榕分享](https://www.tuicool.com/articles/6fyU7bU)
> ##### [感谢chenzanlong123](http://blog.csdn.net/chenzanlong123/article/details/11784143 "关于truststore和kenstore的区别") 关于truststore和kenstore的区别
### Search Guard基础知识
SearchGuard®是Elasticsearch的开源安全套件,提供加密,身份验证,授权,审计日志记录和多租户的整个ELK堆栈。开源版本核心功能:
- 节点之间的RPC流量通过 SSL/TLS 传输(强制性);
- 索引级别访问控制(重点!);
- 权限配置基本与shield保持一致;
- 支持restful接口流量加密(可选);
#### 个人理解
- Search Guard会将ES包裹起来,其他程序连接ES时,实际是Search Guard在做验证和权限控制。
- ES的Master/Node节点间的SSL/TLS通讯加密必须配置,但客户端(Kibana、Logstash、ES-Head等)访问ES的HTTPS可不配置
- 证书的生成需要使用 Search Guard SSL程序包,需要单独下载,但该程序无需放在ES的服务器中执行,只使用生成后的证书
- keystore可以看成一个放key的库,key就是公钥,私钥,数字签名等组成的一个信息。truststore和keystore的性质是一样的,都是存放key的一个仓库,区别在于,truststore里存放的是只包含公钥的数字证书,代表了可以信任的证书,而keystore是包含私钥的
- Search Guard有Demo脚本,为了更好的理解原理,不要使用
##### Search Guard部署过程
- 第一阶段:实现访问ES需要用户名密码
- 第二节点:Kibana实现用户名密码登录
##### 涉及插件
>[GitHub链接](https://github.com/floragunncom "github链接")
- search-guard-ssl(生成证书程序)
- search-guard(ES插件)
- search-guard-kibana-plugin(Kibana插件)
### 部署Search Guard SSL(任意机器)
仅生成证书,无需部署在生产节点,生成后部署到对应节点即可,该文件需备份!
不推荐使用样例脚本
> [具体版本对照](https://github.com/floragunncom/search-guard-ssl/wiki "版本对照")
脚本依赖openssl 和 keytool
```shell
git clone https://github.com/floragunncom/search-guard-ssl.git
cd search-guard-ssl/example-pki-scripts
```
#### 证书生成重要概念
因为我们要使用到生产环境,所以我们需要自定义创建证书
- ##### gen_client_node_cert.sh(生成admin-keystore.jks)
生成客户端和管理员证书,包含客户端证书的密钥库。此证书被配置为管理员证书,名字可以使用sgadmin/admin/ding均可,但名称要与ES中配置的前缀保持一致(下文中会提到),否则ES启动时,会报Search Guard密码错误
- ##### gen_node_cert.sh(生成 node-0-keystore.jks)
生成ES节点间通讯的证书,密钥库包含节点证书和中间证书。这些密钥库可以在所有Elasticsearch节点上使用。
- ##### gen_root_ca.sh(生成truststore.jks)
包含用于签署所有其他证书的根CA的信任库
##### 修改配置
```shell
example-pki-scripts/etc/root-ca.conf
example-pki-scripts/etc/signing-ca.conf
```
脚本会根据这两个配置生成证书,需要修改如下内容,暂时还不太理解作用,我并没有修改
```shell
[ ca_dn ]
0.domainComponent = "com"
1.domainComponent = "example"
organizationName = "Example Com Inc."
organizationalUnitName = "Example Com Inc. Root CA"
commonName = "Example Com Inc. Root CA"
```
#### 生成证书
##### 生成强密码
```shell
根CA密码:NhRxQ3dC3rJZuQFa
truststore密码:siCPVLDYN2BwuYKo
keystore密码:CNByuENniEtkHRfs
```
##### 生成truststore证书
```shell
#./gen_root_ca.sh capassword_use_a_strong_one truststorepassword
./gen_root_ca.sh NhRxQ3dC3rJZuQFa siCPVLDYN2BwuYKo
```
##### 生成ES节点通讯证书
> ##### 留下问题?是所有ES用一个,每个ES都用不同的证书
```shell
./gen_node_cert.sh nodenum keystorepassword capassword_use_a_strong_one
./gen_node_cert.sh 0 CNByuENniEtkHRfs NhRxQ3dC3rJZuQFa
```
##### 生成客户端(管理员)证书
```shell
./gen_client_node_cert.sh clientname keystorepassword capassword_use_a_strong_one
./gen_client_node_cert.sh admin CNByuENniEtkHRfs NhRxQ3dC3rJZuQFa
```
##### 生成的文件
```shell
#ll /opt/search-guard-ssl/example-pki-scripts/*.jks
-rw-r--r-- 1 root root 4164 Nov 10 16:38 admin-keystore.jks
-rw-r--r-- 1 root root 4233 Nov 10 16:38 node-0-keystore.jks
-rw-r--r-- 1 root root 956 Nov 10 16:37 truststore.jks
```
#### 分发证书
node和truststore证书分发到所有ES的/etc/elasticsearch/目录下
admin证书,放到管理机上,Search Guard会在Elasticsearch中建立searchguard的索引分片,内部存储的就是用户和权限的信息,这些信息只能通过sgadmin.sh脚本进行更新,Search Guard中的逻辑用户,是不具备查看权限的。具体请看下文
##### 注意备份整个目录,后期可能还会生成证书
### 所有ES节点安装Search Guard
#### 在线安装
>##### [版本对应关系](https://github.com/floragunncom/search-guard/wiki "版本对应关系")
```shell
cd /usr/share/elasticsearch/bin
./elasticsearch-plugin install com.floragunn:search-guard-5:5.6.4-16
```
search-guard-5:search-guard的版本
5.6.4-16:当前Elasticsearch对应的search-guard版本
#### 离线安装(推荐)
> ##### [zip包下载地址](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.floragunn%22%20AND%20a%3A%22search-guard-5%22 "下载地址")
```shell
./elasticsearch-plugin install -b file:///tmp/search-guard-5-5.6.4-16.zip
```
#### 增加ES配置(所有ES)
配置结尾增加
```shell
searchguard.ssl.transport.keystore_filepath: node-0-keystore.jks
searchguard.ssl.transport.keystore_password: CNByuENniEtkHRfs
searchguard.ssl.transport.truststore_filepath: truststore.jks
searchguard.ssl.transport.truststore_password: siCPVLDYN2BwuYKo
#enforce_hostname_verification为不强制验证主机名
searchguard.ssl.transport.enforce_hostname_verification: false
#注意CN=admin,必须和admin-keystore.jks中的admin相同
searchguard.authcz.admin_dn:
- CN=admin,OU=client,O=client,L=Test, C=DE
```
重启ES服务器,如未设置,将无法加入到集群,建议所有ES全部停止后统一配置,避免脑裂
### 生成searchguard索引分片
> ##### [sgadmin相关参数](http://floragunncom.github.io/search-guard-docs/sgadmin.html "1")
```shell
sh /usr/share/elasticsearch/plugins/search-guard-5/tools/sgadmin.sh -h 192.168.0.230 -p 9300 -tspass siCPVLDYN2BwuYKo -kspass CNByuENniEtkHRfs -cd /usr/share/elasticsearch/plugins/search-guard-5/sgconfig -ks /etc/elasticsearch/admin-keystore.jks -ts /etc/elasticsearch/truststore.jks -nhnv -cn es-cluster
```
- 默认要求ES集群状态至少要为YELLOW,可以使用-arc,–accept-red-cluster跳过
- 早期版本的Search guard是允许使用node证书的,但是新版本已经禁止了,这里的ks需要指定为管理用户的证书(admin-keystore.jks)
- es-cluster为集群名称
- -nhnv 禁用主机名称验证,不要验证主机名
```shell
###################################
Contacting elasticsearch cluster 'es-cluster' and wait for YELLOW clusterstate ...
Clustername: es-cluster
Clusterstate: YELLOW
Number of nodes: 1
Number of data nodes: 1
searchguard index already exists, so we do not need to create one.
Populate config from /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/
Will update 'config' with /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_config.yml
SUCC: Configuration for 'config' created or updated
Will update 'roles' with /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_roles.yml
SUCC: Configuration for 'roles' created or updated
Will update 'rolesmapping' with /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_roles_mapping.yml
SUCC: Configuration for 'rolesmapping' created or updated
Will update 'internalusers' with /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_internal_users.yml
SUCC: Configuration for 'internalusers' created or updated
Will update 'actiongroups' with /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_action_groups.yml
SUCC: Configuration for 'actiongroups' created or updated
Done with success
```
SUCC代表更新成功
#### 截至目前,ES各个节点间通讯已经加密;Search Guard已经开始守护ES集群了。但由于Search Guard默认设置了一些用户,都是弱口令用户,下一步,我们要进行权限设置以及客户端(Logstash、Kibana、Head)的访问设置
';
6. 日志数据展示(待补充)
最后更新于:2022-04-02 07:47:31
5. 日志处理转发
最后更新于:2022-04-02 07:47:29
> ##### [感谢TTA0168](https://zhidao.baidu.com/question/1174224044228167419.html "参考站点")
> ##### [感谢Mr. Hu](http://www.cnblogs.com/huhangfei/p/6904994.html "感谢Mr. Hu")
> ##### [感谢irow10](http://irow10.blog.51cto.com/ "感谢irow10")
> ##### [感谢石瞳禅](http://www.cnblogs.com/stozen/p/5638369.html "感谢石瞳禅"),grok各个规则中文注释
> ##### [感谢飞走不可](http://www.cnblogs.com/hanyifeng/p/5871150.html "感谢飞走不可"),Kibana修改字段单位
写在前面:有时候我们需要分析请求的URL或请求的字符串(?后面的部分),这部分我是在Tomcat中分析,因为Tomcat有专门的query?string字段,不需要单独拆解Nginx日志,所以在Nginx中,我只保留了http请求的版本
对于json过滤,grok过滤等不同的过滤方法,我是这样认为的,grok是万能的,但是如果原始数据能够json化,那优先使用json
### Logstash配置(直接处理转发ES)
```yaml
input {
redis {
host => "192.168.0.106"
port => "6400"
db => 0
key => "filebeat"
password => "ding"
data_type => "list"
}
}
filter {
if [type] == "proxy-nginx-accesslog" {
json {
source => "message"
remove_field => [ "message" ]
}
mutate {
split => { "request" => " " }
}
mutate {
add_field => {
"httpversion" => "%{[request][2]}"
}
}
geoip {
source => "xff"
database => "/etc/logstash/GeoLite2-City.mmdb"
fields => ["city_name", "continent_code", "country_code2", "country_code3", "country_name", "dma_code", "ip", "latitude", "longitude", "postal_code", "region_name", "timezone", "location"]
remove_field => [ "[geoip][latitude]", "[geoip][longitude]" ]
target => "geoip"
}
}
if [type] == "nginx-accesslog" {
json {
source => "message"
remove_field => [ "message" ]
}
mutate {
split => { "request" => " " }
}
mutate {
add_field => {
"httpversion" => "%{[request][2]}"
}
}
mutate {
split => { "xff" => "," }
}
mutate {
add_field => {
"realip" => "%{[xff][0]}"
}
}
geoip {
source => "realip"
database => "/etc/logstash/GeoLite2-City.mmdb"
fields => ["city_name", "continent_code", "country_code2", "country_code3", "country_name", "dma_code", "ip", "latitude", "longitude", "postal_code", "region_name", "timezone", "location"]
remove_field => [ "[geoip][latitude]", "[geoip][longitude]" ]
target => "geoip"
}
}
if [type] == "tomcat-accesslog" {
json {
source => "message"
remove_field => [ "message" ]
}
mutate {
split => { "method" => " " }
}
mutate {
add_field => {
"request_method" => "%{[method][0]}"
"request_url" => "%{[method][1]}"
"httpversion" => "%{[method][2]}"
}
}
mutate {
remove_field => [ "method" ]
}
}
mutate {
convert => [ "status", "integer" ]
convert => [ "body_bytes_sent", "integer" ]
convert => [ "request_time", "float" ]
convert => [ "send bytes", "integer" ]
}
}
output {
if [type] == "proxy-nginx-accesslog" {
elasticsearch {
hosts => ["192.168.0.231:9200", "192.168.0.232:9200"]
index => "logstash-proxy-nginx-accesslog-%{+YYYY.MM.dd}"
}
}
if [type] == "proxy-nginx-errorlog" {
elasticsearch {
hosts => ["192.168.0.231:9200", "192.168.0.232:9200"]
index => "logstash-proxy-nginx-errorlog-%{+YYYY.MM.dd}"
}
}
if [type] == "nginx-accesslog" {
elasticsearch {
hosts => ["192.168.0.231:9200", "192.168.0.232:9200"]
index => "logstash-nginx-accesslog-%{+YYYY.MM.dd}"
}
}
if [type] == "nginx-errorlog" {
elasticsearch {
hosts => ["192.168.0.231:9200", "192.168.0.232:9200"]
index => "logstash-nginx-errorlog-%{+YYYY.MM.dd}"
}
}
if [type] == "systemlog" {
elasticsearch {
hosts => ["192.168.0.231:9200", "192.168.0.232:9200"]
index => "systemlog-%{+YYYY.MM.dd}"
}
}
if [type] == "tomcat-catalina" {
elasticsearch {
hosts => ["192.168.0.231:9200", "192.168.0.232:9200"]
index => "tomcat-cataline-%{+YYYY.MM.dd}"
}
}
if [type] == "tomcat-ding-info" {
elasticsearch {
hosts => ["192.168.0.231:9200", "192.168.0.232:9200"]
index => "tomcat-ding-info-%{+YYYY.MM.dd}"
}
}
if [type] == "tomcat-dinge-error" {
elasticsearch {
hosts => ["192.168.0.231:9200", "192.168.0.232:9200"]
index => "tomcat-ding-error-%{+YYYY.MM.dd}"
}
}
if [type] == "tomcat-accesslog" {
elasticsearch {
hosts => ["192.168.0.231:9200", "192.168.0.232:9200"]
index => "tomcat-accesslog-%{+YYYY.MM.dd}"
}
}
}
```
因为拆分了字段,原始字段就可以删除,这里要注意需要单独写删除代码跨,这里涉及优先级的问题,具体问题可以自己尝试。
如果Nginx上层有代理的话,xff字段中会是多个IP,我选择拆分字段,后保留第一个IP,但保留原始字段。
### Logstash配置(消费Redis数据)
```yaml
input {
redis {
host => "192.168.0.106"
port => "6400"
db => 0
key => "filebeat"
password => "ding"
data_type => "list"
}
}
```
其他配置同上,写入配置请看《日志收集配置》章节
Logstash会根据filebeat中数据的type进行分析,不需要改动
### Logstash配置(分析IIS日志)
```yaml
input {
beats {
port => 5045
}
}
filter {
if [type] == "iislog" {
grok {
match => {"message" => "%{TIMESTAMP_ISO8601:log_timestamp} (%{NOTSPACE:s_sitename}|-) (%{NOTSPACE:s_computername}|-) (%{IPORHOST:s_ip}|-) (%{WORD:cs_method}|-) %{NOTSPACE:cs_uri_stem} %{NOTSPACE:cs_uri_query} (%{NUMBER:s_port}|-) (%{NOTSPACE:cs_username}|-) (%{IPORHOST:c_ip}|-) (?:HTTP/%{NUMBER:http_version}) %{NOTSPACE:cs_useragent} (%{GREEDYDATA:cs_cookie}| -) (%{NOTSPACE:cs_referer}|-) %{NOTSPACE:cs_host} (%{NUMBER:sc_status}|-) (%{NUMBER:sc_substatus}|-) (%{NUMBER:sc_win32_status}|-) (%{NUMBER:sc_bytes}|-) (%{NUMBER:cs_bytes}|-) (%{NUMBER:time_taken}|-)"}
add_tag => "iis"
remove_field => ["message", "@version"]
}
date {
match => [ "log_timestamp", "YYYY-MM-dd HH:mm:ss" ]
timezone => "Etc/GMT"
}
useragent {
source => "cs_useragent"
target => "ua"
remove_field => ["cs_useragent"]
}
geoip {
source => "c_ip"
database => "/etc/logstash/GeoLite2-City.mmdb"
fields => ["city_name", "continent_code", "country_code2", "country_code3", "country_name", "dma_code", "ip", "latitude", "longitude", "postal_code", "region_name", "timezone", "location"]
remove_field => [ "[geoip][latitude]", "[geoip][longitude]" ]
target => "geoip"
}
mutate {
convert => [ "sc_bytes", "integer" ]
convert => [ "cs_bytes", "integer" ]
convert => [ "time_taken", "float" ]
convert => [ "sc_status", "integer" ]
convert => [ "s_port", "integer" ]
}
}
}
output {
if [type] == "iislog" {
elasticsearch {
hosts => ["192.168.0.231:9200", "192.168.0.232:9200"]
index => "logstash-iislog-%{+YYYY.MM.dd}"
}
}
}
```
#### 经验1:减少配置内容,更加易读
gork中的匹配规则一旦固定下下,最终放到指定目录中,配置中直接调用
```shell
/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.1.2/patterns/iis
```
实际内容
```shell
IIS_LOG %{TIMESTAMP_ISO8601:log_timestamp} ...略... (%{NUMBER:time_taken}|-)
```
Logstash中调用
```shell
match => { "message" => "%{IIS_LOG}" }
```
#### 经验2:日志过滤
IIS日志中的前4行是"#"开头,减少Logstash的工作,在Filebeat中配置
#### 经验3:grok的调试
```shell
调试站点:http://grokdebug.herokuapp.com
```
##### grok排错思路:
- ##### 注意匹配时,字段间的空格
- ##### 要考虑字段默认值
- ##### 了解内置正则含义,请参考文档开始的链接
- ##### 注意一定要尝试多样本,生产数据
```shell
比如cookie,最终,(%{NOTSPACE:cookie}|-)生产不适用,(%{GREEDYDATA:cookie}|-)生产适用
```
#### 经验4:其他
logstash有时候关的慢,因为在处理数据,等待一会就好了
没用的字段去掉,但要注意先后顺序,拆分后再删除
时间的处理需要使用Logstash的plugins-filters-date插件
#### 经验5:IIS日志时区问题
>IIS日志时间为什么晚八小时的原因?
这要从W3C标准说起,W3C是按照GMT时间进行记录的,IIS默认的日志格式就是W3C标准日志文件。北京时间是东八时区,也就是GMT+8,IIS在记录时间时就会在系统时间基础上加上8小时,所以,你那服务器的日志文件记录的时间久延后了八个小时,但实际上仍然是实时记录的。解决这个问题的方法是,依次打开Internet信息服务(IIS)---Internet信息服务----本地计算机---网站,右击子项中相应的网站(如果要设置所有的网站,则直接在网站上点击),选择属性,在网站标签下找到活动日志格式,打开IIS日志属性,再选择常规,最后勾选文件命名和创建使用当地时间
设置当前时间为timezone => "Etc/GMT",kibana会自动根据当前时区转换时间。
> #### [常用时区](http://php.net/manual/zh/timezones.others.php "常用时区")
#### 经验6:注意字段的转换
后期使用Kibana出图时,如果想使用范围、计算,有些字段需要转换成integer
可过滤时转换,也可以结尾同意转换
如果是计算网络流量,还需要在kibana中设置字段单位,具体可参照开头部分的站点。
#### 经验7:批量删除索引
```shell
curl -XDELETE 'http://192.168.0.230:9200/abcddd'
```
[https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html)
#### 经验8:Logstash和Filebeat重启顺序
建议先停止Filebeat,再重启Logstash
';
4. 消息缓冲队列
最后更新于:2022-04-02 07:47:26
### Redis
过度期用,在Logstash撑不住,但又不想上消息队列集群时使用,大规模还是Kafka
';
3. 日志收集配置
最后更新于:2022-04-02 07:47:24
### Filebeat配置(发送Logstash)
>文中具体配置请查看3.12章节内容
```yaml
filebeat.prospectors:
# system log
- input_type: log
paths:
- /var/log/messages
fields:
type: systemlog
fields_under_root: true
exclude_lines: ["^$"]
exclude_files: [".gz$"]
# system login log
- input_type: log
paths:
- /var/log/lastlog
fields:
type: lastlog
fields_under_root: true
exclude_lines: ["^$"]
exclude_files: [".gz$"]
# nginx all access log
- input_type: log
paths:
- /usr/local/nginx/logs/*_access.log
fields:
type: nginx-accesslog
fields_under_root: true
exclude_lines: ["^$"]
exclude_files: [".gz$"]
# nginx error log
- input_type: log
paths:
- /usr/local/nginx/logs/error.log
fields:
type: nginx-errorlog
fields_under_root: true
exclude_lines: ["^$"]
exclude_files: [".gz$"]
# tomcat access log
- input_type: log
paths:
- /usr/local/tomcat1/logs/ding_access.*.log
fields:
type: tomcat-accesslog
fields_under_root: true
exclude_lines: ["^$"]
exclude_files: [".gz$"]
# catalina log
- input_type: log
paths:
- /usr/local/tomcat1/logs/catalina.out
fields:
type: tomcat-catalina
fields_under_root: true
exclude_lines: ["^$"]
exclude_files: [".gz$"]
# multiline config
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
# ding info log
- input_type: log
paths:
- /usr/local/tomcat1/logs/ding_Info.log
fields:
type: tomcat-ding-info
fields_under_root: true
exclude_lines: ["^$"]
exclude_files: [".gz$"]
# multiline config
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
# ding error log
- input_type: log
paths:
- /usr/local/tomcat1/logs/ding_Error.log
fields:
type: tomcat-ding-error
fields_under_root: true
exclude_lines: ["^$"]
exclude_files: [".gz$"]
# multiline config
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
output.logstash:
hosts: ["192.168.0.230:5044"]
```
### Filebeat配置(收集IIS日志)
```yaml
- input_type: log
encoding: gb18030
paths:
- /opt/iislog/*.log
fields:
type: iislog
fields_under_root: true
exclude_lines: ["^#"]
output.logstash:
hosts: ["192.168.0.230:5045"]
```
#### IIS日志中有中文,需要设置字符集gb18030,这个需要自己尝试
### Filebeat配置(发送消息缓冲队列)
#### Redis
```yaml
output.redis:
hosts: ["192.168.0.106:6400"]
password: "ding"
key: "filebeat"
db: 0
timeout: 5
```
其他配置同上
';
2. 整体方案规划
最后更新于:2022-04-02 07:47:22
### 拓扑图
### 软件选型
#### 文件数据收集(Filebeat)
- Nginx、Tomcat访问日志(Json)(单行)
- Nginx错误日志(单行)
- Tomcat日志(多行)
- JAVA程序日志(单行)
- JAVA程序日志(多行)
- 系统日志(messages)(单行)
- 系统日志(lastlog)(单行)
#### 缓冲消息队列(消费)
- Redis
- Kafka(待补充)
#### 数据处理(转发)
- Logstash
#### 数据检索(存储)
- Elasticsearch
#### 数据展示
- Kibana
### 基础环境
#### Web01
| 收集对象 | 位置 |
| :------------: | :------------: |
| 系统日志 | /var/log/messages |
| 系统日志 | /var/log/lastlog |
| Nginx访问日志 | /usr/local/nginx/logs/*_access.log |
| Nginx错误日志 | /usr/local/nginx/logs/error.log |
|Tomcat访问日志 |/usr/local/tomcat1/logs/ding_access.*.log |
|Java程序输出日志 | /usr/local/tomcat1/logs/ding_Info.log|
|Java程序错误日志 | /usr/local/tomcat1/logs/ding_Error.log|
#### ELK
| 服务 | 配置 |
| :------------: | :------------: |
| Elasticsearch | /etc/elasticsearch/elasticsearch.yml |
| Logstash | /etc/logstash/conf.d/*.conf |
| Kibana | /etc/kibana/kibana.yml |
#### 硬件配置
ES写入数据时主要消耗CPU和磁盘IP,磁盘越快越好(RAID0或RAID10)
Logstash写入数据时,主要消耗CPU
#### 常用Logstash插件
- **Json过滤**
处理Nginx、Tomcat已经Json化的访问日志
- **Grok过滤**
处理非结构化的日志,比如IIS日志,MySQL满日志或原始的Nginx日志
- **Mutate过滤**
处理字段的合并、拆解、转换,比如分解Nginx中的request字段,分解为请求方法,请求URL和http版本
- **Geoip过滤**
结合Maxmind的开源GeoLite2数据库,解析IP地址,生成GEO相关字段,用于地图类展示
- **Data过滤**
对时间进行匹配转换
- **Useragent过滤**
拆解日志中的useragent字段
- **Drop过滤**
根据条件,删除数据
### 已知的问题
#### 1.性能瓶颈
Elasticsearch对磁盘IO要求很高,建议数据放在当读分区中,可以考虑用多块磁盘,建立RAID0或RAID0+1,缓解数据查询缓慢的问题
#### 2.索引的命名规则
Elasticsearch默认会将Geoip过滤后的location字段转换为geo_point类型,但是前提是索引要以logstash-开头,否则不转换
#### 3.字符集乱码
Filebeat中设置encoding:UTF-8
如未使用Filebeat,Logstash设置codec => plain{charset=>"UTF-8"}
#### 4.Logstash使用不同的端口,接收不同日志数据
拆分配置文件,避免同一个Logstash配置文件过于庞大
#### 4.一些感悟
1.Nginx的访问日志和Tomcat的访问日志并不能很好的关联
2.动态请求的字符串,在Tomcat中获取
';
1. 项目需求
最后更新于:2022-04-02 07:47:19
### 业务需求
- #### 开发人员代码上线到测试、预生产、生产后,要查看服务日志(Tomcat后台、应用输出的日志)
- #### 运维人员排查问题,需要查看Nginx日志,Tomcat访问日志,接口调用日志
- #### 运维人员需要分析Nginx访问日志,过滤404,50x日志,提交给开发或运营
- #### 运维人员收集分析系统日志(message、crond)
- #### 运维人员收集各个应用日志(MySQL、Redis)
- #### 统计接口调用次数
- #### 根据IP地址绘制用户地图、热点,使用高德的开源地图接口
- #### 实现用户登录,并能实现索引级控制
### 建议先阅读3.12章节
';
2.1.5 全网日志收集展示平台项目
最后更新于:2022-04-02 07:47:17
[1. 项目需求](1.%E9%A1%B9%E7%9B%AE%E9%9C%80%E6%B1%82%E5%8F%8A%E5%88%86%E6%9E%90.md)
[2. 整体方案规划](2.%E6%95%B4%E4%BD%93%E6%96%B9%E6%A1%88%E8%A7%84%E5%88%92.md)
[3. 日志收集配置](3.%E6%97%A5%E5%BF%97%E6%94%B6%E9%9B%86%E9%85%8D%E7%BD%AE.md)
[4. 消息缓冲队列](4.%E6%B6%88%E6%81%AF%E7%BC%93%E5%86%B2%E9%98%9F%E5%88%97.md)
[5. 日志处理转发](5.%E6%97%A5%E5%BF%97%E5%A4%84%E7%90%86%E8%BD%AC%E5%8F%91.md)
[6. 日志数据展示(待补充)](6.%E6%97%A5%E5%BF%97%E6%95%B0%E6%8D%AE%E5%B1%95%E7%A4%BA%EF%BC%88%E5%BE%85%E8%A1%A5%E5%85%85%EF%BC%89.md)
[7. ELK安全配置(上)](7.ELK%E5%AE%89%E5%85%A8%E9%85%8D%E7%BD%AE%EF%BC%88%E4%B8%8A%EF%BC%89.md)
[8. ELK安全配置(下)](8.ELK%E5%AE%89%E5%85%A8%E9%85%8D%E7%BD%AE%EF%BC%88%E4%B8%8B%EF%BC%89.md)
[9. 项目总结](9.%E9%A1%B9%E7%9B%AE%E6%80%BB%E7%BB%93.md)
';
2.1.1 系统部署和优化
最后更新于:2022-04-02 07:47:15
> 基于项目实战中《方案一》设计
> 系统自动部署依赖软件: Cobbler
> 默认为Centos 7.x 系统,与Centos 6.x的区别会注明
## 操作系统自动化部署需求
#### 系统环境标准化
- 标准化 - 字符集
- 标准化 - 命令行
- 标准化 - 内核参数
- 标准化 - 系统参数
#### 分区标准化
- 标准化 - 标准化分区
#### 系统配置标准化
- 标准化 - 网卡名称
- 标准化 - IP地址
- 标准化 - IPv6
- 标准化 - YUM环境
- 标准化 - 系统服务
- 标准化 - 主机名
- 标准化 - VIM
- 标准化 - 用户
- 标准化 - SSH
- 标准化 - 时间
- 标准化 - Selinux
- 标准化 - 关闭ctrl+alt+del快捷键
#### 软件标准化
- 标准化 - 基础软件包
- 标准化 - 常用软件包
- 标准化 - Java标准化
#### 配套软件标准化
- 标准化 - 监控Agent
- 标准化 - 公钥(管理机免密钥)
## 需求拆解
>以下内容来自《3.1 Cobbler(系统自动部署)》
#### 系统环境标准化 - 字符集
##### 需求
- 字符集设置 en_US.utf8
##### 一键优化脚本配置
Centos 7.x
```shell
#update system character
localectl set-locale LANG=en_US.utf8
```
注意 Centos 6 和 Centos 7 之间配置的差异
#### 系统环境标准化 - 命令行
##### 需求
- 配置shell,便于定位当前目录
##### 一键优化脚本
```shell
#modify PS1
echo 'export PS1="[ \033[01;33m\u\033[0;36m@\033[01;34m\h \033[01;31m\w\033[0m ]\033[0m \n#"' >> /etc/profile
```
#### 系统环境标准化 - 内核参数
##### 需求
- 优化网卡
- 优化swap
##### 一键优化脚本配置
```shell
#tune kernel parametres
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_fin_timeout = 30
vm.swappiness=10
vm.max_map_count = 262144
EOF
```
##### 备注:对不了解的参数不要配置
#### 系统环境标准化 - 系统参数
##### 需求
- 打开文件描述符
##### 一键优化脚本配置
```shell
#set the file limit
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535
* hard nofile 65535
EOF
```
##### 备注:目前还不明白为什么很多人配置成102400
#### 分区标准化 - 标准化分区
##### 需求
- 虚拟机或服务器
```shell
/boot 200M~1G
/swap 1G~8G
/ 剩余全部
```
- Oracle服务器
```shell
/boot 200M~1G
/swap >16G
/ 40G
/data(Oracle数据目录) 剩余全部
```
##### Cobbler配置
```shell
#Disk partitioning information
part /boot --fstype xfs --size 1024 --ondisk sda
#Oracle:part swap --size 16384 --ondisk sda
part swap --size 2048 --ondisk sda
part / --fstype xfs --size 1 --grow --ondisk sda
```
注意 Centos 6.x 和Centos 7.x 磁盘分区格式的区别
#### 系统配置标准化 - 网卡配置
##### 需求
- 网卡名称以eth0开始
- 关闭IPv6
##### Cobbler配置
修改镜像配置
```shell
cobbler profile edit --name=Centos-7.3-x86_64 --kopts='net.ifnames=0 biosdevname=0 noipv6'
```
#### 系统配置标准化 - 网络和主机名配置
##### 需求
- 系统安装时指定IP地址、主机名、网关、子网掩码
##### Cobbler配置
```shell
cobbler system edit --name=odb01.prod.ding --mac=00:0c:29:34:58:f1 --profile=Centos-6.8-x86_64 --ip-address=192.168.0.20 --subnet=255.255.255.0 --gateway=192.168.0.1 --interface=eth0 --static=1 --hostname=odb01.prod.ding --name-servers="114.114.114.114"
```
#### 系统配置标准化 - YUM环境
##### 需求
- 使用内网YUM源
- 如无内网YUM源,配置外网YUM源
##### Cobbler配置内网YUM源
请参照 《3.1.4 Cobbler基础配置》中“建立本地yum源”
##### 一键优化脚本
没有cobbler-config.repo,就配置阿里YUM源
```shell
#clean OS default repo
mkdir /etc/yum.repos.d/old && mv /etc/yum.repos.d/C* /etc/yum.repos.d/old/
#add repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
function_writelog_judgment "[add aliyun mirrors base]"
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
function_writelog_judgment "[add aliyun mirrors epel]"
#rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
```
#### 系统配置标准化 - 系统服务
##### 需求
- 关闭无用服务
##### 一键优化脚本
Centos 7.x
```shell
目前无优化方案
```
Centos 6.x
```shell
#set system start service
LANG=en
for chkoff in `chkconfig --list|grep 3:on|awk '{print $1}'`;do chkconfig --level 3 $chkoff off;done
for chkoff in crond network rsyslog sshd;do chkconfig --level 3 $chkoff on;done
```
#### 系统配置标准化 - VIM
##### 需求
- VIM基础配置,并增加易读性
##### 一键优化脚本
结尾拷贝到普通用户环境变量
```shell
#modify vimrc
cat >> /root/.vimrc << EOF
syntax enable
syntax on
set ruler
set number
set cursorline
set cursorcolumn
set hlsearch
set incsearch
set ignorecase
set nocompatible
set wildmenu
set paste
set nowrap
set expandtab
set tabstop=2
set shiftwidth=4
set softtabstop=4
set gcr=a:block-blinkon0
set guioptions-=l
set guioptions-=L
set guioptions-=r
set guioptions-=R
highlight CursorLine cterm=NONE ctermbg=black ctermfg=green guibg=NONE guifg=NONE
highlight CursorColumn cterm=NONE ctermbg=black ctermfg=green guibg=NONE guifg=NONE
EOF
cp /root/.vimrc /home/ding/
```
#### 系统配置标准化 - 用户
##### 需求
- 建立日常管理用户
- 为用户设置sudo权限
- 所有用户使用相同密码(无CMDB情况下)
- 用户设置强密码
##### 一键优化脚本
```shell
#add default user
useradd ding -u 2017
echo 'ding@)!&' | passwd --stdin ding && history -c
#set sudo authority
echo "" >> /etc/sudoers
echo "#set sudo authority" >> /etc/sudoers
echo "ding ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
```
#### 系统配置标准化 - SSH
##### 需求
- 禁止Root远程登录
- 关闭DNS解析
- 不允许空密码
- 修改SSH默认端口
- 关闭GSSAPI校验
##### 一键优化脚本
```shell
\cp /etc/ssh/sshd_config /etc/ssh/sshd_config.`date +%F`
sed -i 's/^GSSAPIAuthentication yes$/GSSAPIAuthentication no/' /etc/ssh/sshd_config
sed -i 's/#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
sed -i 's%#PermitRootLogin yes%PermitRootLogin no%g' /etc/ssh/sshd_config
sed -i 's%#PermitEmptyPasswords no%PermitEmptyPasswords no%g' /etc/ssh/sshd_config
#sed -i 's%#Port 22%Port 52020%g' /etc/ssh/sshd_config
```
#### 系统配置标准化 - 时间
##### 需求
- 所有服务器每分钟与时间服务器进行同步
##### 一键优化脚本
```shell
echo "* 4 * * * /usr/sbin/ntpdate ${ntp_server}> /dev/null 2>&1" >> /var/spool/cron/root
```
#### 系统配置标准化 - Selinux
##### 需求
- 关闭selinux
##### 一键优化脚本
```shell
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
```
#### 系统配置标准化 - 关闭ctrl+alt+del快捷键
##### 需求
- 关闭ctrl+alt+del快捷键
##### 一键优化脚本
centos 7.x
```shell
mv /usr/lib/systemd/system/ctrl-alt-del.target /usr/lib/systemd/system/ctrl-alt-del.target.bak
```
centos 6.x
```shell
mv /etc/init/control-alt-delete.conf /etc/init/control-alt-delete.conf.bak
```
#### 软件标准化 - 基础软件包
##### 需求
- 安装base包组
- 安装core包组
- 安装fonts包组
- 安装performance tools包组
- Oracle 需要安装desktop
##### Cobbler配置
```shell
#Package install information
%packages
@base
@core
@fonts
@performance tools
%end
```
#### 软件标准化 - 常用软件包
##### 需求
- 安装常用软件
##### 一键优化脚本
```shell
yum -y install ntp lrzsz tree telnet dos2unix sysstat sysstat iptraf ncurses-devel openssl-devel zlib-devel OpenIPMI-tools nmap screen
```
#### 软件标准化 - 升级软件包
##### 需求
- 升级当前软件包
##### 一键优化脚本
```shell
yum -y update
```
#### 软件标准化 - Java标准化
待完善
#### 配套软件标准化 - 监控Agent
##### 需求
- 安装监控所需要的Agent
##### 一键优化脚本
```shell
yum install zabbix-agent zabbix-sender -y
```
#### 配套软件标准化 - 公钥(管理机免密钥)
##### 需求
- 设置管理机(Ansible)的公钥
- 便于上线后,进行个性化配置(配置文件修改)
##### 一键优化脚本
```shell
wget http://cobbler_host/ansible_key -O /tmp/ansible_key
cat /tmp/ansible_key >> /home/ding/.ssh/authorized_keys
rm -f /tmp/ansible_key
```
';
2.1 标准化 & 工具化项目
最后更新于:2022-04-02 07:47:12
[2.1.1 系统部署和优化](2.1.1%E7%B3%BB%E7%BB%9F%E9%83%A8%E7%BD%B2%E5%92%8C%E4%BC%98%E5%8C%96.md)
[2.1.5 全网日志收集展示平台项目](2.1.5%E5%85%A8%E7%BD%91%E6%97%A5%E5%BF%97%E6%94%B6%E9%9B%86%E5%B1%95%E7%A4%BA%E5%B9%B3%E5%8F%B0%E9%A1%B9%E7%9B%AE.md)
';
二、运维项目实战(迁移中)
最后更新于:2022-04-02 07:47:10
### 部署手册要求
- 包含业务基础
- 功能介绍
- 基本部署手册
- 包含模拟案例
- 按照部署手册要求
### 文档基本原则
- #### 面向初级运维人员编写文档,禁止面向0基础(系统运维0基础)
- #### 禁止突出显示(标红、加粗)重要提示(不认真看文档,活该踩坑)
- #### 禁止过多描述基础(没基础补充一下再看)
- #### 引用他人文章要在文档开始 **加粗注明(使用####)**作者和引用地址
`例: #### [原文地址](http://www.cnblogs.com/reblue520/p/6874925.html "原文地址"),非常感谢郑子明的分享。`
- #### 配置文件、报错及日志,统一放置在文档结尾或单独建立一章节,保持文档简洁
- #### 文档上传前必须脱敏(密码替换、主机名替换、实例名替换),避免不必要的麻烦
#### 基本介绍要求
1. 功能介绍或官方文档链接
2. 适用场景
3. 基本部署
#### 部署手册要求
1. 环境介绍(主机名、IP、配置、端口作用、拓扑图),表格呈现
2. 如果表格内容较多,可拆分为两个表格
3. 配置文件和注释
4. 根据不同场景部署
#### 命令执行要求
```shell
用``` ```包含
命令注释用#开头
```
举例
```shell
#进入/opt目录,解压后移至/usr/local/下
cd /opt
tar xzf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mv mycat /usr/local/
```
#### 文档目录层级
```shell
一、
1.1
1.1.1
1.
```
举例
```shell
三、MySQL运维笔记
1.1 MySQL高可用
1.1.1 MyCAT
1. MyCAT基础
```
#### 笔记层级(markdown)
```shell
### 第一层级(功能介绍、业务部署、原理机制)
#### 第二层级(应用场景、主要特性、优缺点)
##### 第三层级(主要步骤、原理分类、场景分类)
```
举例:
```shell
### Zookeeper服务部署
#### 伪集群方式部署
##### 依赖环境部署
##### Zookeeper部署
##### 配置文件调整
##### 服务器启动
```
###
';
5. PHP 常用模块
最后更新于:2022-04-02 07:47:08
#### PHP缓存加速器选择
常见的PHP缓存加速器有xcache、eaccelerator、APC(Alternative PHP Cache)、ZendOpcache
**5.5以前 **第一选择xcache
- 效率更高、更快
- 社区活跃、使用广泛、稳定
**5.6以后 **第一选择ZendOpcache
- 官方研发,发展潜力好
- 编译直接使用--enable-opcache
##### 编译安装xcache
```shell
cd /opt
wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz
tar xf xcache-3.2.0.tar.gz
cd xcache-3.2.0
/app/php/bin/phpize
./configure --enable-xcache --with-php-config=/app/php/bin/php-config
make
make install
```
配置生效
```shell
echo "20160926 BrandynX" >> /app/php/lib/php.ini
echo "This xcache config." >> /app/php/lib/php.ini
cat /opt/xcache-3.2.0/xcache.ini >> /app/php/lib/php.ini
```
主要参数
```shell
xcache.size = 128M
xcache.count = 2
xcache.slots = 8K
xcache.ttl = 86400
xcache.gc_interval = 3600
xcache.var_size = 0
```
##### PHP5.5以前,编译ZendOpcache
编译安装ZendOpcache(插件)
```shell
cd /opt/
wget http://pecl.php.net/get/zendopcache-7.0.5.tgz
tar xzf zendopcache-7.0.5.tgz
cd zendopcache-7.0.5
/app/php/bin/phpize
./configure --enable-opcache --with-php-config=/app/php/bin/php-config
make
make install
```
配置生效(通用)
```shell
zend_extension= /app/php/lib/php/extensions/no-debug-non-zts-20131226/opcache.so
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
```
#### 其他必备模块
##### 编译安装Memcache
```shell
cd /opt/
wget http://pecl.php.net/get/memcache-2.2.7.tgz
tar xzf memcache-2.2.7.tgz
cd memcache-2.2.7
/app/php/bin/phpize
./configure --enable-memcache --with-php-config=/app/php/bin/php-config
make
make install
ll /app/php/lib/php/extensions/no-debug-non-zts-20131226/
```
##### 插件安装imagick
imagick可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,依赖imagemagick工具
1. 安装imagemagick(有rpm包)
```shell
cd /opt/
wget http://www.imagemagick.org/download/ImageMagick.tar.gz
#wget http://www.imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-7.0.3-1.x86_64.rpm
tar xzf ImageMagick.tar.gz
cd /opt/ImageMagick-7.0.3-1/
./configure
make
make install
```
2. 安装imagick
```shell
cd /opt/
wget http://pecl.php.net/get/imagick-3.4.3RC1.tgz
tar xzf imagick-3.4.3RC1.tgz
cd imagick-3.4.3RC1
./configure --with-php-config=/app/php/bin/php-config
make
make install
```
编辑php.ini,结尾添加
```shell
extension_dir = "/app/php/lib/php/extensions/no-debug-non-zts-20131226/"
extension = memcache.so
extension = imagick.so
```
##### 动态添加libmcrypt模块(可选)
```shell
cd /opt
wget http://jaist.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
tar xzf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure
make && make install
sleep 2
/sbin/ldconfig
cd libltdl/
./configure --dnable-ltdl-install
make && make install
```
';
4. PHP原理
最后更新于:2022-04-02 07:47:05
#### 基础知识
##### 什么是操作码?
服务器PHP引擎解析PHP程序,会将其便意味特定的操作码文件(Operate Code ,opcode),编译好的操作码由PHP引擎执行后丢弃。
##### 缓存原理
将编译后的操作码保存下来,放在共享内存中,以便下一次PHP页面复用,节省了PHP引擎的重复编译时间,降低了服务器负载(CPU和内存开销)
##### LNMP环境PHP缓存加速器原理
1. Nginx接受客户端的PHP程序访问请求
2. Nginx根据扩展名等过滤规则将PHP程序穿都给解析PHP的FastCGI进程(PHP-FPM)
3. PHP-PFM进程调用PHP解析器读取站点磁盘上的PHP文件,并加载到内存中
4. PHP解析器将PHP程序编译成opcode文件,然后把opcode缓存起来
5. PHP-FPM引擎执行opcode树,返回数据给Nginx,进而返回客户端
6. Nginx收到新的PHP程序请求,PHP-FPM引擎直接读取缓存中的opcode执行,节省第4步,提升了PHP编译解析效率
![opcache原理](index_files/1.png "opcache原理")
2. 拓:PHP的MySQL扩展
http://my.oschina.net/junn/blog/204594
https://blog.linuxeye.com/395.html
传统libmysql扩展
传统的PHP访问MySQL数据库,是通过MySQL数据库的libmysql client库,这个libmysql client是用C/C++编写的,虽然一直以来PHP通过libmysql访问数据库性能也一直很好,但是却无法利用PHP本身的很多特性
mysqlnd 扩展
mysqlnd提供了和Zend引擎高度的集成性,更加快速的执行速度,更少的内存消耗,利用了PHP的Stream API,以及客户段缓存机制。由于mysqlnd是透过Zend引擎,因此提供更多高级特性,以及有效利用Zend进行加速
mysqli扩展
MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性
PHP数据对象(PDO)
是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以使得你的PHP应用不去关心具体要 连接的数据库服务器系统类型,缺点是会限制让你不能使用 后期MySQL服务端提供所有的数据库高级特性
';
2. PHP5.6 部署
最后更新于:2022-04-02 07:47:03
#### 安装依赖
```shell
yum install zlib-devel libxml2-devel libjpeg-turbo-devel freetype-devel libpng-devel gd-devel libcurl-devel libmcrypt libmcrypt-devel mhash mhash-devel mcrypt libxslt-devel openssl openssl-devel
```
##### 依赖包注释
```shell
zlib-devel #压缩支持
libxml2-devel #管理xml文件
libjpeg-turbo-devel #使用libjpeg实现图像的输入输出和像素读写
freetype-devel #渲染字体
libpng #解析png图片
gd-devel #php处理图形的扩展库
libcurl-devel #用不同协议沟通不同服务器
libmcrypt #提供统一接口的对称加密算法库
mcrypt #加密算法扩展库
mhash #不可逆向的php加密方式扩展库
libxslt-devel #转换XML文件
```
##### libiconv需编译安装 #支持编码转换
```shell
cd /opt/
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
tar xzf libiconv-1.15.tar.gz
cd libiconv-1.15
./configure --prefix=/usr/local/libiconv
make && make install
echo $?
```
#### 安装PHP 5.6
```shell
./configure \
--prefix=/usr/local/php-5.6.30 \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-iconv-dir=/usr/local/libiconv \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--with-mcrypt \
--with-gd \
--enable-gd-native-ttf \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--enable-short-tags \
--enable-static \
--with-xsl \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-ftp
```
和PHP5.3的编译参数区别
```shell
--enable-safe-mode
--with-curlwrappers
--enable-zip
--enable-zend-multibyte
```
建立软连接
```shell
ln -s /usr/local/php-5.6.30 /usr/local/php
```
#### 配置PHP
复制生产配置文件
```shell
cp /opt/php-*/php.ini-production /usr/local/php/lib/php.ini
cd /usr/local/php/etc && cp php-fpm.conf.default php-fpm.conf
mkdir /app/logs
```
需要编辑部分
```shell
cat > /usr/local/php/etc/php-fpm.conf <
';
1. PHP 7.1 部署
最后更新于:2022-04-02 07:47:01
#### 架构
Nginx+PHP
Nginx安装请查看Nginx部署文档
#### 安装依赖
~~~
yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel
~~~
#### 下载并编译
下载
```shell
wget http://cn.php.net/distributions/php-7.1.6.tar.gz -P /opt
cd /opt
tar xzf php-7.1.6.tar.gz
cd php-7.1.6
```
##### 编译参数
```shell
./configure \
--prefix=/usr/local/php7.1 \
--exec-prefix=/usr/local/php7.1 \
--bindir=/usr/local/php7.1/bin \
--sbindir=/usr/local/php7.1/sbin \
--includedir=/usr/local/php7.1/include \
--libdir=/usr/local/php7.1/lib/php \
--mandir=/usr/local/php7.1/php/man \
--with-config-file-path=/usr/local/php7.1/etc \
--with-mcrypt=/usr/include \
--with-mhash \
--with-openssl \
--with-mysqli=shared,mysqlnd \
--with-pdo-mysql=shared,mysqlnd \
--with-gd \
--with-iconv \
--with-zlib \
--enable-zip \
--enable-inline-optimization \
--disable-debug \
--disable-rpath \
--enable-shared \
--enable-xml \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--enable-gd-native-ttf \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--without-pear \
--with-gettext \
--enable-session \
--with-curl \
--with-jpeg-dir \
--with-freetype-dir \
--enable-opcache \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--without-gdbm \
--disable-fileinfo
```
## 待解决:--with-iconv=/usr/local/iconv
##### 拷贝配置文件
```shell
cd /opt/php-7.1.6
cp php.ini-production /usr/local/php7.1/etc/php.ini
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
cp /usr/local/php7.1/etc/php-fpm.conf.default /usr/local/php7.1/etc/php-fpm.conf
```
##### 加载环境变量
```shell
echo -e 'export PATH=$PATH:/usr/local/php7.1/bin:/usr/local/php7.1/sbin\n' >> /etc/profile && source /etc/profile
```
##### 创建基础目录
PHP日志目录
php-fpm的sock目录
session的目录
```shell
mkdir -p /var/log/php-fpm/ /var/run/php-fpm /var/lib/php/session
chown -R nginx:nginx /var/run/php-fpm /var/lib/php/session
```
### 修改配置文件
#### php.ini
```shell
######避免PHP信息暴露在http头中
expose_php = Off
######避免暴露php调用mysql的错误信息
display_errors = Off
######在关闭display_errors后开启PHP错误日志(路径在php-fpm.conf中配置)
log_errors = On
######设置PHP的扩展库路径
extension_dir = "/usr/local/php7.1/lib/php/extensions/no-debug-non-zts-20141001/"
######设置PHP的opcache和mysql动态库
zend_extension=opcache.so
extension=mysqli.so
extension=pdo_mysql.so
######设置PHP的时区
date.timezone = Asia/Shanghai
######开启opcache
[opcache]
; Determines if Zend OPCache is enabled
opcache.enable=1
######设置PHP脚本允许访问的目录(需要根据实际情况配置)
;open_basedir = /data/ding/dynamic;
```
#### php-fpm.conf
最后追加
```shell
######设置错误日志的路径
error_log = /var/log/php-fpm/error.log
```
#### www.conf
```shell
cd /usr/local/php7.1/etc/php-fpm.d
cp www.conf.default www.conf
```
www.conf追加
```shell
######根据nginx.conf中的配置fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;设置PHP监听
;listen = 127.0.0.1:9000
;listen = /var/run/php-fpm/php-fpm.sock
######开启慢日志
slowlog = /var/log/php-fpm/$pool-slow.log
request_slowlog_timeout = 10s
######设置php的session目录(所属用户和用户组都是nginx)
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
```
### 追加模块
##### 设置开机
```shell
chmod +x /etc/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on
```
#### 疑问:编译后有一个输出
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
解释:安装后,模块存在
';
3.4.3 PHP
最后更新于:2022-04-02 07:46:58
[1. PHP 7.1 部署](1.PHP7.1%E9%83%A8%E7%BD%B2.md)
[2. PHP5.6 部署](2.PHP5.6%E9%83%A8%E7%BD%B2.md)
[4. PHP原理](4.PHP%E5%8E%9F%E7%90%86.md)
[5. PHP 常用模块](5.PHP%E5%B8%B8%E7%94%A8%E6%A8%A1%E5%9D%97.md)
';