■開発仕様書紹介について:
「開発仕様書が3ステップに分けされるのです。」
●システム設計: 要求仕様書、システム説明仕様書。
普通的にお客様からいろいろな情報をもらってプロジェクトマネージャが作成するのです。
内容はシステムの紹介、機能要求、応用場合、ソフトウェア環境、性能要求等です。他の仕様書が全てこれによる作成するのです。
●ソフトウェア設計: 外部要求仕様書、各部間インターフェース仕様書、オブジェクト仕様書
これは設計チームが作成するのです。プロジェクトマネージャはレビューする責任があります。
○外部仕様書の内容は各部の機能を詳細的に別々説明するものです。ソフトウェアのフレームワーク設計もここで定義する。
○各部間インターフェース仕様書は通信する事がある部分間のインターフェース定義です。
例えば:今回の開発で装置と監視サーバ間インターフェース、クライアントと監視サーバ間インターフェースはそうなインターフェース定義です。二つ間が互いにメッセージとデータを通信する内容を定義するものです。
○オブジェクト仕様書の内容は全システムの属性と対象リストです、または属性と対象定義のルールがあります。DBの値名称をここから定義し、ソースのオブジェクトクラスをここから定義するのです。
●詳細設計: 内部個別仕様書、単体試験仕様書
ソフトウェア開発の為に各開発チームが作成するのです。設計チームはレビューする責任があります。
○内部個別仕様書はコーディングのためにクラスとメソッドの詳細定義です。
○単体試験仕様書はコーディング完了した後でクラスに単体試験を行う要求を定義するものです。
●試験仕様書: UT試験仕様書、CT試験仕様書
設計チームがシステムの機能と動作を確認するために作成するのです。試験の項目、手順、要求などを記載するものです。
○UT試験仕様書は各部のアプリケーションをテストする要求と内容です。
○CT試験仕様書は全システム一緒にテストする要求と内容です。
2007-10-20
パナソニック製Let'sNoteノートパソコン
今月にパナソニク製CF-Y7ノートパソコンを買った。Let'sNoteノードの特徴はLight,LongTimeですので、パソコン本体1.5キロ、電池で使用時間は8時ぐらいです。これは結構すばらしい。いつもIBM製X41を使用するが、パナソニク製ノートにキーボードの問題があります。その以外は、今までこのノートの性能と特長に私が満足しています。一週間ぐらい使用した、いい感じ。
初めでのOSはVistaです、でも私がVistaに好きないです。それでVistaをXPに変更しました。その作業とても大変です。一番難しい問題はCF-Y7のハードディスクがSATAだんですので、XPSP2のCDでインストールできない。インストール時にSATAのドライバのFloppyが必要です。それで私がXPSP2のOEMインストールCD作りました。CF-Y7用のSATAドライバをXPインストールに追加しました。問題を解決しました。



初めでのOSはVistaです、でも私がVistaに好きないです。それでVistaをXPに変更しました。その作業とても大変です。一番難しい問題はCF-Y7のハードディスクがSATAだんですので、XPSP2のCDでインストールできない。インストール時にSATAのドライバのFloppyが必要です。それで私がXPSP2のOEMインストールCD作りました。CF-Y7用のSATAドライバをXPインストールに追加しました。問題を解決しました。
仕事会社のプロジェクト開発チーム構成
プロジェクト開発チーム構成:
-----------------------------------------------------------------------------------
[開発マネージャ] 2名
←開発進捗を管理する、お客様に打合せる、
↓ (管理、システム設計をレビューする)
-----------------------------------------------------------------------------------
[設計チーム] 4-6名
←システム設計を行う、ソフトウェア設計を行う
↓ (管理、詳細設計をレビューする)
-----------------------------------------------------------------------------------
[開発チーム] 50-100名
←詳細設計する、コーディングする、単体テストする
↓ (サポート、改修)
-----------------------------------------------------------------------------------
[試験チーム] 20名
←UT組合せ試験する、CT総合試験する
↓ (管理マネージャに開発品質が表現される)
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
[開発マネージャ] 2名
←開発進捗を管理する、お客様に打合せる、
↓ (管理、システム設計をレビューする)
-----------------------------------------------------------------------------------
[設計チーム] 4-6名
←システム設計を行う、ソフトウェア設計を行う
↓ (管理、詳細設計をレビューする)
-----------------------------------------------------------------------------------
[開発チーム] 50-100名
←詳細設計する、コーディングする、単体テストする
↓ (サポート、改修)
-----------------------------------------------------------------------------------
[試験チーム] 20名
←UT組合せ試験する、CT総合試験する
↓ (管理マネージャに開発品質が表現される)
-----------------------------------------------------------------------------------
2007-06-02
奈良一日游
今天起来精神不错,外面天气也不错。所以趁着还有春天的气息,一不做二不休前往奈良,一日游。
随手在JR里面拿的步行游奈良的导游册帮了大忙,出了近铁奈良站,徒步于奈良有名的三条通,前往奈良公园。沿街非常多的特色商店,卖名物的,卖旅游商品的,比比皆是。进入公园,其实不知道什么时候进入的,完全没有明显的标志,看了导游标牌才知道当前位置已经在公园里面了。
放出点照片


公园内环境非常的好,大片的草地,步行于其间,安静,美丽,让人非常放松舒服,身边到处都是梅花鹿跑来跑去的,还成群结队的穿街过巷的,完全不怕人的样子。

顺便把照片附上:
http://picasaweb.google.co.jp/tolatao/GgQmmG
随手在JR里面拿的步行游奈良的导游册帮了大忙,出了近铁奈良站,徒步于奈良有名的三条通,前往奈良公园。沿街非常多的特色商店,卖名物的,卖旅游商品的,比比皆是。进入公园,其实不知道什么时候进入的,完全没有明显的标志,看了导游标牌才知道当前位置已经在公园里面了。
放出点照片
公园内环境非常的好,大片的草地,步行于其间,安静,美丽,让人非常放松舒服,身边到处都是梅花鹿跑来跑去的,还成群结队的穿街过巷的,完全不怕人的样子。
顺便把照片附上:
http://picasaweb.google.co.jp/tolatao/GgQmmG
2007-05-27
环球影城JP一日游
今天去了。大阪的环球影城-USJ。是环球影视公司办的一个主题公园。以其所发行的电影为主题的各种娱乐节目。从福岛站出发,JR直达,出了站就满是环球影视公司电影为主题的商店,一下就很有气氛,各种电影为主题的招牌到处都是。不过价格不便宜。蛮佩服这种商业运作的。
因为朋友是留学生的样子。购得的是团体票。所以票价4000,觉得还可以接受。门口是环球影视公司的标志-一个硕大的地球,上面写着Universal。周围是喷泉,主题比较突出呀,顺便宣传了公司的形象。
上午首先去的是电影Back to the future为主题的互动电影,进入后就晕了,队伍非常长,也拉开了今天排队慢慢长路的第一站。终于轮到我们了,座进一部车内,4人一排,共2排,然后烟雾升起,在我们眼前一片漆黑的时候。机车悄然升起,眼前出现了电影里面的场景,冲入一个光球后进入了未来的世界。眼前满是岩浆和火焰,我们追着电影里面的坏蛋,在将要喷发的火山里飞来飞去的。机车随着360度宽屏呈现的场景上下左右翻飞,烟雾水花也配合着不时出现,让你以为真的进入了未来的世界,非常的刺激。之后与一条霸王龙的搏斗后终于搞定电影中的反派脚色,成果返回现实。出来后大家都兴奋不易,集体和前往未来的机车合影。
接着是救火的一个电影主题公园。听说过没看过。进入后,介绍了这部电影是如何拍摄的,之后模拟了电影里面的火灾爆炸的效果的场景,火光冲天,爆炸声此起彼伏,突然我们所站的位置的天花板掉下来了,地面也一阵抖动,非常吓人。还好马上发现不过是个机关,让你体会下当时的惊险。
出来后直奔侏罗纪主题公园,等了无数时间后进入一艘快艇中,随水漂流进入主题公园,周围到处是恐龙,样子逼真,还不时跳出来吓你一跳,喷点水什么的。突然一个急转我们就冲出了山洞,飞下瀑布,惊魂未定,快艇冲入水中,给我们每个人一个透心凉。哈。爽是爽了点。不过大家都湿的不成样子了。
吃完午饭,作在未来水世界门口等下一场开幕,1个小时的等待还算值得,迎来了一座海洋大剧场,我们座在靠中间。据说前排会被水浇,我们没有什么装备,倒是很多人买了雨衣,果然上来主持人就活跃了下气氛。前排被浇了好几筒水,后来还有人排成一排上去被泼水,正式开始后,展示了真实电影里面的场景,火光冲天,快艇飞来,反派脚色杀入,然后当然就是英雄救美了,战斗非常火爆,爆炸,机枪,水花,一切体现了真实,中间还飞进来一架飞机,一个字-强!
之后是征服者和蜘蛛侠的主题公园,和《回到未来》一样座上车享受真实互动的刺激,当然更强的是,这次需要带上立体眼镜,立体电影的感觉爽,相比《回到未来》更加真实的感觉,子弹在你身边飞过的真实感觉,电影里面的怪物向你从来的真实感觉,人下意识躲避飞过来的石块的感觉,哈哈。爽。。
最后也是最厉害的。过山车。哈哈。一个10层楼高的90度俯冲,1个上下回转,2个左右回转,加上无数次上下起伏。配合耳边摇滚音乐。爽翻了。。。。现在写BLOG的时候还飞着哪。下来还想再作一次哦。不过面对1个小时的队终于还是忍啦。哈。反正已经很爽了。。
时间也差不多了。回家!总体主题公园体现2个特点。真实!刺激!不枉此行呀。とても楽しい!
http://picasaweb.google.co.jp/tolatao/USJ
因为朋友是留学生的样子。购得的是团体票。所以票价4000,觉得还可以接受。门口是环球影视公司的标志-一个硕大的地球,上面写着Universal。周围是喷泉,主题比较突出呀,顺便宣传了公司的形象。
上午首先去的是电影Back to the future为主题的互动电影,进入后就晕了,队伍非常长,也拉开了今天排队慢慢长路的第一站。终于轮到我们了,座进一部车内,4人一排,共2排,然后烟雾升起,在我们眼前一片漆黑的时候。机车悄然升起,眼前出现了电影里面的场景,冲入一个光球后进入了未来的世界。眼前满是岩浆和火焰,我们追着电影里面的坏蛋,在将要喷发的火山里飞来飞去的。机车随着360度宽屏呈现的场景上下左右翻飞,烟雾水花也配合着不时出现,让你以为真的进入了未来的世界,非常的刺激。之后与一条霸王龙的搏斗后终于搞定电影中的反派脚色,成果返回现实。出来后大家都兴奋不易,集体和前往未来的机车合影。
接着是救火的一个电影主题公园。听说过没看过。进入后,介绍了这部电影是如何拍摄的,之后模拟了电影里面的火灾爆炸的效果的场景,火光冲天,爆炸声此起彼伏,突然我们所站的位置的天花板掉下来了,地面也一阵抖动,非常吓人。还好马上发现不过是个机关,让你体会下当时的惊险。
出来后直奔侏罗纪主题公园,等了无数时间后进入一艘快艇中,随水漂流进入主题公园,周围到处是恐龙,样子逼真,还不时跳出来吓你一跳,喷点水什么的。突然一个急转我们就冲出了山洞,飞下瀑布,惊魂未定,快艇冲入水中,给我们每个人一个透心凉。哈。爽是爽了点。不过大家都湿的不成样子了。
吃完午饭,作在未来水世界门口等下一场开幕,1个小时的等待还算值得,迎来了一座海洋大剧场,我们座在靠中间。据说前排会被水浇,我们没有什么装备,倒是很多人买了雨衣,果然上来主持人就活跃了下气氛。前排被浇了好几筒水,后来还有人排成一排上去被泼水,正式开始后,展示了真实电影里面的场景,火光冲天,快艇飞来,反派脚色杀入,然后当然就是英雄救美了,战斗非常火爆,爆炸,机枪,水花,一切体现了真实,中间还飞进来一架飞机,一个字-强!
之后是征服者和蜘蛛侠的主题公园,和《回到未来》一样座上车享受真实互动的刺激,当然更强的是,这次需要带上立体眼镜,立体电影的感觉爽,相比《回到未来》更加真实的感觉,子弹在你身边飞过的真实感觉,电影里面的怪物向你从来的真实感觉,人下意识躲避飞过来的石块的感觉,哈哈。爽。。
最后也是最厉害的。过山车。哈哈。一个10层楼高的90度俯冲,1个上下回转,2个左右回转,加上无数次上下起伏。配合耳边摇滚音乐。爽翻了。。。。现在写BLOG的时候还飞着哪。下来还想再作一次哦。不过面对1个小时的队终于还是忍啦。哈。反正已经很爽了。。
时间也差不多了。回家!总体主题公园体现2个特点。真实!刺激!不枉此行呀。とても楽しい!
http://picasaweb.google.co.jp/tolatao/USJ
2007-05-09
日本で二ヶ月の記念日
今日は日本で二ヶ月の記念日です。
今日はわたしが初めで日本語でのBLOGを誕生する日です。
多分たくさんの問題があります。どぞよろしくお願い致します。
いつも東京に行きたいです。それで今度のゴールデンウイークに夜行バースで行きました。夜行バースはとても安いですよ。でも寝ることがいくないです。
東京に就て、上海で働く会社の友達に会いました。今この2人も日本で働きました。
東京での第一日渋谷に行きました、にぎやかですよ。多分ゴールデンウイークですが、商店街にたくさんの人がいました。夜に友達の自動車で静岡に行きました。そのご天神温泉です。
今日はわたしが初めで日本語でのBLOGを誕生する日です。
多分たくさんの問題があります。どぞよろしくお願い致します。
いつも東京に行きたいです。それで今度のゴールデンウイークに夜行バースで行きました。夜行バースはとても安いですよ。でも寝ることがいくないです。
東京に就て、上海で働く会社の友達に会いました。今この2人も日本で働きました。
東京での第一日渋谷に行きました、にぎやかですよ。多分ゴールデンウイークですが、商店街にたくさんの人がいました。夜に友達の自動車で静岡に行きました。そのご天神温泉です。
2007-04-21
足球比赛-兵库县
2007-03-21
到达大阪
北京时间10:15 上海浦东机场出发
东京时间01:07 到达关西机场
出发
上飞机的时候遇到同一班飞机的中国人.她是专门要乘她同学开的飞机才坐这躺飞机的.因为她的同学的原因,我也有幸坐在头等仓里面.感觉非常不错.舒服而宽敞.飞机上的服务也不错.大概是她的同学的客人,所以飞机上的空姐对我们也特别热情,真没有想到第一次坐飞机就坐了头等舱.嘿嘿^_^
路途的兴奋
正是中午时分,天气又好,飞机飞过日本列岛的时候,伏看下面,一个个小岛像沉在蓝色的海洋中的贝克般朦胧,清澈的海洋加上美丽的小岛.害我兴奋了好久....:P

机场见闻
到达关西机场的时候,正是中午时分,阳光非常好.通过机场大厅的玻璃墙照进来,感觉关西机场非常明亮干净.一下飞机就体会到了日本自动化程度很高.机场和候机楼直接通过一个轨道列车相连接,每隔5分钟一班列车.快捷方便,出关的时候没有我想象的那么严格,没有怎么检查就出来了.出来的时候.接我的同事还没有到.稍等了下才出发坐JR到达大阪站
初到大阪.
感觉这里空气不错.周围环境也很干净.
接我的同事直接把我带到我住的公寓,一个非常现代化的公寓,入口有自动门,需要公寓的钥匙才能开启.进入后有一部很小的电梯,但很干净.
门口的信箱也是自动管理的.有包裹或者信件,管理员会通知你去取,甚至可以通过email通知你,然后你有一张磁卡,插入门口的邮箱管理系统,你的邮件的箱子会自动打开的.
公寓是新的,还没有入住过.电器非常齐全,虽然小了点,但各种生活设施一样俱全,电器都很现代化,大灯可以调节8种亮度,带有遥控器的,有自动门铃系统,一个组合式的淋浴间,浴缸很深,泡澡很舒服,洗衣机,微波炉等一样不稍.
日本的电视机我研究了很久感觉挺有趣的.有普通和卫星2种接口,听说很快普通的信号就不再使用了.转为完全的数字信号了.
听说日本倒垃圾很麻烦.来了果然如此,垃圾桶就有5个之多.开始我都不敢倒垃圾,后来问了同事之后才偷偷默默的倒了已经满处理的垃圾.
日本的消费
日本的超市分便利店,超级市场supermarket,100yen店.价格也是按照次序100yen店最便宜,生活用品大部分都是从那么买的.感觉便宜划算.价格和上海的便利店差不多,还能够承受的了.很多买不到的东西只好到supermarket去买,那里价格稍微便宜点,但和便利店也差不多.好在种类比较多.可以挑最便宜的买.便宜的东西感觉也不是很劣质,也蛮好用的.大件买了张桌子椅子,公寓里完全没有家具.
吃饭的话.中午外面吃超级贵的东西.咖喱加饭450yen,咖喱里面可是什么东西都没有的哟.一般的定食都要600yen左右,吉野家大概是日本最便宜的店了吧.牛肉饭380yen(小),所以中午很多人都在那里吃.早饭晚饭都自己家里解决.还好有电饭煲.煮饭加作点菜,解决下.饭很贵2kg/1000yen.自己作也不省的.总体花费的话大概200yen一顿.

今天就到这里.累了....
东京时间01:07 到达关西机场
出发
上飞机的时候遇到同一班飞机的中国人.她是专门要乘她同学开的飞机才坐这躺飞机的.因为她的同学的原因,我也有幸坐在头等仓里面.感觉非常不错.舒服而宽敞.飞机上的服务也不错.大概是她的同学的客人,所以飞机上的空姐对我们也特别热情,真没有想到第一次坐飞机就坐了头等舱.嘿嘿^_^
路途的兴奋
正是中午时分,天气又好,飞机飞过日本列岛的时候,伏看下面,一个个小岛像沉在蓝色的海洋中的贝克般朦胧,清澈的海洋加上美丽的小岛.害我兴奋了好久....:P
机场见闻
到达关西机场的时候,正是中午时分,阳光非常好.通过机场大厅的玻璃墙照进来,感觉关西机场非常明亮干净.一下飞机就体会到了日本自动化程度很高.机场和候机楼直接通过一个轨道列车相连接,每隔5分钟一班列车.快捷方便,出关的时候没有我想象的那么严格,没有怎么检查就出来了.出来的时候.接我的同事还没有到.稍等了下才出发坐JR到达大阪站
初到大阪.
感觉这里空气不错.周围环境也很干净.
接我的同事直接把我带到我住的公寓,一个非常现代化的公寓,入口有自动门,需要公寓的钥匙才能开启.进入后有一部很小的电梯,但很干净.
门口的信箱也是自动管理的.有包裹或者信件,管理员会通知你去取,甚至可以通过email通知你,然后你有一张磁卡,插入门口的邮箱管理系统,你的邮件的箱子会自动打开的.
公寓是新的,还没有入住过.电器非常齐全,虽然小了点,但各种生活设施一样俱全,电器都很现代化,大灯可以调节8种亮度,带有遥控器的,有自动门铃系统,一个组合式的淋浴间,浴缸很深,泡澡很舒服,洗衣机,微波炉等一样不稍.
日本的电视机我研究了很久感觉挺有趣的.有普通和卫星2种接口,听说很快普通的信号就不再使用了.转为完全的数字信号了.
听说日本倒垃圾很麻烦.来了果然如此,垃圾桶就有5个之多.开始我都不敢倒垃圾,后来问了同事之后才偷偷默默的倒了已经满处理的垃圾.
日本的消费
日本的超市分便利店,超级市场supermarket,100yen店.价格也是按照次序100yen店最便宜,生活用品大部分都是从那么买的.感觉便宜划算.价格和上海的便利店差不多,还能够承受的了.很多买不到的东西只好到supermarket去买,那里价格稍微便宜点,但和便利店也差不多.好在种类比较多.可以挑最便宜的买.便宜的东西感觉也不是很劣质,也蛮好用的.大件买了张桌子椅子,公寓里完全没有家具.
吃饭的话.中午外面吃超级贵的东西.咖喱加饭450yen,咖喱里面可是什么东西都没有的哟.一般的定食都要600yen左右,吉野家大概是日本最便宜的店了吧.牛肉饭380yen(小),所以中午很多人都在那里吃.早饭晚饭都自己家里解决.还好有电饭煲.煮饭加作点菜,解决下.饭很贵2kg/1000yen.自己作也不省的.总体花费的话大概200yen一顿.
今天就到这里.累了....
2007-02-28
前往日本的准备小结
1. 办签证需要准备的事项:
出入境管理局办理护照,顺便拍20张照片(以后要用的,建议穿作正式点)
上海是公证处办理学历公证
2. 劳动合同准备
签订相关的工作合同,为了在日公司能够帮你申请反签证。
3. 反签证下来后,去日本领事馆办理正式签证
4. 机票的准备
上航,国航的机票比较便宜,其他航空公司的比较贵,但行李限重不同,第一次去还是建议买行李限重超过30公斤的。定票可以通过携程,能够拿到比较多的优惠,缺点是不能转签,也不能退。
5. 行李的准备
上海,国航等国内航空公司的飞机的托运行李限重20公斤。
东航,日航等国际航空公司的行李限重为30公斤。如果是学生票,第一次去。行李限重还更高,听说有的有100公斤。
行李的话,建议只带被褥2套,一套稍厚的,一套稍薄的,组合使用可以解决春夏秋冬的使用,也便于更换。其他的物品,除了礼品以外,准备一周到一个月所用的日用品就好了,那里买其实也不是很贵。
6. 准备礼品
茶叶,白酒,工艺品,字画,都是比较好的。包装一定要好。礼品可以考虑小点精致点。除了方便携带的好处。日本人也比较喜欢。
7. 银行卡的处理
在日本可以使用银联卡,建议使用信用卡。通过借机卡绑定还款,开通美元还款后,可以自动将人民币转为美元,再转为日元还款,汇率也比一般的银行人民币换日元合算。
如果是master card还可以获得当地master card 的相关服务,Visa card也一样的。
8. 理发
听说那里理发很贵。够一个月生活费。关注中。。
9. 准备日本用的小章
一厘米宽的圆章,大概10~30圆不等,文字突起那种。文字外围最好有一圈,好的章还有花纹,以起到防伪的作用。
10. 与家人通讯
建议使用skype,通话质量比较高。家里没有电脑也可以通过skpye拨固定电话。费用还是非常便宜的。
出入境管理局办理护照,顺便拍20张照片(以后要用的,建议穿作正式点)
上海是公证处办理学历公证
2. 劳动合同准备
签订相关的工作合同,为了在日公司能够帮你申请反签证。
3. 反签证下来后,去日本领事馆办理正式签证
4. 机票的准备
上航,国航的机票比较便宜,其他航空公司的比较贵,但行李限重不同,第一次去还是建议买行李限重超过30公斤的。定票可以通过携程,能够拿到比较多的优惠,缺点是不能转签,也不能退。
5. 行李的准备
上海,国航等国内航空公司的飞机的托运行李限重20公斤。
东航,日航等国际航空公司的行李限重为30公斤。如果是学生票,第一次去。行李限重还更高,听说有的有100公斤。
行李的话,建议只带被褥2套,一套稍厚的,一套稍薄的,组合使用可以解决春夏秋冬的使用,也便于更换。其他的物品,除了礼品以外,准备一周到一个月所用的日用品就好了,那里买其实也不是很贵。
6. 准备礼品
茶叶,白酒,工艺品,字画,都是比较好的。包装一定要好。礼品可以考虑小点精致点。除了方便携带的好处。日本人也比较喜欢。
7. 银行卡的处理
在日本可以使用银联卡,建议使用信用卡。通过借机卡绑定还款,开通美元还款后,可以自动将人民币转为美元,再转为日元还款,汇率也比一般的银行人民币换日元合算。
如果是master card还可以获得当地master card 的相关服务,Visa card也一样的。
8. 理发
听说那里理发很贵。够一个月生活费。关注中。。
9. 准备日本用的小章
一厘米宽的圆章,大概10~30圆不等,文字突起那种。文字外围最好有一圈,好的章还有花纹,以起到防伪的作用。
10. 与家人通讯
建议使用skype,通话质量比较高。家里没有电脑也可以通过skpye拨固定电话。费用还是非常便宜的。
2007-02-13
2007年的工作总结
期间参与的工作项目情况如下(按照时间先后):
时间(2006) 项目 负责 备注
8.1~9.22 薬剤師求人 • 开发 已完成
9.23~9.31 SHANGHAI24 SMS • 开发 已完成
10.10~2.13.2007 PREMAMA • 开发 已完成
【感想】
这一年作了2个比较大,时间比较赶的项目:
* YAK大量的使用了AJAX, GOOGLE MAP,对Javascript的使用有了很多的理解, 初步尝试了Cakephp的使用
* PREMAMA的架构比较完整和全面,涉及到了完整的Mail系统,BLOG系统,Enquete系统。对SMTP的socket通讯有所了解,对PHP的反射应用非常喜欢,我相信这个就是PHP解释语言的快速开发的优势,这个同样适用于RUBY, 相信解释语言是未来发展的方向。
总体上, 感觉这一年对PHP这个开发语言有了更进一步的理解。对PHP快速的WEB开发和JAVA企业级别的WEB开发有了很多的比较和感想。
【对于今后的工作】
明年将前往日本大阪工作。主要任务可能是C语言的开发,这个是我熟悉也陌生的语言,相信大学里面的学习的东西有助于我更快的熟习这个开发工作。
希望在日本能有效的提高我的日语能力。能安下心来学好这门语言,多容入日本的社会,体会不同的文化。
时间(2006) 项目 负责 备注
8.1~9.22 薬剤師求人 • 开发 已完成
9.23~9.31 SHANGHAI24 SMS • 开发 已完成
10.10~2.13.2007 PREMAMA • 开发 已完成
【感想】
这一年作了2个比较大,时间比较赶的项目:
* YAK大量的使用了AJAX, GOOGLE MAP,对Javascript的使用有了很多的理解, 初步尝试了Cakephp的使用
* PREMAMA的架构比较完整和全面,涉及到了完整的Mail系统,BLOG系统,Enquete系统。对SMTP的socket通讯有所了解,对PHP的反射应用非常喜欢,我相信这个就是PHP解释语言的快速开发的优势,这个同样适用于RUBY, 相信解释语言是未来发展的方向。
总体上, 感觉这一年对PHP这个开发语言有了更进一步的理解。对PHP快速的WEB开发和JAVA企业级别的WEB开发有了很多的比较和感想。
【对于今后的工作】
明年将前往日本大阪工作。主要任务可能是C语言的开发,这个是我熟悉也陌生的语言,相信大学里面的学习的东西有助于我更快的熟习这个开发工作。
希望在日本能有效的提高我的日语能力。能安下心来学好这门语言,多容入日本的社会,体会不同的文化。
可缓存的CMS系统设计
对于一个日访问量达到百万级的网站来说,速度很快就成为一个瓶颈。除了优化内容发布系统的应用本身外,如果能把不需要实时更新的动态页面的输出结果转化成静态网页来发布,速度上的提升效果将是显著的,因为一个动态页面的速度往往会比静态页面慢2-10倍,而静态网页的内容如果能被缓存在内存里,访问速度甚至会比原有动态网页有2-3个数量级的提高。
动态缓存和静态缓存的比较
基于反向代理加速的站点规划
基于apache mod_proxy的反向代理加速实现
基于squid的反向代理加速实现
面向缓存的页面设计
应用的缓存兼容性设计:
HTTP_HOST/SERVER_NAME和REMOTE_ADDR/REMOTE_HOST需要用 HTTP_X_FORWARDED_HOST/HTTP_X_FORWARDED_SERVER代替
后台的内容管理系统的页面输出遵守可缓存的设计,这样就可以把性能问题交给前台的缓存服务器来解决了,从而大大简化CMS系统本身的复杂程度。
静态缓存和动态缓存的比较
静态页面的缓存可能有2种形式:其实主要区别就是CMS是否自己负责关联内容的缓存更新管理。
1.静态缓存:是在新内容发布的同时就立刻生成相应内容的静态页面,比如:2003年3月22日,管理员通过后台内容管理界面录入一篇文章后,就立刻生成http://www.chedong.com/tech/2003/03/22/001.html这个静态页面,并同步更新相关索引页上的链接。
2.动态缓存:是在新内容发布以后,并不预先生成相应的静态页面,直到对相应内容发出请求时,如果前台缓存服务器找不到相应缓存,就向后台内容管理服务器发出请求,后台系统会生成相应内容的静态页面,用户第一次访问页面时可能会慢一点,但是以后就是直接访问缓存了。
如果去ZDNet等国外网站会发现他们使用的基于Vignett内容管理系统都有这样的页面名称:0,22342566,300458.html。其实这里的0,22342566,300458就是用逗号分割开的多个参数: 第一次访问找不到页面后,相当于会在服务器端产生一个doc_type= 0&doc_id=22342566&doc_template=300458的查询,而查询结果会生成的缓存的静态页面: 0,22342566,300458.html
静态缓存的缺点:
1.复杂的触发更新机制:这两种机制在内容管理系统比较简单的时候都是非常适用的。但对于一个关系比较复杂的网站来说,页面之间的逻辑引用关系就成为一个非常非常复杂的问题。最典型的例子就是一条新闻要同时出现在新闻首页和相关的3个新闻专题中,在静态缓存模式中,每发一篇新文章,除了这篇新闻内容本身的页面外,还需要系统通过触发器生成多个新的相关静态页面,这些相关逻辑的触发也往往就会成为内容管理系统中最复杂的部分之一。
2.旧内容的批量更新: 通过静态缓存发布的内容,对于以前生成的静态页面的内容很难修改,这样用户访问旧页面时,新的模板根本无法生效。
在动态缓存模式中,每个动态页面只需要关心,而相关的其他页面能自动更新,从而大大减少了设计相关页面更新触发器的需要。
以前做小型应用的时候也用过类似方式:应用首次访问以后将数据库的查询结果在本地存成一个文件,下次请求时先检查本地缓存目录中是否有缓存文件,从而减少对后台数据库的访问。虽然这样做也能承载比较大的负载,但这样的内容管理和缓存管理一体的系统是很难分离的,而且数据完整性也不是很好保存,内容更新时,应用需要把相应内容的的缓存文件删除。但是这样的设计在缓存文件很多的时候往往还需要将缓存目录做一定的分布,否则一个目录下的文件节点超过3000,rm *都会出错。
这时候,系统需要再次分工,把复杂的内容管理系统分解成:内容输入和缓存这2个相对简单的系统实现。
后台:内容管理系统,专心的将内容发布做好,比如:复杂的工作流管理,复杂的模板规则等……
前台:页面的缓存管理则可以使用缓存系统实现
______________________ ___________________
|Squid Software cache| |F5 Hardware cache|
---------------------- -------------------
\ /
\ ________________ /
|ASP |JSP |PHP |
Content Manage System
----------------
所以分工后:内容管理和缓存管理2者,无论哪一方面可选的余地都是非常大的:软件(比如前台80端口使用SQUID对后台8080的内容发布管理系统进行缓存),缓存硬件,甚至交给akamai这样的专业服务商。
面向缓存的站点规划 一个利用SQUID对多个站点进行做WEB加速http acceleration方案:
原先一个站点的规划可能是这样的:
200.200.200.207 www.chedong.com
200.200.200.208 news.chedong.com
200.200.200.209 bbs.chedong.com
200.200.200.205 images.chedong.com
面向缓存服务器的设计中:所有站点都通过外部DNS指向到同一个IP:200.200.200.200/201这2台缓存服务器上(使用2台是为了冗余备份)
工作原理:
外部请求过来时,设置缓存根据配置文件进行转向解析。这样,服务器请求就可以转发到我们指定的内部地址上。
在处理多虚拟主机转向方面:mod_proxy比squid要简单一些:可以把不同服务转向后后台多个IP的不同端口上。
而squid只能通过禁用DNS解析,然后根据本地的/etc/hosts文件根据请求的域名进行地址转发,后台多个服务器必须使用相同的端口。
使用反向代理加速,我们不仅可以得到性能上的提升,而且还能获得额外的安全性和配置的灵活度:
配置灵活性提高:可以自己在内部服务器上控制后台服务器的DNS解析,当需要在服务器之间做迁移调整时,就不用大量修改外部DNS配置了,只需要修改内部DNS实现服务的调整。
数据安全性增加:所有后台服务器可以很方便的被保护在防火墙内。
后台应用设计复杂程度降低:原先为了效率常常需要建立专门的图片服务器images.chedong.com和负载比较高的应用服务器 bbs.chedong.com分离,在反向代理加速模式中,所有前台请求都通过缓存服务器:实际上就都是静态页面,这样,应用设计时就不用考虑图片和应用本身分离了,也大大降低了后台内容发布系统设计的复杂程度,由于数据和应用都存放在一起,也方便了文件系统的维护和管理。
基于Apache mod_proxy的反向代理缓存加速实现
Apache包含了mod_proxy模块,可以用来实现代理服务器,针对后台服务器的反向加速
安装apache 1.3.x 编译时:
--enable-shared=max --enable-module=most
注:Apache 2.x中mod_proxy已经被分离成mod_proxy和mod_cache:同时mod_cache有基于文件和基于内存的不同实现
创建/var/www/proxy,设置apache服务所用户可写
mod_proxy配置样例:反相代理缓存+缓存
架设前台的www.example.com反向代理后台的www.backend.com的8080端口服务。
修改:httpd.conf
ServerName www.example.com
ServerAdmin admin@example.com
# reverse proxy setting
ProxyPass / http://www.backend.com:8080/
ProxyPassReverse / http://www.backend.com:8080/
# cache dir root
CacheRoot "/var/www/proxy"
# max cache storage
CacheSize 50000000
# hour: every 4 hour
CacheGcInterval 4
# max page expire time: hour
CacheMaxExpire 240
# Expire time = (now - last_modified) * CacheLastModifiedFactor
CacheLastModifiedFactor 0.1
# defalt expire tag: hour
CacheDefaultExpire 1
# force complete after precent of content retrived: 60-90%
CacheForceCompletion 80
CustomLog /usr/local/apache/logs/dev_access_log combined
基于Squid的反向代理加速实现
Squid是一个更专用的代理服务器,性能和效率会比Apache的mod_proxy高很多。
如果需要combined格式日志补丁:
http://www.squid-cache.org/mail-archive/squid-dev/200301/0164.html
squid的编译:
./configure --enable-useragent-log --enable-referer-log --enable-default-err-language=Simplify_Chinese \ --enable-err-languages="Simplify_Chinese English" --disable-internal-dns
make
#make install
#cd /usr/local/squid
make dir cache
chown squid.squid *
vi /usr/local/squid/etc/squid.conf
在/etc/hosts中:加入内部的DNS解析,比如:
192.168.0.4 www.chedong.com
192.168.0.4 news.chedong.com
192.168.0.3 bbs.chedong.com
---------------------cut here----------------------------------
# visible name
visible_hostname cache.example.com
# cache config: space use 1G and memory use 256M
cache_dir ufs /usr/local/squid/cache 1024 16 256
cache_mem 256 MB
cache_effective_user squid
cache_effective_group squid
http_port 80
httpd_accel_host virtual
httpd_accel_single_host off
httpd_accel_port 80
httpd_accel_uses_host_header on
httpd_accel_with_proxy on
# accelerater my domain only
acl acceleratedHostA dstdomain .example1.com
acl acceleratedHostB dstdomain .example2.com
acl acceleratedHostC dstdomain .example3.com
# accelerater http protocol on port 80
acl acceleratedProtocol protocol HTTP
acl acceleratedPort port 80
# access arc
acl all src 0.0.0.0/0.0.0.0
# Allow requests when they are to the accelerated machine AND to the
# right port with right protocol
http_access allow acceleratedProtocol acceleratedPort acceleratedHostA
http_access allow acceleratedProtocol acceleratedPort acceleratedHostB
http_access allow acceleratedProtocol acceleratedPort acceleratedHostC
# logging
emulate_httpd_log on
cache_store_log none
# manager
acl manager proto cache_object
http_access allow manager all
cachemgr_passwd pass all
----------------------cut here---------------------------------
创建缓存目录:
/usr/local/squid/sbin/squid -z
启动squid
/usr/local/squid/sbin/squid
停止squid:
/usr/local/squid/sbin/squid -k shutdown
启用新配置:
/usr/local/squid/sbin/squid -k reconfig
通过crontab每天0点截断/轮循日志:
0 0 * * * (/usr/local/squid/sbin/squid -k rotate)
可缓存的动态页面设计
什么样的页面能够比较好的被缓存服务器缓存呢?如果返回内容的HTTP HEADER中有"Last-Modified"和"Expires"相关声明,比如:
Last-Modified: Wed, 14 May 2003 13:06:17 GMT
Expires: Fri, 16 Jun 2003 13:06:17 GMT
前端缓存服务器在期间会将生成的页面缓存在本地:硬盘或者内存中,直至上述页面过期。
因此,一个可缓存的页面:
页面必须包含Last-Modified: 标记
一般纯静态页面本身都会有Last-Modified信息,动态页面需要通过函数强制加上,比如在PHP中:
// always modified now
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
必须有Expires或Cache-Control: max-age标记设置页面的过期时间:
对于静态页面,通过apache的mod_expires根据页面的MIME类型设置缓存周期:比如图片缺省是1个月,HTML页面缺省是2天等。
ExpiresActive on
ExpiresByType image/gif "access plus 1 month"
ExpiresByType text/css "now plus 2 day"
ExpiresDefault "now plus 1 day"
对于动态页面,则可以直接通过写入HTTP返回的头信息,比如对于新闻首页index.php可以是20分钟,而对于具体的一条新闻页面可能是1天后过期。比如:在php中加入了1个月后过期:
// Expires one month later
header("Expires: " .gmdate ("D, d M Y H:i:s", time() + 3600 * 24 * 30). " GMT");
应用的缓存兼容性设计
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTD头信息中,增加了HTTP_X_FORWARDED_????信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。
下面是2个例子,用于说明缓存兼容性应用的设计原则:
function getHostName ()
dim hostName as String = ""
hostName = Request.ServerVariables("HTTP_HOST")
if not isDBNull(Request.ServerVariables("HTTP_X_FORWARDED_HOST")) then
if len(trim(Request.ServerVariables("HTTP_X_FORWARDED_HOST"))) > 0 then
hostName = Request.ServerVariables("HTTP_X_FORWARDED_HOST")
end if
end if
return hostNmae
end function
//对于一个需要记录客户端IP的PHP应用:不要直接引用REMOTE_ADDR,而是要使用HTTP_X_FORWARDED_FOR,
function getUserIP (){
//注意这个函数中的¥字符是PHP的美元符号
¥user_ip = ¥_SERVER["REMOTE_ADDR"];
if (¥_SERVER["HTTP_X_FORWARDED_FOR"]) {
¥user_ip = ¥_SERVER["HTTP_X_FORWARDED_FOR"];
}
}
注意:HTTP_X_FORWARDED_FOR如果经过了多个中间代理服务器,有何能是逗号分割的多个地址,
比如:200.28.7.155,200.10.225.77 unknown,219.101.137.3
因此在很多旧的数据库设计中(比如BBS)往往用来记录客户端地址的字段被设置成20个字节就显得过小了。
经常见到类似以下的错误信息:
Microsoft JET Database Engine 错误 '80040e57'
字段太小而不能接受所要添加的数据的数量。试着插入或粘贴较少的数据。
/inc/char.asp,行236
原因就是在设计客户端访问地址时,相关用户IP字段大小最好要设计到50个字节以上,当然经过3层以上代理的几率也非常小。
如何检查目前站点页面的可缓存性(Cacheablility)呢?可以参考以下2个站点上的工具:
http://www.ircache.net/cgi-bin/cacheability.py
小节:
大访问量的网站应尽可能将动态网页生成静态页面作为缓存发布,甚至对于搜索引擎这样的动态应用来说,缓存机制也是非常非常重要的。
在动态页面中利用HTTP Header定义缓存更新策略。
利用缓存服务器获得额外的配置和安全性
日志非常重要:SQUID日志缺省不支持COMBINED日志,但对于需要REFERER日志的这个补丁非常重要:http://www.squid-cache.org/mail-archive/squid-dev/200301/0164.html
参考资料:
HTTP代理缓存
http://vancouver-webpages.com/proxy.html
可缓存的页面设计
http://linux.oreillynet.com/pub/a/linux/2002/02/28/cachefriendly.html
运用ASP.NET的输出缓冲来存储动态页面 - 开发者 - ZDNet China
http://www.zdnet.com.cn/developer/tech/story/0,2000081602,39110239-2,00.htm
相关RFC文档:
RFC
2616:
section
13 (Caching)
section
14.9 (Cache-Control header)
section
14.21 (Expires header)
section
14.32 (Pragma: no-cache) is important if you are interacting with
HTTP/1.0 caches
section
14.29 (Last-Modified) is the most common validation method
section
3.11 (Entity Tags) covers the extra validation method
可缓存性检查
http://www.web-caching.com/cacheability.html
缓存设计要素
http://vancouver-webpages.com/CacheNow/detail.html
ZOPE上的几篇使用APACHE MOD_PROXY MOD_GZIP加速的文档
http://www.zope.org/Members/anser/apache_zserver/
http://www.zope.org/Members/softsign/ZServer_and_Apache_mod_gzip
http://www.zope.org/Members/rbeer/caching
动态缓存和静态缓存的比较
基于反向代理加速的站点规划
基于apache mod_proxy的反向代理加速实现
基于squid的反向代理加速实现
面向缓存的页面设计
应用的缓存兼容性设计:
HTTP_HOST/SERVER_NAME和REMOTE_ADDR/REMOTE_HOST需要用 HTTP_X_FORWARDED_HOST/HTTP_X_FORWARDED_SERVER代替
后台的内容管理系统的页面输出遵守可缓存的设计,这样就可以把性能问题交给前台的缓存服务器来解决了,从而大大简化CMS系统本身的复杂程度。
静态缓存和动态缓存的比较
静态页面的缓存可能有2种形式:其实主要区别就是CMS是否自己负责关联内容的缓存更新管理。
1.静态缓存:是在新内容发布的同时就立刻生成相应内容的静态页面,比如:2003年3月22日,管理员通过后台内容管理界面录入一篇文章后,就立刻生成http://www.chedong.com/tech/2003/03/22/001.html这个静态页面,并同步更新相关索引页上的链接。
2.动态缓存:是在新内容发布以后,并不预先生成相应的静态页面,直到对相应内容发出请求时,如果前台缓存服务器找不到相应缓存,就向后台内容管理服务器发出请求,后台系统会生成相应内容的静态页面,用户第一次访问页面时可能会慢一点,但是以后就是直接访问缓存了。
如果去ZDNet等国外网站会发现他们使用的基于Vignett内容管理系统都有这样的页面名称:0,22342566,300458.html。其实这里的0,22342566,300458就是用逗号分割开的多个参数: 第一次访问找不到页面后,相当于会在服务器端产生一个doc_type= 0&doc_id=22342566&doc_template=300458的查询,而查询结果会生成的缓存的静态页面: 0,22342566,300458.html
静态缓存的缺点:
1.复杂的触发更新机制:这两种机制在内容管理系统比较简单的时候都是非常适用的。但对于一个关系比较复杂的网站来说,页面之间的逻辑引用关系就成为一个非常非常复杂的问题。最典型的例子就是一条新闻要同时出现在新闻首页和相关的3个新闻专题中,在静态缓存模式中,每发一篇新文章,除了这篇新闻内容本身的页面外,还需要系统通过触发器生成多个新的相关静态页面,这些相关逻辑的触发也往往就会成为内容管理系统中最复杂的部分之一。
2.旧内容的批量更新: 通过静态缓存发布的内容,对于以前生成的静态页面的内容很难修改,这样用户访问旧页面时,新的模板根本无法生效。
在动态缓存模式中,每个动态页面只需要关心,而相关的其他页面能自动更新,从而大大减少了设计相关页面更新触发器的需要。
以前做小型应用的时候也用过类似方式:应用首次访问以后将数据库的查询结果在本地存成一个文件,下次请求时先检查本地缓存目录中是否有缓存文件,从而减少对后台数据库的访问。虽然这样做也能承载比较大的负载,但这样的内容管理和缓存管理一体的系统是很难分离的,而且数据完整性也不是很好保存,内容更新时,应用需要把相应内容的的缓存文件删除。但是这样的设计在缓存文件很多的时候往往还需要将缓存目录做一定的分布,否则一个目录下的文件节点超过3000,rm *都会出错。
这时候,系统需要再次分工,把复杂的内容管理系统分解成:内容输入和缓存这2个相对简单的系统实现。
后台:内容管理系统,专心的将内容发布做好,比如:复杂的工作流管理,复杂的模板规则等……
前台:页面的缓存管理则可以使用缓存系统实现
______________________ ___________________
|Squid Software cache| |F5 Hardware cache|
---------------------- -------------------
\ /
\ ________________ /
|ASP |JSP |PHP |
Content Manage System
----------------
所以分工后:内容管理和缓存管理2者,无论哪一方面可选的余地都是非常大的:软件(比如前台80端口使用SQUID对后台8080的内容发布管理系统进行缓存),缓存硬件,甚至交给akamai这样的专业服务商。
面向缓存的站点规划 一个利用SQUID对多个站点进行做WEB加速http acceleration方案:
原先一个站点的规划可能是这样的:
200.200.200.207 www.chedong.com
200.200.200.208 news.chedong.com
200.200.200.209 bbs.chedong.com
200.200.200.205 images.chedong.com
面向缓存服务器的设计中:所有站点都通过外部DNS指向到同一个IP:200.200.200.200/201这2台缓存服务器上(使用2台是为了冗余备份)
工作原理:
外部请求过来时,设置缓存根据配置文件进行转向解析。这样,服务器请求就可以转发到我们指定的内部地址上。
在处理多虚拟主机转向方面:mod_proxy比squid要简单一些:可以把不同服务转向后后台多个IP的不同端口上。
而squid只能通过禁用DNS解析,然后根据本地的/etc/hosts文件根据请求的域名进行地址转发,后台多个服务器必须使用相同的端口。
使用反向代理加速,我们不仅可以得到性能上的提升,而且还能获得额外的安全性和配置的灵活度:
配置灵活性提高:可以自己在内部服务器上控制后台服务器的DNS解析,当需要在服务器之间做迁移调整时,就不用大量修改外部DNS配置了,只需要修改内部DNS实现服务的调整。
数据安全性增加:所有后台服务器可以很方便的被保护在防火墙内。
后台应用设计复杂程度降低:原先为了效率常常需要建立专门的图片服务器images.chedong.com和负载比较高的应用服务器 bbs.chedong.com分离,在反向代理加速模式中,所有前台请求都通过缓存服务器:实际上就都是静态页面,这样,应用设计时就不用考虑图片和应用本身分离了,也大大降低了后台内容发布系统设计的复杂程度,由于数据和应用都存放在一起,也方便了文件系统的维护和管理。
基于Apache mod_proxy的反向代理缓存加速实现
Apache包含了mod_proxy模块,可以用来实现代理服务器,针对后台服务器的反向加速
安装apache 1.3.x 编译时:
--enable-shared=max --enable-module=most
注:Apache 2.x中mod_proxy已经被分离成mod_proxy和mod_cache:同时mod_cache有基于文件和基于内存的不同实现
创建/var/www/proxy,设置apache服务所用户可写
mod_proxy配置样例:反相代理缓存+缓存
架设前台的www.example.com反向代理后台的www.backend.com的8080端口服务。
修改:httpd.conf
ServerName www.example.com
ServerAdmin admin@example.com
# reverse proxy setting
ProxyPass / http://www.backend.com:8080/
ProxyPassReverse / http://www.backend.com:8080/
# cache dir root
CacheRoot "/var/www/proxy"
# max cache storage
CacheSize 50000000
# hour: every 4 hour
CacheGcInterval 4
# max page expire time: hour
CacheMaxExpire 240
# Expire time = (now - last_modified) * CacheLastModifiedFactor
CacheLastModifiedFactor 0.1
# defalt expire tag: hour
CacheDefaultExpire 1
# force complete after precent of content retrived: 60-90%
CacheForceCompletion 80
CustomLog /usr/local/apache/logs/dev_access_log combined
基于Squid的反向代理加速实现
Squid是一个更专用的代理服务器,性能和效率会比Apache的mod_proxy高很多。
如果需要combined格式日志补丁:
http://www.squid-cache.org/mail-archive/squid-dev/200301/0164.html
squid的编译:
./configure --enable-useragent-log --enable-referer-log --enable-default-err-language=Simplify_Chinese \ --enable-err-languages="Simplify_Chinese English" --disable-internal-dns
make
#make install
#cd /usr/local/squid
make dir cache
chown squid.squid *
vi /usr/local/squid/etc/squid.conf
在/etc/hosts中:加入内部的DNS解析,比如:
192.168.0.4 www.chedong.com
192.168.0.4 news.chedong.com
192.168.0.3 bbs.chedong.com
---------------------cut here----------------------------------
# visible name
visible_hostname cache.example.com
# cache config: space use 1G and memory use 256M
cache_dir ufs /usr/local/squid/cache 1024 16 256
cache_mem 256 MB
cache_effective_user squid
cache_effective_group squid
http_port 80
httpd_accel_host virtual
httpd_accel_single_host off
httpd_accel_port 80
httpd_accel_uses_host_header on
httpd_accel_with_proxy on
# accelerater my domain only
acl acceleratedHostA dstdomain .example1.com
acl acceleratedHostB dstdomain .example2.com
acl acceleratedHostC dstdomain .example3.com
# accelerater http protocol on port 80
acl acceleratedProtocol protocol HTTP
acl acceleratedPort port 80
# access arc
acl all src 0.0.0.0/0.0.0.0
# Allow requests when they are to the accelerated machine AND to the
# right port with right protocol
http_access allow acceleratedProtocol acceleratedPort acceleratedHostA
http_access allow acceleratedProtocol acceleratedPort acceleratedHostB
http_access allow acceleratedProtocol acceleratedPort acceleratedHostC
# logging
emulate_httpd_log on
cache_store_log none
# manager
acl manager proto cache_object
http_access allow manager all
cachemgr_passwd pass all
----------------------cut here---------------------------------
创建缓存目录:
/usr/local/squid/sbin/squid -z
启动squid
/usr/local/squid/sbin/squid
停止squid:
/usr/local/squid/sbin/squid -k shutdown
启用新配置:
/usr/local/squid/sbin/squid -k reconfig
通过crontab每天0点截断/轮循日志:
0 0 * * * (/usr/local/squid/sbin/squid -k rotate)
可缓存的动态页面设计
什么样的页面能够比较好的被缓存服务器缓存呢?如果返回内容的HTTP HEADER中有"Last-Modified"和"Expires"相关声明,比如:
Last-Modified: Wed, 14 May 2003 13:06:17 GMT
Expires: Fri, 16 Jun 2003 13:06:17 GMT
前端缓存服务器在期间会将生成的页面缓存在本地:硬盘或者内存中,直至上述页面过期。
因此,一个可缓存的页面:
页面必须包含Last-Modified: 标记
一般纯静态页面本身都会有Last-Modified信息,动态页面需要通过函数强制加上,比如在PHP中:
// always modified now
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
必须有Expires或Cache-Control: max-age标记设置页面的过期时间:
对于静态页面,通过apache的mod_expires根据页面的MIME类型设置缓存周期:比如图片缺省是1个月,HTML页面缺省是2天等。
ExpiresActive on
ExpiresByType image/gif "access plus 1 month"
ExpiresByType text/css "now plus 2 day"
ExpiresDefault "now plus 1 day"
对于动态页面,则可以直接通过写入HTTP返回的头信息,比如对于新闻首页index.php可以是20分钟,而对于具体的一条新闻页面可能是1天后过期。比如:在php中加入了1个月后过期:
// Expires one month later
header("Expires: " .gmdate ("D, d M Y H:i:s", time() + 3600 * 24 * 30). " GMT");
应用的缓存兼容性设计
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTD头信息中,增加了HTTP_X_FORWARDED_????信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。
下面是2个例子,用于说明缓存兼容性应用的设计原则:
function getHostName ()
dim hostName as String = ""
hostName = Request.ServerVariables("HTTP_HOST")
if not isDBNull(Request.ServerVariables("HTTP_X_FORWARDED_HOST")) then
if len(trim(Request.ServerVariables("HTTP_X_FORWARDED_HOST"))) > 0 then
hostName = Request.ServerVariables("HTTP_X_FORWARDED_HOST")
end if
end if
return hostNmae
end function
//对于一个需要记录客户端IP的PHP应用:不要直接引用REMOTE_ADDR,而是要使用HTTP_X_FORWARDED_FOR,
function getUserIP (){
//注意这个函数中的¥字符是PHP的美元符号
¥user_ip = ¥_SERVER["REMOTE_ADDR"];
if (¥_SERVER["HTTP_X_FORWARDED_FOR"]) {
¥user_ip = ¥_SERVER["HTTP_X_FORWARDED_FOR"];
}
}
注意:HTTP_X_FORWARDED_FOR如果经过了多个中间代理服务器,有何能是逗号分割的多个地址,
比如:200.28.7.155,200.10.225.77 unknown,219.101.137.3
因此在很多旧的数据库设计中(比如BBS)往往用来记录客户端地址的字段被设置成20个字节就显得过小了。
经常见到类似以下的错误信息:
Microsoft JET Database Engine 错误 '80040e57'
字段太小而不能接受所要添加的数据的数量。试着插入或粘贴较少的数据。
/inc/char.asp,行236
原因就是在设计客户端访问地址时,相关用户IP字段大小最好要设计到50个字节以上,当然经过3层以上代理的几率也非常小。
如何检查目前站点页面的可缓存性(Cacheablility)呢?可以参考以下2个站点上的工具:
http://www.ircache.net/cgi-bin/cacheability.py
小节:
大访问量的网站应尽可能将动态网页生成静态页面作为缓存发布,甚至对于搜索引擎这样的动态应用来说,缓存机制也是非常非常重要的。
在动态页面中利用HTTP Header定义缓存更新策略。
利用缓存服务器获得额外的配置和安全性
日志非常重要:SQUID日志缺省不支持COMBINED日志,但对于需要REFERER日志的这个补丁非常重要:http://www.squid-cache.org/mail-archive/squid-dev/200301/0164.html
参考资料:
HTTP代理缓存
http://vancouver-webpages.com/proxy.html
可缓存的页面设计
http://linux.oreillynet.com/pub/a/linux/2002/02/28/cachefriendly.html
运用ASP.NET的输出缓冲来存储动态页面 - 开发者 - ZDNet China
http://www.zdnet.com.cn/developer/tech/story/0,2000081602,39110239-2,00.htm
相关RFC文档:
RFC
2616:
section
13 (Caching)
section
14.9 (Cache-Control header)
section
14.21 (Expires header)
section
14.32 (Pragma: no-cache) is important if you are interacting with
HTTP/1.0 caches
section
14.29 (Last-Modified) is the most common validation method
section
3.11 (Entity Tags) covers the extra validation method
可缓存性检查
http://www.web-caching.com/cacheability.html
缓存设计要素
http://vancouver-webpages.com/CacheNow/detail.html
ZOPE上的几篇使用APACHE MOD_PROXY MOD_GZIP加速的文档
http://www.zope.org/Members/anser/apache_zserver/
http://www.zope.org/Members/softsign/ZServer_and_Apache_mod_gzip
http://www.zope.org/Members/rbeer/caching
订阅:
博文 (Atom)




