南琴浪 发表于 2018-1-5 14:39:49

【Nginx 反代】看到 loc 很多问这个的,所以转过来

原帖地址: https://sometimesnaive.org/article/website/nginx/elementary/reverse-proxy

站点现在在维护,所以之后把内容贴过来吧...

南琴浪 发表于 2018-1-5 15:44:13


Nginx 基础教程(二)反向代理

2018-01-04
站点相关►Nginx►基础教程
本文共计 1,118 字,预计阅读 29 分钟

文章目录

    反向代理和源站的区别
    配置项的组成
    基本配置
    进阶配置

这是Nginx 基础教程系列的第二篇文章。本文介绍 Nginx 作为反向代理的基本用法。
反向代理和源站的区别

首先有必要说明下:反向代理 和 源站 的区别

对于一个网站所包含的内容(数据)来说:如果你就是源站,网站的所有数据的第一手来源都是你,所有响应的数据都由你决定;而如果你的网站只是一个反向代理,那么你的网站的数据就来源于被你反代的那个网站,虽然你可以对反代来的这些数据进行更改后再作为响应返回给客户,但是网站数据的第一手来源不是你。

以上所述区别,在 Nginx 配置文件上的体现,这里仅举出下列几个例子:

    root 与 proxy_pass
    add_header 与 proxy_set_header
    buffer 与 proxy_buffer

配置项的组成

Nginx 作为反向代理时的配置项,可以含有以下的基本组成部分:

    proxy_pass
    proxy_redirect
    proxy_set_header
    proxy_hide_header
    sub_filter
    proxy_cache
    proxy_buffer
    其它等等

其中,proxy_pass 是必选项,作用是指定你要反代的网站,值的含义是 scheme+host+port,例如 proxy_pass https://www.google.com:443;。

proxy_redirect 可选项,指定是否允许对源站的 host 进行 rewrite,值为 on 或 off,例如 proxy_redirect off;。

proxy_set_header 可选项,作用是对 http request header 进行修改后,发送给源站。

proxy_hide_header 可选项,作用是不将来自源站的指定的 header 返回给客户,即隐藏来自源站的 header。

sub_filter 可选项,替换源站数据中的指定字符串。

proxy_cache 可选项,对反代后返回的数据进行缓存。使用方法请看我的这篇文章:Nginx 启用 proxy_cache 缓存。

proxy_buffer 可选项,对反代启用 buffer 区缓存。使用方法请看我的这篇文章:Nginx 启用 proxy_buffer 缓冲。
基本配置

上文已提到,Nginx 作为反向代理时,只有一个必需项 – proxy_pass。所以,以反代 github 为例,最简单的站点配置就可以写成这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

      

server {
      # 监听端口,其实可以随意
      listen80;
      # 你的反代的域名
      server_name你的反代的域名;
      # 记录访问日志
      access_log   /home/site/access.log;
      location / {
                proxy_passhttps://github.com;
      }
}

进阶配置

上文所述的基本配置,对于 Nginx 的配置来说的确已可行。但在实际使用过程中,这样只有一行 proxy_pass 的反代可能会遇到各种麻烦。所以这时就需要一些增强功能,那就是上文提到的可选项。

最常见的可选项就是 proxy_set_header 了。这里介绍它的用法。

上文已提到,proxy_set_header 的作用是对 http request header 进行修改后,发送给源站。

在常见的网站访问中,HTTP 过程通常包括了 request header 和 response header 两部分的响应头。客户对网站发出访问请求时,会对网站发送 request header;而网站向客户返回网站内容时,会对客户发送 response header。那么,proxy_set_header 就是适用于前者的情况。

来举个例子:

1

      

proxy_set_headerHost "github.com";

当你访问一个 github 的反代网站时,你对这个网站发出的 request header 的 Host 的值就是你的这个反代站点的 host,你的 Nginx 反代会将这个值原封不动的发送给 github。而当我在 Nginx 上写入上述一行配置后,你的 Nginx 反代发送给 github 源站的值就不再是你的这个反代站点的 host 了,而是会更改为我指定的 github.com 这个值。这样做的好处就在于能避免源站因为 request header Host 的值不是源站的 host 而将你判定为异常流量这种问题的发生。

那么,根据以上所述,我可以写一个加入了 proxy_set_header 部分后的 github 反代:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

      

server {
      # 监听端口,其实可以随意
      listen80;
      # 你的反代的域名
      server_name你的反代的域名;
      # 记录访问日志
      access_log   /home/site/access.log;
      location / {
                # 指定我要反代的网站是 github
                proxy_passhttps://github.com;
                # 修改 request header Host 的值
                proxy_set_headerHost                        "www.google.com";
                # 修改 request header Referer 的值
                proxy_set_headerReferer                https://www.google.com;
                # 修改 request header remote_addr 的值
                proxy_set_headerX-Real-IP                $remote_addr;
                # 修改 request header user_agent 的值
                proxy_set_headerUser-Agent      $http_user_agent;
      }
}

关于反向代理更完全的配置,我之前写过 Nginx 反代谷歌的系列教程,结合 这篇文章 一起阅读后,就能对 Nginx 的反代有一个基本的掌握了。
本文可能过时失效,若需更新,请留言
本博客文章均为原创,转载请注明来源

oilbit 发表于 2018-1-5 20:09:14

这个必须顶一波
页: [1]
查看完整版本: 【Nginx 反代】看到 loc 很多问这个的,所以转过来