前言
同事总问我Nginx做反向代理负载均衡的问题,因此特意留下一篇扫盲贴!
直接部署服务器的风险
假设,我开发了一个网站,然后买了一台Web服务器和一台数据库服务器,直接部署到公共网络上。如下图,网站用户通过手机、平板、台式机等终端设备,连上网络,输入 118.178.109.187 这个地址,我的系统就读取数据库,然后直接返回一个网页。
像这种网站部署的方式在今天的网络部署上特别常见。这种部署方式虽然简单、方便,高效,但是也存在着巨大的安全隐患。为什么呢?那是因为我将所有服务器资源都直接暴露在了公共网络上。直接将服务器暴露在网上的风险特别高。据阿里统计,他们每天在全球范围内,会被黑客攻击大概16亿次。是不是很震惊?我的两台服务器在网上裸奔,没有防火墙,没有安全策略,也不知道其他黑客还掌握了哪些漏洞。因此一旦被各种黑客扫描到了,我的服务器就很容易沦为别人的肉鸡,任人宰割。
所以啊,一旦要直接暴露在网上的服务器都应该是具有强大的安全策略来方式被攻击。比如,防火墙策略要做好,漏洞要修补好,端口不要乱开放等等。而且即便是这样,地球上也没有任何人敢保证他的服务器不被入侵。因此,不被入侵是不可能的了!那么我们应该怎么办呢?我觉得应该增加黑客入侵的门槛,以及减少入侵成功之后的收益。这样费力又不讨好的事情,我相信很多黑客是不愿意做的。
那说了那么多,怎么操作呢?我觉得要暴露在公网上的服务器,必须都应该是不存储任何数据的服务器,即便是服务器挂了。用户虽然不能访问了,但是至少数据不会丢失。 所以常用的策略就是,重要的东西尽量放内网。
如下图,手机、平板、台式机等终端设备通过公网访问反向代理服务器。反向代理服务器上有两张网卡,一张网卡是公共网卡,另一张网卡是局域网网卡。反向代理服务器通过将请求反向代理到192.168.1.1这台Web服务器,Web服务器连接局域网的数据库进行SQL查询操作,然后将数据返回给反向代理服务器,反向代理服务器再将数据通过公网传给终端设备。
这种技术就相对安全一点了,因为只有反向代理服务器直接暴露在公网上了,即便是反向代理服务器被攻击了,只要局域网内的其他服务器不被攻击,也损失不了什么。
反向代理
如何理解反向代理呢?就像刚刚那个图,反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
我们从客户端的视野来看,实际上客户端并不知道真实的服务提供者是哪台服务器,它只知道它请求了反向代理服务器。因此反向代理这种方式又对外隐藏了真实服务器的地址,从一定程度上降低了安全隐患。
在Windows上部署nginx实现Web服务器反向代理和负载均衡
本次主要通过一个例子来演示一下nginx。大概流程为,建立三个网站 分别是 192.168.17.69:20001 ,192.168.17.69:20002 ,192.168.17.69:20003 。我们在浏览器上输入 192.168.17.69 的时候,通过 nginx 反向代理这三个站点,并实现负载均衡。
那么先来介绍一下nginx吧!
nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
nginx 的下载地址 http://nginx.org/en/download.html ,我这边使用的是 Windows 版本 nginx-1.14.2 .,下载完之后解压到文件夹,如图:
nginx的常规配置文件为 conf / nginx.conf
我这边已经配置好了一个最基础的反向代理和负载均衡配置:
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65;
#配置 nginx 的站点为 192.168.17.67 ,反向代理 192.168.17.69:20001 , 192.168.17.69:20002 , 192.168.17.69:20003 三个站点,并实现负载均衡 server { listen 80; server_name 192.168.17.69; location / { proxy_pass http://web; index index.html index.htm; } } upstream web { server 192.168.17.69:20001; server 192.168.17.69:20002; server 192.168.17.69:20003; } }
server 表示 nginx 服务监听 192.168.17.69 服务器的 80 端口。进行 http 协议反向代理 web ,web下面有三个站点。多个就实现负载均衡。
配置完 nginx 之后,我们将 nginx 运行起来。使用 dos 命令:nginx.exe 或者 start nginx 都可以:
然后我们来访问一下 192.168.17.69
可以看到,我每次刷新 或者 进入 192.168.17.69 的时候,看到的页面都有些不一样。通过观察,我们可以得知,nginx 将我们的请求进行了反向代理和负责均衡。