Chinaunix首页 | 论坛 | 博客
  • 博客访问: 820890
  • 博文数量: 162
  • 博客积分: 5308
  • 博客等级: 大校
  • 技术积分: 2152
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-15 19:09
个人简介

DevOps让系统管理更轻松。

文章分类

全部博文(162)

文章存档

2014年(28)

2012年(10)

2011年(6)

2009年(60)

2008年(58)

我的朋友

分类: 系统运维

2008-08-22 10:57:54

  
   在实际环境中,元素丰富的页面产生的服务器负担不能小觑。几个月前配置的Apache最近终于撑不住了,在连接数达到1000的时候,页面访问已经相当迟缓,到了非优化不可的地步。
    由于网站还提供在线音乐,怀疑是由于百度和迅雷的盗链影响,d4e上很多人都在反应迅雷对他们站点的影响很恶劣。
  • 在Apache中启用防盗链(需要mod_rewrite支持 )

附上.htaccess配置文件
 
RewriteEngine  On
RewriteCond %{HTTP_HOST} !([a-zA-Z]*\.)?sends.cc$ [NC] [OR]
RewriteCond %{HTTP_REFERER} !^http://([a-zA-Z]*\.)?sends.cc/.*$ [NC]
RewriteRule \.(mp3|wav|flv|gif|jpg|wma)$ - [F]
    如上配置,在一定程度上缓解了服务器压力。Apache此时差不多可以顶1400个连接数,由此也引来一个问题,Apache子进程大量派生,Load average经常都上100(2×2核心,单个CPU此时的load大约在25左右(危急状态)。 Apache默认MaxRequestsPerChild为0,子进程在完成所有请求仍然不会退出,处于等候状态。在Apache2.conf中将其修改为适当的数字,我将其改成10000,子进程在处理完10000个Web请求之后自动退出,不再占用系统资源。


  • 对访问优化

     因为页面中含有大量图片和音视频的多媒体文件,所以可以使用高速Web缓存在解决访问速度问题。Apache有自带的缓存代理模块,不过效率不高,实际生产中却是很少用。我使用的是开源软件中享有盛名的Squid,该软件既有代理和缓存的双重功能,这里我们只用其缓存功能。
     注:关于代理以及Squid的基本原理,上有详细的解释,这里不再累述。
     迄今,Squid的稳定版是squid-2.6.STABLE17,网上有各种归档文件,rpm和deb安装包都有,这里推荐源码包安装squid-2.6.STABLE17.tar.gz ,理由是可定制强,在实际应用中才能发挥最大功效。
 
     configure很重要,这里提供我使用的参数给大家参考:
 '--with-maxfd=65535' '--prefix=/usr/local/squid/' '--disable-internal-dns' '--enable-async-io'
--disable-internal-dns
squid源代码包含两个不同的DNS解决方案,叫做“内部的”和“外部的”。内部查询是默认的,但某些人可能要使用外部技术。该选项禁止内部功能,转向使用旧的方式。
 
内部查询使用 squid自己的DNS协议执行工具。也就是说,squid产生未完成的DNS查询并且将它们发送到一个解析器。假如超时,它重新发送请求,你能指定任意数量的解析器。该工具的有利处之一是,squid获得准确无误的DNS响应的TTLs。
 
外部查询利用C库的gethostbyname()和gethostbyaddr()函数。squid使用一个外部进程池来制造并行查询。使用外部DNS解析的主要弊端是你需要更多的辅助进程,增加squid的负载。另一个麻烦是C库函数不在响应里传输TTLs,这样squid使用postive_dns_ttl指令提供的一个常量值。
 
请注意--enable-async-io是打开其他三个./configure选项的快捷方式,它等同于:
 --with-aufs-threads=N_THREADS
    
--with-pthreads
   
--enable-storeio=ufs,aufs
   
--with-pthreads
该选项导致编译过程链接到你系统中的P线程库。aufs存储模块是squid中唯一需要使用线程的部分。通常来说,如果你使用--enable-saync-io选项,那么不必再单独指定该选项,因为它被自动激活了。#Very Important,事实证明该参数对Squid的效率有强悍的催化作用。异步I/O是squid技术之一,用以提升存储性能。aufs模块使用大量的线程来执行磁盘I/O操作。该代码仅仅工作在linux和solaris系统中。=N_THREADS参数改变squid使用的线程数量。
 

 
     make;make clean;make install
     无误的话,就可以正常启动Squid了
     squid -z #创建缓存区域
     squid start(如果没在/usr/bin里建立squid的软链接用/usr/local/squid/sbin/squid start启动)
附上我的配置文件(squid.conf)
visible_hostname a.server
#----端口设置----
http_port 192.168.0.1:80 vhost vport
#xx.xx.xx.xx为这台服务器的IP地址
icp_port 0
 
#----缓存设置----
cache_mem 2000 MB
#设置Squid所能使用的内存共2000MB,这个值因人而异
cache_swap_low 90
cache_swap_high 95
maximum_object_size 4096 KB
#最大缓存文件大小,超过这个值则不缓存,最好不要过大,10MB以内比较合适,过大严重影响性能
maximum_object_size_in_memory 4096 KB
cache_dir aufs /raid/cache_web 100000 16 256
#磁盘缓存的类型和目录,大小,一二级目录的设置,这里磁盘缓存大小是20G
 
#----日志设置----
cache_store_log none
#这个设置是不记录store.log
emulate_httpd_log on
#打开emulate_httpd_log选项,将使Squid仿照Aapche的日志格式
pid_filename /var/log/squid/squid.pid
cache_log /var/log/squid/cache.log
access_log /var/log/squid/access.log
 
#----反向代理-完成高速WEB缓存功能
cache_peer 192.168.0.1 parent 8080 0 no-query originserver
cache_peer_domain 192.168.0.1 a.test.cc
acl QUERY urlpath_regex .wmv .mp3 .flv
cache deny QUERY

#----访问控制列表----
acl all src 0.0.0.0/0.0.0.0
#acl dst dstdomain .sends.cc
#acl dst_other dst 0.0.0.0/0.0.0.0
http_access allow all
#http_access allow dst
#http_access deny dst_other
#----启动用户组
cache_effective_user proxy
cache_effective_group proxy


 


  • 对用户访问进行限速(适用于低带宽或者容易堵塞的网络环境)

     Apache的mod_bw提供了该功能,详细配置相对容易找到,请参看相关文档。
下载最新版本
root# wget

解压
root# wget
root# tar -vfxz mod_bw-0.7.tgz
root# cd mod_bw-0.7

修改mod_bw 0.7bug
由於mod_bw 0.7在编译时bug,会导致在安装后出现apr_atomic_add找不到的错误,所以要修改mod_bw.c
将原本的:
/* Compatibility for ARP < 1 */
#if (APR_MAJOR_VERSION < 1)
#define apr_atomic_inc32 apr_atomic_inc
#define apr_atomic_dec32 apr_atomic_dec
#define apr_atomic_add32 apr_atomic_add
#define apr_atomic_cas32 apr_atomic_cas
#define apr_atomic_set32 apr_atomic_set
#endif

改成:
/* Compatibility for ARP < 1 */
/*
#if (APR_MAJOR_VERSION < 1)
#define apr_atomic_inc32 apr_atomic_inc
#define apr_atomic_dec32 apr_atomic_dec
#define apr_atomic_add32 apr_atomic_add
#define apr_atomic_cas32 apr_atomic_cas
#define apr_atomic_set32 apr_atomic_set
#endif
*/

更新Debian软件包:
root# apt-get update

安装apxs2
root# apt-get install apache2-prefork-dev

安装gcc
root# apt-get install gcc

执行模组安装:
root# apxs2 -i -a -c mod_bw.c

这时就会安装到你的Apache的模组里,并且http.conf也已经自动加上了:
LoadModule bw_module modules/mod_bw.so

建立mod_bandwidth工作目录
root# mkdir -p /tmp/apachebw/link
root# mkdir -p /tmp/apachebw/master
root# chown -R nobody:nobody /tmp/apachebw
root# chmod -R 755 /tmp/apachebw

配置:

Options Includes FollowSymLinks MultiViews
AllowOverride None
order allow,deny
allow from all
  
# Limit BW usage
BandWidthModule On
ForceBandWidthModule On
#
開放20KB对外使用
BandWidth all 51200
#
Connection最小带宽为50K
MinBandwidth all 51200
#
大于50M的文件传输速率按
50Kbytes/sec
#LargeFileLimit 51200 51200
#
最大同时连接数量

#MaxConnection 300
Apache服务器重新启动就可以实现对带宽的限制了。
----------------------------------------------------------------------------------------------------------------------
apxs工具安装
编译mod_encoding时,必须要有apxshttpd-devel中包括创建和安装扩展模块的apxs工具。如果是你安装了Apache,检查${APACHE_HOME}/bin/下是否存在apxs,如果存在则略过该步无需自己安装该程序包,如果尚未安装e则需要自己手动安装httpd-devel


  • 友情提示

     为防止站点资源被百度或者迅雷盗链,尽可能将你们的资源重新编码或者打包,有办法的话,还可以经常改变下载地址。
     另外如果你怀疑有Dos攻击的话,可以运行
     netstat -an | grep -i "服务器ip地址:80" | awk '{print $6}' | sort | uniq -c | sort -n 
     这个命令会自动统计Tcp连接各个状态的数量,如果SYN_RECV很高的话,就不能排除有基于tcp协议的ddos攻击的可能
     这样的话,你需要打开tcp_syncookies 
     echo 1 >; /proc/sys/net/ipv4/tcp_syncookies
     如果没有 /proc/sys/net/ipv4/tcp_syncookies说明你的内核不支持syncookies,需要重新编译内核
     同时降低syn重试次数
     echo "1" >; /proc/sys/net/ipv4/tcp_syn_retries
     echo "1" >; /proc/sys/net/ipv4/tcp_synack_retries
     加大syn_backlog,以保证用户的访问(消耗内存为代价,设的太高。。)
     echo "2048" >; /proc/sys/net/ipv4/tcp_max_syn_backlog
     如果还是不行,那么只能交给相应的硬件防火墙了
 
注:此配置目前可以撑到3000个同时在线连接。
阅读(1101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~