nginx支持手机应用(mobile)相关

作者:Lightning@小宝 发布时间:January 23, 2010 分类:web服务器方向

1、判断手机用户

一般通过User-Agent来判断,从网上抄一抄,那些列出的都不错,我的配置里加上了Java、curl和Wget,方便调试和其它内部项目的抓取。

因为现在很多手机网关没有发送User-Agent,所以大部分手机发送的User-Agent到了网关就被过滤掉了,相当于是空值。经过抽样调查,User-Agent为空且为手机用户比例比较大。有部分User-Agent为空的是一些蜘蛛或垃圾程序的造访,这些垃圾流量并不那么重要。希望手机网关将来有相应的标准,不要发送空的User-Agent,就是发送一个字母也好啊。

如果应用有一个独立域名,也未必要做手机判断。譬如新浪有独立域名且深入人心,那它做不做跳转无关紧要。

nginx配置用穷举方式罗列各类手机User-Agent并把空User-Agent也转到手机应用里,非这些情况,则跳到帮助页面。

set $ismob 0;
if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC\-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT\-)|(SonyEricsson)|(NEC\-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi\-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG\-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC\-)|(SED\-)|(EMOL\-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )
{
set $ismob 1;
proxy_pass http://m.sudone.com;
}
if ( $http_user_agent ~ ^$ )
{
set $ismob 1;
proxy_pass http://m.sudone.com;
}
if ( $ismob = 0 )
{
rewrite "^.*$" http://help.m.sudone.com/ permanent;
}

另一种配置方法:可以利用nginx的browser模块配置,参考:

http://www.daxi8.cn/index.php/archives/253/

注意:使用上面的正则表达式的办法要求nginx版本为0.7.43或以下,0.7.44版到0.8版都会有问题。

2、Content-Type

手机浏览器和普通电脑访问页面有所不同,绝大多数手机不支持text/html这种Content-Type格式。在web服务方面,除了要做出合适手机浏览的页面,另外一个重要的事情就是要把Content-Type弄对了。一般手机使用的是text/vnd.wap.wml和application/xhtml+xml,听说text/vnd.wap.wml是老式手机专用,application/xhtml+xml是3g标准指定的Content-Type,另外charset需要指明为UTF-8。

所以Content-Type就应像如下:

Content-Type: application/xhtml+xml; charset=UTF-8

这样就对了。

对于动态页面,Content-Type可以在程序里设定。

譬如php:

header("Content-Type: application/xhtml+xml; charset=UTF-8")

jsp的话,把顶头的page改了就好。

动态程序里的设定,到了nginx上默认会继承,所以不用太多考虑。nginx要做的一个是静态页面,另一个是302跳转。

静态页面的Content-Type改起来不麻烦,修改mime.types:

application/xhtml+xml html htm shtml;
application/xhtml+xml xml;

把需要的扩展名对应的类型改一改就好了。然后在nginx.conf里指定charset UTF-8;并加上charset_types text/vnd.wap.wml;和charset_types application/xhtml+xml;,charset_types这个指令在0.6版的nginx下是没有的,因此需要用0.7版,一般用的是0.7.43版。

麻烦的是301和302跳转,nginx中使用rewrite的redirect和permanent跳转的时候,Content-Type怎么改都会是text/html,使用add_header,Content-Type变成了两行,没能达成目的。用代理到动态程序固然行,但性能和稳定性又成了问题。最后查阅了nginx源码,发现这个text/html是写死的……

我调试的这个nginx是0.7.30版的,文件:

vi ./src/http/ngx_http_special_response.c

568 //r->headers_out.content_type_len = sizeof("text/html") - 1;
569 //r->headers_out.content_type.len = sizeof("text/html") - 1;
570 //r->headers_out.content_type.data = (u_char *) "text/html";

把568 569 570这三行代码注释掉,就可以让nginx跳转时不发送Content-Type,我发现在电脑的IE/FF浏览器上没有Content-Type也能正常跳转。

当然,为了严谨一些,写上Content-Type吧,现在可以用add_header定义:

add_header Content-Type "text/html";

手机的就是:

add_header Content-Type "application/xhtml+xml";

3、缓存

如果前端不是nginx,而是squid缓存,页面或是跳转都有可能被缓存住,造成访问问题,这时需要利用Vary这个header。查看网页的response header一般都有Vary头(服务器支持压缩的都有),意思是说squid要把客户端传来的某个头区别对待,譬如Vary:Accept-Encoding,客户端发来Accept-Encoding:gzip(MSIE), deflate时squid会为gzip, deflate做一个存档;如果客户端没发来Accept-Encoding这个头(wget),squid又会为无Accept-Encoding做另一个存档;这两个存档的内容是不一样的,gzip, deflate的是压缩后的内容,一堆乱码,无Accept-Encoding的则是网页源码。

知道了Vary的原理,剩下的事就容易了,在网页输出时加上Vary:User-Agent,意味着squid要为每一种User-Agent存一个存档,nginx里这样配置即可:

add_header Vary User-Agent;

这时网页的response header会有两行Vary:

Vary:Accept-Encoding;
Vary:User-Agent;

这倒无伤大雅,能正常工作。

因为目前User-Agent被各种改装的浏览器改来改去,所以版本特多,这会在squid上造成很多的存档,穿透也会相应增加,所以要仔细监控。

4、内核配置

在nginx特别是做代理的机器上,通常系统管理员都会把这两个内核参数设为1:

/proc/sys/net/ipv4/tcp_tw_recycle(net.ipv4.tcp_tw_recycle)= 1
/proc/sys/net/ipv4/tcp_tw_reuse(net.ipv4.tcp_tw_reuse)= 1

但这个配置会导致手机用CMWAP访问时出问题,因此要将这两个参数设为0。

nginx的browser模块

作者:Lightning@小宝 发布时间:January 23, 2010 分类:web服务器方向

使用这个模块,可对各种浏览器的请求进行区别对待。通常区别浏览器在nginx里可用if标签和正则表达式实现,与正则表达式相比,这个模块主要是可以提供更好的性能,而且可以使配置文件更清晰,但功能方面较弱。

这个模块提供的标签和语法不很多,主要是两个标签:modern_browser和ancient_browser,这两个标签从字面理解为“新浏览器”和“旧浏览器”,于是乎,browser模块利用客户端发来的User-Agent头,将请求划分为“新浏览器请求”和“旧浏览器请求”。那么这里就有一个疑问,这个模块只能划分出两类请求吗?答案是yes。也就是说,假如要为ie6、ie7、ie8分别对应三个首页,这个模块还做不了,这时只能用正则表达式来分;为ie6和ie7对应两个首页,是可以支持得了。

modern_browser

modern_browser指定新浏览器类型,但是modern_browser这个标签的浏览器参数是预定好的,不能随便乱写,浏览器参数只有msie, gecko (Mozilla-based browsers) opera, safari, konqueror几种,另外还可以写的浏览器参数是unlisted,表示所有的浏览器。modern_browser还有一个参数是浏览器版本,比如msie 6.0。

配置例子:

modern_browser msie 5.5;
modern_browser gecko 1.0.0;
modern_browser opera 9.0;
modern_browser safari 413;
modern_browser konqueror 3.0;

ancient_browser

ancient_browser指定旧浏览器类型,与modern_browser不同,ancient_browser可以自定义参数,其参数指的是在User_Agent这个头里包含的字符串。ancient_browser的参数大小写是区分的。

配置例子:

ancient_browser "BlackBerry";
ancient_browser "UCWEB";
ancient_browser "UCWEB" "BlackBerry";

定义好这两个标签之后,就可以通过$modern_browser或$ancient_browser变量来判断属于新浏览器还是旧浏览器。

if ( $modern_browser )
{
...
}

if ( $ancient_browser )
{
...
}

注意:如果User-Agent为空值时,将会被归为新浏览器。

browser模块还有两个标签modern_browser_value和ancient_browser_value,这两个标签可以指定符合条件时$modern_browser和$ancient_browser的值是什么,上面的例子中,$modern_browser和$ancient_browser都是true或false。

modern_browser_value "modern.";
modern_browser msie 5.5;
index index.${modern_browser}html index.html;

撰写index.modern.html和index.html两个页面,就可以让msie 5.5的浏览器读取到index.modern.html,其它的读取到index.html。

由于这个模块的功能弱,用这个模块处理事情还是比较麻烦的。

以下这个配置用于对手机浏览器的判断:

modern_browser unlisted;

ancient_browser "GoBrowser";
ancient_browser "MIDP";
ancient_browser "WAP";
ancient_browser "UP.Browser";
ancient_browser "Smartphone";
ancient_browser "Obigo";
ancient_browser "Mobile";
ancient_browser "AU.Browser";
ancient_browser "wxd.Mms";
ancient_browser "WxdB.Browser";
ancient_browser "CLDC";
ancient_browser "UP.Link";
ancient_browser "KM.Browser";
ancient_browser "UCWEB";
ancient_browser "SEMC-Browser";
ancient_browser "Mini";
ancient_browser "Symbian";
ancient_browser "Palm";
ancient_browser "Nokia";
ancient_browser "Panasonic";
ancient_browser "MOT-";
ancient_browser "SonyEricsson";
ancient_browser "NEC-";
ancient_browser "Alcatel";
ancient_browser "Ericsson";
ancient_browser "BENQ";
ancient_browser "BenQ";
ancient_browser "Amoisonic";
ancient_browser "Amoi";
ancient_browser "Capitel";
ancient_browser "PHILIPS";
ancient_browser "SAMSUNG";
ancient_browser "Lenovo";
ancient_browser "Mitsu";
ancient_browser "Motorola";
ancient_browser "SHARP";
ancient_browser "WAPPER";
ancient_browser "LG-";
ancient_browser "LG/";
ancient_browser "EG900";
ancient_browser "CECT";
ancient_browser "Compal";
ancient_browser "kejian";
ancient_browser "Bird";
ancient_browser "BIRD";
ancient_browser "G900/V1.0";
ancient_browser "Arima";
ancient_browser "CTL";
ancient_browser "TDG";
ancient_browser "Daxian";
ancient_browser "DBTEL";
ancient_browser "Eastcom";
ancient_browser "EASTCOM";
ancient_browser "PANTECH";
ancient_browser "Dopod";
ancient_browser "Haier";
ancient_browser "HAIER";
ancient_browser "KONKA";
ancient_browser "KEJIAN";
ancient_browser "LENOVO";
ancient_browser "Soutec";
ancient_browser "SOUTEC";
ancient_browser "SAGEM";
ancient_browser "SEC";
ancient_browser "SED-";
ancient_browser "EMOL";
ancient_browser "INNO55";
ancient_browser "ZTE";
ancient_browser "iPhone";
ancient_browser "Android";
ancient_browser "Windows CE";
ancient_browser "DX";
ancient_browser "TELSON";
ancient_browser "TCL";
ancient_browser "oppo";
ancient_browser "ChangHong";
ancient_browser "MALATA";
ancient_browser "KTOUCH";
ancient_browser "TIANYU";
ancient_browser "TOUCH";
ancient_browser "MAUI";
ancient_browser "J2ME";
ancient_browser "BlackBerry";
ancient_browser "yulong";
ancient_browser "coolpad";

if ( $ancient_browser )
{
proxy_pass http://m.sudone.com;
}

在这个配置中,将手机浏览器配置在ancient_browser中,电脑浏览器为modern_browser。
转自:sudone.com

2009年回顾与总结

作者:Lightning@小宝 发布时间:January 10, 2010 分类:生活 & 职场

刚好今天有点时间坐下来回顾了过去的一年都干了哪些事情,哪些计划没有被实现。
回顾:在09年的前11个月里,我在一家网页游戏公司做一些运营维护与新产品开发重复的编码工作,数据统计,前沿技术研究,webgame架构分析。在10月份被借调到公司的游戏研发工作室(xxx工作室)。虽然只在这个工作室工作了一月有余,还是有很多收获,无论是在知识的深度上还是广度上。工作室的两位领导对我也很器重,直到最后离开了还真有点不舍。在新公司的一个月里很忙碌很充实,对自己负责的几个模块的业务也逐步熟悉了。

总结:在09年的一年里,我的知识面得到了一定的开阔,基础知识也越来越扎实了,了解了网页游戏运营模式,
对各类网页游戏的架构也都有了清楚的认识。有点遗憾是没有用python实际开发一个完整的项目。

未来一年内的目标:
1. 写一个flash版轻量级的音乐播放器。1-2个月
2. 研究javascript & KingJsFramework。3-5个月
3. 优化公司的开发框架。12个月
4. 学习下C语言。12个月
5. 复习java&python[不写东西很容易忘掉]。6个月

开发新产品所需要的十类文档

作者:Lightning@小宝 发布时间:January 3, 2010 分类:互联网系统架构

开发新产品所需要的十类文档
1、产品概念文档(项目策划书)
主要是对市场需求进行合理的科学的推导,得出新产品机遇,并对产品定位以及未来的发展方向进行概念性阐述。产品概念文档主要用来对新产品进行宣讲,让项目团队对将要开发的产品有一个概念上的理解,在思想上达成一致。
2、用户调研报告
主要有两类,一类是产品概念形成之初,研究人员进行的需求调研而输出的报告。主要是为产品概念的提出提供科学的依据,为需求的推导寻找佐证。另外一类是项目开发过程中,对设计中不确定以及有分歧的地方进行用户测试,得出结果并输出用户测试报告。
3、产品需求列表
这个列表并不一定是文档,但是他非常重要。它是将新产品拆分成几个大的模块,并将这几个大模块再细拆分成各个功能点后形成的功能列表。它的用途是将整个产品的工作量化,利于设计师、开发人员、测试人员评估自己的工作量,利于开发过程中对各个功能点进行跟踪,不遗漏,利于产品测试时对产品进行全面覆盖。
4、产品说明书
产品说明书是目前很多公司中最常见,他主要包括产品功能的详细描述,产品所需要的开发、运行环境,性能要求等等。准确的讲,这份文档并不应该包含具体的交互内容。这个文档面向的是项目的全体成员。
5、交互设计说明书
交互设计说明书对整个产品的界面结构、交互流程进行详细的描述。它一般包括需求分解、竞争产品分析、流程说明、页面布局说明等内容。交互设计说明书的格式众多,灵活性也相当高,但目的都是将产品的结构和及流程形象化。交互设计说明书主要面向开发人员和测试人员。
很多公司将交互设计说明书和产品说明书结合在一起进行撰写,其实这种做法并不是十分合理。通常情况下,产品和设计结合的文档结构非常庞大,非常不利于查阅,也不利于撰写,而且这种结合文档的很多内容对特定人员是无用的。
6、交互设计规范
交互设计规范主要是用来规范新产品中常规的功能、操作等内容,比如页面的标题规范、界面快捷键操作的规范、提示反馈信息的规范等等。
7、视觉设计规范
视觉设计规范主要是规范新产品中一些视觉元件的样式、页面边距相对边距、通用界面的页面框架等等,开发人员根据规范就可以自行开发一些通用界面。
8、开发文档
开发文档包括一些需求分析、系统架构分析、数据库分析、开发日志等等内容。开发文档主要用来作为开发团队的技术沉淀。
9、测试用例
测试用例指对新产品进行测试任务的描述,体现测试方案、方法、技术和策略。内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,并形成文档。
10、产品评估报告
产品开发完成后,应由测试人员撰写一份评估报告,对产品功能的实现情况、性能情况、bug解决率等问题进行综合说明和评估,来确定新产品是否符合发布标准。
上面的这十类文档是非常理想化的项目中才具备的,也并不是适用于所有的项目开发,但是,产品说明书、交互设计说明书、测试用例等几类文档是一个项目中不可能缺少的,他们是一个项目有效运行的核心文档。
来源:http://www.paidai.com/displaythread.php?boardid=18&topicid=19341

回家的偶遇-有图有真相

作者:Lightning@小宝 发布时间:January 3, 2010 分类:生活 & 职场

大马路上突然塌陷了,偶没带相机,还好有一老乡带了!真像2012现场提前版



这人真胆大! 不怕也掉下去哦

司机没事,真是太好了,不知道这公路会不会让这位司机给陪

  1. 页码:
  2. 1
我要报警