青春纸盒子

文: 芦苇

你喜欢我笑的样子

我靠上了落寞的窗子

晚风吹起了我的袖子

明月沾湿了你的眸子


转身,你走出了两个人的圈子

树影婆娑,整座院子


挽起袖子

回头,把揽你忧伤一地的影子

装进,青春,这纸盒子


更多代码请关注我的微信小程序: "ecoder"

luwei0915

导航

临时规则

1> 脚本
 
1.awk扩展应用:分析Web日志的访问量排名,要求获得客户机的地址、访问次数,并且按照访问次数排名
 
分析:awk统计Web访问排名
在分析Web日志文件时,每条访问记录的第一列就是客户机的IP地址,其中会有很多重复的IP地址。因此只用awk提取出这一列是不够的,还需要统计重复记录的数量并且进行排序。
通过awk提取信息时,利用IP地址作为数组下标,每遇到一个重复值就将此数组元素递增1,最终就获得了这个IP地址出现的次数。
针对文本排序输出可以采用sort命令,相关的常见选项为-r、-n、-k。其中-n表示按数字顺序升序排列,而-r表示反序,-k可以指定按第几个字段来排序。
# awk '{ip[$1]++} END{for(i in ip) {print ip[i],i }}' /var/log/httpd/access_log  --->提取
# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log | sort -n/r  --->排名
 
**********************
2.nginx日志切割
 
]# vim /usr/local/nginx/logbak.sh
#!/bin/bash
date=`date +%Y%m%d`
logpath=/usr/local/nginx/logs
mv $logpath/access.log $logpath/access-$date.log
mv $logpath/error.log $logpath/error-$date.log
kill -USR1 $(cat $logpath/nginx.pid)
]# crontab -e
03 03 * * 5  /usr/local/nginx/logbak.sh
 
也可以是php日志:
]# ls /var/log/php-fpm/
error.log  www-error.log
 
也可以是Tomcat日志
***********************
3.memcache数据库连接脚本
]# vim /usr/local/nginx/html/test.php
<?php
$memcache=new Memcache;               //创建memcache对象
$memcache->connect('192.168.2.5',11211) or die ('could not connect!!');
$memcache->set('key','test');         //定义变量
$get_values=$memcache->get('key');    //获取变量值
echo $get_values;
?>
 
4.认LVS健康检查脚本
]# vim check.sh
#!/bin/bash
VIP=192.168.4.15:80
RIP1=192.168.4.100
RIP2=192.168.4.200
 
while :
do
   for IP in $RIP1 $RIP2
   do
           curl -s http://$IP &>/dev/vnull
if [ $? -eq 0 ];then
            ipvsadm -Ln |grep -q $IP(能查到,即为真) || ipvsadm -a -t $VIP -r $IP(前面为真,后面不执行)
        else
            ipvsadm -Ln |grep -q $IP(能查到,即为真) && ipvsadm -d -t $VIP -r $IP(为真才删)
        fi
   done
sleep 1
done

5.连接redis脚本
]# vim /usr/local/nginx/html/linkredis.php
<?php
$redis = new redis();
$redis->connect('192.168.4.50',6350);
$redis->auth("123456");
$redis->set('tel,'13152098678);
echo  $redis->get('tel');
?>
 
6.连接mongoDB脚本
]# vim  /usr/local/nginx/html/mdb1.php
<?php
$m = new Mongo("mongodb://192.168.4.50:27050");
$db = $m->buysite;
$c = $db->usera;
$data=array("name"=>"bob","age"=>19);
$c->insert($data);
echo  "data ok";
?>

***************************
2> nginx 优化
1.常见http状态码:
200 一切正常
301 永久重定向
302 临时重定向
401 用户名或密码错误
403 禁止访问(客户端IP地址被拒绝)
404 文件不存在
414 请求头过长
500 服务器内部错误
502 Bad Gateway
 
2.优化Nginx并发量
worker_processes  2; //进程,与CPU核心数量一致
events {
worker_connections 65535; //每个worker最大并发连接数(线程)
use epoll;
}
 
3.用户或组  硬限制或软限制
vim /etc/security/limits.conf
#用户或组  硬限制或软限制  需要限制的项目 限制的值
*  soft nofile 100000
*  hard nofile 100000
 
4.优化Nginx数据包头缓存
http {
client_header_buffer_size    1k;  //默认请求包头信息的缓存    
large_client_header_buffers  4 6m;  //最大请求包头部信息的缓存个数与容量,生产环境4k足以
 
5.浏览器本地缓存静态数据
ocation ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
    expires  30d; //定义客户端静态缓存时间为30天,一定要有;号
 
6.日志切割
 
7.对页面进行压缩处理
  http {...
   gzip on;        //开启压缩
   gzip_min_length 1000;  //小文件不压缩
   gzip_comp_level 4;     //压缩比率
   gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; //对特定文件压缩,类型参考mime.types
]# nginx -s reload
 
8.服务器内存缓存
http {
...
open_file_cache  max=2000  inactive=20s;
    open_file_cache_valid    60s;
    open_file_cache_min_uses 5;
    open_file_cache_errors   off;
//设置服务器最大缓存2000个文件句柄,关闭20秒内无请求的文件句柄
//文件句柄的有效时间是60秒,60秒后过期
//只有访问次数超过5次会被缓存
 
9.配置PHP使用memcached服务器共享Session信息(部署在后端web).
]# vim /etc/php-fpm.d/www.conf  //文件的最后2行
 
修改前效果如下:
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
//原始文件,默认定义Sessoin会话信息本地计算机(默认在/var/lib/php/session)
 
修改后效果如下:
php_value[session.save_handler] = memcache
php_value[session.save_path] = "tcp://192.168.2.5:11211"
//定义Session信息存储在公共的memcached服务器上,主机参数中为memcache(没有d)
//通过path参数定义公共的memcached服务器在哪(服务器的IP和端口)
]# systemctl restart php-fpm
 
10.部署varnish缓存服务器(5.2.1)
]# vim  /usr/local/etc/default.vcl
backend default {
  .host = "192.168.2.100";
  .port = "80";
 }
启动服务
]# nginx -s stop(如果占用的话)
]# varnishd -f /usr/local/etc/default.vcl
//varnishd命令的其他选项说明如下:
//varnishd –s malloc,128M  定义varnish使用内存作为缓存,空间为128M
//varnishd –s file,/var/lib/varnish_storage.bin,1G 定义varnish使用文件作为缓存
 
]# varnishlog  varnish日志
]# varnishncsa 访问日志
]# varnishadm  命令管理缓存页面
]# varnishstat 查看Varnish状态

11 Nginx安全优化包括:删除不要的模块、修改版本信息、限制并发、拒绝非法请求、防止buffer溢出。

禁用自动索引文件目录模块;

隐藏版本信息:
http{
     server_tokens off;
1.12]# vim +48 src/http/ngx_http_header_filter_module.c

限制并发量
DDOS攻击者会发送大量的并发连接,占用服务器资源(包括连接数、带宽等),这样会导致正常用户处于等待或无法访问服务器的状态。
Nginx提供了一个ngx_http_limit_req_module模块,可以有效降低DDOS攻击的风险,操作方法如下:
http{
… …
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
        listen 80;
        server_name localhost;
        limit_req zone=one burst=5;
            }
}
//备注说明:
//limit_req_zone语法格式如下:
//limit_req_zone key zone=name:size rate=rate;
//上面案例中是将客户端IP信息存储名称为one的共享内存,内存空间为10M
//1M可以存储8千个IP信息,10M可以存储8万个主机连接的状态,容量可以根据需要任意调整
//每秒中仅接受1个请求,多余的放入漏斗
//漏斗超过5个则报错

拒绝非法的请求
网站使用的是HTTP协议,该协议中定义了很多方法,可以让用户连接服务器,获得需要的资源。但实际应用中一般仅需要get和post。
]# curl -i -X GET  http://192.168.4.51  //正常
]# curl -i -X HEAD http://192.168.4.51  //正常
//curl命令选项说明:
//-i选项:访问服务器页面时,显示HTTP的头部信息
//-X选项:指定请求服务器的方法
 listen 80;
#这里,!符号表示对正则取反,~符号是正则匹配符号
#如果用户使用非GET或POST方法访问网站,则retrun返回444的错误信息
              if ($request_method !~ ^(GET|POST)$ ) {
                     return 444;
                     ...
防止buffer溢出
当客户端连接服务器时,服务器会启用各种缓存,用来存放连接的状态信息。
如果攻击者发送大量的连接请求,而服务器不对缓存做限制的话,内存数据就有可能溢出(空间不足)。
修改Nginx配置文件,调整各种buffer参数,可以有效降低溢出风险。
 
]# vim /usr/local/nginx/conf/nginx.conf
http{
client_body_buffer_size  1K;   客户端缓冲区的大小
client_header_buffer_size 1k;  协议头部信息的大小
client_max_body_size 1k;       网页页面内容的大小
large_client_header_buffers 2 1k; 客户端头部信息的大小

12.配置Nginx支持PHP动态网站
http{
… …
    fastcgi_buffers 8 16k;        //缓存php生成的页面内容,8个16k
    fastcgi_buffer_size 32k;      //缓存php生产的头部信息
    fastcgi_connect_timeout 300;  //连接PHP的超时时间
    fastcgi_send_timeout 300;     //发送请求的超时时间
    fastcgi_read_timeout 300;     //读取请求的超时时间
***********************
3> Tomcat 优化
1.Tomcat的主要启动文件
]# ls /usr/local/tomcat
bin/       //主程序目录
lib/       //库文件目录
logs/      //日志目录  
temp/      //临时目录
work/      //自动编译目录jsp代码转换servlet
conf/      //配置文件目录
webapps/   //页面目录
]# ln -s /usr/local/tomcat/bin/startup.sh /sbin/
]# ln -s /usr/local/tomcat/bin/shutdown.sh /sbin/
私钥、证书存储路径为:/usr/local/tomcat/conf/cert

2.Tomcat配置文件详解、
组件类别:
    顶级组件     :位于整个配置的顶层,如server。
    容器类组件   :可以包含其它组件的组件,如service、engine、host、context。
    连接器组件   :连接用户请求至tomcat,如connector。
    被嵌套类组件 :位于一个容器当中,不能包含其他组件,如Valve、logger。
 
8080: http 1.1 connector,也就是接收处理http请求的端口,如果你只用一个tomcat处理所有请求,可以只使用这个connector。
8005: tomcat接受关闭指令的端口,比如你要关闭tomcat,这个接口会收到shutdown的指令,然后关闭所有后台线程。
8009: ajp connector,它一般用来设置tomcat集群。因为tomcat作为servlet容器,对于处理静态资源的能力不是很好,所以一般大点的项目都会在tomcat前面加个apache服务器,用来处理静态资源和负载均衡,通过预先设定的规则把动态请求通过ajp端口交给tomcat处理,这时可以只使用ajp connector。
8443:网页加密端口

Tomcat安全优化包括:隐藏版本信息、降权启动、删除默认测试页面.
隐藏版本信息:(错误页面、正确页面)
vim /usr/local/tomcat/lib/org/apache/catalina/util/ServerInfo.properties
vim /usr/local/tomcat/lib/usr/local/tomcat/conf/server.xml(69行)

降权启动:
默认tomcat使用系统高级管理员账户root启动服务,启动服务尽量使用普通用户。
//修改tomcat目录的权限,让tomcat账户对该目录有操作权限
]# vim /etc/rc.local            //修改文件,添加如下内容
su -c /usr/local/tomcat/bin/startup.sh tomcat

删除默认的测试页面
]# rm -rf /usr/local/tomcat/webapps/*

***************************
4> DB
1.memcache
PORT="11211"
USER="memcached"
MAXCONN="1024"  //最大连接数
CACHESIZE="64"  //缓存64k

2.MySQL 5.7.17
MySQL安全优化包括:初始化安全脚本、密码安全、备份与还原、数据安全。

2.1 数据库引擎
InnoDB MyISAM MEMORY CSV

InnoDB:支持事物、行锁、外键、自增长
从MySQL5.5.8,InnoDB成为MySQL默认的存储引擎。
表结构:.frm
数据:innodb_data_home
索引:innodb_data_path
插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能。

MyISAM
MySQL5.5.8之前MyISAM是MySQL默认的存储引擎。
MyISAM不支持事务,不支持外键,支持全文索引,处理速度快。
MyISAM存储引擎的表存储成3个文件:
    frm文件:存储表的结构。
    myd文件:存储数据。
    myi文件:存储存储索引。
MySQL 5.0版本之前,MyISAM默认支持的表大小为4GB。
从MySQL5.0开始,MyISAM默认支持256T的单表数据。
MyISAM的缓冲池只缓存索引文件,而不缓存数据文件,64位的系统可以支持大于4GB的索引缓冲区。数据文件的缓存交给操作系统完成。

MEMORY
MEMORY存储引擎(之前被称为HEAP存储引擎)将表中的数据存储在内存中。
表结构以文件存储于磁盘。文件名与表名相同,后缀名为frm。
MEMORY存储引擎默认使用哈希索引,可以按需求指定索引类型。
只支持表锁,并发性能较差。不支持VARCHAR、BLOB和TEXT的列类型。
MEMORY存储引擎通常很少用到。由于基于内存,所以响应速度非常快。但若内存出现异常就会影响到数据的完整性。若重启机器或者关机,或当mysqld守护进程崩溃时,所有的MEMORY数据都会丢失。


MyISAM:

    不支持事务,但是每次查询都是原子的;
    支持表级锁,即每次操作是对整个表加锁;
    存储表的总行数;
    一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;
    采用菲聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。

InnoDb:

    支持ACID的事务,支持事务的四种隔离级别;
    支持行级锁及外键约束:因此可以支持写并发;
    不存储总行数;
    一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为2G),受操作系统文件大小的限制;
    主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。

2.2 数据库备份

逻辑备份工具 mysqldump
]# mysqldump -u root -p123456 --all-databases > /root/alldb.sql
]# mysql -u root -p123456 userdb2 < /root/userdb.sql

**************************

使用binlog日志
server_id=50
log-bin=mysql50
binlog_format=STATEMENT
Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW!

Statement:每一条会修改数据的sql都会记录在binlog中。
优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。(相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。)

缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题(如sleep()函数, last_insert_id(),以及user-defined functions(udf)会出现问题).

Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。
优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题
缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行alter table之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。

Mixedlevel: 是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。

max_binlog_size    100m      //binlog每个日志文件大小
binlog-do-db=需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可
binlog-ignore-db=不需要备份的数据库苦命,如果备份多个数据库,重复设置这个选项即可

**************************

innobackupex备份工具
安装percona软件包
innobackupex完整备份、增量备份操作。
恢复数据
]# yum -y install percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
]# innobackupex --user=root --password=1234567 /backup --no-timestamp
]# innobackupex --user=root --password=1234567 --incremental /incr01 --incremental-basedir=/backup --no-timestamp
]# innobackupex --user=root --password=1234567 --apply-log --redo-only /backup/
]# innobackupex --user=root --password=1234567 --apply-log --redo-only /backup/ --incremental-dir=/incr01
]# innobackupex --copy-back /backup

2.3 主从集群
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicater'@'192.168.4.%' IDENTIFIED BY '123qqq...A';
从库配置
mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.4.51',
    -> MASTER_USER='replicater',
    -> MASTER_PASSWORD='123qqq...A',
    -> MASTER_LOG_FILE='master51.000001',
    -> MASTER_LOG_POS=453;
mysql> START SLAVE;   //启动复制
mysql> SHOW SLAVE STATUS\G

读写分离: maxscale-2.1.2-1.rhel.7.x86_64.rpm

多实例:]# vim /etc/my.cnf
[mysqld_multi]        //启用多实例

2.4 性能优化:
默认的并发连接数:4
默认的最大连接数:151
连接超时:10
插入超时:300
读超时:30
写超时:60
允许保存在缓存中被重用的线程数量:9
用于MyISAM引擎的关键索引缓存大小:8M
为每个要排序的线程分配的缓存空间:256k
为顺序读取表记录保留的缓存大小:128k
所有线程缓存的打开的表的数量:2000
查询缓存:1M

2.5 mha集群:主从复制、高可用
MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

2.6 mycat 分片服务器
从mycat写的数据通过分片分配写到后端数据服务器集群里。


3. redis-4.0.8
]# redis-cli
127.0.0.1:6379> ping
PONG     //PONG说明服务正常
]# redis-trib.rb  create  --replicas 1 \
> 192.168.4.51:6351  192.168.4.52:6352 \
> 192.168.4.53:6353  192.168.4.54:6354 \
> 192.168.4.55:6355  192.168.4.56:6356

主库宕机后,对应的从库会自动升级为主库,原主库起来后,成为新主库的从库。
命令行指定主库 > slaveof 主库ip 端口
命令行把从库恢复为主库 > slaveof no one

哨兵服务配置文件
主库宕机后,从库自动升级为主库
在slave主机编辑sentinel.conf文件
在slave主机运行哨兵程序

redis持久化
启用RDB
]# vim /etc/redis/6379.conf
dbfilename dump.rdb
save 900 1 900秒内且有1次修改
save 300 10 300秒内且有10次修改
save 60 10000 60秒内且有10000修改
]# cd /var/lib/redis/6379/
6379]# ls
dump.rdb
RDB优点:
高性能的持久化实现:创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,再用这个临时文件替换上次持久化好的文件;过程中主进程不做任何IO操作
比较适合大规模数据恢复,且对数据完整性要求不是非常高的场合
RDB的缺点:
意外宕机时,最后一次持久化的数据会丢失

使用AOF文件恢复数据
启用AOF
备份AOF文件
删除数据
使用AOF文件恢复数据
只做追加操作的文件,Append Only File
记录redis服务所有写操作
不断的将新的写操作,追加到文件的末尾
使用cat命令可以查看文件内容
参数配置
文件名
appendfilename "appendonly.aof" 指定文件名
appendonly yes 启用aof ,默认no
AOF文件记录写操作的方式
appendfsync always 有新写操作立即记录
appendfsync everysec 每秒记录一次
appendfsync no 从不记录

6379]# vim /etc/redis/6379.conf(修改,不需要添加)
appendonly yes                  //启用aof,默认no
appendfilename "appendonly.aof" //文件名
appendfsync everysec            //每秒记录一次
AOF优点:
可以灵活的设置同步持久化appendfsync always或异步持久化appendfsync verysec
宕机时,仅可能丢失1秒的数据
RDB的缺点:
AOF文件的体积通常会大于RDB文件的体积
执行fsync策略时的速度可能会比RDB慢

**********************
4.MongoDB 1.6.16
]# /usr/local/mongodb/bin/mongo --host 192.168.4.50 --port 27050(两次)
> db.t1.remove({name:"tom"})
> db.t2.drop()
> show tables
> db.t15.find()
正则表达式 数组 内嵌 代码 对象
导出为json格式
]# /usr/local/mongodb/bin/mongoexport \
 --host 192.168.4.50 --port 27050  \
 -d gamedb -c t1 --type=json > /mdb/gamedb_t1.json(必须有gamedb库,t1表)

]# /usr/local/mongodb/bin/mongoimport \
 --host 192.168.4.50 --port 27050 \
 -d bbsdb  -c user --type=json /mdb/gamedb_t1.json

MongoDB副本集
]#/usr/local/mongodb/bin/mongo --host 192.168.4.51 --port 27051
> config={
_id:"rs1",
members:[
{_id:0,host:"192.168.4.51:27051"},
{_id:1,host:"192.168.4.52:27052"},
{_id:2,host:"192.168.4.53:27053"}
]
}
查看集群信息
> rs.status()
> rs.isMaster()
测试集群功能(高可用功能测试)
停止当前主库的mongodb服务,
在2个副本主机查看集群状态信息(两个副本机会随机选举一个作为主库)
把坏掉的主库修复后会自动配置位当前主库的副本主机并自动同步宕机期间的数据

************
添加网关的命令
client ~]# nmcli connection modify eth0 ipv4.gateway 192.168.4.5
client ~]# nmcli connection up eth0
*************

**********************
5.Zabbix监控平台 zabbix-3.4.4
]# free | awk '/Mem/{print $4}'  查看剩余内存容量
]# df -h | awk '/\/$/{print $5}' 查看根分区的利用率

]# uptime                         //查看CPU负载(1,5,15分钟)
19:32:17 up  1:46,  1 user,  load average: 0.00, 0.01, 0.01
]# uptime |awk '{print $NF}'      //仅查看CPU的15分钟平均负载

]# ifconfig eth0 |awk '/inet /{print $2}'    //查看IP地址信息
]# ifconfig eth0 |awk '/RX p/{print $5}'     //网卡接受数据包流量
]# ifconfig eth0 |awk '/TX p/{print $5}'     //网卡发送数据包流量

posted on 2019-03-31 18:11  芦苇の  阅读(324)  评论(0)    收藏  举报