ngx_http_proxy_module 模块 | english русский 简体中文 עברית 日本語 türkçe 新闻 [en] nginx 介绍 下载 [en] 安全漏洞 [en] 文档 FAQ 外部连接 [en] 书籍 [en] 支持 [en] 捐献 [en] trac wiki nginx.com | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
翻译内容可能已经过旧。 你可以通过 英文版本 查看最近的更新。
配置示例
location / { proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
指令
设置缓冲区的大小为
代理的时候,开启或关闭缓冲后端服务器的响应。 当开启缓冲时,nginx尽可能快地从被代理的服务器接收响应,再将它存入proxy_buffer_size和proxy_buffers指令设置的缓冲区中。如果响应无法整个纳入内存,那么其中一部分将存入磁盘上的临时文件。proxy_max_temp_file_size和proxy_temp_file_write_size指令可以控制临时文件的写入。 当关闭缓冲时,收到响应后,nginx立即将其同步传给客户端。nginx不会尝试从被代理的服务器读取整个请求,而是将proxy_buffer_size指令设定的大小作为一次读取的最大长度。
响应头“X-Accel-Buffering”传递“
为每个连接设置缓冲区的数量为
当开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定
指定用于页面缓存的共享内存。同一块共享内存可以在多个地方使用。
定义nginx不从缓存取响应的条件。如果至少一个字符串条件非空而且非“0”,nginx就不会从缓存中去取响应: proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment; proxy_cache_bypass $http_pragma $http_authorization; 本指令可和与proxy_no_cache一起使用。
定义如何生成缓存的键,比如 proxy_cache_key "$host$request_uri $cookie_user"; 这条指令的默认值类似于下面字符串 proxy_cache_key $scheme$proxy_host$uri$is_args$args;
这个指令出现在版本 1.1.12. 开启此功能时,对于相同的请求,同时只允许一个请求发往后端,并根据proxy_cache_key指令的设置在缓存中植入一个新条目。 其他请求相同条目的请求将一直等待,直到缓存中出现相应的内容,或者锁在proxy_cache_lock_timeout指令设置的超时后被释放。
这个指令出现在版本 1.1.12. 为proxy_cache_lock指令设置锁的超时。
设置响应被缓存的最小请求
设置缓存的路径和其他参数。缓存数据是保存在文件中的,缓存的键和文件名都是在代理URL上执行MD5的结果。
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m; 缓存中文件名看起来是这样的: /data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
被缓存的响应首先写入一个临时文件,然后进行重命名。从0.8.9版本开始,临时文件和缓存可以放在不同的文件系统。但请注意,这将导致文件在这两个文件系统中进行拷贝,而不是廉价的重命名操作。因此,针对任何路径,都建议将缓存和proxy_temp_path指令设置的临时文件目录放在同一文件系统。
此外,所有活动的键和缓存数据相关的信息都被存放在共享内存中。共享内存通过
特殊进程“cache manager”监控缓存的条目数量,如果超过
nginx新启动后不就,特殊进程“cache loader”就被启动。该进程将文件系统上保存的过去缓存的数据的相关信息重新加载到共享内存。加载过程分多次迭代完成,每次迭代,进程只加载不多于
如果后端服务器出现状况,nginx是可以使用过期的响应缓存的。这条指令就是定义何种条件下允许开启此机制。这条指令的参数与proxy_next_upstream指令的参数相同。
此外, 在植入新的缓存条目时,如果想使访问源服务器的次数最少,可以使用proxy_cache_lock指令。
为不同的响应状态码设置不同的缓存时间。比如,下面指令 proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; 设置状态码为200和302的响应的缓存时间为10分钟,状态码为404的响应的缓存时间为1分钟。
如果仅仅指定了 proxy_cache_valid 5m; 那么只有状态码为200、300和302的响应会被缓存。
如果使用了 proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m;
缓存参数也可以直接在响应头中设定。这种方式的优先级高于使用这条指令设置缓存时间。
“X-Accel-Expires”响应头可以以秒为单位设置响应的缓存时间,如果值为0,表示禁止缓存响应,如果值以
设置与后端服务器建立连接的超时时间。应该注意这个超时一般不可能大于75秒。
这个指令出现在版本 1.1.15.
设置“Set-Cookie”响应头中的 proxy_cookie_domain localhost example.org;
将这个属性改写为“
proxy_cookie_domain www.$host $host;
这条指令同样可以使用正则表达式。这时, proxy_cookie_domain ~\.(?P<sl_domain>[-0-9a-z]+\.[a-z]+)$ $sl_domain;
可以同时定义多条 proxy_cookie_domain localhost example.org; proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1;
proxy_cookie_domain off; proxy_cookie_domain localhost example.org; proxy_cookie_domain www.example.org example.org;
这个指令出现在版本 1.1.15.
设置“Set-Cookie”响应头中的 proxy_cookie_path /two/ /;
将这个属性改写为“
proxy_cookie_path $uri /some$uri;
这条指令同样可以使用正则表达式。如果使用大小写敏感的匹配, proxy_cookie_path ~*^/user/([^/]+) /u/$1;
可以同时定义多条 proxy_cookie_path /one/ /; proxy_cookie_path / /two/;
proxy_cookie_path off; proxy_cookie_path /two/ /; proxy_cookie_path ~*^/user/([^/]+) /u/$1;
nginx默认不会将“Date”、“Server”、“X-Pad”,和“X-Accel-...”响应头发送给客户端。
这个指令出现在版本 1.1.4. 设置代理使用的HTTP协议版本。默认使用的版本是1.0,而1.1版本则推荐在使用keepalive连接时一起使用。
决定当客户端在响应传输完成前就关闭连接时,nginx是否应关闭后端连接。
不处理后端服务器返回的指定响应头。下面的响应头可以被设置: “X-Accel-Redirect”,“X-Accel-Expires”,“X-Accel-Limit-Rate” (1.1.6),“X-Accel-Buffering” (1.1.6), “X-Accel-Charset” (1.1.6),“Expires”,“Cache-Control”,和“Set-Cookie” (0.8.44)。 如果不被取消,这些头部的处理可能产生下面结果:
当后端服务器的响应状态码大于等于400时,决定是否直接将响应发送给客户端,亦或将响应转发给nginx由error_page指令来处理。
打开响应缓冲以后,如果整个响应不能存放在proxy_buffer_size和proxy_buffers指令设置的缓冲区内,部分响应可以存放在临时文件中。
这条指令可以设置临时文件的最大 将此值设置为0将禁止响应写入临时文件。
指定在何种情况下一个失败的请求应该被发送到下一台后端服务器:
需要理解一点的是,只有在没有向客户端发送任何数据以前,将请求转给下一台后端服务器才是可行的。也就是说,如果在传输响应到客户端时出现错误或者超时,这类错误是不可能恢复的。
定义nginx不将响应写入缓存的条件。如果至少一个字符串条件非空而且非“0”,nginx就不将响应存入缓存: proxy_no_cache $cookie_nocache $arg_nocache$arg_comment; proxy_no_cache $http_pragma $http_authorization; 这条指令可以和proxy_cache_bypass指令一起使用。
设置后端服务器的协议和地址,还可以设置可选的URI以定义本地路径和后端服务器的映射关系。
这条指令可以设置的协议是“ proxy_pass http://localhost:8000/uri/;
又可以使用UNIX域套接字路径来定义。该路径接在“ proxy_pass http://unix:/tmp/backend.socket:/uri/;
如果解析一个域名得到多个地址,所有的地址都会以轮转的方式被使用。当然,也可以使用服务器组来定义地址。 请求URI按下面规则传送给后端服务器:
某些情况下,无法确定请求URI中应该被替换的部分:
后端服务器的地址,端口和URI中都可以使用变量: proxy_pass http://$host$uri; 甚至像这样: proxy_pass $request;
这种情况下,后端服务器的地址将会在定义的服务器组中查找。如果查找不到,nginx使用resolver来查找该地址。
允许传送被屏蔽的后端服务器响应头到客户端。
定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。
设置后端服务器“Location”响应头和“Refresh”响应头的替换文本。
假设后端服务器返回的响应头是
“ proxy_redirect http://localhost:8000/two/ http://frontend/one/;
将把字符串改写为
“
proxy_redirect http://localhost:8000/two/ /; 此时将使用代理服务器的主域名和端口号来替换。如果端口是80,可以不加。
用 location /one/ { proxy_pass http://upstream:port/two/; proxy_redirect default;
location /one/ { proxy_pass http://upstream:port/two/; proxy_redirect http://upstream:port/two/ /one/;
而且因为同样的原因,proxy_pass指令使用变量时,不允许本指令使用
proxy_redirect http://localhost:8000/ http://$host:$server_port/;
而 proxy_redirect http://$proxy_host:8000/ /;
同时,从1.1.11版本开始,指令支持正则表达式。使用正则表达式的话,如果是大小写敏感的匹配, proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2; proxy_redirect ~*/user/([^/]+)/(.+)$ http://$1.example.com/$2;
除此以外,可以同时定义多个 proxy_redirect default; proxy_redirect http://localhost:8000/ /; proxy_redirect http://www.example.com/ /;
另外, proxy_redirect off; proxy_redirect default; proxy_redirect http://localhost:8000/ /; proxy_redirect http://www.example.com/ /;
最后,使用这条指令也可以为地址为相对地址的重定向添加域名: proxy_redirect / /;
定义向后端服务器传输请求的超时。此超时是指相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的最长时间。如果后端服务器在超时时间段内没有接收到任何数据,连接将被关闭。
允许重新定义或者添加发往后端服务器的请求头。 proxy_set_header Host $proxy_host; proxy_set_header Connection close;
如果不想改变请求头“Host”的值,可以这样来设置: proxy_set_header Host $http_host;
但是,如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。
这种情况下,更好的方式是使用 proxy_set_header Host $host;
此外,服务器名可以和后端服务器的端口一起传送: proxy_set_header Host $host:$proxy_port;
如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器: proxy_set_header Accept-Encoding "";
决定是否重用与后端服务器的SSL会话。如果日志中出现“
开启将文件保存到磁盘上的功能。如果设置为 proxy_store /data/www$original_uri;
保存文件的修改时间根据接收到的“Last-Modified”响应头来设置。响应都是先写到临时文件,然后进行重命名来生成的。从0.8.9版本开始,临时文件和持久化存储可以放在不同的文件系统,但是需要注意这时文件执行的是在两个文件系统间拷贝操作,而不是廉价的重命名操作。因此建议保存文件的路径和proxy_temp_path指令设置的临时文件的路径在同一个文件系统中。 这条指令可以用于创建静态无更改文件的本地拷贝,比如: location /images/ { root /data/www; open_file_cache_errors off; error_page 404 = /fetch$uri; } location /fetch/ { internal; proxy_pass http://backend/; proxy_store on; proxy_store_access user:rw group:rw all:r; proxy_temp_path /data/temp; alias /data/www/; }
或者像这样: location /images/ { root /data/www; error_page 404 = @fetch; } location @fetch { internal; proxy_pass http://backend; proxy_store on; proxy_store_access user:rw group:rw all:r; proxy_temp_path /data/temp; root /data/www; }
设置新创建的文件和目录的访问权限,比如: proxy_store_access user:rw group:rw all:r;
如果指定了任何 proxy_store_access group:rw all:r;
在开启缓冲后端服务器响应到临时文件的功能后,设置nginx每次写数据到临时文件的
定义从后端服务器接收的临时文件的存放路径,可以为临时文件路径定义至多三层子目录的目录树。 比如,下面配置 proxy_temp_path /spool/nginx/proxy_temp 1 2; 那么临时文件的路径看起来会是这样: /spool/nginx/proxy_temp/7/45/00000123457
内嵌变量
|