反向代理的基本配置及命令解析
nginx.conf例子:
location ~* \.ts$ {
access_log /data/logs/lmss/hls.log hls_sla;
content_by_lua_block {
return ngx.exec("@ts_proxy")
}
keepalive_timeout 30;
keepalive_requests 10000000;
client_body_buffer_size 512k;
}
location @ts_proxy {
set $cache_key $Host$uri;
set $balancer_ip "";
set $source_host $Host;
set $source_bind "";
set $param_range "";
keepalive_timeout 30;
keepalive_requests 10000000;
client_body_buffer_size 512k;
proxy_buffer_size 32k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404 http_502;
proxy_pass http://hls_upstream; ## 回源地址
proxy_bind $source_bind;
proxy_cache_lock on;
proxy_cache_lock_timeout 120s;
proxy_cache $cache_type;
proxy_cache_key $cache_key;
proxy_cache_valid 200 304 206 5m;
proxy_connect_timeout 3s;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
proxy_http_version 1.1;
proxy_set_header Connection "Keep-Alive";
proxy_set_header Host $source_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
1.proxy_pass
语法: proxy_pass URL;
配置块:: location, if in location, limit_except
此配置项将当前请求反向代理到URL参数指定的服务器上。协议可以是”http”或”https”。URL可以是主机名或IP地址加端口的形式,例如:
proxy_pass http://localhost:8000/uri/;
也可以是UNIX句柄:
proxy_pass http://unix:/path/to/backend.socket:/uri/;
还可以如上节负载均衡中所示,直接使用upstream块,例如:
upstream backend {
...
}
server {
location / {
proxy_pass http://backend;
}
}
在nginx中配置proxy_pass时:
- 当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;
- 如果没有/,则会把匹配的路径部分也给代理走。
下面四种情况分别用http://192.168.1.1/proxy/test.html 进行访问。
示例1:
location /proxy/ {
proxy_pass http://127.0.0.1:81/;
}
会被代理到 http://127.0.0.1:81/test.html
这个url
示例2:
location /proxy/ {
proxy_pass http://127.0.0.1:81;
}
会被代理到 http://127.0.0.1:81/proxy/test.html
这个url
示例3:
location /proxy/ {
proxy_pass http://127.0.0.1:81/ftlynx/;
}
会被代理到 http://127.0.0.1:81/ftlynx/test.html
这个url
示例4:
location /proxy/ {
proxy_pass http://127.0.0.1:81/ftlynx;
}
会被代理到 http://127.0.0.1:81/ftlynxtest.html
这个url
2. proxy_bind
语法: proxy_bind address;
配置块:: http, server, location
示例:
proxy_bind 192.168.1.1;
在调用connect()前将上游socket绑定到一个本地地址,如果主机有多个网络接口或别名,但是你希望代理的连接通过指定的借口或地址,可以使用这个指令。
3. proxy_buffer_size
语法:proxy_buffer_size the_size
默认值:proxy_buffer_size 4k/8k
配置块:http, server, location
设置从被代理服务器读取的第一部分应答的缓冲区大小。
通常情况下这部分应答中包含一个小的应答头。
默认情况下这个值的大小为指令proxy_buffers中指定的一个内存页面的大小,即4K或者8K, 不过可以将其设置为更小。
4. proxy_buffering
语法:proxy_buffering on|off
默认值:proxy_buffering on
配置块:http, server, location
开启或者关闭缓冲后端的服务器的应答的功能。
如果开启缓冲,nginx在接收到后端服务器的响应后,会并将其放入缓冲区,用户可以使用proxy_buffer_size和proxy_buffers设置相关的缓冲参数。如果响应无法全部放入内存,nginx会将其写入硬盘的临时文件里面。
如果禁用缓冲,从后端传来的应答将被立即被传送到客户端。
如果缓冲区被关闭了,那么响应内容会按照获取内容的多少立刻同步传送到客户端。
nginx不尝试计算被代理服务器整个响应内容的大小,nginx能从服务器接受的最大数据,是由指令proxy_buffer_size指定的。
对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作
5.proxy_buffers
语法:proxy_buffers the_number is_size;
默认值:proxy_buffers 8 4k/8k;
配置块:http, server, location
该指令设置缓冲区的大小和数量,从被代理的后端服务器取得的响应内容,会放置到这里. 默认情况下,一个缓冲区的大小等于内存页面大小,可能是4K也可能是8K,这取决于平台。
6. proxy_busy_buffers_size
语法:proxy_busy_buffers_size size;
默认值:proxy_busy_buffers_size proxy_buffer_size * 2;
配置块:http, server, location, if
当开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小时,nginx一定会向客户端发送响应,直到缓冲小于此值。这条指令用来设置此值。
同时,剩余的缓冲区可以用于接收响应,如果需要,一部分内容将缓冲到临时文件。该大小默认是proxy_buffer_size和proxy_buffers指令设置单块缓冲大小的两倍.
- buffer工作原理:
首先第一个概念是所有的这些proxy buffer参数是作用到每一个请求的。每一个请求会安按照参数的配置获得自己的buffer。proxy buffer不是global而是per request的。
proxy_buffering 是为了开启response buffering of the proxied server,开启后proxy_buffers和proxy_busy_buffers_size参数才会起作用。
无论proxy_buffering是否开启,proxy_buffer_size(main buffer)都是工作的,proxy_buffer_size所设置的buffer_size的作用是用来存储upstream端response的header。
在proxy_buffering开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到buffer,直到proxy_buffers设置的所有buffers被写满或者数据被读取完(EOF)。此时nginx开始向客户端传输数据,会同时传输这一整串buffers。同时如果response的内容很大的话,Nginx会接收并把他们写入到temp_file里去。大小由proxy_\max_temp_file_size控制。如果busy的buffer传输完了会从temp_file里面接着读数据,直到传输完毕。
一旦proxy_buffers设置的buffer被写入,直到buffer里面的数据被完整的传输完(传输到客户端),这个buffer将会一直处在busy状态,我们不能对这个buffer进行任何别的操作。所有处在busy状态的buffer size加起来不能超过proxy_busy_buffers_size,所以proxy_busy_buffers_size是用来控制同时传输到客户端的buffer数量的,剩余的缓冲区可以用于接收响应。
7. proxy_temp_file_write_size
语法: proxy_temp_file_write_size size;
默认值: proxy_temp_file_write_size 8k|16k;
配置块: http, server, location
在开启缓冲后端服务器响应到临时文件的功能后,设置nginx***每次写数据到临时文件的size(大小)限制*。 size的默认值是proxy_buffer_size指令和proxy_buffers指令定义的每块缓冲区大小的两倍, 而临时文件最大容量由proxy_max_temp_file_size指令设置。
8. proxy_max_temp_file_size
语法: proxy_max_temp_file_size size;
默认值:proxy_max_temp_file_size 1024m;
配置块: http, server, location
打开响应缓冲以后,如果整个响应不能存放在proxy_buffer_size和proxy_buffers指令设置的缓冲区内,部分响应可以存放在临时文件中。 这条指令可以设置临时文件的最大容量。而每次写入临时文件的数据量则由proxy_temp_file_write_size指令定义。
将此值设置为0将禁止响应写入临时文件。
9. proxy_next_upstream
语法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off …;
默认值: proxy_next_upstream error timeout;
配置块: http, server, location
指定在何种情况下一个失败的请求应该被发送到下一台后端服务器:
error
和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误;
timeout
和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现超时;
invalid_header
后端服务器返回空响应或者非法响应头;
http_500
后端服务器返回的响应状态码为500;
http_502
后端服务器返回的响应状态码为502;
http_503
后端服务器返回的响应状态码为503;
http_504
后端服务器返回的响应状态码为504;
http_404
后端服务器返回的响应状态码为404;
off
停止将请求发送给下一台后端服务器。需要理解一点的是,只有在没有向客户端发送任何数据以前,将请求转给下一台后端服务器才是可行的。也就是说,如果在传输响应到客户端时出现错误或者超时,这类错误是不可能恢复的。
参考文章:
http://blog.youkuaiyun.com/u010391029/article/details/50850210
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_proxy_module.html#proxy_max_temp_file_size