三剑客之awk

最近各种云盘挂掉,直到上周,用了很久的为知笔记官方宣布要收费了,就不吐槽了,云端的东西各种不靠谱,还是把平时的一些有价值的笔记,转移到博客吧,转多少是多少。

因为是整理的笔记,所以可能很乱,见谅!

- 阅读剩余部分 -

Redis3.0.6安装

之前的版本是2.4,开发要求3.0以上的,目前最新的stable版是3.0.6,就选这个吧。安装非常简单,做个记录吧。

redis是直接编译到src目录的,所以我们尽量不要在用户家目录编译,否则可能有些用户不能运行,我们选择在/usr/local下操作。

- 阅读剩余部分 -

Linux下用ping监测网络状态并告警

其实个人感觉在部署了zabbix后,这个监测的意义并不是很大,但是公司要求每天把ping结果发给几位负责人,之前都是手工ping,然后截图发送结果的,实在是费时费力,于是就写脚本吧。

具体要求:每天早上9:10分开始,ping目标ip 20分钟,9:30把结果发送给相关负责人。

- 阅读剩余部分 -

CentOS6.5最小化安装后的简单调优配置

很长时间没有安装centos了,今天公司又托管了一台服务器,安装时发现记忆有些本来记的很牢的东西已经有点模糊了,时间真是个可怕的东西。

记录整理下安装配置过程,备忘吧。

系统选择的是的centos 6.5x64,据说各大互联网公司几乎都在用这个版本,我们也用吧。最小化安装然后自己选包,可能有些有洁癖的同学会说,干嘛要选包,我就是要mini安装,爱折腾,任性!好吧,我表示我选的都是我要用的。

1

2

34

如图,一共600个包。当然,没有哪个包是必须的,只是这些都是我要的,web服务的生产环境一般都会用的到。

装好后,开始配置吧。

1,配置网络

默认安装后是dhcp,每次开机都会自动获取1个随机的IP,这当然不是我要的,手动配置。

vi /etc/sysconfig/network-scripts/ifcfg-eth0

11

注意ONBOOT=yes 是开机启动,默认是no,改之!改好后:wq保存退出。

重启网卡使之生效。

/etc/init.d/network restart

12

ifconfig查看一下,没问题就OK了。

2,更新yum源

阿里云、网易、新浪等等都有提供镜像,任选,我这里选阿里云的了。

[root@web ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[root@web ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
[root@web ~]# yum makecache

这里顺手更新一下系统补丁,因为一旦应用后,一般就不会再考虑升级了,所以这个时候把补丁打一下。

yum update (注意这个不会升级内核,不会升级版本,比如6.5-6.6这样,和yum upgrade要区分一下)

3,关闭selinux

这货在我印象里就完全没用,至于到底有什么用,也不清楚,反正做web应用的,这货绝对可以咔嚓掉!

sed –i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config

不放心就再cat /etc/selinux/config一下。

setenforce 0

让修改立即生效,这个不做也没事,因为是全新安装,稍后会重启一次。

4,调整文件描述符大小

这里我们参照阿里云的设置,相信是没错的。vi /etc/security/limits.conf,在最后加上。

* soft noproc 65535
* hard noproc 65535
* soft nofile 65535
* hard nofile 65535

5,内核优化

#可用于apache,nginx,squid多种等web应用
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800

#net.ipv4.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024 65535


#以下参数是对centos6.x的iptables防火墙的优化,防火墙不开会有提示,可以忽略不理。
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120

/sbin/sysctl -p 使之立即生效。其实这个还是习惯脚本实现。

还有更改用户,限制root登录,修改ssh端口等一些安全设置就不写了。酌情处理吧。

解决MySQL备份时出现“Using a password on the command line interface”

今天给博客做了个自动备份的脚本,脚本是以前就写好并且一直在生产环境使用的,直接套上去就用了。结果看到这样的错误提示:Using a password on the command line interface

mysql错误

前面说了,脚本肯定是没问题的,那么错误是怎么来的呢?字面理解的意思是在命令行使用密码是不安全的。额,这是个警告信息,其实数据库备份是成功的,没有问题的。没办法呀,强迫症不能忍呀。百度之!

原来这是MySQL5.6版本才会有的安全警告,而我用的是最新的5.7.11,所以。。。

mysql5.7.11

查帮助找到:

MySQL users should use the following guidelines to keep passwords secure.
When you run a client program to connect to the MySQL server, it is inadvisable to specify your password in a way that exposes it to discovery by other users. The methods you can use to specify your password when you run client programs are listed here, along with an assessment of the risks of each method. In short, the safest methods are to have the client program prompt for the password or to specify the password in a properly protected option file.

Store your password in an option file. For example, on Unix, you can list your password in the [client] section of the .my.cnf file in your home directory:

本人英语很烂,看懂了个大概,配合翻译得出结论:使用命令行的时候可以在得到提示后输入密码,或者在指定的安全文档内输入密码,至于那个安全文档,上面也给出了答案,就是my.cnf了。

所以,

vim /etc/my.cnf
host=localhost
user=数据库用户
password='数据库密码'

在[client]部分加上你的user和password就可以了。

如果你不想修改也没关系,用以下命令操作mysql即可。

导出:

mysqldump --defaults-extra-file=/etc/my.cnf database > database.sql

导入:

mysql --defaults-extra-file=/etc/my.cnf database < database.sql

聪明的你肯定已经发现不同了。
所以再说一次,生产环境下,推荐MySQL5.5版本!关于5.5的编译安装可以看我的另一篇博文《编译安装MySQL 5.5》。

zabbix3.0安装之MySQL 5.5篇

目前,5.5版本是很多大公司的首选,个人建议生产环境下选择这个版本,当然了,大多数情况下不是我们说了算,是开发,他们可能更偏爱5.1或者5.2,有时候说服开发也是个挺头疼的事。

确认当前环境,以下以opdev.me自用的腾讯云学生机为例。

[root@VM_31_225_centos ~]# uname -rn
VM_31_225_centos 2.6.32-504.30.3.el6.x86_64
[root@VM_31_225_centos ~]#
下载MySQL5.5安装源,我们选择从官方下载。
[root@VM_31_225_centos ~]# cd /usr/local/src/
[root@VM_31_225_centos ~]# wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.45-linux2.6-x86_64.tar.gz
[root@VM_31_225_centos ~]# mkdir /usr/local/mysql -p
[root@VM_31_225_centos ~]# mkdir /usr/local/mysql/data -p
[root@VM_31_225_centos ~]# mkdir /usr/local/mysql/tmp -p
安装cmake及依赖。
[root@VM_31_225_centos ~]# yum -y install cmake ncurses-devel
解压安装源。
[root@VM_31_225_centos ~]# tar xf mysql-5.5.45.tar.gz
进入正题,编译安装!
[root@VM_31_225_centos ~]# cd mysql-5.5.45
[root@VM_31_225_centos mysql-5.5.45]# cmake . \
> -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.5.45 \
> -DMYSQL_DATADIR=/usr/local/mysql-5.5.45/data \
> -DMYSQL_UNIX_ADDR=/usr/local/mysql-5.5.45/tmp/mysql.sock \
> -DDEFAULT_CHARSET=utf8 \
> -DDEFAULT_COLLATION=utf8_general_ci \
> -DENABLED_LOCAL_INFILE=1 \
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \
> -DWITH_FEDERATED_STORAGE_ENGINE=1 \
> -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
> -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
> -DWITHOUT_PARTITION_STORAGE_ENGINE=1 \
> -DWITH_ZLIB=bundled \
> -DWITH_READLINE=1 \
> -DWITH_EMBEDDED_SERVER=1 \

...
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/local/src/mysql-5.5.45
[root@VM_31_225_centos mysql-5.5.45]#

[root@VM_31_225_centos mysql-5.5.45]# make
...
[100%] Built target my_safe_process
[root@VM_31_225_centos mysql-5.5.45]#

[root@VM_31_225_centos mysql-5.5.45]# make install


安装完成后创建mysql用户。

[root@VM_31_225_centos mysql-5.5.45]# useradd -s /sbin/nologin -M mysql
[root@VM_31_225_centos mysql-5.5.45]# id mysql
uid=500(mysql) gid=500(mysql) groups=500(mysql)
[root@VM_31_225_centos mysql-5.5.45]# 
加入系统变量,更改目录属性
[root@VM_31_225_centos mysql-5.5.45]# ln -s /usr/local/mysql-5.5.45/ /usr/local/mysql
[root@VM_31_225_centos mysql-5.5.45]# echo 'export PATH=/usr/local/mysql/bin/:$PATH'>>/etc/profile
[root@VM_31_225_centos mysql-5.5.45]# source /etc/profile
[root@VM_31_225_centos mysql-5.5.45]# chown -R mysql.mysql /usr/local/mysql/
[root@VM_31_225_centos mysql-5.5.45]# 
[root@VM_31_225_centos mysql-5.5.45]# 
复制配置文件及启动脚本
root@VM_31_225_centos mysql-5.5.45]# cd /usr/local/mysql/support-files/
[root@VM_31_225_centos support-files]# ls my-*
[root@VM_31_225_centos support-files]# cp my-huge.cnf /etc/my.cnf 
cp: overwrite `/etc/my.cnf'? y
[root@VM_31_225_centos support-files]# 

[root@VM_31_225_centos support-files]# cp mysql.server /etc/init.d/mysqld


初始化数据库

[root@VM_31_225_centos support-files]# sh /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --user=mysql
Installing MySQL system tables...
OK
Filling help tables...
OK
...
[root@VM_31_225_centos support-files]#
启动MySQL
[root@VM_31_225_centos support-files]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS! 
[root@VM_31_225_centos support-files]# 

[root@VM_31_225_centos support-files]# lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 17115 mysql 11u IPv4 52461 0t0 TCP *:mysql (LISTEN)
[root@VM_31_225_centos support-files]#


修改 root 密码

[root@VM_31_225_centos support-files]# mysqladmin -uroot password 'flyym'
好了,登陆试一下。
[root@VM_31_225_centos support-files]# mysql -uroot -pflyym
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.45-log Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.01 sec)

mysql> \q
Bye
[root@VM_31_225_centos support-files]#

快速找出linux下的大文件

这是个经常遇到的问题,比如磁盘空间不足,需要释放空间,又比web故障,快速的找出大文件或者目录,有时能帮我们找到故障的原因并解决。记得刚踏入现公司的第一天就遇到一个web故障,网站访问异常,发现是磁盘空间占满导致的,具体过程就不说了,进而发现一个web目录占用超过170G了,全是数据库备份文件,汗。

回正题,查找当然是用到find命令了,详细的用法大家可以-help查看。下面给个例子:查找磁盘大于100M的文件

# find / -type f -size +100000k | xargs ls -lh | awk '{ print $9 ": " $5 }'
./ibdata1: 10M
./www_flyym_com/flyym_postmeta.MYD: 216M
./www_flyym_com/flyym_posts.MYD: 236M
./www_flyym_com/flyym_posts.MYI: 238M

当然,具体运用的时候,配合du df命令,效果更佳,关于du命令,请参考《linux下查看文件大小-移动文件到指定目录

du -h --max-depth=1 |sort -hr #查看当前所有子目录的大小并排序
find /home/ -type f -size +1G | xargs ls -l #列出/home下大于1G的文件
find /home/ -type f -size +1G -exec du -sh {} \; #列出/home下大于1G的文件
find /home/ -type f -size +1G | xargs rm -rf {}\; #删除/home下大于1G的文件

运维常用故障排查命令

整理总结了一些常用分析网站的命令方便大家快速定位故障所在排除故障,最小化的减少故障给业务带来的影响。

端口连接类

1.查看TCP连接状态

netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn 
netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'
netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}'
netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn 
netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c

2.查找请求数请20个IP(常用于查找攻来源):

netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20

3.用tcpdump嗅探80端口的访问看看谁最高

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -n 20

4.查找较多time_wait连接

netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20

5.找查较多的SYN连接

netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

6.根据端口列进程

netstat -ntlp | grep 80 | awk '{print $7}' | cut -d/ -f1

7.查看http的并发请求数及其TCP连接状态

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

8.查看连接某服务端口最多的的IP地址

netstat -an -t | grep ":80" | grep ESTABLISHED | awk '{printf "%s %s\n",$5,$6}' | sort

9.查看Apache的并发请求数及其TCP连接状态

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

Web日志类

1.获得访问前10位的ip地址

cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -n 10
cat access.log|awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}'

2.访问次数最多的文件或页面,取前20

cat access.log|awk '{print $11}'|sort|uniq -c|sort -nr|head -n 20

3.列出传输最大的几个rar文件

cat access.log |awk '($7~/\.rar/){print $10 " " $1 " " $4 " " $7}'|sort -nr|head -n 20

4.列出输出大于200000byte(约200kb)的rar文件以及对应文件发生次数

cat access.log |awk '($10 > 200000 && $7~/\.rar/){print $7}'|sort -n|uniq -c|sort -nr|head -n 100

5.如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面

cat access.log |awk '($7~/\.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -n 100

6.列出最最耗时的页面(超过60秒的)的以及对应页面发生次数

cat access.log |awk '($NF > 60 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -n 100

7.列出传输时间超过 30 秒的文件

cat access.log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -n 20

8.统计网站流量(G)

cat access.log |awk '{sum+=$10} END {print sum/1024/1024/1024}'

9.统计404的连接

awk '($9 ~/404/)' access.log | awk '{print $9,$7}' | sort

10. 统计http status.

cat access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}'
cat access.log |awk '{print $9}'|sort|uniq -c|sort -rn

11.查看是哪些爬虫在抓取内容。

tcpdump -i eth0 -l -s 0 -w - dst port 80 | strings | grep -i user-agent | grep -i -E 'bot|crawler|slurp|spider'

12.按域统计流量

zcat squid_access.log.tar.gz| awk '{print $10,$7}' |awk 'BEGIN{FS="[ /]"}{trfc[$4]+=$1}END{for(domain in trfc){printf "%s\t%d\n",domain,trfc[domain]}}'

13.查看数据库执行的sql语句

tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | egrep -i 'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL'

14.调试命令

strace -p pid

15. 简单web

python -m SimpleHTTPServer [port] //默认8000端口

16.统计一下服务器下面所有jpg文件的大小

find / -name *.jpg -exec wc -c {} \;|awk '{print $1}'|awk '{a+=$1}END{print a}'

进程类

1.进程总数

ps aux | wc -l

2.清除僵死进程

ps -eal | awk '{ if ($2 == "Z") {print $4}}' | kill -9

3.杀掉80端口相关的进程

lsof -i :80|grep -v "PID"|awk '{print "kill -9",$2}'|sh

4.检查是否有异常错误记录

grep -i error /var/log/messages
 grep -i fail /var/log/messages

5.跟踪指定进程的PID

gdb -p pid

文件类

1.列出当前目录中今天修改的文件

find . -maxdepth 1 -mmin -$((`date +%H`*60+`date +%M`))
find . -maxdepth 1 -newermt $(date --date='now' '+%Y-%m-%d')

2.列出3天内修改的文件

find . -mtime -3 -print
find / -mtime  +/- 数字 执行之前或之内的几天

3.找出2017-01-01这一天修改的文件,当前目录

find . -maxdepth 1 -newermt "2017-01-01"

其他

如何在编写SHELL显示信息,用EOF

cat << EOF
 +--------------------------------------------------------------+
 | === Welcome to opdev.me  ===                                |
 +--------------------------------------------------------------+
 EOF