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

轻量级的web服务器

作者:Lightning@小宝 发布时间:October 30, 2009 分类:web服务器方向

虽然轻量级 Web 服务器有很多共同之处,但是各有各的不同。大多数轻量级 Web 服务器是用 C 编写的,但是实践证明,有些其他实现语言也可以成功地用于实现服务器,对此我已经做了实验,这些语言包括 Erlang、Java、Lisp、Lua、Perl、Python 和 Tcl。如果其中有您喜欢的语言,那么也许可以找到适合您的 Web 服务器。

由于很多特定的原因,您可能会将目光投向某种 “不常见” 的语言:

  • 教学:使用轻量级 Web 服务器来制定一个重要、但是并不太大的目标。这是获得使用某种语言的经验的好方法。
  • 虽然用 C 编写的轻量级 Web 服务器大小为 10-50 KB,更高级的语言有 100 KB 到数 MB 的运行时,但整个 Web 服务器的源文件可能只占几千个字节。这种 Web 服务器占用的空间很小,因此比 Apache 更易于与技术伙伴共享。
  • 更高级的语言可以使实验更吸引人 —— 例如,添加一个新的 HTTP/1.1 特性可能只需几行源代码。这些轻量级服务器是非常方便的实验材料。
  • 将 HTTP 服务器添加到已有的、用高级语言编写的应用程序中只需增加几行源代码。

Athana 可以作为这些主题的例子。它是用 Python 编写的 Web 服务器。它支持 HTTP 多部分(上传)、会话、 cookie 等。从 0.2.1 版开始,Athana 一直被编写在一个单独的、精心组织的源文件中。

如前所述,不同的轻量级 Web 服务器有着不同的优点,它们或多或少独立于编程语言。所有轻量级 Web 服务器都比 Apache 更小、更易于配置。与 Apache 相比,有些轻量级 Web 服务器更快,有些则快得多。有些则强调安全性、重负载下的从容性、可扩展性或者内存占有量。在任何情况下,都可以以一种不适用于 Apache 的方式彻底地理解这些服务器。

哪些特定的产品使这些可能性成为现实?即使只留意 “轻量级” 服务器,面对的也是一个很大的难于管理的产品集合。不过可以将它们按子类来划分:超轻型、关注安全型、支持特定语言型等等。

我特别喜欢其中的超轻型 Web 服务器,它们比 Apache 小得多。如此小的应用程序可以直接记住,系统地、严密地加以考虑,以证明 它们的安全性或可伸缩性。小型 Web 服务器包括:

  • Cheetah Server,用不到一千行的 C 代码编写而成。
  • DustMote,一个非常 小的 Web 服务器,用一个大约 3000 字节的 Tcl 源文件实现。
  • fnord,大小取决于平台和配置,不超过 20K。虽然很小,但是它支持虚拟主机、CGI 和 keep-alive。
  • ihttpd,使用不到 800 行的 C 代码,包括 CGI,并通过 inetd 提供页面。
  • im-httpd,非常小的服务器 —— 只有大约 7 KB,链接到 glibc。而且它也非常快。
  • mattows,支持 CGI,只有 600 行 C 代码。
  • Scrinchy,虽然很小,不到 30KB,但是支持多种脚本编制语言,包括一种特殊用途的、基于栈的 Sy 脚本语言。
  • ZWS 演示了一个即使是使用 500 多行带足够注释的 zsh (!) 编写的应用程序 —— 在这里是一个 HTTP 0.9+ 服务器 —— 也可以有多强大。

体积小并不妨碍这些服务器被正式使用。例如,fnord 可以处理数千个同时进行的连接。

也许轻量级作为一个类别最令人印象深刻的成就是高性能服务器:

  • cghttpd 是一个小型 Web 服务器,它被理解为使用 2.6 系列内核中可用的异步功能的一个试验品。
  • darkhttpd 是一个快速的、单线程的 HTTP/1.1 服务器。
  • Gatling 是为高性能设计的。它的特性包括 FTP、IPv6、虚拟主机、CGI 等。
  • Kernux 是一个 Linux 内核模块,它实现了一个 HTTP 守护进程。
  • lighttpd 是使用率排名第五的 Web 服务器(排名还在上升)。它为很多同时进行的连接进行了优化:“典型的场景是使用 lighttpd 作为一个下载(off-load)服务器,以提供静态内容……”
  • Nginx 当前最流行的轻量级服务器。
  • LiteSpeed Web Server 是一款轻量级商业 Web 服务器,强调性能和安全性。 LiteSpeed Technologies 公司宣传为静态内容提速了 6 倍,在解释页面方面也有一定的提高。
  • Miniature JWS,也称 tjws,它是基于 Java 的 Web 服务器,可以处理 servlet、JSP 和数千个并发连接,而大小只有 77 KB。它的作者声称它 “比 Apache 2.x 快 10%”。
  • Yaws 是用 Erlang 编写的一款高性能 HTTP/1.1 服务器。

有些 Web 服务器被实现为类或库,以便嵌入 到较大的应用程序中。 在这些 Web 服务器当中,我发现特别有趣的有:

  • EHS —— “嵌入式 HTTP 服务器”,被设计为一个 C++ 类,用于嵌入到较大的 C++ 应用程序;还有
  • Embedded TCL Web Server,它是一个很普通的 Web 服务器,支持 SSL 和 Basic Authentication,速度非常快 —— 其作者使它至少与 lighthttpd 和 AOLserver 一样快。它是用不到 100 行 Tcl 编写的。

Python 是几种适合不寻常环境的 Web 服务器的实现语言,这些 Web 服务器包括:

  • cdServer 是一个小型的、用 Python 编写的 HTTP 服务器,它 “被设计用来提供来自 CD-ROM 的(静态)内容” 。它在提供动态内容方面能力有限。我们有几个涉及不受影响的 “live CDs” 的项目,在这些项目中像 cdServer 之类的工具很关键。
  • edna,一款智能的用 Python 编写的 MP3 服务器,它是用 HTTP 实现的。

还有其他一些用 Perl 和其他不出名的语言编写的轻量级 Web 服务器:

  • Camlserv,用 ocaml 编写的一个完整的 Web 服务器,目标是 “高度交互式的 Web 页面”。它由几千行 ocaml 编写而成,其中大部分代码都与 MySQL 和 HTML 的特殊处理有关。
  • dhttpd 用和 Apache 相同的格式记录访问。它支持 CGI,并具有内建的 Perl 解释器、虚拟主机、IPv6、带宽管理和安全性等方面的特性。
  • DNHTTPD 是用 Perl 编写的,用于 UNIX®。它支持虚拟主机、SSL 连接、CGI 等。
  • Jellybean 是用 Perl 编写的基于 HTTP 的 Perl Object Server。
  • lns.http 是一个 Common LISP HTTP/1.1 Web 框架。
  • Mongrel 是用 Ruby 编写的、用于 HTTP 的一个库和服务器。
  • Nanoweb 是用 PHP 编写的一款快速、健壮的 Web 服务器。它宣称具有丰富的特性,包括完全遵从 HTTP/1.1、访问控制、身份验证、虚拟主机、SSL 兼容性等。
  • Naridesh 是用 Perl 编写的 Web 服务器。
  • OpenAngel 是用 Perl 编写的。它强调的重点是安全性。
  • Xavante 是用 Lua 编写的 HTTP/1.1 Web 服务器。
  • XSP 是用 C# 编写的,用于运行 ASP.NET。

有时候您可能需要其他一些用 C 编写的、具有不常见的次要优势的轻量级 Web 服务器:

  • ABYSS 可以在 UNIX 和 Win32 之间移植,其 “目的是成为完全遵从 HTTP/1.1 的 Web 服务器”。它占用的内存很少。
  • Anti-Web HTTPD(也称 “Anti-Web”、“awhttpd” 和 “AW”)是一款单进程、无线程、支持 CGI 的服务器,它强调安全性和简单性。
  • MHTTPD 支持从外部文件或 LDAP 服务器进行的 MHTTPD Basic Authentication。
  • mini-httpd 可以在一个系统线程中处理多个并发请求,但是在主机上占用的内存或 CPU 很少。
  • Naken Web 类似于很多其他的轻量级服务器 —— 它支持 Basic Authentication、静态内容等 —— 但是它的作者将它设计为用于 Webcam 操作,并且在 Gumstix、WRT54GL、OpenWrt 和其他新的平台上运行。
  • Null httpd 是一款多线程的、简单的、可移植的 Web 服务器。
  • Seminole 是一款商业 Web 服务器,内存需求较小,功能较多。
  • thttpd throttle,支持  Basic Authentication 等。

Varnish反向代理安装与配置

作者:Lightning@小宝 发布时间:October 20, 2009 分类:web服务器方向

下载:wget http://nchc.dl.sourceforge.net/sourceforge/varnish/varnish-1.1.1.tar.gz
安装:

tar zxvf varnish-1.1.2.tar.gz
cd varnish-1.1.2
./configure --prefix=/usr/local/varnish
make && make install

------------------------

/usr/sbin/groupadd www -g 48 //创建用户组
/usr/sbin/useradd -u 48 -g www www //创建用户并制定所在用户组
mkdir -p /var/vcache        //设置缓存目录
chmod +w /var/vcache 
chown -R www:www /var/vcache

mkdir -p /usr/local/varnish/logs      //设置log目录
chmod +w /usr/local/varnish/logs
chown -R www:www /usr/local/varnish/logs/varnish.log

------------------------

ulimit -SHn 51200
开启Varnish
/usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/vcache/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on

启动varnishncsa用来将Varnish访问日志写入日志文件
/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /usr/local/varnish/logs/varnish.log &

查看帮助
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 help

查看Varnish服务器连接数与命中率
/usr/local/varnish/bin/varnishstat

Nginx做负载均衡器时Session共享解决方案

作者:Lightning@小宝 发布时间:October 17, 2009 分类:web服务器方向

1) 不使用session,换作cookie

能把session改成cookie,就能避开session的一些弊端,在从前看的一本J2EE的书上,也指明在集群系统中不能用session,否则惹出祸端来就不好办。如果系统不复杂,就优先考虑能否将session去掉,改动起来非常麻烦的话,再用下面的办法。

2) 应用服务器自行实现共享

已知的,php可以用数据库或memcached来保存session,从而在php本身建立了一个session集群,用这样的方式可以令session保证稳定,即使某个节点有故障,session也不会丢失,适用于较为严格但请求量不高的场合。但是它的效率是不会很高的,不适用于对效率要求高的场合。

以上两个办法都跟nginx没什么关系,下面来说说用nginx该如何处理:

3) ip_hash

nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的:

upstream backend {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
ip_hash;
}

ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,因此ip_hash是有缺陷的,不能在一些情况下使用:

1/ nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。

2/ nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器。最好的办法是用location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。

4) upstream_hash

为了解决ip_hash的一些问题,可以使用upstream_hash这个第三方模块,这个模块多数情况下是用作url_hash的,但是并不妨碍将它用来做session共享:

假如前端是squid,他会将ip加入x_forwarded_for这个http_header里,用upstream_hash可以用这个头做因子,将请求定向到指定的后端:

可见这篇文档:

http://www.sudone.com/nginx/nginx_url_hash.html

在文档中是使用$request_uri做因子,稍微改一下:

hash   $http_x_forwarded_for;

这样就改成了利用x_forwarded_for这个头作因子,在nginx新版本中可支持读取cookie值,所以也可以改成:

hash   $cookie_jsessionid;

假如在php中配置的session为无cookie方式,配合nginx自己的一个userid_module模块就可以用nginx自发一个cookie,可参见userid模块的英文文档:

http://wiki.nginx.org/NginxHttpUserIdModule
转自:sudone
  1. 页码:
  2. 1
  3. 2
  4. 3
  5. 4
我要报警