nginx反向代理的实现

一、什么是反向代理

在弄清什么是反向代理前,我们先了解下什么是代理,什么是正向代理(如果没有正向代理哪有反向代理,对吧?)

1、代理:

我们日常生活中,特别是商业圈内,有代理商、生产商、渠道商什么的,生产商就是生产哪个产品的,比如我们买个苹果,假如这个苹果是一个农场栽种出来的,那生产商就是农场了,我们买苹果不可能都到农场去买吧,所以就有了一个中间人如水果店,我们可以通过水果店买到苹果,而不需要直接到农场中去买,那这个水果店就充当了代理的角色。代理它本身并不生产某种产品,但我们通过它获得那种产品。(至于怎么获得的,消费者或者需求者不会理会)

2、正向代理

网络中的正向代理和我们生活中的代理很类似,比如,因为某种原因,我们无法使用某个网站(无法访问),比如谷歌,我们可以使用中间的网站或者工具访问目标网站,那这个中间网站或者工具就是一个代理。那我只需要告诉这个代理网站,我想访问哪个网站,然后它就可以把目标网站的信息返回给我。(像不像哪种海外代购??)

那用比较严谨的话来说就是:

正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

3、反向代理

我们在一个网站上获取一些信息,但它本身并没有这个信息,于是它通过其他手段将其他能提供这个信息的网站的信息拿过来(说的不太专业),但对于我们来说,我们并不知道这个第三方网站的存在。因为我们只感觉从这个网站上获取了我们需要的信息。

用专业的话讲:

对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。

二、nginx反向代理的实现

1、实现原理

nginx中使用proxy实现代理功能,实现原理:

如nginx中默认是不解析php脚本的,我们可以把它传递给apache让apache来处理。(那么现在就是这样,用户发起一个请求,如果是静态文件,nginx自身就会处理,如果是php等动态脚本,给传递给apache来处理,然后apache把处理后的结果返回给nginx,这就是一个反向代理的过程,这种处理方式也有一种不专业的说法叫“动静分离”)

2、为什么要将nginx和apache结合呢?

可能有以一几个原因:

  • (1)网站原来是用apache来做web服务器的,但apache处理静态文件效率并不高(相对而言),所以想尝试用nginx来替代它部分功能

  • (2)网站原来的apache有很多配置,与代码的耦合性很高,迁移到其他服务器比较麻烦。

  • (3)网站需要apache的一些功能,并且这些功能的效率比nginx高等。

3、通过配置实现反向代理。
(1)nginx和apache都需要在运行状态。

nginx运行在80端口,用户访问的就是它,apache运行在8080端口,当请求中有php时nginx把这些请求转发给apache处理。

  1. /usr/local/nginx/sbin/nginx
  2. /usr/local/httpd/bin/apachectl -k start
(2)配置apache:
  • 将apache的监听端口调整为8080
  1. Listen 8080;
  • 将ServerName设置为localhost:8080
  1. ServerName localhost:8080
  • 增加索引支持:DirectoryIndex
  1. DirectoryIndex index.html index.htm index.php index.phtml
(3)配置nginx将php请求转发给apache

将请求中有.php的请求转发给127.0.0.1:8080即apache进程处理

  1. location ~ ^(.+.php)(.*)$ {
  2. proxy_pass http://127.0.0.1:8080;
  3. }
(4)重启apache和nginx,在apache的文档根目录建立一个文件news.php

输入:

  1. <?php
  2. echo 'news'.PHP_OS;
  3. ?>

我们访问:http://192.168.18.106

我们看到的是nginx默认的欢迎页,

然后我们说:http://192.168.18.106:8080/news.php

会显示:newsLinux的字样

我们直接访问:http://192.168.18.106/news.php也会显示:newsLinux字样,虽然,nginx文档目录下并没有news.php的这个文件,但同样访问了news.php这个文件,于是实现了反向代理

三、nginx代理模块proxy的相关指令

1、proxy_pass 指向代理服务器的地址

语法:proxy_pass 名称:端口;

这个名称可以是IP地址,也可以是upstream组名,也可以是域名

注:名称前一定要加http://

如:

  1. proxy_pass 127.0.0.1:8080;
  2. upstream webservers{
  3. server 192.168.0.100:8080;
  4. server 192.168.0.101:8080;
  5. }
  6. proxy_pass http://webservers;
2、proxy_set_header 设置代理服务器的头信息

用法 :proxy_set_header 键名 变量值

  1. proxy_set_header Host $http_host;
  2. proxy_set_header X-Real-IP $remote_addr;