博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx学习之反向代理篇(六)
阅读量:5882 次
发布时间:2019-06-19

本文共 2473 字,大约阅读时间需要 8 分钟。

在本节,你将学会:

--如何根据不同的协议,将请求转发到后端服务器;

--修改发送到后端服务器的请求头;

--以及配置是否buffering从后端服务器返回来的响应。

 

1. 将请求转发给后端服务器

当nginx代理一个请求时,它会将请求转发给一个指定的后端服务器,然后从后端服务器获取相应,最后将响应返回给用户。

可以将请求代理给一个HTTP服务器nginx服务器或者apache服务器或者lighttpd服务器),也可以代理给一个非HTTP服务器(这个服务器运行着一个应用程序,该应用程序可能

是由PHP开发的,也可能是由Python开发的),这个非HTTP服务器可能使用的是一种特殊的协议。特殊的协议指的是:FastCGI,uwsgi,SCGI,或者是memcached。

 

将请求转发给后端的HTTP服务器:

location /some/path/ {    proxy_pass http://www.example.com/link/;}

 

location ~ \.php {    proxy_pass http://127.0.0.1:8000;}

 

注意第一个例子中的意思:假如我的URI是/some/path/page.html,那么转发之后,实际请求的是http://www.example.com/link/page.html。

如果http://www.example.com后面没有跟/link/,或者说无法决定要替换URI中的哪个部分,那么请求中的整个URI会原样的转发给后端服务器。

 

将请求转发给后端的非HTTP服务器:

fastcgi_pass    将请求转发给一个fastcgi服务器

uwsgi_pass     将请求转发给一个uwsgi服务器

scgi_pass      将请求转发给一个scgi服务器

memcached_pass  将请求转发给一个memcached服务器

注意:在这些指令后面,指定后端服务器的格式不一样,携带的参数也不一样,所以需要注意。

请查看详细文档:http://nginx.org/en/docs/?_ga=1.239185987.1593816507.1472003628

 

2.转发请求头

默认的,nginx会修改被转发请求中的2个头字段,一个是"Host",一个是"Connection"。并消除字段值为空字符串的字段。

"Host"的值会设置为$proxy_host变量的值,"Connection"的值会设置为close。

 

可以在http块中,server块中,location块中修改头字段:

location /some/path/ {    proxy_set_header Host $host;    proxy_set_header X-Real-IP $remote_addr;    proxy_pass http://localhost:8000;}

 

如果不想让请求中的某个字段转发到后端服务器上,可以将其设置为空字符串:

location /some/path/ {    proxy_set_header Accept-Encoding "";    proxy_pass http://localhost:8000;}

 

3.设置buffers

默认情况下,nginx会将后端服务器发过来的响应先缓冲在本地的buffers中,等到整个响应接收完毕后,才发送给用户。

对于接收很慢的用户,我的nginx不可能为了满足你而放慢脚步。你一次只能接受1字节,我就传1字节。这样我的nginx就完全拖慢了。

所以nginx会先将后端服务器发过来的响应缓冲起来,等到整个请求接收完毕后,再发给用户。你用户慢慢去接收,我还要服务别的用户。

如果后端服务器每发送部分响应,nginx都直接返回给用户,这叫做同步操作

 

开启或关闭buffering,由proxy_buffering控制,默认值是on。

proxy_buffers

proxy_buffer_size

 

后端服务器返回来的响应,它的第一部分存储在一个单独的buffer中,它的大小由proxy_buffer_size来设置。

location /some/path/ {    proxy_buffers 16 4k;    proxy_buffer_size 2k;    proxy_pass http://localhost:8000;}

上面的设置中,buffer的数量为16,比默认的数量多,每个buffer的大小4K。

我们为响应中第一部分设置的单个buffer的大小是2K,比默认的小。

 

如果关闭buffering,那么对于快速交互用户是有好处的,因为用户能快速接收响应

关闭某个location的buffering功能:

location /some/path/ {    proxy_buffering off;    proxy_pass http://localhost:8000;}

 

4. 选择一个出口IP(用哪个网卡去连接后端服务器)

location /app1/ {    proxy_bind 127.0.0.1;    proxy_pass http://example.com/app1/;}location /app2/ {    proxy_bind 127.0.0.2;    proxy_pass http://example.com/app2/;}

 

location /app3/ {    proxy_bind $server_addr;    proxy_pass http://example.com/app3/;}

上面的$server_addr变量代表的是:接收请求的网卡,nginx从这个网卡接收的请求,就从这个网卡去连接后端服务器。

转载于:https://www.cnblogs.com/t-road/p/6739523.html

你可能感兴趣的文章
python
查看>>
SIEM在PCI DSS和安全等级保护合规性中的作用
查看>>
MySQL技术综合
查看>>
Linux就该这么学-第五课
查看>>
好程序员前端分享使用JS开发简单的音乐播放器
查看>>
奥马冰箱:用设计创新突破行业“天花板”
查看>>
Oracle Database 11g SQL开发指南
查看>>
ACM一些小的注意事项 持续更新ing
查看>>
Go语言之单元测试
查看>>
查找字符串里出现次数最多的字符。(map的遍历方法)
查看>>
python对象和类
查看>>
Linux Virtualiztion—概述
查看>>
ssh 免密码登录
查看>>
教学笔记-方法的重载与重写
查看>>
Target runtime Apache Tomcat 6.0 is not defined 解决方法
查看>>
【浙大网新图灵通讯】无废话简单高效C#编码规范20100612
查看>>
实现基于组织机构的数据集权限系统的设计思路讲解【提供完整数据库设计下载】...
查看>>
docker-py execute echo无效
查看>>
Spring Boot Redis Cache应用
查看>>
Handler学习
查看>>