随着互联网的发展,用户的大量产生,一些大型网站迅速崛起,如京东,淘宝,抖音。
伴随着业务量和数据的增加,一台服务器已经不能满足这些大型网站的运行,为了达到高性能、高可用、高安全等特性的需求,现代网站的架构也需要不断的发展。
网站架构的基础由应用程序、数据库、文件组成,最开始这些都在一台服务器上,随着需求的变化我们如今的网站架构已经将应用、数据、文件都由部署在了独立的服务器上,并且每个部分都做了强大的优化设计,其中Nginx起到重要的作用:
一、Nginx可以做反向代理
1、什么是正向代理
正向代理,代理的是用户,类似一个跳板机,代理访问外部资源,如我们要在国内访问谷歌,直接访问不到,就可以通过向正向代理服务器发请求,代理服务器能访问到谷歌,这样我们就能访问到了。
2、什么是反向代理
反向代理,代理的是服务器,此时的代理服务器是接受internet上的连接请求,转发给内部网络上的服务器,并从服务器上得到的结果返回给请求连接的客户端,此时的代理服务器对外表现为一个服务器,并不是真实提供服务的服务器。
反向代理是以“欺骗IP”的形式产生新的IP地址供用户访问,这样的优点有:IP地址不可见、提高安全性、做缓存。它可以隐藏后端服务器的数量,并且保证后端服务器免受攻击。
1、Nginx作为负载均衡器
在当代最先进的网站架构中,应用程序已经根据业务搭建了分布式服务框架,并且通过负载均衡服务器对用户的请求根据分发策略分发到不同业务服务器节点,这样加大了应用服务器的承担量,通过Nginx可以配置几台服务器,共同分摊流量,实现负载均衡,常用的轮询和权重策略。
2、在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器。
负载均衡用于从“upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求。一个最基本的upstream模块是这样的,模块内的server是服务器列表
在upstream模块配置完成后,要让指定的访问反向代理到服务器列表:
负载均衡策略包括轮询(默认)、权重、依据IP分配、最少连接、响应时间、依据URL分配。
3、Nginx可以做动静分离
在用户请求的数据中包括静态数据,如:css、js、png等文件,这些静态数据交给Nginx处理效率非常高。
动态数据如:xhr、查询数据库或者进行一些数据运算等直接由后端Tomcat处理,这就是我们常听到的Nginx+Tomcat动静分离技能。
这样的动静分离技能能够加快加载速度,提高用户体验。
实现动静分离,其实就是在反向代理的时候,如果是静态资源,就直接从 Nginx发布的路径去读取,而不需要从后台服务器获取了。
但是要注意,这种情况下需要保证后端跟前端的程序保持一致,可以使用Rsync做服务端自动同步或者使用NFS、MFS分布式共享存储。
下面举例简单操作:
后端服务
写一个简单的 “Hello World” 项目并启动,端口为 8080:
实际应用中的动态请求通常会涉及相关资源的调度,这里我们简化该过程,假设后端服务进行了一系列运算,最后返回字符串 “Hello, world!”。
配置 Nginx
打开 nginx.conf 配置文件,在 server 块中添加如下内容:
动态请求
浏览器中输入 localhost/hello 得到如下响应:
这里我们并没有指定端口,因为 HTTP 的默认端口就是 80,而 Nginx 配置文件中也监听了 80 端口,真实的请求为 localhost:8080/hello
静态请求
浏览器中输入 localhost/img,得到如下响应:
上图中列举出了 /img 目录下的文件,这是因为配置文件中设置了 autoindex on;,它表示打开目录浏览功能。
浏览器中输入 localhost/img/test.png,得到如下响应:
浏览器中输入 localhost/html/test.html,得到如下响应:
上述操作中,我们实现了静态请求和动态请求的分离,当访问静态资源(如 html 和图片)时,请求并不会到达 “Hello World” 后端服务,
而是从静态资源服务器(这里是本机)中获取资源,当访问 localhost/img/test.png 时真实的请求为localhost:80/usr/data/img/test.png。
Nginx是由俄罗斯人发明的一款高性能的web服务器,除了web服务器的功能以外,还有上述中在网站框架中的重要作用,因此它受到各企业用户的青睐,成为全球最热门的网站所使用的web服务器中稳居首位。