本文为翻译文,原文地址: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. linux 学习笔记 ftp

    server with sites set up for download files sometimes provide an anonymous ftp account 数据传输 ftp 192. ...

  2. DataGrid绑定DataTable出错

    直接用DataGrid.ItemSource = DataTable.DefaultView时会出现以下错误: target element is 'TextBlock' (Name=''); tar ...

  3. 服务端spark gbdt模型计算性能优化

    服务端使用训练出来的模型,spark模型计算第一步是实现spark模型加载. 线上服务对用户体验影响极大,故需要对模型使用进行优化. 1.多线程并发进行计算,线上两个服务.优化cpu 2.在扩召回集, ...

  4. Codeforces.1082E.Increasing Frequency(思路)

    题目链接 \(Description\) 给定\(n\)个数.你可以选择一段区间将它们都加上或减去任意一个数.求最终序列中最多能有多少个数等于给定的\(C\). \(n\leq5\times10^5\ ...

  5. Tarjan求强连通分量 缩点

    强连通分量的定义: 在一张有向图中,如果两个点u,v之间能相互到达则称这两个点u,v是强连通的,在这个基础上如果有向图G中的任意两个顶点都强连通,那么称图G是一个强连通图.有向非强连通图的极大强连通子 ...

  6. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction 并查集

    C. String Reconstruction 题目连接: http://codeforces.com/contest/828/problem/C Description Ivan had stri ...

  7. db2 load报文件系统满

    使用db2 load导入数据 数据量比较大时常常会报文件系统已满错误. 原因分析:导入表建有索引,在load的“索引复制”阶段会从系统临时表空间拷贝到目标表空间,导致系统临时表空间所在的文件系统满,l ...

  8. C#_02.13_基础四_.NET方法

    C#_02.13_基础四_.NET方法 一.方法概述: 方法是一块具有名称的代码.可以通过方法进行调用而在别的地方执行,也可以把数据传入方法并接受数据输出. 二.方法的结构: 方法头  AND  方法 ...

  9. 【搜索】传感器 @upcexam6023

    时间限制: 1 Sec 内存限制: 128 MB 题目描述 SR最近新买了一款电子桌游 这个玩具内部是M个围成一圈的传感器.每个传感器都有开和关两种工作状态,分别用1和0表示.显然,从不同的位置触发沿 ...

  10. GMA Round 1 数列求和(Hard)

    传送门 数列求和(Hard) 在数列{$a_n$}中,$a_1=-\frac{1}{4}$,$\frac{1}{a_{n+1}}+\frac{1}{a_n}=\begin{cases}-3(n为偶数) ...