工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.51099.com 注册 | 登陆
浏览模式: 标准 | 列表2012年06月的文章

squid.conf部分解析

  1. cache_effective_user squid #运行squid的用户
  2. cache_effective_group squid #运行squid的用户所在的组
  3. visible_hostname squid1.cache.cn #设定squid的主机名,如无此项squid将无法启动
  4. http_port 80 accel vhost vport #代理端口
  5. icp_port 3130 #icp端口
  6. # 配置其他缓存服务器,当squid1在其缓存中没有找到请求的资源时,通过ICP查询去其邻居中取得缓存
  7. cache_peer 192.168.0.150 sibling 80 3130
  8. # 后端web服务器配置,round-robin表示通过轮询方式将请求分发到其中一台web节点
  9. cache_peer 192.168.0.108 parent 80 0 no-query originserver round-robin name=webServer1
  10. cache_peer 192.168.0.109 parent 80 0 no-query originserver round-robin name=webServer2
  11. cache_peer 192.168.1.115 parent 80 0 no-query originserver round-robin name=webServer3
  12. cache_peer_domain webServer1 webServer2 webServer3 .xuad.com #根据通配域名xuad.com来进行转发
  13. # 下面三行是配置访问控制的
  14. acl localnet src 192.168.0.149 192.168.0.150 #配置同级代理服务器IP段
  15. http_access allow all #允许以上所有规则通过
  16. icp_access allow localnet #允许localnet规则通过
  17. # URL中包含cgi-bin和以https:\\开头的都不缓存,asp、cgi、php、jsp等动态页面也不缓存
  18. hierarchy_stoplist cgi-bin ?
  19. hierarchy_stoplist -i ^https:\\ ?
  20. acl QueryString urlpath_regex -i cgi-bin \? \.asp \.php \.jsp \.cgi
  21. acl denyssl urlpath_regex -i ^https:\\
  22. no_cache deny QueryString
  23. no_cache deny denyssl
  24. # 日志和缓存目录的设置
  25. cache_log /usr/local/squid/var/logs/cache.log #cache.log日志文件存放目录
  26. access_log /usr/local/squid/var/logs/access.log squid #access.log日志文件存放目录
  27. cache_dir aufs /var/cache 1024 16 256 #设定缓存目录cache,目录容量最大1024M,16*256级子目录
  28. cache_dir aufs /var/squid 3072 16 256 #设定缓存目录squid,目录容量最大3072M,16*256级子目录
  29. cache_mem 128 MB #squid用于缓存的内存容量
  30. # 当缓存目录空间使用达到95%以上时,新的内容将取代旧的内容,直到空间又下降到90%才停止这一活动
  31. cache_swap_low 90
  32. cache_swap_high 95
  33. # 设置存储策略
  34. maximum_object_size 4096 KB #能缓存的最大对象为4M
  35. maximum_object_size_in_memory 80 KB #内存中缓存的最大对象80K
  36. ipcache_size 1024 #缓存DNS解析得到的IP,最大单个对象为1024K
  37. ipcache_low 90
  38. ipcache_high 95
  39. cache_replacement_policy lru #缓存替换策略
  40. memory_replacement_policy lru #内存替换策略
  41. memory_pools on #开启内存池
  42. memory_pools_limit 32 MB #限制内存池大小为32MB
  43. forwarded_for on #开启转发
  44. log_icp_queries off #关闭icp查询日志
  45. forward_timeout 20 seconds #允许转发超时20秒
  46. connect_timeout 30 seconds #连接到其他机器的最大尝试时间
  47. read_timeout 3 minutes #允许读取超时3分钟
  48. request_timeout 1 minutes #允许返回超时1分钟
  49. persistent_request_timeout 30 seconds #允许持续连接超时30秒
  50. client_lifetime 15 minutes #客户端会话保持
  51. shutdown_lifetime 5 seconds
  52. negative_ttl 30 seconds #设置错误信息的生存时间
  53. # 允许一个IP最大并发数为50
  54. acl OverConnLimit maxconn 50
  55. http_access deny OverConnLimit
  56. client_persistent_connections off #对客户端长连接KeepAlive这个参数的支持
  57. server_persistent_connections on # 开启服务端的KeepAlive,web端要开启KeepAlive,不然这里打开是没用的
  58. tcp_recv_bufsize 65535 bytes #TCP套接字接收缓冲区大小
  59. half_closed_clients off #当客户与squid的连接处于半关闭状态时,允许squid立即关闭连接
  60. via on #开启转发循环的检测
  61. request_header_access via deny all #避免由于两台squid的主机名一样而返回403错误
  62. httpd_suppress_version_string off #错误页面不显示squid的版本信息
  63. ie_refresh off #是否允许对旧版本的IE浏览器强制刷新页面

注:shutdown_lifetime 5 seconds说明:当收到SIGTERM 或者 SIGHUP 信号后,squid将进入一种shutdown pending的模式,等待所有活动的套接字关闭。在过了shutdown_lifetime所定义的时间后,所有活动的用户都将收到一个超时信息。缺省值为30秒。

setuptool

yum install -y setuptool

system-config-network-tui

个性化定制你的系统

二.个性化定制你的系统 
去掉装机图片:修改/tank-os/isolinux/boot.msg文件,删除“splash.lss”。 
删除/tank-os/isolinux/splash.lss这个图片。 
去掉安装过程中的CentOS字样: 
在安装光盘里面有两个.buildstamp文件,一个位于stage2.img中,一个位于initrd.img中, 
安装光盘运行时读取的是initrd.img中的那个.buildstamp文件,所以只要把initrd.img文件改了就可以了。 
2.6内核中的initrd.img采用cpio压缩,不再是2.4内核使用的ext2格式,无法使用mount -o loop 挂载。需 
要使用gunzip解压缩,然后再使用利用cpio给img解包 
# cd /tank-os/isolinux/ 
# cp initrd.img /tmp/initrd.img.gz 
# cd /tmp 
# gunzip initrd.img.gz 
# mkdir initrd 
# mv initrd.img initrd 
# cd initrd 
# cpio -ivmd < initrd.img 
然后修改.buildstamp文件,将CentOS改为tank-os即可.当然,里面的网址也可以改。

生成新的initrd.img文件: 
#cd /tmp/initrd 
# find . | cpio -c -o > ../initrd.img 
# gzip ../initrd.img 
#cd .. 
# mv initrd.img.gz initrd.img 
# cp initrd.img /tank-os/isolinux/ 
然后将 initrd.img复制到/tank-os/isolinux/,覆盖旧的。

三.打包发布 
# cd /tank-os 
# declare -x discinfo=`head -1 .discinfo` //指定环境变量discinfo 
# createrepo -u "media://$discinfo" -g repodata/comps.xml . //生成repodata数据库。 
说明:repodata 数据库精确描述一个rpm包的详细信息,如依赖关系,包含文件,校验码信息。它的文件主要是XML格式。

生成ISO文件 
#cd /tank-os 
#mkisofs -R -J -T -r -l -d -allow-multidot -allow-leading-dots -no-bak -o /tmp/tank-os-0.1-i386.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table .

生成Md5,供下载后校验ISO 
#md5sum /tmp/tank-os-0.1-i386.iso > tank-os-0.1-i386.iso.md5

四.另建立个虚拟机测试安装该ISO

下面是补充

二.个性化定制你的系统(问答形式)
1.如何定制安装开机画面:
启动画面用的是一种比较奇怪的格式lss16,它限制图片使用16种颜色,除去前景和背景色只能有14种颜色。我们需要ppmtolss16 giftopnm等程序,系统一般默认都安装了。
一般用gimp生成一个index模式的gif图形,颜色限制为14, 然后通过如下的办法进行转:
安装yum -y install syslinux
giftopnm < splash.gif | ppmtolss16 > splash.lss
另外你还需要修改isolinux/boot.msg文件,做一些个性化的提示.
?如何生成高质量的图。
先用photoshop打开任何一张图片,然后在文件的下拉菜单里,保存的时候选择“保存为WEB和设备使用格式“,再然后选择gif再选择16色保存就OK.
仍后利用giftopnm < splash.gif | ppmtolss16 > splash.lss 转换即可.
2.如何生成GRUP的xpm文件?
(1) 将备一张640 x 480 16色图片,档案类型为JPG的格式

conver命令没有话,就:yum install ImageMagick 
(2)convert grub.gif -colors 14 -geometry 640x480! splash.xpm && gzip -9 splash.xpm
(3) 直接替换/boot/grup/splash.xpm.gz 文件即可.
? 利用上面方法生成的图片可能无法显示,或者质量不高,如何生成高质量的grub图片呢.
利用文中后面我提供的ltospackl.tar.gz里面的grubtool.exe即可在windows平台将jpg,bmp图生成为.xpm.gz格式的文件,直接替换/boot/grup下的文件即可.
2.如何去掉安装过程中的CentOS字样?
在安装光盘里面有两个.buildstamp文件,一个位于stage2.img中,一个位于initrd.img中,
安装光盘运行时读取的是initrd.img中的那个.buildstamp文件,所以只要把initrd.img文件改了就可以了。
如何解压initr.dimg文件:
2.6内核中的initrd.img采用cpio压缩,不再是2.4内核使用的ext2格式,无法使用mount -o loop 挂载。需要使用gunzip解压缩,然后再使用
利用cpio给img解包
# cd /ltos/isolinux/
# cp initrd.img /tmp/initrd.img.gz
# cd /tmp
# gunzip initrd.img.gz
# mkdir initrd
# mv initrd.img initrd
# cd initrd
# cpio -ivmd < initrd.img
仍后修改.buildstamp文件,将CentOS改为LTOS即可.
如何制作initrd.img文件:
#假设当前目录位于准备好的initrd文件系统的根目录下
# find . | cpio -c -o > ../initrd.img
# gzip ../initrd.img
# mv initrd.img.gz initrd.img
# cp initrd.img /ltos/isolinux/
仍后将initrd.img复制到/ltos/isolinux/3. 如何替换安装以后的grub ?
在安装光盘里的ks.cfg文件里写好替换splash.xpm.gz文件即可.
4. 如何去掉启动过程中的"CentOS release 5 (Final)"
在安装光盘里的ks.cfg文件里写好脚本,直接替换/etc/redhat-release即可.
三.打包生成ISO文件发布
# cd /ltos
# declare -x discinfo=`head -1 .discinfo`
# createrepo -u "media://$discinfo" -g repodata/comps.xml .
生成ISO文件
#mkisofs -R -J -T -r -l -d -allow-multidot -allow-leading-dots -no-bak -o /tmp/ltos-0.1-i386.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table .
Md5

/usr/lib/anaconda-runtime/implantisomd5 /tmp/ltos-0.1-i386.iso

在RH下使用mkisofs制作启动镜像时碰到问题

#mkisofs -R -J -T -V Boot -r -d -allow-multidot -allow-leading-dots -no-bak -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o boot.iso

Warning: creating filesystem that does not conform to ISO-9660.
INFO:   UTF-8 character encoding detected by locale settings.
        Assuming UTF-8 encoded filenames on source filesystem,
        use -input-charset to override.
mkisofs: Missing pathspec.

1、去掉-d选项,解决Warning: creating filesystem that does not conform to ISO-9660.

2、增加-input-charset UTF-8,解决INFO:   UTF-8 character encoding detected by locale settings.

3、在句尾"-o /dada/boot/boot.iso"之后增加". "变成"-o /dada/boot/boot.iso ." ,解决mkisofs: Missing pathspec.

最终命令如下:

mkisofs -R -J -T -V Boot -joliet-long -no-bak -allow-multidot -allow-leading-dots -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -input-charset UTF-8 -o /dada/boot/boot.iso .

 

-----------------------------------

我查到另外的生成ISO命令

mkisofs -o ../cdrom.iso -A 'ISOLINUX' -V 'ISOLINUX'   -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot     -boot-load-size 4 -boot-info-table   -input-charset UTF-8 .

集成raid驱动下CentOS 5.5系统盘的定制

由于CentOS 5.5操作系统自身没有集成Logic MegaRAID SAS 1078驱动,所以在标配有此类raid卡的服务器需要安装CentOS 5.5时,需要我们用软驱或者U盘的方式来加载raid驱动,进而完成系统的安装。针对此种情况,本人突发奇想,想自定制一套满足此类raid卡的CentOS 5.5系统盘,此系统盘除了只需手动分区外(由于分区会因业务的不同会有所变化,故此处不定制),其余所有要实现自动安装之目的,而且需增加一些第三方的软件包与做一些系统安全方面的设置,从而达到真正自动运维之目的,为了这个梦想,本人找遍谷歌与百度,网上都能难找到一篇完全的教程与文档来实现我的这个想法。紧接着...下面就有了我自己艰难的定制之路。

    在定制之前,本人开始直接想尝试修改光盘根目录下的isolinux目录下的引导文件isolinux.cfg,直接在引导选项加入Logic MegaRAID SAS 1078卡的驱动文件megasr.img,即操作方式:dd=cdrom:/megasr.img文件,可是事与愿违,启动安装过程中,提示让我们再次选择设备驱动器来加载第三方驱动,故只有另辟蹊径,重谋对策。考虑到系统安装识别驱动是靠initrd.img这个镜像来实现的,需initrd.img这个文件解开,把Logic MegaRAID SAS 1078 raid卡驱动文件中的.ko文件导入到initrd.img文件,进行再次打包,以实现系统的顺利安装;同时为了实现安装好的系统顺利启动,我们再次需要编辑ks.cfg这个kickstart文件,将Logic MegaRAID SAS 1078 raid卡驱动文件中的.ko文件导入到/lib/modules/`uname -r`/updates/目录下,mkinitrd重新制作initrd文件来实现安装后系统的引导,具体步骤如下:

1、挂载光驱

[root@localhost ~]# mount /dev/cdrom /mnt 

2、创建临时目录

[root@localhost ~]# mkdir -p /root/iso/CentOS 

3、提取安装好系统需要RPM包

    正常安装好操作系统在/root目录下会有install.log文件,这个就是操作系统安装RPM包的记录,我们从这些记录中,将所需的RPM包从/mnt/CentOS中复制到/root/iso/CentOS里面去,这里我们编写脚本package.sh。

[root@localhost ~]# vi package.sh  
#!/bin/bash
cd /root
awk '/Installing/{print $2}' install.log | sed 's/^[0-9]*://g' >package.txt
DVD='/mnt/CentOS'
PACKDIR='/root/package.txt'
NEW_DVD='/root/iso/CentOS/'
while read LINE
do
cp ${DVD}/${LINE}*.rpm /${NEW_DVD} || echo "$LINE don't cp......."
done < package.txt
rm -f package.txt

运行package.sh脚本,会筛选出我们需要的一些rpm包,rpm包放置在我们定制系统盘的/root/iso目录下的CentOS目录中。

[root@localhost ~]# sh package.sh 

4、把原镜像除了CentOS目录外的文件全部复制至/root/iso目录下

[root@localhost ~]# rsync -av --exclude=CentOS /mnt/  /root/iso 

5、解开initrd.img文件(file /root/iso/isolinux/initrd.img查看是gzip文件)

[root@localhost ~]# mkdir /tmp/initrd  

[root@localhost ~]# cd /tmp/initrd  

[root@localhost initrd]# gzip -dc /root/iso/isolinux/initrd.img | cpio -ivd  

[root@localhost initrd]# cd modules  

[root@localhost modules]# gzip -dc modules.cgz | cpio -ivd 

modules子目录中的modules.cgz是经过gzip压缩过的cpio包,将其解开。

6、解压Logic MegaRAID SAS 1078 raid卡驱动文件megasr.img文件(这里以附件的形式上传到博文后面,请自行解压,导入)

[root@localhost modules]# mkdir /tmp/megasr 

[root@localhost modules]# mount -o loop /root/megasr.img /media  

[root@localhost modules]# cp /media/*  /tmp/megasr  

[root@localhost modules]# cd /tmp/megasr/  

[root@localhost megasr]# gzip -dc modules.cgz | cpio -ivd  

[root@localhost megasr]# cp 2.6.18-194.el5/megasr.ko /tmp/initrd/modules/2.6.18-194.el5/x86_64/  

[root@localhost megasr]# cat modules.alias >> /tmp/initrd/modules/modules.alias  

mkdir /tmp/megasr 

 7、生成新的initrd.img文件
    就像我们以前所做的,修改了源码包中的内容就势必再次打包恢复,这里我们需要把修改过的内容打包成一个initrd.img文件,不过这里要注意打包时的压缩格式,modules.cgz文件用的是crc格式,而initrd.img文件用的是newc格式,命令参数不要弄错。

[root@localhost megasr]# cd /tmp/initrd/modules  

[root@localhost modules]# find 2.6.18-53.el5 | cpio -o -H crc | gzip -9 > modules.cgz  

[root@localhost modules]# rm -rf 2.6.18-53.el5  

[root@localhost modules]# cd ..  

[root@localhost initrd]# find . | cpio -o -H newc | gzip -9 > /tmp/initrd.img 

8、将打包好的initrd.img文件复制到 /root/iso/isolinux 目录

[root@localhost initrd]# cp /tmp/initrd.img /root/iso/isolinux 

9、上述第3步操作中,在/root/iso/CentOS目录下的软件包仅是我们定制的一些系统自带的rpm软件包;除此之外,我们还需要增加一些系统不自带的软件包,如:MegaClinload,并且禁止了ipv6协议。(其中MegaCli-2.00.15-1.i386.rpm与nload-0.7.4.tar.gz软件包详见博文后面的nload与MegaCli工具附件,请自行解压开来,上传到服务器上)

[root@localhost initrd]# cd  

[root@localhost ~]# mkdir /root/iso/Custom  

[root@localhost ~]# cp MegaCli-2.00.15-1.i386.rpm /root/iso/CentOS  

[root@localhost ~]# cp /tmp/megasr/2.6.18-194.el5/megasr.ko /root/iso/Custom  

[root@localhost ~]# cp nload-0.7.4.tar.gz /root/iso/Custom  

 10、安装上述定制的软件包,我们需要配置ks.cfg文件,具体ks.cfg的配置文件如下:  

[root@localhost ~]# cd /root/iso

[root@localhost iso]# vi ks.cfg

  1. # Kickstart file automatically generated by anaconda.
  2. install
  3. cdrom
  4. lang en_US.UTF-8
  5. langsupport --default=en_AU.UTF-8 en_US.UTF-8 zh_CN.UTF-8 zh_HK.UTF-8 zh_CN.UTF-8 zh_SG.UTF-8 zh_TW.UTF-8 en_AU.UTF-8
  6. keyboard us
  7. # Network information
  8. network --device=eth0 --bootproto=dhcp --onboot=on
  9. rootpw 123456.
  10. authconfig --enableshadow --enablemd5
  11. firewall --disabled
  12. selinux --disabled
  13. timezone Asia/Shanghai
  14. bootloader --location=mbr
  15. # The following is the partition information you requested
  16. # Note that any partitions you deleted are not expressed
  17. # here so unless you clear all partitions first, this is
  18. # not guaranteed to work
  19. clearpart --all --drives=sda
  20. # part /boot --fstype ext3 --size=200
  21. # part swap --size=8196
  22. # part / --fstype ext3 --size=50000
  23. # part /movies --fstype ext3 --size=100 --grow
  24. # Reboot after installation
  25. reboot
  26. %packages
  27. @base
  28. @chinese-support
  29. @core
  30. @development-libs
  31. @development-tools
  32. @dialup
  33. @editors
  34. @ftp-server
  35. @legacy-network-server
  36. @legacy-software-development
  37. @legacy-software-support
  38. @server-cfg
  39. @system-tools
  40. @text-internet
  41. keyutils
  42. trousers
  43. fipscheck
  44. device-mapper-multipath
  45. perl-Convert-ASN1
  46. imake
  47. lsscsi
  48. audit
  49. net-snmp-utils
  50. sysstat
  51. iptraf
  52. dstat
  53. expect
  54. MegaCli
  55. gfs-utils
  56. gfs2-utils
  57. OpenIPMI-tools
  58. %post --nochroot
  59. # 挂载光驱
  60. mkdir -p /mnt/cdrom
  61. mount -r -t iso9660 /tmp/cdrom /mnt/cdrom
  62. # 拷贝Logic MegaRAID SAS 1078 raid卡驱动文件到系统驱动目录下
  63. cp /mnt/cdrom/Custom/megasr.ko /mnt/sysimage/lib/modules/2.6.18-194.el5/updates/
  64. # 拷贝自定制的第三方软件包
  65. cp /mnt/cdrom/Custom/nload-0.7.4.tar.gz /mnt/sysimage/tmp/nload-0.7.4.tar.gz > /dev/null
  66. # 解压自定制的第三方软件包
  67. cd /mnt/sysimage/tmp
  68. tar -zxvf nload-0.7.4.tar.gz > /dev/null
  69. # 卸载光驱
  70. umount /mnt/cdrom
  71. %post
  72. # 使安装后的系统支持Logic MegaRAID SAS 1078 raid上的磁盘
  73. echo "alias scsi_hostadapter megasr" >> /etc/modprobe.conf
  74. depmod -v 2.6.18-194.el5
  75. mv /boot/initrd-2.6.18-194.el5.img /boot/initrd-2.6.18-194.el5.img.bak
  76. mkinitrd --with=megasr /boot/initrd-2.6.18-194.el5.img 2.6.18-194.el5
  77. # 安装自定制软件
  78. cd /tmp/nload-0.7.4
  79. ./configure > /dev/null 2>&1
  80. make > /dev/null 2>&1
  81. make install > /dev/null 2>&1
  82. rm -rf /tmp/* > /dev/null 2>&1
  83. # 禁止ipv6协议
  84. echo "alias ipv6 off" >> /etc/modprobe.conf
  85. echo "alias net-pf-10 off" >> /etc/modprobe.conf
  86. # 停止一些不常用的系统服务
  87. for service in NetworkManager NetworkManagerDispatcher acpid anacron apmd atd auditd autofs bluetooth conman cpuspeed cups dc_client dc_server dhcdbd dund firstboot gpm haldaemon hidd ip6tables irda irqbalance lm_sensors lvm2-monitor mcstrans mdmonitor mdmpd messagebus microcode_ctl netconsole netfs netplugd nfslock nscd ntpd pand pcscd portmap psacct rdisc readahead_early readahead_later restorecond rhnsd rpcgssd rpcidmapd rpcsvcgssd saslauthd smartd snmptrapd wpa_supplicant ypbind
  88. do
  89. chkconfig --level 35 $service off
  90. done
  91. # 开启一些常用的系统服务
  92. for service in ipmi crond
  93. do
  94. chkconfig --level 35 $service on
  95. done
  96. # 系统安装完成,弹出光驱
  97. eject

11、为了使用系统安装按照ks.cfg文件来执行安装,编辑/root/iso/isolinux目录下的isolinux.cfg文件,如下:

[root@localhost iso]# cd /root/iso/isolinux/ 

[root@localhost isolinux]# vi isolinux.cfg   

  1. default kickstart  
  2. prompt 1  
  3. timeout 60  
  4. display boot.msg  
  5. F1 boot.msg  
  6. F2 options.msg  
  7. F3 general.msg  
  8. F4 param.msg  
  9. F5 rescue.msg  
  10. label linux  
  11.   kernel vmlinuz  
  12.   append initrdinitrd=initrd.img  
  13. label text  
  14.   kernel vmlinuz  
  15.   append initrdinitrd=initrd.img text  
  16. label ks  
  17.   kernel vmlinuz  
  18.   append ks initrdinitrd=initrd.img  
  19. label local  
  20.   localboot 1  
  21. label memtest86  
  22.   kernel memtest  
  23.   append -  
  24. label kickstart  
  25. kernel vmlinuz  
  26. append text initrdinitrd=initrd.img ks=cdrom:/ks.cfg ramdisk_size=16384 ksdevice=eth0 console=tty0 


12、生成comps.xml文件 

[root@localhost isolinux]# cd ..  

[root@localhost iso]# createrepo -g repodata/*comps.xml /root/iso/ 

13、制作自定制CentOS 5.5系统镜像

[root@localhost iso]# mkisofs -o /root/CentOS-5.5-x86_64-bin-DVD.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -T /root/iso/ 


    好了,这样在root根目录下就生成了我们制作的系统镜像CentOS-5.5-x86_64-bin-DVD.iso,到此为止,这样一个集成Logic MegaRAID SAS 1078 raid卡的CentOS 5.5系统盘已经定制完成了,下载下来刻盘就可以安装了!~~~

Linux相关TCP参数优化: proc/sys/net/ipv4/提高web质量

CLOSE_WAIT,TCP的癌症,TCP的朋友。

CLOSE_WAIT状态的生成原因

首先我们知道,如果我们的服务器程序APACHE处于CLOSE_WAIT状态的话,说明套接字是被动关闭的!

因为如果是CLIENT端主动断掉当前连接的话,那么双方关闭这个TCP连接共需要四个packet:

Client —>  FIN  —>  Server

Client <—  ACK  <—  Server

这时候Client端处于FIN_WAIT_2状态;而Server 程序处于CLOSE_WAIT状态。

Client <—  FIN  <—  Server

这时Server 发送FIN给Client,Server 就置为LAST_ACK状态。

Client —>  ACK  —>  Server

Client回应了ACK,那么Server 的套接字才会真正置为CLOSED状态。

Server 程序处于CLOSE_WAIT状态,而不是LAST_ACK状态,说明还没有发FIN给Client,那么可能是在关闭连接之前还有许多数据要发送或者其他事要做,导致没有发这个FIN packet。

通常来说,一个CLOSE_WAIT会维持至少2个小时的时间。如果有个流氓特地写了个程序,给你造成一堆的CLOSE_WAIT,消耗

你的资源,那么通常是等不到释放那一刻,系统就已经解决崩溃了。

只能通过修改一下TCP/IP的参数,来缩短这个时间:修改tcp_keepalive_*系列参数有助于解决这个问题。

proc/sys/net/ipv4/下各项的意义

/proc/sys/net/ipv4/icmp_timeexceed_rate

这个在traceroute时导致著名的“Solaris middle star”。这个文件控制发送ICMP Time Exceeded消息的比率。

/proc/sys/net/ipv4/igmp_max_memberships

主机上最多有多少个igmp (多播)套接字进行监听。

/proc/sys/net/ipv4/inet_peer_gc_maxtime

每一遍碎片收集之间的最小时间间隔。当内存压力比较大的时候,调整这个间隔很有效。以jiffies计。

/proc/sys/net/ipv4/inet_peer_maxttl

entries的最大生存期。在pool没有内存压力的情况下(比如,pool中entries的数量很少的时候),未使用的entries经过一段时间就会过期。以jiffies计。

/proc/sys/net/ipv4/inet_peer_minttl

entries的最小生存期。应该不小于汇聚端分片的生存期。当pool的大小不大于inet_peer_threshold时,这个最小生存期必须予以保证。以jiffies计。

/proc/sys/net/ipv4/inet_peer_threshold

The approximate size of the INET peer storage. Starting from this threshold entries will be thrown aggressively. This threshold also determines entries’ time-to-live and time intervals between garbage collection passes. More entries, less time-to-live, less GC interval.

/proc/sys/net/ipv4/ip_autoconfig

这个文件里面写着一个数字,表示主机是否通过RARP、BOOTP、DHCP或者其它机制取得其IP配置。否则就是0。

/proc/sys/net/ipv4/ip_default_ttl

数据包的生存期。设置为64是安全的。如果你的网络规模巨大就提高这个值。不要因为好玩而这么做??那样会产生有害的路由环路。实际上,在很多情况下你要考虑能否减小这个值。

/proc/sys/net/ipv4/ip_dynaddr

/proc/sys/net/ipv4/icmp_destunreach_rate

如果你有一个动态地址的自动拨号接口,就得设置它。当你的自动拨号接口激活的时候,本地所有没有收到答复的TCP套接字会重新绑定到正确的地址上。这可以解决引发拨号的套接字本身无法工作,重试一次却可以的问题。

/proc/sys/net/ipv4/ip_forward

内核是否转发数据包。缺省禁止。

/proc/sys/net/ipv4/ip_local_port_range

用于向外连接的端口范围。缺省情况下其实很小:1024到4999。

/proc/sys/net/ipv4/ip_no_pmtu_disc

如果你想禁止“沿途MTU发现”就设置它。“沿途MTU发现”是一种技术,可以在传输路径上检测出最大可能的MTU值。参见Cookbook一章中关于“沿途MTU发现”的内容。

/proc/sys/net/ipv4/ipfrag_high_thresh

用 于IP分片汇聚的最大内存用量。分配了这么多字节的内存后,一旦用尽,分片处理程序就会丢弃分片。When ipfrag_high_thresh bytes of memory is allocated for this purpose, the fragment handler will toss packets until ipfrag_low_thresh is reached.

/proc/sys/net/ipv4/ip_nonlocal_bind

如果你希望你的应用程序能够绑定到不属于本地网卡的地址上时,设置这个选项。如果你的机器没有专线连接(甚至是动态连接)时非常有用,即使你的连接断开,你的服务也可以启动并绑定在一个指定的地址上。

/proc/sys/net/ipv4/ipfrag_low_thresh

用于IP分片汇聚的最小内存用量。

/proc/sys/net/ipv4/ipfrag_time

IP分片在内存中的保留时间(秒数)。

/proc/sys/net/ipv4/tcp_abort_on_overflow

一个布尔类型的标志,控制着当有很多的连接请求时内核的行为。启用的话,如果服务超载,内核将主动地发送RST包。

/proc/sys/net/ipv4/tcp_fin_timeout

如 果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。参见tcp_max_orphans。

/proc/sys/net/ipv4/tcp_keepalive_time

当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。

/proc/sys/net/ipv4/tcp_keepalive_intvl

当探测没有确认时,重新发送探测的频度。缺省是75秒。

/proc/sys/net/ipv4/tcp_keepalive_probes

 

在认定连接失效之前,发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以tcp_keepalive_intvl之后决定了,一个连接发送了keepalive之后可以有多少时间没有回应。

/proc/sys/net/ipv4/tcp_max_orphans

系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单 的DoS攻击,你绝对不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。This limit exists only to prevent simple DoS attacks, you _must_ not rely on this or lower the limit artificially, but rather increase it (probably, after increasing installed memory), if network conditions require more than default value, and tune network services to linger and kill such states more aggressively. 让我再次提醒你:每个孤儿套接字最多能够吃掉你64K不可交换的内存。

/proc/sys/net/ipv4/tcp_orphan_retries

本端试图关闭TCP连接之前重试多少次。缺省值是7,相当于50秒~16分钟(取决于RTO)。如果你的机器是一个重载的WEB服务器,你应该考虑减低这个值,因为这样的套接字会消耗很多重要的资源。参见tcp_max_orphans。

/proc/sys/net/ipv4/tcp_max_syn_backlog

记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。如果服务器不堪重负,试试提高这个值。注意!如果你设置这个值大于1024,最好同时调整include/net/tcp.h中的TCP_SYNQ_HSIZE,以保证 TCP_SYNQ_HSIZE*16 ≤tcp_max_syn_backlo,然后重新编译内核。

/proc/sys/net/ipv4/tcp_max_tw_buckets

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

/proc/sys/net/ipv4/tcp_retrans_collapse

为兼容某些糟糕的打印机设置的“将错就错”选项。再次发送时,把数据包增大一些,来避免某些TCP协议栈的BUG。

/proc/sys/net/ipv4/tcp_retries1

在认定出错并向网络层提交错误报告之前,重试多少次。缺省设置为RFC规定的最小值:3,相当于3秒~8分钟(取决于RIO)。

/proc/sys/net/ipv4/tcp_retries2

在杀死一个活动的TCP连接之前重试多少次。RFC 1122规定这个限制应该长于100秒。这个值太小了。缺省值是15,相当于13~30分钟(取决于RIO)。

/proc/sys/net/ipv4/tcp_rfc1337

这个开关可以启动对于在RFC1337中描述的“tcp的time-wait暗杀危机”问题的修复。启用后,内核将丢弃那些发往time-wait状态TCP套接字的RST包。却省为0。

/proc/sys/net/ipv4/tcp_sack

特别针对丢失的数据包使用选择性ACK,这样有助于快速恢复。

/proc/sys/net/ipv4/tcp_stdurg

使用TCP紧急指针的主机需求解释。因为绝大多数主机采用BSD解释,所以如果你在Linux上打开它,可能会影响它与其它机器的正常通讯。缺省是FALSE。

/proc/sys/net/ipv4/tcp_syn_retries

在内核放弃建立连接之前发送SYN包的数量。

/proc/sys/net/ipv4/tcp_synack_retries

为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

/proc/sys/net/ipv4/tcp_timestamps

时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。

/proc/sys/net/ipv4/tcp_tw_recycle

能够更快地回收TIME-WAIT套接字。缺省值是1。除非有技术专家的建议和要求,否则不应修改。

/proc/sys/net/ipv4/tcp_window_scaling

一般来说TCP/IP允许窗口尺寸达到65535字节。对于速度确实很高的网络而言这个值可能还是太小。这个选项允许设置上G字节的窗口大小,有利于在带宽*延迟很大的环境中使用。

一旦内核认为它无法发包,就会丢弃这个包,并向发包的主机发送ICMP通知。

/proc/sys/net/ipv4/icmp_echo_ignore_all

根本不要响应echo包。请不要设置为缺省,它可能在你正被利用成为DoS攻击的跳板时可能有用。

/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts [Useful]

如果你ping子网的子网地址,所有的机器都应该予以回应。这可能成为非常好用的拒绝服务攻击工具。设置为1来忽略这些子网广播消息。

/proc/sys/net/ipv4/icmp_echoreply_rate

设置了向任意主机回应echo请求的比率。

/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

设置它之后,可以忽略由网络中的那些声称回应地址是广播地址的主机生成的ICMP错误。

/proc/sys/net/ipv4/icmp_paramprob_rate

一个相对不很明确的ICMP消息,用来回应IP头或TCP头损坏的异常数据包。你可以通过这个文件控制消息的发送比率。

tcp_syn_retries :INTEGER

默认值是5

对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅 仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)

tcp_synack_retries :INTEGER

默认值是5

对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。(可以根据上面的 tcp_syn_retries 来决定这个值)

tcp_keepalive_time :INTEGER

默认值是7200(2小时)

当keepalive打开的情况下,TCP发送keepalive消息的频率。(由于目前网络攻击等因素,造成了利用这个进行的攻击很频繁,曾经也 有cu 的朋友提到过,说如果2边建立了连接,然后不发送任何数据或者rst/fin消息,那么持续的时间是不是就是2小时,空连接攻击? tcp_keepalive_time就是预防此情形的.我个人在做nat服务的时候的修改值为1800秒)

tcp_keepalive_probes:INTEGER

默认值是9

TCP发送keepalive探测以确定该连接已经断开的次数。(注意:保持连接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不需要修改,当然根据情形也可以适当地缩短此值.设置为5比较合适)

tcp_keepalive_intvl:INTEGER

默认值为75

探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没 有活动 的连接将在大约11分钟以后将被丢弃。(对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的 值)

tcp_retries1 :INTEGER

默认值是3

放弃回应一个TCP连接请求前?需要进行多少次重试。RFC 规定最低的数值是3?这也是默认值?根据RTO的值大约在3秒 – 8分钟之间。(注意:这个值同时还决定进入的syn连接)

tcp_retries2 :INTEGER

默认值为15

在丢弃激活(已建立通讯状况)的TCP连接之前?需要进行多少次重试。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)

tcp_orphan_retries :INTEGER

默认值是7

在近端丢弃TCP连接之前?要进行多少次重试。默认值是7个?相当于 50秒 – 16分钟?视 RTO 而定。如果您的系统是负载很大的web服务器?那么也许需要降低该值?这类 sockets 可能会耗费大量的资源。另外参的考 tcp_max_orphans 。(事实上做NAT的时候,降低该值也是好处显著的,我本人的网络环境中降低该值为3)

tcp_fin_timeout :INTEGER

默认值是 60

对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值 为 60 秒。过去在2.2版本的内核中是 180 秒。您可以设置该值?但需要注意?如果您的机器为负载很重的web服务器?您可能要冒内存被大量无效数据报填满的风险?FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1 ?因为它们最多只吃 1.5K 的内存?但是它们存在时间更长。另外参考 tcp_max_orphans。(事实上做NAT的时候,降低该值也是好处显著的,我本人的网络环境中降低该值为30)

tcp_max_tw_buckets :INTEGER

默认值是180000

系 统在同时所处理的最大 timewait sockets 数目。如果超过此数的话?time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制?纯粹为了抵御那些简单的 DoS 攻击?千万不要人为的降低这个限制?不过?如果网络条件需要比默认值更多?则可以提高它(或许还要增加内存)。(事实上做NAT的时候最好可以适当地增加 该值)

tcp_tw_recycle :BOOLEAN

默认值是0

打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求?请不要随意修改这个值。(做NAT的时候,建议打开它)

tcp_tw_reuse:BOOLEAN

默认值是0

该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)

tcp_max_orphans :INTEGER

缺省值是8192

系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量?那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制?纯粹为了抵御那些 简单的 DoS 攻击?千万不要依赖这个或是人为的降低这个限制(这个值RedHat AS版本中设置为32768,但是很多防火墙修改的时候,建议该值修改为2000)

tcp_abort_on_overflow :BOOLEAN

缺省值是0

当守护进程太忙而不能接受新的连接,就象对方发送reset消息,默认值是false。这意味着当溢出的原因是因为一个偶然的猝发,那么连接将恢复 状态。 只有在你确信守护进程真的不能完成连接请求时才打开该选项,该选项会影响客户的使用。(对待已经满载的sendmail,apache这类服务的时候,这 个可以很快让客户端终止连接,可以给予服务程序处理已有连接的缓冲机会,所以很多防火墙上推荐打开它)

tcp_syncookies :BOOLEAN

默认值是0

只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生作用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood攻击。

注意:该选项千万不能用于那些没有收到攻击的高负载服务器,如果在日志中出现synflood消息,但是调查发现没有收到synflood攻击,而是合法用户的连接负载过高的原因,你应该调整其它参数来提高服务器性能。参考:

tcp_max_syn_backlog

tcp_synack_retries

tcp_abort_on_overflow

syncookie严重的违背TCP协议,不允许使用TCP扩展,可能对某些服务导致严重的性能影响(如SMTP转发)。(注意,该实现与BSD上 面使用 的tcp proxy一样,是违反了RFC中关于tcp连接的三次握手实现的,但是对于防御syn-flood的确很有用.)

 

tcp_stdurg :BOOLEAN

默认值为0

使用 TCP urg pointer 字段中的主机请求解释功能。大部份的主机都使用老旧的 BSD解释,因此如果您在 Linux 打开它?或会导致不能和它们正确沟通。

tcp_max_syn_backlog :INTEGER

对于那些依然还未获得客户端确认的连接请求?需要保存在队列中最大数目。对于超过 128Mb 内存的系统?默认值是 1024 ?低于 128Mb 的则为 128。如果服务器经常出现过载?可以尝试增加这个数字。警告?假如您将此值设为大于 1024?最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE ?以保持 TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog ?并且编进核心之内。(SYN Flood攻击利用TCP协议散布握手的缺陷,伪造虚假源IP地址发送大量TCP-SYN半打开连接到目标系统,最终导致目标系统Socket队列资源耗 尽而无法接受新的连接。为了应付这种攻击,现代Unix系统中普遍采用多连接队列处理的方式来缓冲(而不是解决)这种攻击,是用一个基本队列处理正常的完 全连接应用(Connect()和Accept() ),是用另一个队列单独存放半打开连接。这种双队列处理方式和其他一些系统内核措施(例如Syn-Cookies/Caches)联合应用时,能够比较有 效的缓解小规模的SYN Flood攻击(事实证明<1000p/s)加大SYN队列长度可以容纳更多等待连接的网络连接数,所以对Server来说可以考虑增大该值.)

tcp_window_scaling :INTEGER

缺省值为1

该 文件表示设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到 65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力(RFC 1323)。(对普通地百M网络而言,关闭会降低开销,所以如果不是高速网络,可以考虑设置为0)

tcp_timestamps :BOOLEAN

缺省值为1

Timestamps 用在其它一些东西中?可以防范那些伪造的 sequence 号码。一条1G的宽带线路或许会重遇到带 out-of-line数值的旧sequence 号码(假如它是由于上次产生的)。Timestamp 会让它知道这是个 ‘旧封包’。(该文件表示是否启用以一种比超时重发更精确的方法(RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。)

tcp_sack :BOOLEAN

缺省值为1

使 用 Selective ACK?它可以用来查找特定的遗失的数据报— 因此有助于快速恢复状态。该文件表示是否启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段)。(对于广域网通信来说这个 选项应该启用,但是这会增加对 CPU 的占用。)

tcp_fack :BOOLEAN

缺省值为1

打开FACK拥塞避免和快速重传功能。(注意,当tcp_sack设置为0的时候,这个值即使设置为1也无效)

tcp_dsack :BOOLEAN

缺省值为1

允许TCP发送”两个完全相同”的SACK。

tcp_ecn :BOOLEAN

缺省值为0

打开TCP的直接拥塞通告功能。

tcp_reordering :INTEGER

默认值是3

TCP流中重排序的数据报最大数量 。 (一般有看到推荐把这个数值略微调整大一些,比如5)

tcp_retrans_collapse :BOOLEAN

缺省值为1

对于某些有bug的打印机提供针对其bug的兼容性。(一般不需要这个支持,可以关闭它)

tcp_wmem(3个INTEGER变量): min, default, max

min:为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建议以后都可以使用它。默认值为4096(4K)。

default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默认值为16384(16K)。

max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max,”静态”选择参数SO_SNDBUF则不受该值影响。默认值为 131072(128K)。(对于服务器而言,增加这个参数的值对于发送数据很有帮助,在我的网络环境中,修改为了51200 131072 204800)

tcp_rmem (3个INTEGER变量): min, default, max

min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下tcp socket都至少会有这么多数量的内存用于接收缓冲,默认值为8K。

default:为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem_default 值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win=0默认值情况下,TCP窗口大小为65535。 默认值为87380

max:用于TCP socket接收缓冲的内存最大值。该值不会影响 net.core.wmem_max,”静态”选择参数 SO_SNDBUF则不受该值影响。默认值为 128K。默认值为87380*2 bytes。(可以看出,.max的设置最好是default的两倍,对于NAT来说主要该增加它,我的网络里为 51200 131072 204800)

tcp_mem(3个INTEGER变量):low, pressure, high

low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。(理想情况下,这个值应与指定给 tcp_wmem 的第 2 个值相匹配 – 这第 2 个值表明,最大页面大小乘以最大并发请求数除以页大小 (131072 * 300 / 4096)。 )

pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退 出 pressure状态。(理想情况下这个值应该是 TCP 可以使用的总缓冲区大小的最大值 (204800 * 300 / 4096)。 )

high:允许所有tcp sockets用于排队缓冲数据报的页面量。(如果超过这个值,TCP 连接将被拒绝,这就是为什么不要令其过于保守 (512000 * 300 / 4096) 的原因了。 在这种情况下,提供的价值很大,它能处理很多连接,是所预期的 2.5 倍;或者使现有连接能够传输 2.5 倍的数据。 我的网络里为192000 300000 732000)

一般情况下这些值是在系统启动时根据系统内存数量计算得到的。

tcp_app_win : INTEGER

默认值是31

保留max(window/2^tcp_app_win, mss)数量的窗口由于应用缓冲。当为0时表示不需要缓冲。

tcp_adv_win_scale : INTEGER

默认值为2

计算缓冲开销bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0)。

tcp_rfc1337 :BOOLEAN

缺省值为0

这个开关可以启动对于在RFC1337中描述的”tcp 的time-wait暗杀危机”问题的修复。启用后,内核将丢弃那些发往time-wait状态TCP套接字的RST 包.

tcp_low_latency : BOOLEAN

缺省值为0

允许 TCP/IP 栈适应在高吞吐量情况下低延时的情况;这个选项一般情形是的禁用。(但在构建Beowulf 集群的时候,打开它很有帮助)

tcp_westwood :BOOLEAN

缺省值为0

启用发送者端的拥塞控制算法,它可以维护对吞吐量的评估,并试图对带宽的整体利用情况进行优化;对于 WAN 通信来说应该启用这个选项。

tcp_bic :BOOLEAN

缺省值为0

为快速长距离网络启用 Binary Increase Congestion;这样可以更好地利用以 GB 速度进行操作的链接;对于 WAN 通信应该启用这个选项。

# 以下一段为抵抗syn flood攻击,平时建议关闭

sysctl -w net.ipv4.tcp_syncookies=1              # tcp syncookie,默认关闭

sysctl -w net.ipv4.tcp_max_syn_backlog=1280   # syn队列,默认1024,> 1280可能工作不稳定,需要修改内核源码参数

sysctl -w net.ipv4.tcp_synack_retries=2             # syn-ack握手状态重试次数,默认5,遭受syn-flood攻击时改为1或2

sysctl -w net.ipv4.tcp_syn_retries=2                  # 外向syn握手重试次数,默认4

# 以下一段为应对tcp connect连接耗尽攻击,如果开启iptables connlimit模块可禁用

# 有严重连接性能影响和不稳定因素,慎用

sysctl -w tcp_tw_recycle=1                           # 默认0,tw快速回收

sysctl -w tcp_tw_reuse=1                             # 默认0,tw重用

sysctl -w tcp_keepalive_intvl=60                    # 默认75,tcp keeplive探测轮询时间

sysctl -w tcp_keepalive_probes=3                  # 默认9,tcp keeplive探测轮询次数

sysctl -w tcp_keepalive_time=1800                # 默认7200,tcp keeplive时间

sysctl -w tcp_fin_timeout=30                        # 默认60,tcp fin状态超时时间

#sysctl -w net.ipv4.tcp_retries1=2                     # tcp连接重传参数,慎用

#sysctl -w net.ipv4.tcp_retries2=8

sysctl -w net.ipv4.ip_conntrack_max=65535          # 增大iptables状态跟踪表

squid优化链接

多线程大文件断点续传和流媒体的CDN处理方法

在使用Squid做反向代理的CDN节点时.多线程大文件断点续传和流媒体的处理是怎么样啦.前些日子花了点时间研究了一下.

在Squid做反向代理时.其中有个range_offset_limit的参数,意思是预先读取.还有一个maximum_object_size的参数控制能缓存的大小.

当了解上面二个参数的意思,我们来讲讲实际中会怎么样.当maximum_object_size设置成100M,也就是最大能缓存的大小.另外range_offset_limit最大预先读取我们也先让他也为100M.当有个用户,比如使用迅雷下载squid中一个100M的文件时.照理他是缓存这个100M,然后其它的用户都是下载的缓存的.理想状态就是这样.

但是事实不是这样处理的,这个和用户和请求数有关,当用户开启了多线程,比如并发10个线程从这个节点下载.预先读取的参数会同时10个并发来缓存,那这样,每个10个进程,在第一次,一个100M的文件有可能下载到squid节点中100M*10(并发)=1000M,直到其中最快的一个并发都预先读取完了所有的要下载的那个文件.才会给文件缓存起来.这样之后的用户才会从缓存中得到文件.但这样下载的量非常大.很多没有必要的.这样也就是我们为什么就从Cacti中常常见到很奇怪的流量.

为了防备squid被多线程下载工具冲击,让squid用acl来禁止http header中带range请求。客户端的表现就是采用多线程下载的请求都会被squid拒绝,也就是多线程下载工具无法下载通过你的squid代理的站点上的东西了.

当然,也可以做业务拆分,让单个squid来缓冲这些大文件,和有可能出现多并发的文件.然后给内容最好主动推到CDN的节点上面.