一、核心目的
单体架构的问题:
(1)随着用户量的增加,请求量也会增加,软件的性能逐步下降,访问延迟增加
(2)单体架构容易出现单体故障
负载均衡的核心目的:
让客户端的请求合理的、均匀的分发到多台服务器上,由于请求被多个节点分发,使得服务器端的性能得到有效的提升
二、实现方法
(1)基于DNS实现负载均衡
方式:通过域名去访问某个网站的时候,会先通过DNS服务器进行域名解析得到一个IP地址,DNS服务器可以随机的选择IP进行访问,实现目标集群的请求分发。DNS服务器支持就近访问原则,缩短网络通信的距离,提升整个网站的请求效率。
优点:配置简单,实现成本低,不需要额外开发成本
缺点:DNS服务器有多级缓存特性,当去修改IP配置时可能由于缓存导致IP变更不及时影响负载均衡效果。
(2)基于硬件实现负载均衡
硬件负载设备可以简单的理解为一个网络设备,类似于网络交换机,每秒钟可处理百万级请求,同时可以支持多种负载均衡算法,可以非常灵活的配置不同的负载策略,还具有防火墙等安全功能,硬件负载是专业的商业设备,企业不用花专门的经历去维护。
(3)基于软件实现负载均衡
常用的软件负载技术:nginx、LVS、HAProxy等,目前互联网企业绝大部分采用的是软件负载均衡
优点:免费、开源、灵活性比较高
三、作用范围
(1)二层负载
基于MAC地址实现的请求分发,采用虚拟MAC地址实现,服务器收到请求之后,通过动态分配后端服务器的实际MAC地址来响应,实现负载均衡
(2)三层负载
基于IP层实现的请求分发,外部请求访问通过访问虚拟IP,服务器收到请求之后根据后端的实际IP地址实现负载均衡
(3)四层负载
基于请求报文中的目标地址和端口来进行负载的。nginx、F5、LVS都可以实现四层负载
(4)七层负载
基于应用层的负载,服务器端可以根据http协议中请求的报文信息,来决定请求分发到哪个服务器上。比如可以根据cookie、消息体、ResquestHeader等信息去做分发
四、常用负载均衡算法
1.解释
决定当前请求匹配到目标服务器的具体哪个节点的算法
2.方式
(1)轮询:多台服务器按照顺序轮询方式,每个服务器可以获得相同的请求次数
(2)随机:根据随机算法,每一台服务器获得的请求次数随机
(3)一致性HASH:对于有相同HASH码的请求,永远发到同一台服务器上
(4)最小连接数:根据目标服务器的服务数量决定分发数
五、Nginx
(一)基本概念
(1)一个高性能的HTTP和反向代理web服务器
(2)同时也提供了IMAP/POP3/SMTP服务
(3)特点:占用内存少,并发能力强
(4)Nginx提供的负载均衡策略:内置策略(轮询、加权轮询、Ip hash)和扩展策略
(5)动静分离:在软件开发中,有一些请求是不需要经过后台处理的(CSS\HTML\JPG\JS等文件),这些不需要经过后台处理的文件称之为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做了拆分以后,就可以根据静态资源的特点将其做缓存操作,提高资源响应的速度。
(二)常用命令
(三)实践
全局配置、events、http三个大模块
配置解释:监听80端口,当请求根目录时,会根据location中的反向代理proxy_pass配置 http://自定义名称A,代理到8080和8081,因为两个端口的权重 weight=1是一样的,则会按序轮询。
#负载均衡
upstream 自定义名称A{
#服务器资源
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight =1;
}
server{
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
#反向代理
proxy_pass http://自定义名称A
}
}
扩展:代理概念
1、正向代理
(1) 定义
正向代理是一种位于客户端和目标服务器之间的服务器。客户端通过正向代理服务器发送请求,代理服务器再将请求转发给目标服务器。目标服务器的响应同样通过代理服务器返回给客户端。
(2)工作流程
(1) 客户端向正向代理服务器发送请求。
(2)正向代理服务器将请求转发给目标服务器。
(3) 目标服务器处理请求并将响应返回给正向代理服务器。
(4) 正向代理服务器将响应返回给客户端。
(3)用途
(1)访问控制:可以通过正向代理限制客户端访问某些网站或资源。
(2)缓存:代理服务器可以缓存常用资源,减少重复请求,提高访问速度。
(3)匿名访问:隐藏客户端的真实IP地址,从而实现匿名访问。
(4)内容过滤:可以过滤不良内容或广告。
2 反向代理
(1) 定义
反向代理是一种位于目标服务器和客户端之间的服务器。客户端直接向反向代理服务器发送请求,反向代理服务器将请求转发给内部的目标服务器,并将目标服务器的响应返回给客户端。
(2)工作流程
(1) 客户端向反向代理服务器发送请求。
(2)反向代理服务器将请求转发给内部的目标服务器。
(3) 目标服务器处理请求并将响应返回给反向代理服务器。
(4) 反向代理服务器将响应返回给客户端。
(3)用途
(1)负载均衡:将请求分发到多台服务器上,均衡负载,提升性能。
(2)安全性:隐藏内部服务器的真实IP地址,保护内部服务器,防止直接攻击。
(3)SSL终端:反向代理服务器可以处理SSL加密,减轻内部服务器的负担。
SSL相关知识: link
(4)缓存:缓存静态内容,提高访问速度。
3 正向代理和反向代理的区别
正向代理:代理服务器为客户端服务,客户端知道代理服务器的存在,主要用于客户端访问外部资源。
反向代理:代理服务器为服务器端服务,客户端不知道代理服务器的存在,主要用于保护和优化服务器端资源。用户无感知!
六、 Nginx常见面试题
关键词:高并发、反向代理、负载均衡、事件驱动
Nginx如何实现高并发
(1)事件驱动模型:Nginx使用事件驱动的架构,主要使用epoll或kqueue等事件模型,使得nginx能够在单个线程内有效的处理大量并发连接,而不需要为每个连接创建一个新的线程或进程
(2)异步非阻塞机制:一个线程可以在等待I/O的同时继续处理其他请求,而不会被阻塞
(3)复用连接:Nginx能够在单个连接上同时处理多个请求,这种特性被称为keeplive,通过保持TCP连接的开放状态,多个请求可以在同一连接复用
(4)高效的内存管理:Nginx通过预分配一块内存池,然后按需从中分配内存 ,避免了频繁的内存分配和释放,减少了内存碎片
(5)精简的代码和模块化设计
(6)高效的反向代理和负载均衡
(7)静态缓存文件和压缩:支持静态文件的缓存和压缩,减少了对后端服务器的访问和请求,提高了静态资源的访问速度
Nginx的使用场景
(1)web服务器:作为静态文件的web服务器
(2)反向代理服务器:接受客户端请求并将请求分发给后端服务器
(3)负载均衡器
(4)HTTP缓存代理:缓存静态文件和动态内容,可以加速对重复请求的响应,通过缓存机制,可以减少后端服务器负担
(5)SSL/TLS终结:可以终结SSL/TLS连接,负责加密和解密通信
(6)容器化应用代理:通过反向代理和负载均衡处理容器之间的通信,提供服务发现和动态配置
(7)静态文件服务器
(8)API网关
(9)反爬虫和安全防护
(10)动态web应用的代理
Nginx如何处理静态内容和动态内容
nginx本身非常擅长处理静态内容,可以直接将静态文件(如HTML/CSS等)直接作为HTTP响应返回给客户端。对于动态内容,nginx通常会配置为反向代理,将请求转发给后端应用服务器(Tomcat/Apache)等,由后端服务器处理动态请求并生成内容。
解释Nginx中的location指令
location指令用于定义nginx如何响应特定的请求URL。location指令可以匹配请求的URL,并根据不同的匹配结果,应用不同的配置,如代理设置、重写规则或返回不同的内容。
Nginx配置文件的结构是什么样的
nginx的配置文件通常以nginx.conf为主配置文件,它的结构包括events块、http块以及可选的mail块。events块配置与连接处理相关的参数;http块配置与HTTP服务相关的参数,包括服务器列表、负载均衡配置、MIME类型定义、日志定义等;mail块用于邮件代理服务器。
如何在Nginx中启用HTTPS?
在nginx中启用HTTPS需要配置SSL证书和私钥,并在server块中设置监听443端口并启用SSL。需要指定ssl_certificate和ssl_certificate_key指令来指定证书文件和私钥文件的路径。举例说明:
(1)第一个server监听80端口(HTTP),并将所有请求重定向到HTTPS(443端口),
- 301 表示这是一个永久重定向。在HTTP协议中,301状态码代表“永久重定向”(Moved Permanently)。当一个客户端(如浏览器)收到301状态码时,它会理解请求的资源已经被永久移动到了新的URL,并且将自动重定向到这个新的URL。
- 指定了重定向的目标URL,其中 $ host 是请求的主机名,$ request_uri 是请求的URI(包括查询字符串)。
(2)第二个server监听443端口,并启用SSL
- ssl_certificate 指令指定SSL证书文件的路径。
- ssl_certificate_key 指令指定SSL证书私钥文件的路径。
(3)可选的SSL配置
- ssl_protocols指定允许的SSL/TLS协议版本:TLSv1.2 TLSv1.3
- ssl_ciphers:指定允许的加密算法
- ssl_prefer_server_ciphers on; 强制服务器优先选择其配置的加密算法。
server {
listen 80;
server_name example.com www.example.com;
# Redirect all HTTP requests to HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
# Root directory and index file
root /var/www/html;
index index.html index.htm;
# Location block to handle requests
location / {
try_files $uri $uri/ =404;
}
# Optional: Logging
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
}
Nginx如何处理请求
Nginx基于事件驱动模型和非阻塞的方式来处理请求。客户端的请求先由master接收,然后master进程根据配置分配给一个或者多个worker进程。worker进程监听端口并接收新的请求,处理请求,并将结果返回给客户端。
如何在Nginx中实现IP黑名单
在Nginx中实现IP黑名单可以通过配置allow和deny指令来完成,在需要限制的location或者server块中,使用deny指定不允许访问的IP,allow指定允许访问的IP。
扩展:如何实现IP黑名单
(1)linux防火墙:sudo iptables -A INPUT -s <IP_ADDRESS> -j DROP
(2)Windows防火墙 :直接设置
(3)Apache配置:Apache配置文件(如.htaccess或httpd.conf)中添加以下内容:
<RequireAll>
Require all granted
Require not ip <IP_ADDRESS>
</RequireAll>
(4)Nginx配置:Nginx会按序检查
server {
listen 80;
server_name yourdomain.com;
location / {
deny <IP_ADDRESS>;
allow all;
}
}
(5)代码实现
(6)数据库存储
Nginx 如何实现防止 DDOS 攻击
Nginx 可以通过配置限制来抵抗 DDOS 攻击,例如:
- 限制连接速率(limit_req 模块)
- 限制并发连接数(limit_conn 模块)
- 配置防火墙规则来拦截异常流量
- 使用第三方模块如 ngx_http_limit_req_module 来限制请求频率
- 启用 fail2ban 等工具来动态地添加攻击源 IP 到防火墙黑名单
Nginx 与 Apache 相比有什么优势和劣势
Nginx 的优势在于处理静态文件、高并发连接时性能较好,内存消耗低,配置灵活,并且适合作为负载均衡器和反向代理。Apache 的优势在于模块众多,社区支持强,文档齐全,而且对 .htaccess 文件的支持使得在不具有服务器配置文件写权限的环境下进行配置变得容易。Nginx 的劣势是模块相对较少,而且对动态内容的处理通常需要与后端服务器结合。Apache 的劣势是在高并发环境下性能可能不如 Nginx,并且内存消耗相对较大。