分类 Web 下的文章

Apache2中增加header

有时候,因为特殊需要,需要在Apache的配置里额外增加一些header,供后台程序来处理
Apache2的mod_headers模块提供了2个方法:

1.Header:设置response的header
2.RequestHeader:设置request的header

注意两者的区别,如果想增加request的header,则必须要用RequestHeader指令,如:
RequestHeader add X-VIP-SCHEME 'https'

如果要增加response的header,则用Header指令:
Header set X-VIP-SCHEME 'https'
这种方式设置的header,能通过Httpwatch观测到的。
另:虽然Header指令也提供了early选项,文档上这么说的
“Early mode is designed as a test/debugging aid for developers. Directives defined using the early keyword are set right at the beginning of processing the request. ”
但如果想在apache的后端服务程序中拿到设置的header,使用Header early指令无论如何也不行的,今天郁闷了很长时间.....

最后,还是采用了RequestHeader来实现.....

顺便提一下,目前apache2的中文文档关于RequestHeader的指令,翻译的有笔误,把request给翻译成了“响应头”
后来还是看了官方的英文文档,才大概明白两者的区别.....

软件架构师成长之路(ZZ)

        对于任何一个软件开发人员来说,架构师都是一个令人向往的角色。就连世界首富比尔盖茨在2000年卸任公司CEO的同时,也担任了微软公司的荣誉角色“首席软件架构师”,可见“架构师”这一称谓的吸引力。架构师是公司的“金领”,有着非常高的收入,很少需要考虑生存的问题,从而有更多的精力思考关键技术问题,形成“强者愈强”的良性循环。部分优秀的开发人员在工作了一定时间后,就要开始考虑自己的未来到底向哪个方向发展。如果开发人员的沟通能力强过技术能力,在补充一定的项目管理知识后,可以向技术管理的方向转型。如果其对技术一直很感兴趣,而沟通能力也不弱,则可以试着进一步加强技术修养,以期向架构师的方向发展,最终“修成正果”。

        那么,到底什么是架构师呢?所谓的架构师,应该是一个技术企业的最高技术决策者。他主要负责公司软件产品或软件项目的技术路线与技术框架的制订。好的架构师都是善良的独裁者,具有很强的技术、良好的写作能力、良好的口头表达能力,能够在各个层次进行沟通。从开发人员到架构师的成长应该是阶梯式的,一般来讲开发人员在刚刚开始工作时只能开发简单的独立软件模块,慢慢的随着经验的增长,他开始接触一些相互之间有信息传递的模块,而后来,他会发现自己接到的开发任务已经不是一个独立的单体,这些任务由一些专门的软件部分组成,可能包含数据库,工作流引擎,消息服务等等各种功能模块,可能分布在不同的服务器上,所有的部分协同起来,完成软件功能。而这时候,体系结构的好坏将直接决定了系统的性能和可扩展性,而就在这时候,这名优秀的开发人员也开始思考架构师应该思考的问题了,或者说,他向成长为架构师的道路迈出了一大步。

        什么是架构师最具价值的技能呢?就是要了解不同的知识,做一个“杂家”或者说“博学家”。当然,如果你的数据库技术非常棒,或者你在工作流引擎方面具有不可超越的专家知识,那也是很不错的。好的架构师有好多都是从专家成长过来的。但是,这不是架构师应该做的事情,架构师应该做的是了解所有的东西,既了解技术的宏观面,又了解技术的细节。真正的架构师不仅仅要了解软件,也要了解硬件,在关键的部位使用合适的硬件来取代软件,可以成倍甚至成百倍的提高整个系统的效率。下面我将会以互联网行业对的架构师的要求为例,向大家讲解作为架构师应该具备的知识。

        互联网行业是当前最激动人心的行业之一,很多的创新都来自于这个行业,而每一个大型的网站如Google,Yahoo,Myspace等都需要解决一个非常复杂的问题,就是网站的分布式向外扩展(Scale Out)的问题。解决这个问题,需要最优秀的架构师对业务进行剖析,利用软硬件将网站进行重构,甚至根据业务研发相应的分布式技术,解决网站复杂的分布式计算的问题。如果你想在这个行业中成为一名架构师的话,需要至少掌握网络知识,硬件,软件,网站优化等方方面面的知识:

网络知识。

        当前的软件已经绝对不是那种仅仅跑在一台单机上的孤立应用了。不仅仅是在互联网行业,任何一个行业的软件,都要求其具有网络功能。因此,网络知识是架构师必备的知识。我们所说的网络知识,不仅仅包括TCP/IP,http等互联网行业常用的软件协议,也包括网络规划,甚至更具体的说,根据网站应用所处的地理环境进行网络规划。比如人们常说:“这世界上最远的距离不是生与死的距离,而是电信到网通的距离”(笑)如果应用是建立在中国的,就要考虑电信用户和网通用户访问网站的速度应该都比较快才可以。这时候的解决方案可能有多种,比如采用CDN(Content Delivery Network内容分发网络)使得网站的内容发布到离用户最近的服务器,又可以采用把服务器放在一些所谓的双线机房中,甚至将几种方案结合起来使用。这些都统统归到网络知识中。做为公司的架构师,要对这些知识都有所了解,才有助于在遇到问题时找到最佳答案。

硬件知识。

        了解硬件的极限,是架构师的基本功。我见过一些人,他们的眼中软件硬件都是没有极限的,需要资源就申请,系统性能下降了就买更高级的设备。然而,硬件的性能有很大一部分取决于I/O设备。而这些I/O设备依靠的都是机械物理运动,这种运动是有极限的。因此当资源访问量增大到一定的程度时,这种物理运动将成为瓶颈。比如说,在开发网站的过程中,记录访客的状态是一件很重要的事情,一般来说可以使用HttpSession来记录。而 HttpSession的存储问题将是一个很大的挑战,尤其是多机共享Session时,将HttpSession存成文件并通过多机共享或网络备份的方式来解决分布式的问题是常用的方案,然而,架构师必须考虑到这种方案是有I/O极限限制的,很难扩展到超过一定规模的大型网络。同时,架构师应该了解目前最近的硬件发展是否对软件系统会造成一定的影响,比如在多核的条件下是否对软件编程有新的要求,是否会对运行在虚拟机和非虚拟机上的程序有影响等等。

软件知识。

        软件知识所包含的范围就更加广泛了。对于互联网行业来讲,架构师要了解操作系统,数据库,应用服务器等各方面的知识。比如说,如果网站使用的操作系统是Linux,就要了解这个Linux版本的性能与局限性,比如说最多可以存放的单个文件为多大。有的数据库的数据是以单个文件来存放的,虽然我们很少见到数据库中的数据多到不能再放入一条记录的情况,但是作为架构师,请时刻注意,这种可能性是有的。而且如果你有幸在一家高速成长的互联网企业中,而你所负责的应用又没有经过优化的话,可能你会很快见到这种现象。这种现象的发生可能是由于操作系统不支持大文件的原因,也可能是数据库不支持大文件。不论如何,架构师应该在这种现象发生之前就把一切都准备好。对数据库中表的拆分是架构师应该遇到的另外一个困难。一般来说增加应用服务器比较简单而增加数据库服务器则是比较复杂的问题,如果一个站点由多个数据库支持,架构师需要考虑如何在保证数据一致的情况下,让多个数据库分担压力。有些解决方案是将数据库的读写分开,使得大多数的查询sql不经过核心数据库,而只是访问数据库的副本,但事实上,这种方式也只能维护规模不大的网站。对于大型的网站来说,把业务分散到不同的数据库中,只共享必要的数据,才是合理的提高网站扩展性的解决方案。

其他知识。

        作为系统架构师,可能还需要对分布式系统,负载均衡,网络安全,数据监控等等各方面都有所了解。不仅仅是了解理论知识,也要对相关的产品和业界进展有一定的认识。比如说

根据Apache的status Info来定位问题

上周积分数据库进行了升级
相应的加减积分的程序也进行了修改
升级过程相对顺利,很快就完成
但自从升级后
积分的服务器就不断的报警重启
几乎每小时都会重启一次

开始怀疑是程序有问题,造成内存泄露
于是,查找resin的log
但也没有发现里面有out of memory的错误
在resin的jvm和stderr的日志里几乎看不到任何有用的信息
只有不断的重启的log

于是,想看看resin的status
在服务器上打开了ResinStatusServlet,配置了一个url
结果,看到的一切似乎都正常
Threads和Total Memory都没有异常
resin的status看不出问题

然后,又把Apache的info status给打开
在extra/httpd-info中打开server-status
配置一个url(要注意Allow权限的问题,不能让外部的用户看到这个页面)
访问后,发现了里面有很多的W
而且随着时间的推移,W越来越多
而W代表是Sending Reply
说明是程序在某个地方堵塞了
然后看到W的url都是某个Action
呵呵,到此基本就找到了问题所在的Class了

然后,再查找该Action对应的Log
发现在减积分的地方没有任何输出
再查看减积分的服务,果然发现很多的Exception
到此,就定位到了真正的问题了

于是,查找减积分的Bug
修改后再上线
服务器就正常了

另:如果从resin的status中看出有内存泄露
那么可能就需要利用第三方的工具
如JConsole,JProfile来定位到底是哪个Class造成的内存泄露了

整个查找问题,发现问题,解决问题的过程
看似挺复杂的,但基本都是这样的一个套路
只要遵从一定的流程和方法
一般都能顺利解决的

使用Apache强制下载文件

一般情况下,txt文件对应的Content-Type是text/plain
这个对应文件通常位于apache2/conf下的mime.types

在浏览器中输入一个可访问的txt文件,是会直接显示txt文件内容的
如果你想直接下载这个txt文件,则需要增加一个header:
Content-Disposition: attachment;filename="a.txt"
最好再修改一下它的Content-Type:
Content-type: application/octet-stream

在jsp或php或其它的脚本中,增加这样的header很简单的
但有时候为了提供一个简单的内网下载服务
就直接在apache中配置一个虚机,然后指定documentroot到要下载的目录
这样,就可以在虚机中使用apache的header指令,来为改虚机下的所有请求都增加这个header
修改httpd.conf文件:
中增加:
AddType application/octet-stream .log

修改extra/httpd-vhost.conf文件:


    ServerAdmin aaa@sohu.com
    DocumentRoot "/log"
    ServerName 10.1.71.32
    
        Options FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    

    Header set Content-Disposition "attachment"

OpenCMS取消登录失败的限制

OpenCMS系统默认当用户连续登录失败超过3次后,会自动锁定帐号15分钟

如果要修改或取消这个限制,则在opencms-system.xml中增加:

<loginmanager>
    <disableMinutes>0</disableMinutes>
    <maxBadAttempts>10</maxBadAttempts>
</loginmanager>

注意位置一定要放在<sites>的前面,否则会出错的

OpenCMS环境的搭建

最近,邮件的帮助系统准备放在自己的服务器上
为了便于产品人员更新发布页面
所以需要一个简单的CMS系统,然后上网搜了一堆
最后还是瞄准了OpenCMS,开始以为安装和配置应该很简单的
但真正操作后,才发现,这个玩意还真挺复杂的......
记录一下安装配置的过程:

1.OpenCMS是和Tomcat绑定的,开始想把它弄到Resin上,结果发现部署后有问题(也许是还没找到配置的方法吧)
  无奈,就改到Tomcat上了
2.安装过程还是比较简单的,但就是太慢了。安装后,它默认的url会是/opencms/opencms/system/login,如果想把它们给去掉,
  安装时,最好把opencms.war修改成ROOT.war,这样就会去掉第一个/opencms了
3.去掉第2个OpenCMS,参考文档:
  http://localhost/alkacon-documentation/howto_apache_httpd/mod_proxy.html
   修改Apache2的虚机配置:
  ProxyPass         /opencms/                 !    
   RedirectPermanent /opencms/                 http://${DOMAIN_NAME}/        
   ProxyPass         /resources/               !    
   ProxyPass         /export/                  !        
   ProxyPass         /                         http://localhost:8081/opencms/    
   ProxyPassReverse  /                      http://localhost:8081/opencms/
   修改Tomcat的配置:
  <Connector port="8081" protocol="HTTP/1.1"  connectionTimeout="20000"
               redirectPort="8443" useBodyEncodingForURI="true" proxyName="192.168.41.236" proxy Port="80" />
   修改opencms-system.xml
  <workplace-server>http://192.168.41.236</workplace-server>
   <default-uri>/sites/default/</default-uri>
   <site server="http://192.168.41.236" uri="/sites/default/"/>
4.配置多个站点,这个相对来说比较简单,在apache2中增加相应的虚机,同时修改Tomcat的service.xml和opencms-system.xml
5.发布站点时自动export静态文件,需要修改opencms-importexport.xml中的staticexporthandler为CmsAfterPublishStaticExportHandler,这样可以自动导出,使用它默认的handler,似乎是有问题
6.关于和前端的反向代理的配合问题,由于前端都是用mail.test.sohu.com/help来反向代理到OpenCMS的服务器上,这样就有2个问题:
  1)export的路径问题,OpenCMS默认是/export/的,但是我们的站点必须得是/help开头的,需要修改opencms-importexport.xml
        增加如下的规则:
          <rfs-rule>
                    <name>mailhelp</name>
                    <description>This is the rfs-rule for mysite</description>
                    <source>/sites/mailhelp/.*</source>
                    <rfs-prefix>/help/export</rfs-prefix>
                    <exportpath>export</exportpath>
                    <related-system-res>
                        <regex>/system/modules/com.sohu.mail.help/.*</regex>
                        <regex>/system/galleries/pics/mail_pic/.*</regex>
                    </related-system-res>
                </rfs-rule>
    2)页面之间的链接问题:这个问题最是郁闷了,直接用相对路径应该就可以了,比如href="test.html",但发现OpenCMS的html编辑器会自动把它转变成href="/test.html",这样,过前端的反向代理就有问题了,无奈,只能在链接时,手工加上href="/help/test.html",但这样就又碰到了一个问题,预览时会出404。上网Google了几把,没找到解决方案,只能用apache2的Rewrite了,增加一个规则,这样预览就正确了,总觉得这么解决很别扭.....
     RewriteEngine on
        RewriteRule /help/(.*) http://192.168.41.236/$1

Apache2配置多个监听端口

1.在httpd.conf中加上:
  Listen 80
   Listen 8008


2.在extra/httpd-vhosts.conf上:
  NameVirtualHost *:8008
  


      ServerAdmin webmaster@dummy-host2.example.com
      DocumentRoot "/usr/local/resin/doc/"
      ServerName test.ysz.com
      ErrorLog "logs/test-error_log"
      CustomLog "logs/test-access_log " common
  

Eclipse和Resin的结合

使用Myclipse好久了,习惯了里面集成的各种插件了
尤其是Resin的plugin,可以直接在MyEclipe里面配置部署
它会自动的编译和拷贝你的文件到Resin的Webapps下面

最近换用了Eclipse For JEE后,发现它的Server里面不支持Resin
也是,就上网找Resin For Eclipse的插件,发现了一个:

在线安装后,试用了一下,发现并不怎么理想
http://www.improve-technologies.com/alpha/updates/site.xml

后来,静下来仔细想想,真是犯晕了
其实根本就用不着那些所谓的插件
只需要在resin.conf中把虚拟目录的路径指到你的project下的web目录即可
如:

这样,在Eclipse中修改文件后,完全也不用重启resin即可马上生效
当然,前提是已Debug的模式启动Resin,加上-Xdebug,默认这个是打开的
为什么非要把project给弄到Resin的Webapps下呢

其实,上面的那个方法在很早之前就在用了
不过,自从用了MyEclipse后就把它给抛弃了
结果,脱离MyEclipse后就不知道该怎么办了
看来,过分依赖IDE确实不是一件什么好事......

使用POI对Excel文件进行处理(1)

前段时间,使用com对office的文档进行了parser
并提供了在线HTML版本的预览功能
初期在并发量不大的情况下,运行一切良好
但当并发量很大时,机器就受不了了,不停的报警
因为本身com调用就是耗内存又耗cpu的,并不适合大并发的请求
于是,开始考虑其它的第三方的库去解析Office文档
Aapache的POI应该算是比较“有活力”的一个开源的库
虽然它目前还不是很完善,不很成熟,但毕竟后边还是有一个开发组在维护更新

word里面可能包含的元素(图片,文档图....),格式,样式太复杂
要想使用POI来很少的处理它,还是有很大的难度的
Excel相对来说还是要简单一些,毕竟它里面主要还是以表格数据为主的
POI现在对Excel的支持还是挺好的,除了对Chart的支持不太好外,其它都还好吧

所以,定下了如下的处理规则:
1.读取Excel文件,构造一个HSSFWorkbook对象,如有异常,则说明该Excel文件已损坏或已加密,直接返回错误。
2.判断Excel文件中是否有图片,嵌入对象或者Chart,如有,则转发到后面的com接口上去处理
  System.out.println(wb.getAllEmbeddedObjects().size());
   System.out.println(wb.getAllPictures().size());
   System.out.println(wb.getSummaryInformation());
   System.out.println(sheet.getDrawingPatriarch().containsChart());
   System.out.println(HSSFChart.getSheetCharts(sheet).length);
   发现,POI并不能精确的判断出Excel中是否含有Chart,至少我测试,有些Chart它并不能识别出来。
3.若没有以上那些现象,则POI自己来进行解析处理,并最后生成对应的Html文件。

经过近2天的研究发现,POI本身对Excel的Parser做的还算比较彻底
然而,使用起来还是挺麻烦的,总感觉它里面的一些方法做的不好,使用起来不够方便
印象较深的就是它的Color的处理,太不人性化了,它只返回了一个自定义的short值,还得自己写方法进行转换
如果它直接就返回Color的Hex形式,对开发人员来说,不就简单多了吗?
不过,复杂归复杂,最终还是能从它提供的一大堆接口中构造出自己想要的东西的

下面,会详细的记录使用POI来将Excel文件转换为Html......

最新文章

最近回复

  • feifei435:这两个URI实际是不一样的
  • zsy: git push origin 分支 -f 给力!
  • 冼敏兵:简单易懂,good fit
  • Jack:无需改配置文件,看着累! # gluster volume se...
  • Mr.j:按照你的方法凑效了,折腾死了。。。。
  • zheyemaster:补充一句:我的网站路径:D:\wamp\www ~~菜鸟站长, ...
  • zheyemaster:wamp2.5(apache2.4.9)下局域网访问403错误的...
  • Git中pull对比fetch和merge | 炼似春秋:[…] 首先,我搜索了git pull和git fe...
  • higkoo:总结一下吧, 性能调优示例: gluster volume s...
  • knowaeap:请问一下博主,你维护的openyoudao支持opensuse吗

分类

归档

其它