Nginx 简述
Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。
代理服务器和VPN
代理服务器
所谓代理服务器,是一个“中间人”的角色,在你和服务器之间传递数据。相当大比例的代理服务器可以以网站的形式存在,你只需打开代理服务器的网站,然后输入你希望访问的链接,就可以像平时浏览网页一样操作了。代理的工作原理是:由代理服务器自己去访问你的目标网站,并加载它的内容,然后再把这些加载过的内容传递到你的窗口上。这样就相当于你在浏览目标网站了。因此代理经常被叫做“梯子”或者“桥”。
使用代理的好处是,你不需要直接链接到目标网站,因此目标网站就无法获取你的IP地址,取而代之获取的是代理服务器的IP地址。这样你就可以隐藏你的位置信息了。 当你访问大多数代理服务的时候,他们通常会要求你选择一个代理服务器所在的国家。你可以通过对应国家的代理服务器访问目标网站,这样目标网站就会认为你是在对应国家进行访问的。 比如,如果你想要访问的网站屏蔽了你所在的国家,那么你可以用代理服务器换上其他国家的IP,只要代理服务器所在的位置不在屏蔽范围之内,你就可以通过代理服务器实现访问了。
VPN
VPN英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”。它可以通过特殊的加密的通讯协议在连接在Internet上的位于不同地方的两个或多个企业内部网之间建立一条专有的通讯线路,就好比是架设了一条专线一样,但是它并不需要真正的去铺设光缆之类的物理线路。
正向代理和反向代理
正向代理(代理服务器相当于客户端)(内网访问外网)
正向代理类似一个跳板机,代理访问外部资源。比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服务器,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了。
为什么使用正向代理
- 一是出于安全审计及控制方面的一些考虑。 在一些组织内,web 相关的端口如 80 及 443 是被封禁的,你在里面直接是根本上不去网的,这时你要想上网,就只能配置组织为你指定的一台内网的代理服务器了;
- 还有一些原因则是出于加速或节省带宽等的考虑。因为有的代理服务器它不仅能转发,还能对网页以及其它一些资源进行缓存;
- 由于国家已经决定,有些国外的技术网站是访问不了的,而我们又想上去查阅资料解决手中的 bug,这时就需要一些科学的手段,直接访问不行,就必须通过代理来”曲径通幽”了。
反向代理(代理服务器相当于服务器)
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
为什么要使用反向代理(Nginx功能)
- 最重要的:负载均衡
可以利用反向代理可以作为内部 负载均衡(load balance) 的手段。举个例子来说, 假如我现在开发了一个 java web 的应用作为我的网站后台,我直接部署它到 tomcat 服务器上,让 tomcat 监听 80 端口,直接对外服务。一开始访问量也不大,所以这样也是没有问题的,如下图所示:
但过一段时间之后,访问量可能上来了,一个 tomcat 进程处理不过来,那怎么办呢?于是我打算再起一个新的 tomcat 进程,但这样就面临一个问题,只有一个 80 端口,它已经被第一个 tomcat 进程占用,如果还要再起另外一个,则只能选用其它的端口,比如 8080。
当使用另外一个端口时,确实可以启动两个 tomcat 的进程,但用户想访问到第二个 tomcat 进程的服务,却要这样去访问: http://xiaogd.net:8080。显然,这样的方案是有问题的,用户根本不知道 8080 端口上服务的存在,就算你有办法告诉用户,用户也可能不太理解,用户同时也很怕麻烦的,为啥要我输入一个冒号加 8080 呢?此外,就算有些用户愿意如你所说转向访问 8080 端口,你还是不能很好的控制把访问量平均地分配在两个 tomcat 上,毕竟这是用户随机决定的,也许很多用户又突然涌过来了 8080 端口的应用上,造成了这边的拥挤。又或者只有很少的用户愿意听从你的劝告转到新的 8080 端口上,访问还是集中在旧的 80 端口上的,这样旧的应用上响应还是很缓慢,而新的应用却因为没几个用户访问而显得空闲,没有得到充分的使用。
那么,在这种情况下,反向代理的好处就体现出来了,具体的操作是这样的,让 Nginx 作为一个前置的反向代理,监听在 80 端口上;而第一个 tomcat 则躲到幕后,同时它也不再监听 80 端口(需要让给 Nginx),而改为监听一个其它没有被使用的端口,比如 8081,然后让 Nginx 转发请求给它处理。此时,如果同时涌入了很多请求,Nginx 会把一半的请求交给 8080 端口上的 tomcat,另一半的请求交给 8081 端口上的 tomcat,如下图所示:
对外来看,所有请求还是 Nginx 来处理,用户不需要去做选择,也不需要知道什么 8080、8081 端口上应用的存在,他们还是继续访问原来的网址 http://xiaogd.net 即可,无需做任何改变。如果你在云上有好几台主机,甚至还可以将其组成一个内网,然后将 tomcat 部署在不同的主机上。比如有三台主机的话,一台运行 Nginx 监听 80 端口,其余两台运行 tomcat,分别监听 8080 和 8081 端口,同时接受并处理 Nginx 反向代理过来的请求,如下图所示:
还可以通过tomcat主机的性能调整负载的比例。在这种反向代理的模式中,同样的,生成网页这个重任交到了隐藏在背后的 tomcat,生成一个复杂的动态网页可能需要经过一些复杂的计算,要查询数据库,要拼凑各个页面组件,可能会比较耗时,但这些请求被两个 tomcat 应用并发地处理了,因此响应的速度还是得到了保证,而这些就是反向代理能给我们带来的好处。
- 也可以提高响应速度,反向代理服务器也可以提供缓存服务
- 正向代理可以隐藏客户端IP,反向代理可以隐藏服务器的IP
- 反向代理服务器可以作为应用层防火墙,为网站提供防护功能。还可以有一些特殊的处理,比如为后端服务器统一提供加密、HTTP访问认证等。