Nginx代理服务1--正反向代理及缓冲
代理服务是Nginx的核心所在,早期在没有代理的时候,客户端直接和服务端进行交互,如下图所示:
当有了代理之后,客户端和服务端直接的交互方式有了改变,代理负责对请求和响应进行转发。代理可以过滤请求也可以对响应做相应的改变,让服务端发挥的空间更大
有代理
代理的分类:
-正向代理
正向代理可以帮助客户端访问无法直接访问的资源,当用户想访问国外无法直接访问的资源时,可以先去访问代理,然后由代理去帮忙寻找资源,然后返回给客户端,所以它和客户端的关系好~~如下图所示:
正向代理
-反向代理
反向代理是为服务端服务的,当用户通过域名去访问某个资源的时候,代理会自动的寻找服务端的某台机器上的资源,这些都是对客户端透明的,客户端感知就只有一个服务端机器。
反向代理
正向代理和反向代理的区别:
正向代理和反向代理在形式上服务的对象不一样。正向代理代理的对象是客户端,为客户端服务,反向代理的对象是服务端,为服务端服务。
Nginx可支持的代理协议
Nginx支持的代理协议很多,有HTTP、Websocket、GRPC等等,我们会对常用的HTTP、Websocket、GRPC、HTTPS协议。我们可以通过下图看到目前Nginx支持的代理协议:
Nginx可支持的代理协议
常见的Nginx作为反向代理支持协议有HTTP、HTTPS、WS、GRPC,Nginx支持这些协议所使用的模块如下图所示:
总结下来反向代理模式对应的Nginx配置模块可以用一个表格表示成这样:
反向代理模式 | Nginx配置模块 |
---|---|
http、websocket、https | ngx_http_proxy_module |
fastcgi | ngx_http_fastcgi_module |
uwsgi | ngx_http_uwsgi_module |
grpc | ngx_http_v2_module |
Nginx作为反向代理支持的协议很多,但是它作为正向代理支持的常见协议很少,往往是HTTP协议,不能支持HTTPS协议,如下图所示:
Nginx作为正向代理支持的协议
反向代理实战篇
语法:proxy_pass URL;可以在location,if in location ,limit_except中配置,URL可以配置成:http://localhost:8000/uri/ https://ip:port/uri http://unix:/tmp/backend.socket:/uri/
测试:我们在其中一台服务器的nginx.conf配置文件中配置:
location ~ /indexzzm.html$ {
proxy_pass http://123.206.36.54;
}
凡是以indexzzm.html结尾的访问都到123.206.36.54上面去访问。
我们在47.100.199.15上对indexzzm.html的访问发生了跳转,说明我们的反向代理配置成功。
结果
正向代理实战篇
现在我们有两台服务器,一台服务器的IP是http://47.100.199.15,另外一台是http://123.206.36.54,现在我们希望只能通过123.206.36.54作为代理的机器才能访问47.100.199.15中的页面。下面我们通过Nginx来完成这个步骤:
步骤1:配置47.100.199.15的配置文件,只允许123.206.36.54才能访问。
location / {
if ( $remote_addr !~* "^123\.206\.36\.54") {
return 403;
}
root /usr/share/nginx/html;
index index.html index.htm;
}
步骤2:验证配置是否成功。我们在自己本机的电脑上去访问http://47.100.199.15,会出现以下结果:
被禁止
步骤3:在123.206.36.54上配置代理
location / {
proxy_pass http://$http_host$request_uri;
}
步骤4:在google中配置代理:
配置代理
步骤5:访问
访问结果
Nginx缓冲使用
如果禁止缓冲,那么当Nginx一收到后端的反馈就同时传给客户端。nginx不会从被代理的服务器读取整个反馈信息
proxy_buffering
语法: proxy_buffering on|off
默认值: proxy_buffering on
上下文: http, server, location
这个参数用来控制是否打开后端响应内容的缓冲区,如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。 但是无论proxy_buffering是否开启,对proxy_buffer_size都是生效的。
proxy_buffering开启的情况下,nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端(边收边传,不是全部接收完再传给客户端)。 临时文件由proxy_max_temp_file_size和proxy_temp_file_write_size这两个指令决定的。如果响应内容无法放在内存里边,那么部分内容会被写到磁盘上。
如果proxy_buffering关闭,那么nginx会立即把从后端收到的响应内容传送给客户端,每次取的大小为proxy_buffer_size的大小,这样效率肯定会比较低。
nginx不尝试计算被代理服务器整个响应内容的大小,nginx能从服务器接受的最大数据,是由指令proxy_buffer_size指定的.
proxy_buffers
语法: proxy_buffers the_number is_size;
默认值: proxy_buffers 8 4k/8k;
上下文: http, server, location该指令设置缓冲区的大小和数量,从被代理的后端服务器取得的响应内容,会放置到这里. 默认情况下,一个缓冲区的大小等于内存页面大小,可能是4K也可能是8K,这取决于平台。
proxy_buffers由缓冲区数量和缓冲区大小组成的。总的大小为number*size。
若某些请求的响应过大,则超过_buffers的部分将被缓冲到硬盘(缓冲目录由_temp_path指令指定), 当然这将会使读取响应的速度减慢, 影响用户体验。
proxy_busy_buffers_size
语法: proxy_busy_buffers_size size;
默认值: proxy_busy_buffers_size proxy_buffer_size * 2;
上下文: http, server, location, if
proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxy_busy_buffers_size来控制的,建议为proxy_buffers中单个缓冲区大小的2倍),然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中。
Nginx跳转重定向
语法:proxy_redirect redirect replacement;可以用在http,server,location中
Nginx头信息
语法:proxy_set_header field value;
经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过remote_addr变量拿到的将是反向代理服务器的ip地址”。这句话的意思是说,当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取remote_addr),取得的是nginx的地址,即remote_addr变量中封装的是nginx的地址,当然是没法获得用户的真实ip的,但是,nginx是可以获得用户的真实ip的,也就是说nginx使用remote_addr变量时获得的是用户的真实ip,如果我们想要在web端获得用户的真实ip,就必须在nginx这里作一个赋值操作,如下:
proxy_set_header X-real-ip $remote_addr;
其中这个X-real-ip是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实ip就被放在X-real-ip这个变量里了,然后,在web端可以这样获取:
request.getAttribute("X-real-ip")
Nginx超时设置
语法:proxy_connect_timeout time;
默认:proxy_connect_timeout 60s;
上下文:http,server,location
此配置意思是,每个从Nginx分发的请求,连接到后台(tomcat X)的连接如果超过60秒,则视为连接失败
proxy_read_timeout
nginx接收upstream server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭
proxy_send_timeout
nginx发送数据至upstream server超时, 默认60s, 如果连续的60s内没有发送1个字节, 连接关闭
附一个Nginx中对上述语法的配置:
常见配置