Apache-系统-网络部分配置
参考了很多东西,但有些理解可能会有错误的地方,希望看到错误的地方可以即使纠正。
参考的内容。
http://netsecurity.51cto.com/art/200608/30428.htm
http://blog.csdn.net/shootyou/article/details/6615051
http://blog.csdn.net/shootyou/article/details/6622226
http://rdc.taobao.com/blog/cs/?p=1062
目录
1、几个单词注释
2、使用telnet Http请求
3、TCP三次握手
1)SYN_RECV过多的危害
4、TCP四次断开
1、主动模式下的web服务器
1)CLOSE_WAIT过多
2)LAST_ACK
2、被动模式下的web服务器
1)FIN_WAIT-1
2)FIN-WAIT-2
3)Time_wait
5、设置系统TCP套接字相关的参数
6、一些额外的参数
7、本文的所有配置
1、几个单词注释:
syn是TCP协议中的一个标志位。如果该位被置为1,则表示这个报文是一个请求建立连接的报文。
FIN(ISH)为TCP报头的码位字段,该位置为1的含义为发送方字节流结束,用于关闭连接。
ack也是TCP协议的一个标志位。如果该位被置为1,则表示这个报文是一个用于确认的报文。ACK (Acknowledgement),即确认字符。
2、使用telnet Http请求:
1)收集两端HTTP状态的脚本
[root@web ~]# cat /home/script/http_conn.sh
#!/bin/sh
while true
do
num=1
time=`date +%F' '%H:%M:%S`
tcp=`netstat -n |awk '/^tcp/{print $0}'|egrep 54.208.35.245|grep 80|wc -l`
stat=`netstat -n |awk '/^tcp/{print $0}'|egrep 54.208.35.245|grep 80|awk '{print $6}'`
[ $tcp -eq 0 ]|| echo "$time---->$stat" >>/tmp/http
echo $stat
Done
2)在服务端跟客户端同时sh执行这个脚本,同时在客户端使用telnet进行请求服务。
[root@web ~]# telnet 54.208.35.245 80
Trying 54.208.35.245...
Connected to 54.208.35.245.
Escape character is '^]'.
3)使用命令稍微处理输出的文件/tmp/http
[root@webserver-01 ~]# uniq -c /tmp/http |awk '{print $2" "$3}'
客户端状态:
2013-07-21 17:50:46---->SYN_SENT
2013-07-21 17:50:47---->SYN_SENT
2013-07-21 17:50:47---->ESTABLISHED
。。。。。。。。。。。
2013-07-21 17:51:18---->ESTABLISHED
2013-07-21 17:51:18---->LAST_ACK
2013-07-21 17:51:18---->
服务端状态:
2013-07-22 04:14:08---->SYN_RECV
2013-07-22 04:14:09---->ESTABLISHED
。。。。。。。。。。。。。。
2013-07-22 04:14:38---->ESTABLISHED
2013-07-22 04:14:39---->FIN_WAIT1
2013-07-22 04:14:39---->TIME_WAIT
。。。。。。。
2013-07-22 04:15:40---->TIME_WAIT
可以看到,Apache服务器做的工作其实,建立一次连接Established,然后等待超过设置的Timeout的值,然后就归属于的TCP/IP的范围了,所以对TCP参数进行一些调整有助于我们的web服务器提高更高的并发。
3、TCP三次握手
在TCP三次握手中,我们通常更关心网站的SYN_RECV的状态是否过多
1)SYN_RECV过多的危害:
1、占用系统和内存资源
2、当超出系统设置的SYN队列的长度,若不启用syncookies,则新用户无法正常连接。
2)相关的网络参数:
[root@webserver-01 ~]# sysctl -a |grep syn |grep ipv4
net.ipv4.tcp_max_syn_backlog = 512
#设置系统所允许的syn的队列的最大长度,在不启用syncookies的情况下,超过该参数
#系统则会拒绝处理新的syn请求,通过上面的三次握手,可以知道如果没有syn的确认,
#则服务端就不会与客户端建立连接,传输数据,那新建打开网站的用户,就无法正常访问。
net.ipv4.tcp_syncookies = 1
#这个参数设置,其实是与上面的max_syn_backlog相辅助的,当syn队列超过上面参数的
#设置的时候,开启该参数,系统则会通过对比cookies的方式,进行TCP三次握手
在SYN cookies中,服务器的初始序列号是通过对客户端IP地址、客户端端囗、服务器IP地址和服务器端囗以及其他一些安全数值等要素进行hash运算,加密得到的,称之为cookie。当服务器遭受SYN攻击使得backlog队列满时,服务器并不拒绝新的SYN请求,而是回复cookie(回复包的SYN序列号)给客户端, 如果收到客户端的ACK包,服务器将客户端的ACK序列号减去1得到cookie比较值,并将上述要素进行一次hash运算,看看是否等于此cookie。如果相等,直接完成三次握手
net.ipv4.tcp_syn_retries = 5
#如果客户端一直没有发ACK包确认建立连接,则服务端会尝试发送SYN包请求客户端,
#该参数设置的就是,在未得到客户端确认的时候,发送SYN包的数量,建议1-2
net.ipv4.tcp_synack_retries = 5
#这个参数与上面参数设置的也差不多,不过发送的数据包为ACK+SYN,默认尝试发送的次#次数为1-2
4、TCP四次断开
主动模式与被动模式:
谁先关,谁就是主动,比如客户端直接关机了,那客户端就是主动,server端就是被动。
1、被动模式下的web服务器
在四次断开中,可能是客户端断开,也有可能是服务端断开,所以服务端通常都会存在。
被动断开:
1)CLOSE_WAIT过多
这个状态通常没有什么直接有效的参数去调整,从上图可以看出,此时客户端发给服务端一个FIN关闭请求。
但服务端处于某些原因未正确回应给客户端。此时,服务端就会处于CLOSE_WAIT。所以,从这里看出,这个状态完全是由服务端造成的,通常可能是由于网站程序的问题造成的。
此时,服务器端就相当于维持了一个非活动的连接,如果有些情况下需要调整,那就只有从调整服务端,保持非活动连接的时间,和超过保持时间后,尝试的重新连接的次数,来减少这个状态。
相关的参数:
[root@webserver-01 /]# sysctl -a|grep keep
net.ipv4.tcp_keepalive_time = 180
#系统TCP非活动连接的保持时间,默认为2小时,我一般设置为120-300秒
net.ipv4.tcp_keepalive_intvl = 2
#如果超过上面的保持时间,每隔多长时间发送一次请求,我设置为了2分钟。
net.ipv4.tcp_keepalive_probes = 2
#尝试连接的次数,当超过超时时间后,每隔2分钟尝试连接一次,一共尝试2次。
需要注意的是,处于该连接状态下,Apache仍然会保持这个连接,且不会断开。所以,该状态尽量少一些比较好。
2)LAST_ACK
此时服务器端已经开始尝试关闭连接,此时对应的TCP套接字已经与APACHE没有什么关系,但是该状态会占用的一定的系统资源,最多可以吃叼64K的内存,所以在高并发的机器上还是尽量减小此值。
相关的参数:
[root@web-01 ~]# sysctl -a|grep orphan
net.ipv4.tcp_max_orphans = 65536
#该参数定义,系统里可以维持孤儿连接的最大数目
net.ipv4.tcp_orphan_retries = 0
#该参数定义,对孤儿连接尝试重新连接的次数,这里用的aws里默认的0,即立刻丢弃。
#也有些朋友的生产环境设置为1-2。
当系统的最大孤儿进程的数目超过了,我们设置的max_orphans,则就当dmesg就会看到”too many of orphaned sockets”。
2、主动模式下的web服务器
主动断开:
1)FIN_WAIT-1
该状态下,server端仍然与client端建立着连接,此时server端仍然可以向client端发送数据,一般情况下,对方都会马上的回应ACK,然连接的状态就会转入FIN-WAIT-2状态,所以该状态通常比较少见,也没有对其的该状态的调整参数。
如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态。
与此相关的,我们可以考虑的一点思路。
此时该连接的状态,如果server端不在向client端发送数据,则就会变成非活动连接,与其相关的保持非活动连接的时间,就是我们可以设置的值之一,此外如果是别人发起的攻击,建议关闭TCP的滑动窗口。
滑动窗口参数:
[root@web-01 ~]# sysctl -a|grep window|grep scaling
net.ipv4.tcp_window_scaling = 1
#我的思路:该参数设置后,只要有空间接受别人的连接,则就会接收,在这里的思路就是,#少接受一些,尽量正常服务一些有限的用户。
2)FIN-WAIT-2
该参数正常情况下,通常是服务端还有一些数据需要传给客户端,此状态相比FIN-WAIT-1状态带来的资源消耗小的多,一般情况下最大不会超过15K,而且我们可以设置该状态的超时时间。
相关参数:
[root@web-01 ~]# sysctl -a|grep fin
net.ipv4.tcp_fin_timeout = 15
#超过15秒就会进入Time_wait状态。
3)Time_wait
这个状态可能是很多朋友遇到比较多的一种,该状态下,会占用一定量的系统资源,如果是在一些并发量比较高的网站上,则新到的请求,我们的web服务器可能就不能即使处理。
通常的一些策略:
1.快速回收
2.连接重用
3.减小time_wait队列的长度
相关参数:
[root@web-01 ~]# sysctl -a|grep tw
net.ipv4.tcp_max_tw_buckets = 65536
#该值用于指定系统Time_wait队列的长度
net.ipv4.tcp_tw_recycle = 1
#当为1时,会快速回收系统的time_wait状态的sock,
net.ipv4.tcp_tw_reuse = 0
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭。
这几个参数存在的几个问题
1.减少time_wait最快的方法,其实就是减少其队列的长度,但如果过短,系统就会在/var/log/message下面 出现大量的该日志。
www kernel: TCP: time wait bucket table overflow
2.关于net.ipv4.tcp_tw_recycle 该参数的一个案例,这是我谷歌的时候搜到的,希望大家调参数的时候,不要犯同样的错误。
摘过来的关键内容:
我们在一些高并发的 WebServer上,为了端口能够快速回收,打开了 tcp_tw_reccycle ,而在关闭 tcp_tw_reccycle 的时候,kernal 是不会检查对端机器的包的时间戳的;打开了 tcp_tw_reccycle 了,就会检查时间戳,很不幸移动的cmwap发来的包的时间戳是乱跳的,所以我方的就把带了“倒退”的时间戳的包当作是“recycle的tw连接的重传数据,不是新的请求”,于是丢掉不回包,造成大量丢包。
该案例的连接,想看的朋友可以看下:
http://blog.csdn.net/wireless_tech/article/details/6405755
5、设置系统TCP套接字相关的参数
默认参数
[root@web-01 ~]# sysctl -a|grep tcp|grep mem
net.ipv4.tcp_mem = 14595 19461 29190
net.ipv4.tcp_rmem = 4096 87380 5020128
net.ipv4.tcp_wmem = 4096 20480 4194304
下面是一些跳过的参数
net.ipv4.tcp_rmem = 4096 87380 4194304
#net.ipv4.tcp_rmem 用来配置读缓冲的大小,三个值,第一个是这个读缓冲的最小值,第一#个是最大值,中间的是默认值。我们可以在程序中修改读缓冲的大小,但是不能超过最小
#与最大。为了使每个socket所使用的内存数最小,我这里设置默认值为4096。
net.ipv4.tcp_wmem = 4096 16384 4194304
#net.ipv4.tcp_wmem 用来配置写缓冲的大小。
#读缓冲与写缓冲在大小,直接影响到socket在内核中内存的占用。
net.ipv4.tcp_mem = 1048576 3145728 2097152
#net.ipv4.tcp_mem则是配置tcp的内存大小,其单位是页,而不是字节。当超过第二个值时,#TCP进入pressure模式,此时TCP尝试稳定其内存的使用,当小于第一个值时,就退出#pressure模式。当内存占用超过第三个值时,TCP就拒绝分配socket了,查看dmesg,会
#打出很多的日志“TCP: too many of orphaned sockets”。
6、一些额外的参数:
[root@web-01 ~]# sysctl -a|grep somaxconn
net.core.somaxconn = 128
这个值不能调高系统的最大连接数,但是能调高系统同事发起连接的tcp连接数
如果是由于系统网络并发联机数过多导致连接不上,那么调整这个数值应该有效
[root@web-01 ~]# sysctl -a|grep netdev_max
net.core.netdev_max_backlog = 1000
每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
[root@web-01 ~]# sysctl -a|grep port |grep range
net.ipv4.ip_local_port_range = 32768 61000
用于本机向外连接的可用的端口范围。对一般的web应用其实默认的这些已经够用了。
net.ipv4.netfilter.ip_conntrack_max = 120000
该参数是在我们开启了iptables防火墙的情况下,可能会出现下面的错误
kernel: ip_conntrack: table full, dropping packet.
kernel: printk: 1 messages suppressed.
我们可以加大这个值,来解决默认的比较小为15000左右。
7、本文的所有配置:
[root@web-01 ~]# sysctl -p
net.ipv4.tcp_mem =1048576 3145728 2097152
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_intvl = 2
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_orphan_retries = 2
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_tw_buckets = 65536
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.core.somaxconn = 60000
net.core.netdev_max_backlog = 327680
net.netfilter.nf_conntrack_max = 120000
Apache-系统-网络部分配置的更多相关文章
- PHP-5.5.10+Apache httpd-2.4.9在Windows系统下配置实战
原文 PHP-5.5.10+Apache httpd-2.4.9在Windows系统下配置实战 环境配置: 程序准备: PHP windows版本下载地址: http://windows.php. ...
- OSX系统下配置Apache+PHP+MySQL+Navicat
概述 OSX系统对于PHP运行非常友好,我们只需要进行简单的配置便可以开始进行使用,本篇文章将一步一步地介绍Apache.PHP和MySQL的安装与配置,为开始进行开发铺好路 Apache 启动Apa ...
- linux下安装apache与php;Apache+PHP+MySQL配置攻略
1.apache 在如下页面下载apache的for Linux 的源码包 http://www.apache.org/dist/httpd/; 存至/home/xx目录,xx是自建文件 ...
- windows下PHP与Apache的安装配置
1.下载安装apache:官网 http://httpd.apache.org/download.cgi#apache24 下载httpd-2.2.25-win32-x86-no_ssl.msi并安装 ...
- 分享:linux下apache服务器的配置和管理
linux下apache服务器的配置和管理. 一.两个重要目录: Apache有两个重要的目录:1.配置目录/etc/httpd/conf:2.文档目录/var/www: 二.两种配置模式: Apac ...
- JDK+Apache+Tomcat+MySQL配置 一起来学习吧
配置JDK1.8+Apache2.4+Tomcat8.0+mySQL5.1,网上的资料非常繁杂,花费几天时间配置成功,汇总记录. 操作系统:CentOS6.5 预先下载最新版软件: apache-to ...
- apache 基本vhost配置 【目的及过程】
转: apache 基本vhost配置 2012年04月18日 09:39:28 chamtianjiao 阅读数:74075 经常使用Apache虚拟主机进行开发和测试,但每次需要配置虚拟主 ...
- 分布式大数据多维分析(OLAP)引擎Apache Kylin安装配置及使用示例【转】
Kylin 麒麟官网:http://kylin.apache.org/cn/download/ 关键字:olap.Kylin Apache Kylin是一个开源的分布式分析引擎,提供Hadoop之上的 ...
- 在Mac系统下配置PHP运行环境
概述 Mac系统对于PHP运行非常友好,我们只需要进行简单的配置便可以开始进行使用,本篇文章将一步一步地介绍Apache.PHP和MySQL的安装与配置,为开始进行开发铺好路 Apache 启动Apa ...
- 基于 Apache 在本地配置多个虚拟主机
如何使用 Apache 在本地配置出多个虚拟主机呢?而且使用不同的“域名”来访问本地不同的站点呢? 一般情况下,咱们都使用 localhost 来访问本机上的服务器,在我们的 C:/WINDOWS/s ...
随机推荐
- bsp tree
http://www.cnblogs.com/dreams/archive/2007/03/25/687267.html http://blog.csdn.net/iduosi/article/det ...
- Intent(意图)
Intent的中文意思是“意图,目的”的意思,可以理解为不同组件之间通信的“媒介”或者“信使”. 目标组件一般要通过Intent来声明自己的条件,一般通过组件中的<intent-filter&g ...
- 使用SchemaSpy逆向工程生成数据库依赖关系使用SchemaSpy工具可以快速的从数据库中得到
使用SchemaSpy逆向工程生成数据库依赖关系 使用SchemaSpy工具可以快速的从数据库中得到表的依赖关系,同时生成一个生动的“表图”结合的报告.方便快速了解数据库中的数据库对象间关系,类 ...
- C#调用其它语言(例如C++)DLL文件中函数的方法摘要
有托管和非托管的概念没仔细看,接下来记录的引用Dll文件指的是无法通过VS自动完成添加引用的情况,可以使用如下方法: 步骤一: 打开“Visual Studio Tools”的“命令提示符”工具 使用 ...
- ios开发APP必须要了解的基本配置
1,配置开发版本 AdHoc开发版,AppStore正式版 2,oc的宏转swift //常量=>ObjectC宏 letLoadingTip="加载中..." letiOS ...
- 打造自己的Markdown编辑器
原文链接: http://www.errdev.com/post/5/ Markdown以其简洁的语法赢得了广大程序猿的喜爱,搜了一下github上相关的web编辑器,星星比较多的 Stackedi ...
- QCon 2013 上海 -- 高并发可用
高并发可用应该是这次QCon的主要议题,目测超过一半的话题都在讨论这个主题或者和这个主题相关.看到Yun关于AWS re:Invent的总结,好像这个在AWS上也是很热的一个主题.就我个人而言,没 ...
- cocos2d-html5将js编译为jsc
在d:\DevTool\cocos2d-x-2.2.2\cocos2d-x-2.2.2\tools\cocos2d-console\console 有 cocos2d_jscompile.py coc ...
- html5 canvas 像素随机百分之十显示
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 生成500个0-1000的随机数&&数组查找—小练习
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...