Nginx 反向代理基本配置

上一篇关于Nginx的文章介绍了Nginx作为Web服务器的特点以及在Windows系统下搭建Nginx+PHP环境的相关配置。Nginx作为服务器的优点是配置简单,响应快,所以不少大型网站会使用Nginx作为前排服务器,将请求转发到后排的Apache、Squid之类的服务器,这时就需要用到"反向代理"这一特点。本文以一个简单的转发需求为例,讲解搭建反向代理的基本操作。尽管这个例子很简单,但只要理解了工作和配置原理,就能应对更复杂的需求。

 

目的:两个通过路由器连接在同一局域网的系统(本例中为虚拟机)分别安装Nginx、Apache作服务器软件,在安装Nginx的系统上搭建反向代理。

环境:VMWare Workstation 9.0,Win7系统(安装Nginx),WinXP系统(安装Apache)

反向代理概念[1]

先理解正向代理。假设用户A需要访问网站C(这个网站正常工作),但通过浏览器发现访问不到(可能是国外网站,被墙了)。又知有一代理服务器B,A可以访问B,B可以访问C,所以A可以通过B作代理访问C了。这时B作中转站,由A发给C的流量最终从A发向B,B负责转发到C,由C发给A的流量也一样道理,事实上A通过跳板B而访问C;

再看反向代理。假设用户A访问服务器B,要从B网站获取X文件。然而服务器B上没有X文件。这时B充当反向代理,根据配置条件在另一个指定的服务器C(可以在同一局域网,也可以不在)上把X文件取回来,然后返回给A。B作为一个接口服务器,把背后C服务器(不止一个,有可能上百个Server)隐藏起来。用户A需要访问这一群服务器时,统一由B接收请求,根据B的配置从不同的服务器读取需要的数据。从用户的角度看,A并不知道实际访问了哪个服务器,只知道一个服务器B。反向代理通常是基于安全需要,有利于统一化网站。

步骤详解:

 

1. 安装服务器软件

在虚拟机上安装好Win7、WinXP系统。在Win7上安装Nginx[2],在XP上安装Apache(为了方便,本例使用APMServ软件[3])。开启相关服务后(端口均为80),在两个系统的浏览器中访问127.0.0.1(APMServ中可以将默认网站目录的phpinfo.php更名为index.php),能够正常访问即可。

 

2. 配置固定IP

反向代理有根据域名和根据路径两个情况。为了方便,现在先把两个系统的IP固定下来,并绑定两个域名(不需要经过外网DNS,修改hosts文件就可以)。由于两个虚拟机采用桥接的方式连接路由器,所以在路由器的设置后台页面中(192.168.1.1),绑定两个虚拟系统的IP地址(开启DHCP则在固定IP分配中用MAC绑定IP,关闭则在两个虚拟系统中使用静态IP方式连接)。本例中Win7的IP为192.168.1.161,WinXP的IP为192.168.1.160,从DHCP的客户端列表能看到(KavMors客户为主机)。使用DHCP时如果虚拟机无法连接到路由器,尝试先点击【虚拟机->可移动设备->网络适配器->断开连接】断开虚拟机的网卡,再重新连接上。

在实际系统中,通过浏览器访问192.168.1.160和192.168.1.161,可以看到APMServ和Nginx的主页

 

3. 绑定域名

这一步需要把域名和IP绑定起来。域名不需要申请,修改一下hosts文件就可以了。打开hosts文件:C:\Windows\System32\drivers\etc,用记事本打开hosts文件,再结尾的地方把自定义的域名和192.168.1.161对应输入:

注意两个域名都要绑定192.168.1.161这个IP。因为本例需要用Nginx作反向代理,无论是vm-xp.com还是xm-win7.com,都要经过Nginx(1.161)。保存修改后,在浏览器访问这两个域名,都可以访问到Win7中的Nginx。

 

4. 基于域名的反向代理配置

现在作以下假设:虚拟机Win7和WinXp在同一局域网中,但与主机不在同一局域网中(实际上是在的),主机不能访问192.168.1.160但可以通过域名访问192.168.1.161。这时有以下需求:通过www.vm-win7.com可以访问Win7的网站目录,通过www.vm-xp.com可以访问WinXP的网站目录。但由于两个域名都指向Win7的IP,所以要在Win7的Nginx上建反向代理。

在Win7中,从Nginx的目录打开conf/nginx.conf编辑:

4.1  把#37行改为 server_name localhost www.vm-win7.com,表示当域名为localhost或www.vm-wim7.com时,使用这个server区域的配置;

4.2  在第一个server区域结束后(#80行),加入新的server配置,如下图:

server_name表示当域名为www.vm-xp.com时使用这个server的配置,proxy_pass是反向代理的配置语句,表示请求映射到192.168.1.160:80。保存后打开cmd,cd命令进入nginx的目录后,输入nginx -s reload,重启nginx。

在浏览器中分别访问两个域名,可以发现两个域名已经定向到Win7和WinXP的主页了。Nginx反向代理把win7.com的的流量交给自己处理,把winxp.com的流量交给192.168.1.160(VM-XP)的80端口处理。虽然两个域名指向同一IP,但可以访问不同的主机。

 

5. 基于路径的反向代理配置

在第4点中,根据不同域名可从同一IP访问不同的主机。现在作以下假设:只有一个域名www.vm-win7.com,这个域名绑定到192.168.1.161,192.168.1.160不可被实际主机直接访问。需配置一反向代理,当访问www.vm-win7.com/xp/时,访问vm-xp的网站目录,其余路径访问vm-win7的目录。

在Win7中,从Nginx的目录打开conf/nginx.conf编辑:

5.1 在#42行中,插入以下红色框内的内容:

表示访问/xp时映射到192.168.1.160(vm-xp)上,下面三个proxy_set_header参数表示传递头信息参数。保存后打开cmd,cd命令进入nginx的目录后,输入nginx -s reload,重启nginx。

当访问www.vm-win7.com时,可以访问到vm-win7的Nginx目录;访问www.vm-win7.com/xp/时,可以访问到vm-xp的Apache目录。

 

6. 总结

本文讲述了Nginx配置反向代理的基本设置。反向代理可基于域名或基于路径转发,本质上没太大区别,但有条件的话,建议使用基于域名的转发。基于路径会出现网站根目录和域名根目录不对应的情况,如上述例子中,在访问www.vm-win7.com/xp/时,会发现phpinfo页面的图标不能显示(如下图)。

通过审查元素可发现图片被定义到www.vm-win7.com/index.php中,但实际上URL应该是www.vm-win7.com/xp/index.php(改为【src="./index?“】则正常)。而使用基于域名的转发则不存在这种情况。

实际上反向代理的配置还有很多可选参数,也可以与负载均衡联系一起使用。有兴趣可以自行搜索学习,本文就不详细讲述了。

 

参考资料及引用:

[1] 反向代理概念: Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解.
http://www.360doc.com/content/13/1114/12/7694408_329125489.shtml

[2] Windows下安装及配置Nginx: Http服务器基本配置[Windows + Nginx + MySQL + phpMyAdmin].
http://www.cnblogs.com/kavmors/p/4295585.html

[3] APMServ官方网站: 张宴的博客. 《APMServ 5.2.6》:一键快速搭建Apache+PHP+MySQL+Nginx+Memcached+ASP平台的绿色软件.
http://zyan.cc/apmserv/

posted @ 2015-03-23 09:35  KavMors  阅读(15818)  评论(0编辑  收藏  举报