Nginx是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验
安装详细步骤参照这篇博客https://blog.csdn.net/weixin_44757206/article/details/106558864
Nginx 不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。那什么是正向代理呢?
正向代理: 如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理
简单来说: 正向代理类似我们想要访问国外的Google服务器,但是由于访问限制,我们需要找一个代理去访问。换句话说,客户端明确知道要访问的服务器的地址,客户端把请求发送给代理,代理转发给服务器,服务器把响应传给代理,最后代理把响应传给客户端。我们可以看到客户端知道服务器是谁,但是服务器并不知道客户端是谁,这就是正向代理,隐藏了客户端的真实信息。
反向代理是Nginx一大重要特点,理解了正向代理,那么反向代理又是什么呢?
反向代理: 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址
简单来说: 反向代理类似我们访问淘宝,由于访问量巨大,淘宝会使用许多台服务器(就是分布式服务器)来支持,但是每个客户端的请求到底由哪一台服务器来响应,我们并不知道。换句话说,客户端并不知道要把请求发送给具体哪一台服务器,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据。可以看到,客户端并不知道他访问的服务器是谁,这就是反向代理,隐藏了服务器的真实信息。
做个简单案例来理解反向代理,并简单了解一下反向代理如何来配置
案例设计: 在linux系统上装两个tomcat,通过端口不一样来模拟两个服务器,在两个tomcat中分别放入两个资源,通过访问Nginx来转发到不同的tomcat,我们只需要知道我们需要访问的资源,但是不知道具体的服务器,是不是就是反向代理了呢
案例准备:
在/usr/src目录下创建两个文件夹 tomcat8080、tomcat8081
然后将tomcat的压缩包下载到两个目录中
链接:https://pan.baidu.com/s/1kA0OEpopJ2T533PewKJjaA
提取码:nbnd
1.进入tomcat8080解压tomcat
tar -xvf apache-tomcat-7.0.70.tar.gz
2.进入tomcat并启动,这样8080端口的就启动了
cd apache-tomcat-7.0.70/
cd bin
./startup.sh
3.进入tomcat8081解压tomcat
4.首先要配置该tomcat的端口为8081,编辑service.xml
cd apache-tomcat-7.0.70/
cd conf
vim server.xml
修改这几处即可
5.启动8081端口的tomcat
6.将访问的资源放入两个tomcat的webapps下
案例配置: 来到nginx/conf目录,编辑nginx.conf
- listen 9001 表示监听9001
- location 后面的代码表示,请求包含/edu/和/vod/就分别转发到8080、8081的tomcat
启动Nginx
cd sbin
./nginx
前言: 客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?
我们首先想到的可能是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?
上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
案例设计: 还是访问刚刚两个端口,分别在两个tomcat的webapps下放入相同的文件名,当我们访问时,会轮流访问两个服务器
配置nginx:
1.配置nginx.conf
cd /usr/local/nginx/conf
vim nginx.conf
./nginx -s reload
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除
2、weight
weight 代表权,重默认为 1,权重越高被分配的客户端越多
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:
3、ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。 例如:
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
动静分离: 简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。
动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。
Keepalived+Nginx(主从模式)
:即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。
Keepalived+Nginx(双主模式)
:即前端使用两台负载均衡服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。这种方案,经济实惠,非常适合于当前架构环境。