`

领先的易物网站-舍得网基于J2ee Resin实现的技术内幕

阅读更多
全文转自:http://blog.csdn.net/wanghao72214/category/510248.aspx


application server采用j2ee架构技术,使用了免费的resin2.1.17搭建,并采用自行开发的缓存系统进行负载均衡,webserver 采用了重量级的apache 和轻量级的lighttpd。动态内容交由apache处理,静态内容(比如图片、css、js)等交由lighttpd处理。


    以下是主要配置参数和建议:

一、java应用服务器,建议用resin2.1.17,如果有钱,可以买一个resin3的license,否则resin3比resin2慢,也可以考虑使用Glassfish,这个和resin性能差别比较小,tomcat还是不行。
如果缓存需要使用特别大的内存,建议用64位操作系统。32位jdk理论上最多使用4G内存,实际上只能用3G,3G还要分成两部分,一部分是native,剩下一部分才是Xmx这个参数定义的,配置不好
就经常出错,系统会停顿6-10秒,甚至jvm会因为native内存不够而崩溃(实际这种情况linux有的是剩余内存),这里我应用我的一些配置经验,如下:(以下内容csdn死活审核不过,疯了)


     1:串行垃圾回收,也就是默认配置,完成10万request用时153秒,JVM参数配置如下:(略)

这种配置一般在resin启动24小时内似乎没有大问题,网站可以正常访问,但查看日志发现,在接近24小时时,Full GC执行越来越频繁,大约每隔3分钟就有一次Full GC,每次Full GC系统会停顿6秒左右,作为一个网站来说,用户等待6秒恐怕太长了,所以这种方式有待改善。MaxTenuringThreshold=7表示一个对象如果在救助空间移动7次还没有被回收就放入年老代,GCTimeRatio=19表示java可以用5%的时间来做垃圾回收,1/(1+19)=1 /20=5%。

2:并行回收,完成10万request用时117秒,配置如下:(略)
并行回收我尝试过多种组合配置,似乎都没什么用,resin启动3小时左右就会停顿,时间超过10 秒。也有可能是参数设置不够好的原因,MaxGCPauseMillis表示GC最大停顿时间,在resin刚启动还没有执行Full GC时系统是正常的,但一旦执行Full GC,MaxGCPauseMillis根本没有用,停顿时间可能超过20秒,之后会发生什么我也不再关心了,赶紧重启resin,尝试其他回收策略。
 
    3:并发回收,完成10万request用时60秒,比并行回收差不多快一倍,是默认回收策略性能的2.5倍,配置如下:(略)
这个配置虽然不会出现10秒连不上的情况,但系统重启3个小时左右,每隔几分钟就会有5秒连不上的情况,查看gc.log,发现在执行ParNewGC时有个promotion failed错误,从而转向执行Full GC,造成系统停顿,而且会很频繁,每隔几分钟就有一次,所以还得改善。UseCMSCompactAtFullCollection是表是执行Full GC后对内存进行整理压缩,免得产生内存碎片,CMSFullGCsBeforeCompaction=N表示执行N次Full GC后执行内存压缩。
 
    4:增量回收,完成10万request用时171秒,太慢了,配置如下 :(略)
似乎回收得也不太干净,而且也对性能有较大影响,不值得试。

5:并发回收的I-CMS模式,和增量回收差不多,完成10万request用时170秒。
配置如下:(略)

采用了sun推荐的参数,回收效果不好,照样有停顿,数小时之内就会频繁出现停顿,什么sun推荐的参数,照样不好使。
 
    6:递增式低暂停收集器,还叫什么火车式回收,不知道属于哪个系,完成10万request用时153秒。配置如下:(略)
该配置效果也不好,影响性能,所以没试。
 
   7:相比之下,还是并发回收比较好,性能比较高,只要能解决ParNewGC(并行回收年轻代)时的promotion failed错误就一切好办了,查了很多文章,发现引起promotion failed错误的原因是CMS来不及回收(CMS默认在年老代占到90%左右才会执行),年老代又没有足够的空间供GC把一些活的对象从年轻代移到年老代,所以执行Full GC。CMSInitiatingOccupancyFraction=70表示年老代占到约70%时就开始执行CMS,这样就不会出现Full GC了。SoftRefLRUPolicyMSPerMB这个参数也是我认为比较有用的,官方解释是softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap,我觉得没必要等1秒,所以设置成0。配置如下:略

   8:第7的配置还有可能因为救助空间不够造成promotion failed,我索性把救助空间去掉,通过调整SurvivorRatio和MaxTenuringThreshold实现,设置如下,总之还是要根据实际情况做出适合的调整。下面是我的最终配置,已经非常稳定,如果改成64位系统,内存可以加大。但隔三差五重启resin还是有必要的,Perm空间总会变满的。

二、apache的一些配置和技巧。
    安装apache时根据情况带几个参数,网上也有其他优化参数,但估计性能差不了多少,如下
./configure --prefix=/usr/local/apache2.2.10 --enable-so --enable-deflate --enable-rewrite --enable-expires 
我做过测试,apache自带的mod_mem_cache不太好使,最大使用内存不到200M时就会有问题,内存使用量突然下降,所以
图片服务器建议不要用apache,用lighttpd或者nginx会更好。lighttpd+memcached的方式我就没配成功过,nginx+memcached能从缓存
里获取,但不能set到缓存,所以我用的是lighttpd+mod_mem_cache(需要把lighttpd打个补丁),稍后作详细介绍。

apache简单防DDOS攻击的配置,需要从网上找一个mod_evasive20模块,用/usr/local/apache/bin/apxs -cia mod_evasive20.c安装,一般情况下没有必要配置这玩意。
<IfModule mod_evasive20.c>
    DOSHashTableSize    10000  
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
    DOSEmailNotify      webmaster@xxx.com
    DOSLogDir           /var/log/mod_dosevasive.log
</IfModule>

apache防sql注入攻击的配置,需要安装mod_security模块
<IfModule mod_security.c>
    SecFilterEngine On
    SecFilterCheckURLEncoding On
    SecFilterForceByteRange 32 126
    SecFilterCheckUnicodeEncoding On
    SecServerResponseToken Off
    SecAuditEngine RelevantOnly
    SecAuditLog logs/audit_log
    SecFilterDebugLog logs/modsec_debug_log
    SecFilterDebugLevel 0
    SecFilterDefaultAction "deny,log,status:406"
    SecFilter /etc/*passwd
    SecFilter /bin/*sh
    SecFilter "\.\./"
    SecFilter "<( |\n)*script"
    SecFilter "<(.|\n)+>"
    SecFilter "delete[[:space:]]+from"
    SecFilter "insert[[:space:]]+into"
    SecFilter "select.+from"
    SecFilter "union[[:space:]]+from"
    SecFilter "drop[[:space:]]"
    SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"
</IfModule>

加大apache最大连接数的配置,如果选择的是preworker工作方式。preworker和worker的区别就不讲了。apache2.0以上直接设置ServerLimit即可,apache2.0以前还要修改源代码才能使修改
的ServerLimit生效,建议应用服务器用apache2.0吧,性能差不了多少。

<IfModule mpm_prefork_module>
    ServerLimit           20000  #ServerLimit据说要放第一行
    StartServers          50
    MinSpareServers       50
    MaxSpareServers       100
    MaxClients            10000
    MaxRequestsPerChild   10000
</IfModule>

压缩传输的配置,这个做为网站来说非常重要,它是不压缩传输大小的20%左右,也就是说用户访问一个网站速度快了5倍,不配置不行,但是图片不能做压缩了。

<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
DeflateCompressionLevel 3 
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" "%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
#BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Don't compress images, java scripts and style sheets
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|js|css)$ no-gzip dont-vary

# Make sure proxies don't deliver the wrong content
# this needs mod_headers but it's very important
# so I don't add a IfModule around it
#Header append Vary User-Agent env=!dont-vary
#CustomLog logs/deflate_log.log deflate
#CustomLog "|/usr/local/cronolog/sbin/cronolog /usr/local/apache2.0.59_2/logs/www.shedewang.com.access.log.%Y%m%d" deflate env=!IMAG
</IfModule>

apache配置mod_mem_cache,这个模块不太好使,建议不用
<IfModule mod_cache.c>
#CacheForceCompletion 100
CacheDefaultExpire 3600
CacheMaxExpire 86400
CacheLastModifiedFactor 0.1
CacheIgnoreNoLastMod on
        <IfModule mod_mem_cache.c>
                CacheEnable mem /
                MCacheSize 2000000
                MCacheMaxObjectCount 10000
                MCacheMinObjectSize 1000
                MCacheMaxObjectSize 512000
                MCacheRemovalAlgorithm LRU
        </IfModule>
</IfModule>

CacheEnable: 启动 mod_cache,其后接两个参数。第一个参数指定快取的种类,应设为 mem (记忆体快取) 或 disk (磁碟快取) 之其一;第二个参数指定使用快取的 URI 路径,如果对整个网站 (或虚拟主机) 进行快取,简单指定为根目录(/) 即可。
CacheForceCompletion: 这个值指定当 HTTP request 被取消时,内容的产生动作要完成的百分比;预设是 60(%)。
CacheDefaultExpire: 指定快取的预设过期秒数;预设值是一小时 (3600)。
CacheMaxExpire: 指定快取最大的过期秒数;预设值是一天 (86400)。
CacheLastModifiedFactor: 用来从回应里 Last Modified 资讯算出 expire date。
计算方式是:expire period (过期时距) = 最后更新后至今的时间间距 * CacheLastModifiedFactor
而expire date = 目前时间 + expire period
不过无论如何,过期时间不能超过 CacheMaxExpire 的设定值。


配置mod_expires模块

mod_expires可以减少10%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求,这一点特别实用在图片服务器上。

mod_expires的安装配置:
<IfModule mod_expires.c>
  # turn on the module for this directory
  ExpiresActive on

  # cache common graphics for 3 days
  ExpiresByType image/jpg "access plus 365 days"
  ExpiresByType image/gif "access plus 365 days"
  ExpiresByType image/jpeg "access plus 365 days"
  ExpiresByType image/png "access plus 365 days"

</IfModule>



四:图片服务器的安装
图片服务器是相对比较容易的,也是最稳定的服务器了,我建议用lighttpd或者nginx,不要用apache。
lighttpd不加cache也可以撑到50-80m没秒,如果比这个流量还大,建议用lighttpd+mod_mem_cache或者
lighttpd+memcached,但是后者我没有配成功,启动不了。nginx和memcached比较容易整合,但是又不能自动
set到memcached里去,还要自己用php或者java程序把图片放入到memcached里去,不够智能。我用的是lighttpd1.4.20+mod_mem_cache,可以
迟到4G多内存,比apache强多了。安装lighttpd的mod_mem_cache补丁如下
tar -xzvf lighttpd-1.4.20.tar.gz
cp lighttpd-1.4.20.mod_mem_cache.patch lighttpd-1.4.20
patch -p0 < lighttpd-1.4.20.mod_mem_cache.patch  
sh autogen.sh   
./configure --prefix=/usr/local/lighttpd-1.4.20
make && make install

配置文件增加如下段:
server.modules              = (
#                               "mod_rewrite",
#                               "mod_redirect",
#                               "mod_alias",
                                "mod_access",
#                               "mod_cml",
#                               "mod_trigger_b4_dl",
#                               "mod_auth",
#                               "mod_status",
#                               "mod_setenv",
#                               "mod_fastcgi",
#                               "mod_proxy",
#                               "mod_simple_vhost",
#                               "mod_evhost",
#                               "mod_userdir",
#                               "mod_cgi",
#                               "mod_compress",
#                               "mod_ssi",
#                               "mod_usertrack",
                                "mod_expire",
#                               "mod_secdownload",
#                               "mod_rrdtool",
                                "mod_accesslog",
                                "mod_mem_cache" )  #注意加上这个

#然后增加如下配置段                                
mem-cache.filetypes = ("application/x-javascript", "text/css", "text/html", "text/javascript", "image/jpg", "image/jpeg", "image/gif", "image/png", "image/bmp")

mem-cache.enable = "enable"

#4096M
mem-cache.max-memory = 4096

#512k
mem-cache.max-file-size = 512

#lru count
mem-cache.lru-remove-count = 100000

#1 day
mem-cache.expire-time = 1440


五:nginx可以做负载均衡,按照IP做负载均衡就不用管分布式session的问题,这里就不做讲述了,需要的时候查查就行。

六:网上说的lighttpd+squid+apache可以怎么怎么加速网站,我配置了一下,根本没用,第一层的lighttpd只要必须经过squid,即使squid的缓存里有也会很慢,还没有直接一个lighttpd快。
下面附上squid3.0配置成功的配置文件,可以实现缓存,如果没有缓存可以往81这个端口转发。
#visible_hostname www.abc.com 
visible_hostname localhost
http_port 3128 vhost vport
cache_mem 2048 MB
maximum_object_size_in_memory 2048 KB
memory_replacement_policy lru
#cache_dir ufs /tmp 512 16 256 
cache_dir ufs /usr/local/squid/var/cache 2048 16 256
max_open_disk_fds 0
minimum_object_size 0 KB
maximum_object_size 32768 KB
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log /usr/local/squid/var/logs/access_log combined
cache_log /usr/local/squid/var/logs/cache.log
pid_filename /usr/local/squid/var/logs/squid.pid
#cache_store_log none 
cache_peer 127.0.0.1 parent 81 0 no-query no-digest originserver name=www
#cache_peer_domain www www.abc.com
cache_peer_domain localhost
cache_peer_access www allow all
http_access allow all
acl QUERY urlpath_regex .exe
cache deny QUERY
cache_effective_user nobody
cache_effective_group nobody
分享到:
评论

相关推荐

    人工智能-项目实践-网站设计-校园易物网站-毕业设计.zip

    标题中的“人工智能-项目实践-网站设计-校园易物网站-毕业设计.zip”表明这是一个关于人工智能在实际项目中的应用,具体是针对校园易物网站的毕业设计。这个项目可能涵盖了从概念设计到实现的全过程,旨在让学生理解...

    济南易物网--程序可以

    1、网站名称在Global.asa文件里面改 2、管理员路径admin/index.asp 初始密码的帐号:admin 3、还有一些小小的功能没有完善,请大家自行完善。 感谢您选用本站代码! http://wish.fytcw.com

    校园易物网站毕业设计论文

    校园易物网站毕业设计论文 资源标题:校园易物网站毕业设计论文 资源描述:河南理工大学2015毕业设计论文,校园易物在线 资源标签:易物 物物交换 毕业设计 校园易物交换平台是基于B/S架构的网上交易平台,...

    易物网原码易物网原码

    易物网原码易物网原码易物网原码易物网原码

    基于ssh的购物网站

    总结来说,基于SSH的购物网站项目是一个综合性的学习资源,涵盖了MVC架构、依赖注入、对象关系映射等核心Java Web开发技术,对于提升开发者的技能水平具有显著帮助。通过深入研究和实践,可以全面了解电子商务平台的...

    Android校园应用—易物网的设计与实现.pdf

    随着网络技术和物流业的迅速发展,网上易物有了可靠的发展空间,网络技术为以物易物这种交换方式搭建了一个交换平台,人们可以在网上挑选自己中意的商品,与其他人在线交流,直接在易物网站进行信息交换,实现以物换...

    基于安卓的校园以物易物系统开题报告.docx

    本资源摘要信息主要介绍基于安卓的校园以物易物系统的设计与实现,旨在解决大学生之间的闲置物品交易问题。该系统通过移动端APP,提供了方便快捷的交易平台,为大学生之间的闲置物品交易提供了便捷的解决方案。 ...

    一个很好用的易物系统 换客易物系统

    易物系统,也被称为物物交换系统,是一种允许用户通过互联网平台用自己拥有的物品或服务与他人交换等价或不等价物品或服务的机制。"换客易物系统"是一个专门为此目的设计的软件应用,旨在促进这种非货币交易的便利性...

    基于安卓的校园以物易物系统任务书.doc

    该系统基于 B/S 架构进行设计搭建,使用 Android 开发框架实现前端的开发,后台主要采用 Java 语言以及数据库技术实现。 系统由三大模块构成,分别是游客操作模块、用户操作模块以及管理员操作模块。游客模块能够...

    易物狗物品交换平台~~~~~~~~~~~

    【易物狗物品交换平台】是一个在线平台,旨在促进用户之间的物品交换,提供了一种创新的方式来进行二手交易,实现资源的再利用。该平台的核心功能是连接拥有闲置物品的个人或商家,让他们能够找到愿意用自己物品进行...

    基于ASP的新力易物网源码.zip

    对“基于ASP的新力易物网源码”的研究有助于开发者学习ASP编程,理解Web开发流程,以及如何构建一个实际的在线交易系统。同时,通过源码的分析,也可以吸取前人的经验教训,避免常见的设计缺陷和安全问题,提升自身...

    二手易物网站

    二手易物交易网站发布二手物品,购买记录,物品管理等

    校内易物网的设计与实现

    本毕业设计是作者2015年6月份毕业自己写的,数据库用的是mysql,后台没有用到任何框架,jsp和前端语言直接干,系统实现起来还是不难的,比较适合大四狗,你懂得!代码下载后可以直接运行,最烦那些下载后又不能运行的代码,...

    265易物换物网网站源代码

    【标题】"265易物换物网网站源代码" 涉及的是一个基于互联网的交易平台,其核心功能是允许用户通过交换物品而非金钱来进行交易。这种类型的网站源代码通常包括用户注册、登录、发布交换信息、搜索与匹配物品、管理...

    ASP实例开发源码-新力易物网源码 asp版.zip

    这个"ASP实例开发源码—新力易物网源码 asp版.zip"是一个基于ASP技术的网站源代码实例,适用于学习和理解ASP编程、网站开发以及电子商务平台的构建。 在ASP中,开发者可以使用VBScript或JScript等脚本语言编写...

    深圳易物之窗 asp原代码

    【标题】"深圳易物之窗 asp原代码"揭示了这是一个基于ASP(Active Server Pages)编程语言开发的网站源代码。ASP是微软推出的一种服务器端脚本环境,主要用于创建动态交互式网页。这个项目可能是为了实现深圳地区的...

    回收及以物易物校园电子产品回收及以物易物商业计划书.pptx

    总结来说,"回收及以物易物校园电子产品回收及以物易物商业计划书"是一个结合了环保理念和技术应用的综合项目,旨在通过创新的方式解决电子废物问题,提高资源循环利用率,同时培养学生的社会责任感。策划人赵明明的...

    ASP实例开发网站源码——某易物网程序,经测试正常可用.rar

    这个实例开发网站源码——某易物网程序,是基于ASP技术构建的一个在线交换物品的平台,展示了ASP在实际网站开发中的应用。源码经过测试,确认可以正常运行,这意味着它包含了完整的数据库连接、页面逻辑以及用户交互...

    校园以物易物app系统的设计与实现论文.docx

    本文主要探讨的是校园以物易物app系统的开发与实现,该系统旨在为校园内的学生提供一个方便快捷的平台,实现物品交换,提高资源利用率,同时增进校园内的交流与互动。项目的背景源自于当前校园内普遍存在的闲置物品...

Global site tag (gtag.js) - Google Analytics