月度归档:2012年12月

TCP状态转换图以及tcp状态

来源:互联网

wps_clip_image-8997[4][1]

TCP状态:

LISTEN:侦听来自远方的TCP端口的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有任何连接状态

java cookie 详解

来源:互联网

一.什么是cookies?

大家都知道,浏览器与WEB服务器之间是使用HTTP协议进行通信的,当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的连接。因此当一个请求发送到WEB服务器时,无论其是否是第一次来访,服务器都会把它当作第一次来对待,这样的不好之处可想而知。为了弥补这个缺陷,Netscape开发出了cookie这个有效的工具来保存某个用户的识别信息,因此人们昵称为“小甜饼”。cookies是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段:Netscape Navigator使用一个名为cookies.txt本地文件保存从所有站点接收的Cookie信息;而IE浏览器把Cookie信息保存在类似于C://windows//cookies的目录下。当用户再次访问某个站点时,服务端将要求浏览器查找并返回先前发送的Cookie信息,来识别这个用户。
cookies给网站和用户带来的好处非常多:
1、Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径
2、Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告
3、Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点
4、Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务
在JSP中,我们也可以使用Cookie,来编写一些功能强大的应用程序。
下面,我想介绍一下如何用JSP创建和处理Cookie。

二.如何创建Cookie

import="javax.servlet.http.Cookie"
说了这么多,大家一定很想知道JSP是如何创建cookie了。JSP是使用如下的语法格式来创建cookie的:
Cookie cookie_name =new Cookie("Parameter","Value");
例如:
Cookie username_Cookie =new Cookie("username","waynezheng");
response.addCookie(username_Cookie);
解释:JSP是调用Cookie对象相应的构造函数Cookie(name,value)用合适的名字和值来创建Cookie,然后Cookie可以通过HttpServletResponse的addCookie方法加入到Set-Cookie应答头,
本例中Cookie对象有两个字符串参数:username,waynezheng。注意,名字和值都不能包含空白字符以及下列字符:@ : ;? , " / [ ] ( ) =
处理Cookie的属性

看到这里,有的朋友又要问了:我光知道如何创建Cookie有什么用呀?是呀,光知道如何创建Cookie而不知道怎么使用是不够的。
在JSP中,程序是通过cookie.setXXX设置各种属性,用cookie.getXXX读出cookie的属性,现在把Cookie的主要属性,及其方法列于下,供大家参考:

类型
方法名
方法解释

String getComment()返回cookie中注释,如果没有注释的话将返回空值.

String getDomain() 返回cookie中Cookie适用的域名. 使用getDomain() 方法可以指示浏览器把Cookie返回给同 一域内的其他服务器,而通常Cookie只返回给与发送它的服务器名字完全相同的服务器。注意域名必须以点开始(例如.yesky.com)

int getMaxAge() 返回Cookie过期之前的最大时间,以秒计算。

String getName()返回Cookie的名字。名字和值是我们始终关心的两个部分,笔者会在后面详细介绍 getName/setName。

String getPath()返回Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下 的所有页面。

boolean getSecure() 如果浏览器通过安全协议发送cookies将返回true值,如果浏览器使用标准协议则返回false值。

String getValue() 返回Cookie的值。笔者也将在后面详细介绍getValue/setValue。

int getVersion() 返回Cookie所遵从的协议版本。

void setComment(String purpose) 设置cookie中注释。

void setDomain(String pattern) 设置cookie中Cookie适用的域名

void setMaxAge(int expiry) 以秒计算,设置Cookie过期时间。

void setPath(String uri) 指定Cookie适用的路径。

void setSecure(boolean flag) 指出浏览器使用的安全协议,例如HTTPS或SSL。

void setValue(String newValue) cookie创建后设置一个新的值。

void setVersion(int v) 设置Cookie所遵从的协议版本。

读取客户端的Cookie
在Cookie发送到客户端前,先要创建一个Cookie,然后用addCookie方法发送一个HTTP Header。JSP将调用request.getCookies()从客户端读入Cookie,getCookies()方法返回一个HTTP请求头中的内容对应的Cookie对象数组。你只需要用循环访问该数组的各个元素,调用getName方法检查各个Cookie的名字,直至找到目标Cookie,然后对该Cookie调用getValue方法取得与指定名字关联的值。
例如
<%
//从提交的HTML表单中获取,用户名
String userName=request.getParameter("username");
//以"username", userName 值/对 创建一个Cookie
Cookie theUsername=new Cookie("username",userName);
response.addCookie(theUsername);
%>
..............
<%
Cookie myCookie[]=request.getCookies();//创建一个Cookie对象数组
for(int n=0;n=cookie.length-1;i++);//设立一个循环,来访问Cookie对象数组的每一个元素
Cookie newCookie= myCookie[n];
if(newCookie.getName().equals("username")); //判断元素的值是否为username中的值
{%>
你好,<%=newCookie.getValue()%>!//如果找到后,向他问好
<%}
%>
设置Cookie的存在时间,及删除Cookie
在JSP中,使用setMaxAge(int expiry)方法来设置Cookie的存在时间,参数expiry应是一个整数。正值表示cookie将在这么多秒以后失效。注意这个值是cookie将要存在的最大时间,而不是cookie现在的存在时间。负值表示当浏览器关闭时,Cookie将会被删除。零值则是要删除该Cookie。如:
<%
Cookie deleteNewCookie=new Cookie("newcookie",null);
deleteNewCookie.setMaxAge(0); //删除该Cookie
deleteNewCookie.setPath("/");
response.addCookie(deleteNewCookie);
%> 
一、 前言
说起来,Cookie应该是一种应用较久的技术了。早在HTML刚刚出现的时候,在每个独立的页面之间没有办法记录和标识不同的用户。后来人们就发明了Cookie技术,当用户访问网页时,它能够在访问者的机器上创立一个文件,我们把它叫作Cookie,写一段内容进去,来标识不同的用户。如果下次用户再访问这个网页的时候,它又能够读出这个文件里面的内容,这样网页就知道上次这个用户已经访问过该网页了。
虽然现在网页的制作技术比起几年以前已经发展了许多。不过有些时候,Cookie还是能够帮我们很多忙的。接下来,我们就来看看,如何在写JSP文件的时候,用JSP操作Cookie。
=======================================
二、 保存写入Cookie
其实用JSP操作Cookie是非常简单的,我们来看下面一段JSP程序:
........(中间略)
//保存写入Cookie
<%
String cookieName="Sender";
Cookie cookie=new Cookie(cookieName, "Test_Content");
cookie.setMaxAge(10);   //存活期为10秒
response.addCookie(cookie);
%>
........(其他内容)
这样我们就设置了一个Cookie,很简单吧?
我们来仔细研究一下这段代码:
Cookie cookie=new Cookie(cookieName, "Test_Content");
这一行建立了一个Cookie对象,初始化有两个参数,第一个参数cookieName定义了Cookie的名字,后一个参数,也是一个字符串,定义了Cookie的内容。也就是我们希望网页在用户的机器上标识的文件内容。
接下来一行:cookie.setMaxAge(10),调用了Cookie中的setMaxAge方法,设定Cookie在用户机器硬盘上的存活期为10秒。一个Cookie在用户的硬盘里面存在的时间并不是无限期的,在建立Cookie对象的时候,我们必须制定Cookie的存活期,超过了这个存活期后,Cookie文件就不再起作用,会被用户的浏览器自行删除。如果我们希望用户在下次访问这个页面的时候,Cookie文件仍然有效而且可以被网页读出来的话,我们可以将Cookie的存活期设得稍微长一些。比如cookie.setMaxAge(365*24*60*60)可以让Cookie文件在一年内有效。
三、 读取出Cookie
Cookie文件创建好后,自然还需要我们把它读出来,否则我们不是白费力气吗?接下来我们看看如何读出在用户硬盘上的Cookie。
........(中间略)
Name value
<%
Cookie cookies[]=request.getCookies(); //读出用户硬盘上的Cookie,并将所有的Cookie放到一个cookie对象数组里面
Cookie sCookie=null;
String svalue=null;
String sname=null;
for(int i=0;i<cookies.length-1;i++{    //用一个循环语句遍历刚才建立的Cookie对象数组
sCookie=cookies;   //取出数组中的一个Cookie对象
sname=sCookie.getName(); //取得这个Cookie的名字
svalue=sCookie.getValue(); //取得这个Cookie的内容
%>
<%
}
%>
name value
<%=name%> <%=svalue%>
........(其他内容)
这一小段JSP文件可以读出用户硬盘上的所有有效的Cookie,也就是仍然在存活期内的Cookie文件。并用表格的形式列出每个Cookie的名字和内容。
我们来逐行分析一下这段代码:
Cookie cookies[]=request.getCookies() 我们用request.getCookies()读出用户硬盘上的Cookie,并将所有的Cookie放到一个cookie对象数组里面。
接下来我们用一个循环语句遍历刚才建立的Cookie对象数组,我们用sCookie=cookies取出数组中的一个Cookie对象,然后我们用sCookie.getValue()和sCookie.getName()两个方法来取得这个Cookie的名字和内容。
通过将取出来的Cookie的名字和内容放在字符串变量中,我们就能对其进行各种操作了。在上面的例子里,可通过循环语句的遍历,将所有Cookie放在一张表格中进行显示。
=======================================
四、 需要注意的一些问题
通过上面两个简单的例子,可以看到,用JSP进行Cookie的操作,是非常简单的。不过我们在实际操作中还要注意一些问题:
1. Cookie的兼容性问题
Cookie的格式有2个不同的版本,第一个版本,我们称为Cookie Version 0,是最初由Netscape公司制定的,也被几乎所有的浏览器支持。而较新的版本,Cookie Version 1,则是根据RFC 2109文档制定的。为了确保兼容性,JAVA规定,前面所提到的涉及Cookie的操作都是针对旧版本的Cookie进行的。而新版本的Cookie目前还不被Javax.servlet.http.Cookie包所支持。
2. Cookie的内容
同样的Cookie的内容的字符限制针对不同的Cookie版本也有不同。在Cookie Version 0中,某些特殊的字符,例如:空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号都不能作为Cookie的内容。这也就是为什么我们在例子中设定Cookie的内容为"Test_Content"的原因。
虽然在Cookie Version 1规定中放宽了限制,可以使用这些字符,但是考虑到新版本的Cookie规范目前仍然没有为所有的浏览器所支持,因而为保险起见,我们应该在Cookie的内容中尽量避免使用这些字符。(

实现跨域名Cookie

来源:互联网

Cookie真是一个伟大的发明,它允许web开发者保留他们的用户的登录状态。然而,当你的站点或网络 
有一个以上的域名时就会出现问题了。 
在Cookie规范上说,一个cookie只能用于一个域名,不能够发给其它的域名。因此,如果在浏览器中对 
一个域名设置了一个cookie,这个cookie对于其它的域名将无效。如果你想让你的用户从你的站点中的其中 
一个进行登录,同时也可以在其它域名上进行登录,这可真是一个大难题。 
我的解决方案将使用下面的一般框架: 
一个预置的脚本将用来接受通过GET或COOKIE方式传递过来的sessionid号。它将比COOKIE优先选择GET 
变量。所以,无论何时需要引用交叉的域名时,我们把sessionid做为一个URL参数进行发送。 
修改Apache配置,用来实现重写所有的交叉域名的cookie。这样做的原因一会儿就会清楚了。 
在任何时候出现一个交叉域名引用时使用变量。 
第一步:创建预置脚本 
将下面的代码加到预置脚本中(或出现在所有脚本之前的函数中)。 
<?php 
/* 支持交叉域名cookie... */ 
// 如果GET变量已经设置了,并且它与cookie变量不同 
//则使用get变量(更新cookie) 
global $HTTP_COOKIE_VARS, $HTTP_GET_VARS; 
if (isset($sessionid) && isset($HTTP_GET_VARS[\'sessionid\']) && ($HTTP_COOKIE_VARS[\'sessionid\'] != $HTTP_GET_VARS[\'sessionid\'])) { 
SetCookie(\'sessionid\', $HTTP_GET_VARS[\'sessionid\'], 0, \'/\', \'\'); 
$HTTP_COOKIE_VARS[\'sessionid\'] = $HTTP_GET_VARS[\'sessionid\']; 
$sessionid = $HTTP_GET_VARS[\'sessionid\']; 

?> 
一旦这个代码运行之后,一个全局的\'sessionid\'变量将可以用于脚本。它将保存着用户的cookie中的 
sessionid值,或者是通过GET请求发来的sessionid值。 
第二步:为所有的交叉域名引用使用变量 
创建一个全局的配置文件,用于存放可以进行切换的域名的基本引用形式。例如,如果我们拥有 
domain1.com和domain2.com,则如下设置: 
<?php 
$domains[\'domain1\'] = "http://www.domain1.com/-$sessionid-"; 
$domains[\'domain2\'] = "http://www.domain2.com/-$sessionid-"; 
?> 
现在,如果在代码中如下做: 
<?php 
echo "Click <a href=\"", $domains[\'domain2\'], "/contact/?email=yes\">here</a> to contact us."; 
?> 
你将产生如下的输出: 
Click <a href="http://www.domain2.com/-66543afe6543asdf6asd-/contact/?email=yes\">here</a> 
to contact us. 
在这里sessionid已经被插入到URL中去了。 
在这个地方,你可能会想"这样可能会在web服务器上打开名为横线,sessionid,横线的子目录?!?!?"。 
然而,下面的步骤将提供一个必需的戏法,以便让它能够使用! 
第三步:配置Apache 
现在,剩下的步骤就是配置apache来重写这个URL: 
http://www.domain2.com/-66543afe6543asdf6asd-/contact/ 
变成这样: 
http://www.domain2.com/contact/?sessionid=66543afe6543asdf6asd 
并且这种url: 
http://www.domain2.com/-66543afe6543asdf6asd-/contact/?email=yes 
变成这样: 
http://www.domain2.com/contact/?email=yes&sessionid=66543afe6543asdf6asd 
为了实现它,简单地配置两个虚拟服务器,作为domain1和domain2,如下操作: 
<VirtualHost ipaddress> 
DocumentRoot /usr/local/www/domain1 
ServerName www.domain1.com 
RewriteEngine on 
RewriteRule ^/-(.*)-(.*\?.*)$ $2&sessionid=$1 [L,R,QSA] 
RewriteRule ^/-(.*)-(.*)$ $2?sessionid=$1 [L,R,QSA] 
</VirtualHost> 
<VirtualHost ipaddress> 
DocumentRoot /usr/local/www/domain2 
ServerName www.domain2.com 
RewriteEngine on 
RewriteRule ^/-(.*)-(.*\?.*)$ $2&sessionid=$1 [L,R,QSA] 
RewriteRule ^/-(.*)-(.*)$ $2?sessionid=$1 [L,R,QSA] 
</VirtualHost> 
这些重写的规则实现了上面两个URL重写的要求。 
结论 
通过使用变量结合与apache的重写功能,交叉域名cookie可以以一种简单的方式实现。想要维护这样的 
系统,无论什么时候链接交叉域名,在使用域名变量之外,什么也不用作了!在域名内部的链接不需要进行 
修改,因为cookie会工作正常。 
如果你有兴趣看一下在生产网络中实际运作中的系统,请参观http://www.familyhealth.com.au/。在 
一些交叉域名链接上移动你的鼠标,并且看一下当你点击后它们是如何被重写的。 
也许,使用这个技术唯一的问题就是无法删除在用户浏览器中的全部域名下的cookie。

tomcat需要多少内存

原创文章,转载请指明出处并保留原文url地址

Tomcat是我们最长用的java应用服务器之一了,但当tomcat工作时到底给他分配多少内存合适?本文方法也适用普通java的进程。

 

一.Tomcat内存构成 

 

Tomcatjava程序,他在运行时是标准的jvm进程,内存分配情况如下图所示。

 

wps_clip_image-26619[2][1]

 

 

Jvm的堆内存大概分为:年轻代,年老代,持久代 三个主要部分。

 

 

其中年轻代,分为:Eden spaceFrom space To  Space 三个部分。

 

 

关于堆三个内存代不在介绍,读者去参考网络上文章,或者本站转载文章

 

 

. 查找java或者tomcat进程 

 

1. 利用jdk自带jps工具 获取java的进程信息如下:

 

wps_clip_image-15268[2][1]

 

图中, 第一列是java的进程id

 

 

2. 利用ps查找java的进程id

 

wps_clip_image-20171[2][1]

 

如上图,我们可以知道几个java进程,分别是289049562等等

 

三.查看java进程相关信息 

 

利用jdk自带的jinfo命令(这个命令只在linux存在,windows下有其他相关命令,大家自己去搜索吧)查看进程相关信息。

 

wps_clip_image-8031[2][1]

 

 

 

 

 

wps_clip_image-12858[2][1]

 

 

如上面两个图形,将系统中很多信息都已经打印出来了, 特别请关注绿色矩形区域内容。

 

是当前进程设置的java内存设置。

 

四.获取当前java进程内存信息 

 

通过jdk自带的jmap命令获取特定java进程实际内存信息如下:

 

[root@localhost ~]# jmap -heap 28904

 

Attaching to process ID 28904, please wait...

 

Debugger attached successfully.

 

Server compiler detected.

 

JVM version is 10.0-b23

 

 

using thread-local object allocation.

 

Parallel GC with 8 thread(s)

 

 

Heap Configuration:

 

MinHeapFreeRatio = 40

 

MaxHeapFreeRatio = 70

 

MaxHeapSize      = 1073741824 (1024.0MB)

 

NewSize          = 1048576 (1.0MB)

 

MaxNewSize       = 536870912 (512.0MB)

 

OldSize          = 4194304 (4.0MB)

 

NewRatio         = 8

 

SurvivorRatio    = 8

 

PermSize         = 536870912 (512.0MB)

 

MaxPermSize      = 1073741824 (1024.0MB)

 

 

Heap Usage:

 

PS Young Generation

 

Eden Space:

 

capacity = 52428800 (50.0MB)

 

used     = 5448320 (5.1959228515625MB)

 

free     = 46980480 (44.8040771484375MB)

 

10.391845703125% used

 

From Space:

 

capacity = 3670016 (3.5MB)

 

used     = 1237008 (1.1797027587890625MB)

 

free     = 2433008 (2.3202972412109375MB)

 

33.70579310825893% used

 

To Space:

 

capacity = 3538944 (3.375MB)

 

used     = 0 (0.0MB)

 

free     = 3538944 (3.375MB)

 

0.0% used

 

PS Old Generation

 

capacity = 477233152 (455.125MB)

 

used     = 211800592 (201.98878479003906MB)

 

free     = 265432560 (253.13621520996094MB)

 

44.380946946451864% used

 

PS Perm Generation

 

capacity = 536870912 (512.0MB)

 

used     = 21306024 (20.319007873535156MB)

 

free     = 515564888 (491.68099212646484MB)

 

3.968556225299835% used

 

[root@localhost ~]#

 

 

请注意上面蓝色字体部分数据,是实际被测量进程的实际对内存使用情况

 

 

五.调整tomcat内存配置信息 

 

1. 常用内存选项

 

-Xms 启动应用时,JVM堆空间的初始大小值。
-Xmx 应用运行中,JVM堆空间的极限值。

 

-XX:PermSize 应用服务器启动时,永久存储区的初始内存大
-XX:MaxPermSize 应用运行中,永久存储区的极限值

 

-XX:NewSize=n:设置年轻代大小

 

-XX:MaxNewSize=n:设置年轻代最大的大小

 

2. 设置tomcat今天内存尺寸

 

根据上面 是新生代实际大小

 

年老带实际大小

 

是持久代实际大小

 

 

< -XX:MaxNewSize

 

+ <= -Xms <= -Xmx

 

<= -XX:PermSize <= -XX:MaxPermSize

 

 

根据这个我们可以配置我们的相关设置。在第一次配置tomcat的配置时,建议给每个设置都预留比较大的 余量,充分保证系统的正常运行。

 

例如如下的一个配置

 

-Xms128m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

 

 

3. Tomcat内存优化

 

tomcat初始配置正常、系统正常工作后,经过一段工作,特别是有较大压力时,我们可以利用上面工具反复多次获取数据,然后不断修正各项参数。

 

内存设置太多利用不上也没有意义,太少不够使用也不行,但是这个配置是一个过程。需要在实践中多利用工具不断调整,最后长时间优化后就稳定下来了。

Nginx proxy基本指令整理1

原创文章,转载请指明出处并保留原文url地址

本文主要针对nginx的几个主要proxy指令做一个简单的整理,本文具体包括如下指令:

proxy_bindproxy_buffer_sizeproxy_bufferingproxy_buffersproxy_busy_buffers_sizeproxy_connect_timeoutproxy_cookie_domainproxy_cookie_path 

ngx_http_proxy_module模块允许请求传递到另一台服务器。

The ngx_http_proxy_module module allows to pass requests to another server.

Example Configuration

location / {

    proxy_pass       http://localhost:8000;

    proxy_set_header Host      $host;

    proxy_set_header X-Real-IP $remote_addr;

}

注意当使用http proxy模块(甚至FastCGI),所有的连接请求在发送到后端服务器之前nginx将缓存它们,因此,在测量从后端传送的数据时,它的进度显示可能不正确。

1. proxy_bind

syntax:

proxy_bind  address;

default:

context:

http, server, location

This directive appeared in version 0.8.22.

强制使用到一个proxy server的连接使用一个特定的本地ip地址

Nginx官方原文如下:

Forces outgoing connections to a proxied server to originate from the specified local IP address.

2. proxy_buffer_size

syntax:

proxy_buffer_size   size;

default:

proxy_buffer_size 4k | 8k;

context:

http, server, location

设置用来读取从proxy server服务器响应数据第一部分的缓冲区的大小。这部分通常包含一小的响应头(header)。默认情况,这个缓冲尺寸等于通过 proxy_buffers指令指定的buffer大小相同。但是它可以制成更小

Nginx官方原文如下:

Sets size of the buffer used for reading the first part of a response received from the proxied server. This part usually contains a small response header. By default, the buffer size is equal to the size of one buffer set by the proxy_buffers directive. It can be made smaller however.

3. proxy_buffering

syntax:

proxy_buffering   on | off;

default:

proxy_buffering on;

context:

http, server, location

打开或者关闭代理服务器响应的缓冲

当缓冲被打开时, nginx将尽可能快的接收数据从代理服务器中,保存数据到缓冲中(通过proxy_buffer_size或者proxy_buffers指令进行设置的缓冲)。如果整个响应不合适保存到内存中(超过内存缓冲大小等),部分数据将被保存到磁盘临时文件中。临时文件的读写被通过proxy_max_temp_file_size指令和proxy_temp_file_write_size指令的设置进行控制。

当缓冲被关闭,只要nginx一接收到一个响应就同步传递到客户端。Nginx不会尝试读取完整响应从代理的server中。Nginx从被代理的服务器接收到的最大数据量通过proxy_buffer_size指令进行设置。

缓冲也能被打开或者关闭通过在响应头的X-Accel-Buffering字段中设置yes或者no在来关闭或者打开缓冲。这种能力可以使用proxy_ignore_headers指令禁用

Nginx官方原文如下:

Enables or disables buffering of responses from the proxied server.

When buffering is enabled, nginx receives a response from the proxied server as soon as possible, saving it into buffers set by the proxy_buffer_size and proxy_buffers directives. If the whole response does not fit into memory, part of it can be saved to a temporary file on disk. Writes to temporary files are controlled by the proxy_max_temp_file_size and proxy_temp_file_write_size directives.

When buffering is disabled, a response is passed to a client synchronously, immediately as it is received. nginx will not try to read the whole response from the proxied server. The maximum size of the data that nginx can receive from the server at a time is set by the proxy_buffer_size directive.

Buffering can also be enabled or disabled by passing “yes” or “no” in the “X-Accel-Buffering” response header field. This ability can be disabled using the proxy_ignore_headers directive.

4. proxy_buffers 

syntax:

proxy_buffers    numbersize;

default:

proxy_buffers  8  4k | 8k;

context:

http, server, location

给每一个连接到被代理的服务器的连接设置用于读取数据缓冲的数目及大小。默认情况下缓冲尺寸等于内存页的大小。这可能是4K或者8K,这取决于具体的操作系统平台。

Nginx官方原文如下:

Sets the number and size of buffers used for reading a response from the proxied server, for a single connection. By default, the buffer size is equal to one memory page. This is either 4K or 8K, depending on a platform.

5. proxy_busy_buffers_size

syntax:

proxy_busy_buffers_size  size;

default:

proxy_busy_buffers_size 8k|16k;

context:

http, server, location

当被代理server的响应启用了缓冲时,在被代理服务器的响应还没完全读取时,用于工作在给客户端发送响应的buffer尺寸的总体限制值可以通过这个指令进行设置。在大多数情况下,剩余的缓冲能用于读取响应,部分响应可能被读取缓冲到临时文件。默认情况,大小被proxy_buffer_sizeproxy_buffers两个指令限制。

Nginx官方原文如下:

When buffering of responses from the proxied server is enabled, limits the total size of buffers that can be busy sending a response to the client while the response is not yet fully read. In the mean time, the rest of the buffers can be used for reading a response and, if needed, buffering part of a response to a temporary file. By default, size is limited by two buffers set by the proxy_buffer_size and proxy_buffers directives.

6. proxy_connect_timeout

syntax:

proxy_connect_timeout    time;

default:

proxy_connect_timeout  60s;

context:

http, server, location

定义同被代理服务器建立连接超时时间。应当指出,这个超时时间可以通常不超过75秒。

Nginx官方原文如下:

Defines a timeout for establishing a connection with the proxied server. It should be noted that this timeout cannot usually exceed 75 seconds.


这个时间并不是指服务器传回页面的时间(这个时间由proxy_read_timeout声明)。如果你的前端代理服务器是正常运行的,但是遇到一些状况(例如没有足够的线程去处理请求,请求将被放在一个连接池中延迟处理),那么这个声明无助于服务器去建立连接。
可以通过指定时间单位以免引起混乱,支持的时间单位有”s”(), “ms”(毫秒), “y”(), “M”(), “w”(), “d”(), “h”(小时),“m”(分钟)
这个值不能大于597小时。

7. proxy_cookie_domain

syntax:

proxy_cookie_domain  off;
proxy_cookie_domain   domainreplacement;

default:

proxy_cookie_domain off;

context:

http, server, location

该指令出现在1.1.15版本。

将一个被代理的服务器响应头中cookie字段(set-cookie)中doamin属性部分文本用指定文本替换。指令支持被代理服务器返回的带有“domain=localhost"属性的"set-cookie"形式的header头。下面的指令

proxy_cookie_domain localhost example.org;

将重写domain=example.org属性

当英文句点开始(.xxxx)域名及替换字符串,这域名属性被忽略,匹配不区分大小写

域名及替换字符串可以包括变量,例如:

proxy_cookie_domain www.$host $host;

指令也能包括正则表达式,在这个情况下域名应该用"~"符号开始。正则表达式可以包含命名和位置捕获,并更换可以参考:

proxy_cookie_domain ~\.(?P<sl_domain>[-0-9a-z]+\.[a-z]+)$ $sl_domain;


可能有几个proxy_cookie_domain指令同时存在

proxy_cookie_domain localhost example.org;

proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1;


off参数在当前基本的设置中取消所有proxy_cookie_domain的指令
proxy_cookie_domain off;

proxy_cookie_domain localhost example.org;

proxy_cookie_domain www.example.org example.org;

Nginx官方原文如下:

This directive appeared in version 1.1.15.

Sets a text that should be changed in the domain attribute of the “Set-Cookie” header fields of a proxied server response. Suppose a proxied server returned the header field “Set-Cookie” with the attribute “domain=localhost”. The directive

proxy_cookie_domain localhost example.org;

will rewrite this attribute to “domain=example.org”.

A dot at the beginning of the domain and replacement strings, and the domain attribute is ignored. Matching is case-insensitive.

The strings domain and replacement can contain variables:

proxy_cookie_domain www.$host $host;

A directive can also be specified using regular expressions. In this case, domain should start from the “~” symbol. A regular expression can contain named and positional captures, and replacement can reference them:

proxy_cookie_domain ~\.(?P<sl_domain>[-0-9a-z]+\.[a-z]+)$ $sl_domain;

There could be several proxy_cookie_domain directives:

proxy_cookie_domain localhost example.org;

proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1;

The off parameter cancels all proxy_cookie_domain directives on the current level:

proxy_cookie_domain off;

proxy_cookie_domain localhost example.org;

proxy_cookie_domain www.example.org example.org;

8. proxy_cookie_path 

syntax:

proxy_cookie_path off;
proxy_cookie_path pathreplacement;

default:

proxy_cookie_path off;

context:

http, server, location

该指令出现在1.1.15版本。

将一个被代理的服务器响应头中cookie字段(set-cookie)中path属性部分文本用指定文本替换。指令支持被代理服务器返回的带有“path=/two/some/uri/"属性的"set-cookie"形式的header头。下面的指令

proxy_cookie_path /two/ /;

将重写“path=/some/uri/”属性

path及替换字符串可以包括变量,例如:

proxy_cookie_path $uri /some$uri;

指令也能包括正则表达式,在这个情况下域名应该用"~"符号开始。正则表达式可以包含命名和位置捕获,并更换可以参考:

proxy_cookie_path ~*^/user/([^/]+) /u/$1;

    可能有几个proxy_cookie_path指令同时存在

proxy_cookie_path /one/ /;

proxy_cookie_path / /two/;

off参数在当前基本的设置中取消所有proxy_cookie_path的指令
    proxy_cookie_path off;

proxy_cookie_path /two/ /;

proxy_cookie_path ~*^/user/([^/]+) /u/$1;

Nginx官方原文如下:

This directive appeared in version 1.1.15.

Sets a text that should be changed in the path attribute of the “Set-Cookie” header fields of a proxied server response. Suppose a proxied server returned the header field “Set-Cookie” with the attribute “path=/two/some/uri/”. The directive

proxy_cookie_path /two/ /;

will rewrite this attribute to “path=/some/uri/”.

The strings path and replacement can contain variables:

proxy_cookie_path $uri /some$uri;

A directive can also be specified using regular expressions. In this case, path should either start from the “~” symbol for a case-sensitive matching, or from the “~*” symbols for case-insensitive matching. A regular expression can contain named and positional captures, and replacement can reference them:

proxy_cookie_path ~*^/user/([^/]+) /u/$1;

There could be several proxy_cookie_path directives:

proxy_cookie_path /one/ /;

proxy_cookie_path / /two/;

The off parameter cancels all proxy_cookie_path directives on the current level:

proxy_cookie_path off;

proxy_cookie_path /two/ /;

proxy_cookie_path ~*^/user/([^/]+) /u/$1;