Fork me on GitHub
Suzf  Blog

Tag web

Linux commands curl and wget

1、curl(文件传输工具)

常用参数如下:

-c,--cookie-jar:将cookie写入到文件

-b,--cookie:从文件中读取cookie

-C,--continue-at:断点续传

-d,--data:http post方式传送数据

-D,--dump-header:把header信息写入到文件

-F,--from:模拟http表达提交数据

-s,--slient:减少输出信息

-o,--output:将信息输出到文件

-O,--remote-name:按照服务器上的文件名,存在本地

--l,--head:仅返回头部信息

-u,--user[user:pass]:设置http认证用户和密码

-T,--upload-file:上传文件

-e,--referer:指定引用地址

-x,--proxy:指定代理服务器地址和端口

-w,--write-out:输出指定格式内容

--retry:重试次数

--connect-timeout:指定尝试连接的最大时间/s

使用示例:

例1:抓取页面到指定文件,如果有乱码可以使用iconv转码

# curl -o baidu.html www.baidu.com

# curl –s –o baidu.html www.baidu.com |iconv -f utf-8  #减少输出信息

例2:模拟浏览器头(user-agent)

# curl -A "Mozilla/4.0 (compatible;MSIE 6.0; Windows NT 5.0)" www.baidu.com

例3:处理重定向页面

# curl –L http://192.168.1.100/301.php   #默认curl是不处理重定向

例4:模拟用户登陆,保存cookie信息到cookies.txt文件,再使用cookie登陆

# curl -c ./cookies.txt -F NAME=user -F PWD=***URL            #NAME和PWD是表单属性不同,每个网站基本都不同

# curl -b ./cookies.txt –o URL

例5:获取HTTP响应头headers

# curl -I http://www.baidu.com

# curl -D ./header.txt http://www.baidu.com   #将headers保存到文件中

例6:访问HTTP认证页面

# curl –u user:pass URL

例7:通过ftp上传和下载文件
# curl -T filename ftp://user:pass@ip/docs  #上传

# curl -O ftp://user:pass@ip/filename   #下载

博客:http://lizhenliang.blog.51cto.com

2、wget(文件下载工具)

常用参数如下:

2.1 启动参数

-V,--version:显示版本号

-h,--help:查看帮助

-b,--background:启动后转入后台执行

2.2 日志记录和输入文件参数

-o,--output-file=file:把记录写到file文件中

-a,--append-output=file:把记录追加到file文件中

-i,--input-file=file:从file读取url来下载

2.3 下载参数

-bind-address=address:指定本地使用地址

-t,-tries=number:设置最大尝试连接次数

-c,-continue:接着下载没有下载完的文件

-O,-output-document=file:将下载内容写入到file文件中

-spider:不下载文件

-T,-timeout=sec:设置响应超时时间

-w,-wait=sec:两次尝试之间间隔时间

--limit-rate=rate:限制下载速率

-progress=type:设置进度条

2.4 目录参数

-P,-directory-prefix=prefix:将文件保存到指定目录

2.5 HTTP参数

-http-user=user:设置http用户名

-http-passwd=pass:设置http密码

-U,--user-agent=agent:伪装代理

-no-http-keep-alive:关闭http活动链接,变成永久链接

-cookies=off:不使用cookies

-load-cookies=file:在开始会话前从file文件加载cookies

-save-cookies=file:在会话结束将cookies保存到file文件

2.6 FTP参数

-passive-ftp:默认值,使用被动模式

-active-ftp:使用主动模式

2.7 递归下载排除参数

-A,--accept=list:分号分割被下载扩展名的列表

-R,--reject=list:分号分割不被下载扩展名的列表

-D,--domains=list:分号分割被下载域的列表

--exclude-domains=list:分号分割不被下载域的列表

使用示例:

例1:下载单个文件到当前目录下,也可以-P指定下载目录

# wgethttp://nginx.org/download/nginx-1.8.0.tar.gz

例2:对于网络不稳定的用户可以使用-c和--tries参数,保证下载完成

# wget --tries=20 -c http://nginx.org/download/nginx-1.8.0.tar.gz

例3:下载大的文件时,我们可以放到后台去下载,这时会生成wget-log文件来保存下载进度

# wget -b http://nginx.org/download/nginx-1.8.0.tar.gz

例4:可以利用—spider参数判断网址是否有效

# wget --spider http://nginx.org/download/nginx-1.8.0.tar.gz

例5:自动从多个链接下载文件

# cat url_list.txt   #先创建一个URL文件

http://nginx.org/download/nginx-1.8.0.tar.gz

http://nginx.org/download/nginx-1.6.3.tar.gz

# wget -i url_list.txt

例6:限制下载速度

# wget --limit-rate=1m http://nginx.org/download/nginx-1.8.0.tar.gz

例7:登陆ftp下载文件

# wget --ftp-user=user --ftp-password=pass ftp://ip/filename

来源: 互联网

 

Linux Web 服务器网站故障分析常用的命令

系统连接状态篇
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 -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

 

网站日志分析篇

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

cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -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 -20

3.列出传输最大的几个exe文件(分析下载站的时候常用)

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

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

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

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

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

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

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

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

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

10.蜘蛛分析,查看是哪些蜘蛛在抓取内容。

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

网站日分析2(Squid篇)

按域统计流量

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

 

数据库篇
1.查看数据库执行的sql

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

 

系统Debug分析篇
1.调试命令
strace -p pid
2.跟踪指定进程的PID
gdb -p pid

Web_Faq: TCP: time wait bucket table overflow

前几日 查看自己的 VPS 主机 返现 有报错信息如下:
kernel: TCP: time wait bucket table overflow
kernel: TCP: time wait bucket table overflow
kernel: TCP: time wait bucket table overflow
(TCP:时间等待桶表)

根据报错提示,需要更改net.ipv4.tcp_max_tw_buckets这个内核参数。这个参数是系统同时保持timewait套接字的最大数量。如果超过这个数字,time-wait套接字将立刻被清除并打印警告信息。这个限制仅仅是为了防止简单的 DoS攻击,你绝对不能过分依靠它或者人为地减小这个值,如果网络实际需要大于缺省值,更应该增加这个值(如果增加了内存之后)。

解决方法:增大 tcp_max_tw_buckets的值,并不是这个值越小越好,我看了我系统中TIME_WAIT 大部是由php-fpm产生的,是属于正常的现象。
系统在同时所处理的最大timewait sockets 数目。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要人为的降低这个限制﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存)。

netstat -an | grep 9000 | awk '{print $6}' | sort | uniq -c | sort -rn
netstat -an | grep 80 | awk '{print $6}' | sort | uniq -c | sort -rn

排查步骤:

1. 查看服务器网络连接情况;

# netstat -pant |awk '/^tcp/ {++state[$6]} END {for(key in state) printf("%-10s\t%d\n",key,state[key]) }'
TIME_WAIT 6798
CLOSE_WAIT 1
ESTABLISHED 592
SYN_RECV 69
CLOSING 39
LAST_ACK 19
LISTEN 107

2.查看内核参数
#sysctl -a | grep net.ipv4.tcp_max_tw_buckets
net.ipv4.tcp_max_tw_buckets = 8192

改为:net.ipv4.tcp_max_tw_buckets = 10000

3.使更改的内核参数生效
sysctl -p

4. 再次查看服务器网络连接情况;

# netstat -pant |awk '/^tcp/ {++state[$6]} END {for(key in state) printf("%-10s\t%d\n",key,state[key]) }'
TIME_WAIT 6644
...

5.再看/var/log/messages和dmesg的信息,已经不再报错了
看来net.ipv4.tcp_max_tw_buckets=10000暂时是够用了

6.原因

服务器的TCP连接数,超出了内核定义最大数。

 

LNMP之源码自定义安装

LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。

Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。代表版本有:debian、centos、ubuntu、fedora、gentoo等。
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Mysql是一个小型关系型数据库管理系统。
PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。
这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统。