本文为翻译文,原文地址:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/


本文描述代理服务器的基本配置。你能学到如何将一个请求在不同的协议上从nginx转发到被代理服务器,如何修改被转发到被代理服务器的客户端的请求头,如何配置来自被代理服务器的响应的缓存。

介绍

代理通常用于将负载分发到几个服务器中,无缝地从不同的网站获取内容,或者转发请求到不同的服务器。

转发请求到被代理服务器

当nginx代理一个请求,它发送这个请求到指定的被代理服务器,获取响应,然后发送响应会客户端。也可能使用特别的协议代理请求到一个HTTP服务器(其他nginx服务器或其他任意服务器)或一个非HTTP服务器(比如运行PHP或Pyhton开发的应用)。支持的协议包括FastCGI、uwsgi、SCGI、memcached。

proxy_pass指令在一个location块中,用于转发一个请求到HTTP被代理服务器。比如:

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

此配置表示代理在此location处理的全部请求到指定地址的被代理服务器。此地址可以用域名或IP表示,地址可能需要包含端口。

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

请注意上面的第一个示例,被代理服务器的地址后面跟着是一个URI(统一资源标识符),/link/。如果有URI被配置在地址中,它会替换匹配location的部分。比如,请求地址为/some/path/page.html,会被代理到http://www.example.com/link/page.html。如果地址没有URI,或者不能确定替换的部分,整个请求URI被转发。

**_pass指令用于转发请求到一个非HTTP被代理服务器:

  • fastcgi_pass
  • uwsgi
  • scgi_pass
  • memcached_pass

请注意在这些情况,指定地址的规则可能不相同。你可能需要转发其它参数到服务器(请查看这里更多细节)。

proxy_pass指令可以转发到一个服务器组。在这些情况中,请求在服务器组中根据指定的机制被分发。

转发请求头

默认情况下,nginx在代理请求中重定义两个请求头,Host和Connection,并且清除值为空的请求头。Host被设置为$proxy_host变量,Connection被设置为close。

用proxy_set_header来为了改变这些设置,和修改其它请求头。此指令能指定在location或更高层级的块中。它能指定在指定的server或http块中。比如:

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

在此配置中,Host请求头被设置为$host变量。

为了防止请求头被转发到被代理服务器,可以将值设置为空字符串,比如:

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

配置缓冲

默认请求下,nginx会缓存被代理服务器的响应。响应会被储存在内部缓存中,直到整个响应接收完毕才发送到客户端。缓存有助于慢的客户端的性能优化,因为响应从nginx同步返回给客户端会浪费被代理服务器的时间。然而,当缓存启动后,nginx允许被代理服务器快速地返回响应,nginx存储响应使客户端有更多的时间下载响应。

broxy_buffering用于表示缓存是否开启,默认是开启的。

Proxy_buffers控制分配的缓存区的大小和数量。响应的第一部分会被存储在一个单独的缓存中,缓存的大小由proxy_buffer_size指令设置。这部分通常包含相对较小的响应头。

如果设置缓冲不可用,当接收被代理服务器的响应时,响应会同步地发送到客户端。此设置或许是希望快速互动的客户所需要的。

想要设置缓冲不可用,将location下的proxy_buffering设为off即可,如下所示:

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

这种情况下,nginx只使用proxy_buffer_size配置的缓冲区去存储当前部分的响应。

选择一个流出的IP

如果你的代理服务器有几个网络接口,你或许需要选择一个特定的IP地址去连接被代理服务器或上游服务器。这在一个被代理服务器配置了只接受指定IP地址的请求时就有用了。

声明proxy_bind和指定的网络接口的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/;}

IP地址也可以为一个变量。比如$server_addr变量表示接收请求的网络接口的IP:

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

【翻译】Nginx的反向代理的更多相关文章

  1. Windos环境用Nginx配置反向代理和负载均衡

    Windos环境用Nginx配置反向代理和负载均衡 引言:在前后端分离架构下,难免会遇到跨域问题.目前的解决方案大致有JSONP,反向代理,CORS这三种方式.JSONP兼容性良好,最大的缺点是只支持 ...

  2. 在ubuntu上面配置nginx实现反向代理和负载均衡

    上一篇文章(http://www.cnblogs.com/chenxizhang/p/4684260.html),我做了一个实验,就是利用Visual Studio,基于Nancy框架,开发了一个自托 ...

  3. nginx的反向代理和负载均衡的一个总结

    之前一直觉的nginx的反向代理和负载均衡很厉害的样子,最近有机会接触了一下公司的这方面的技术,发现技术就是一张窗户纸呀,捅破了啥都明白了! 接下来先看一下nginx的反向代理: 简单的来说就是ngi ...

  4. nginx做反向代理并防盗链

    nginx做反向代理真的非常简单,只需设置location+proxy_pass即可. 防盗链配置有些复杂,需要注意的地方: 在防盗链的location中需要再设置一下proxy_pass(在这里走了 ...

  5. nginx设置反向代理后,页面上的js css文件无法加载

    问题现象: nginx配置反向代理后,网页可以正常访问,但是页面上的js css文件无法加载,页面样式乱了. (1)nginx配置如下: (2)域名访问:js css文件无法加载: (3)IP访问:j ...

  6. 用nginx做反向代理来访问防外链图片

    用nginx做反向代理来访问防外链图片 女儿的博客从新浪搬到wordpress后,发现原来博客上链接的新浪相册的图片都不能访问了,一年的博客内容,一个个去重新上传图片,修正链接也是个大工程.还是得先想 ...

  7. Nginx 笔记与总结(15)nginx 实现反向代理 ( nginx + apache 动静分离)

    在 nginx 中,proxy 用来实现反向代理,upstream 用来实现负载均衡. 例如有两台服务器,nginx 服务器作为代理服务器,执行 .html 文件,apache 服务器上执行 .php ...

  8. 【Nginx】使用Nginx做反向代理时,关于被代理服务器相应的超时设置

    > 参考的优秀文章 Module ngx_http_proxy_module > 设置等待被代理服务器的最大响应时间 使用Nginx做反向代理时,因被代理服务器因业务确实复杂,需时较久,往 ...

  9. Nginx做反向代理总是被系统kill

    公司使用Nginx做反向代理,以前都挺正常的,最近不知怎么回事总是无端被系统kill,而在nginx错误日志中也没有信息输出. 网上查了很多资料,也没什么靠谱的回答,唯一觉得有点关联的就是linux ...

  10. nginx简单反向代理和负载均衡(ubuntu)

    nginx简单反向代理与负载均衡 环境:三台ubuntu 12.04.5 虚拟机    均装有nginx 1.1.19 以下u1(192.168.240.129) ,u2(192.168.240.13 ...

随机推荐

  1. SpringMVC(二六) SpringMVC配置文件中使用mvc:view-controller标签

    在springmvc中使用mvc:view-controller标签直接将访问url和视图进行映射,而无需要通过控制器. 参考springmvc.xml内容: <?xml version=&qu ...

  2. 自己总结的C#编码规范--3.特定场景下的命名最佳实践

    特定场景下的命名最佳实践 命名空间 要使用PascalCasing,并用点号来分隔名字空间中的各个部分. 如Microsof.Office.PowerPoint 要用公司名作为命名空间的前缀,这样就可 ...

  3. 【整理】Java 11新特性总结

    闲语 2018年9月25日,Java 11正式发布,与JDK 10不同,JDK 11将提供长期支持,还将作为Java平台的参考实现以及标准版(Java SE)11.Oracle直到2023年9月都会为 ...

  4. Markdown指南

    Markdown 指南 前几天学习了markdown,然后一直在用,很喜欢这种格式即内容的写作形式.在简书写了几篇,对固定链接的格式很不满意,于是寻找能够支持markdown.固定链接显格式.支持自定 ...

  5. BZOJ2167 : 公交车站

    设$f[i]$表示$i$往上通过一趟公交车能到达的深度最小的祖先,这可以通过将公交车按$lca$深度从小到大排序后用并查集染色得到. 对于每个询问: $1.x==y$ $ans=0$. $2.x$是$ ...

  6. Linux下安装配置virtualenv与virtualenvwrapper

    一.Linux下安装.配置virtualenv 配置源 #指定清华源下载pip的包 [root@localhost opt]# pip3 install -i https://pypi.tuna.ts ...

  7. mysql连接查询(A表某字段 like B表字段)

    假设有A.B两表 A表中有个字段column_aa B表中有个字段column_bb 如果需要查询出B表中字段column_bb like A表中column_aa字段的纪录,可以使用如下语句 sel ...

  8. pytorch写一个LeNet网络

    我们先介绍下pytorch中的cnn网络 学过深度卷积网络的应该都非常熟悉这张demo图(LeNet): 先不管怎么训练,我们必须先构建出一个CNN网络,很快我们写了一段关于这个LeNet的代码,并进 ...

  9. 小甲鱼Python第十一讲课后习题

    0. 注意,这道题跟上节课的那道题有点儿不同,回答完请上机实验或参考答案. old = [1, 2, 3, 4, 5]new = oldold = [6]print(new) 如果不上机操作,你觉得会 ...

  10. Hibernate(12)_基于主键的双向1对1

    一.基于主键的双向1对1 1.介绍: 基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键. <p ...