1,首先聊聊什么Nginx?
Nginx 是一个高性能的HTTP和反向代理web服务器,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx部署在性能较好的服务器上,并发能力可以达到5W以上。
Nginx完全开源,并且有很多基于Nginx二次开发的工具,性能更强。
Nginx是一个反向代理的web服务器,就是作为客户端请求入口的存在
Nginx提供了非常丰富的负载均衡策略
Nginx提供了动静分离策略,可以将动态资源转发给Tomcat,静态资源直接去本地找
Nginx最大的特点就是并发能力强,占用内存低,并且可以实现7*24小时不间断运行
2,为什么要用Nginx,如果不用Nginx的现存问题是什么?
在上面介绍了Nginx的好处之后,对Nginx优势有了解了,在企业中实际项目如果不用Nginx会存在的问题大体如下:
在单体架构服务搭建集群后,客户端请求没有统一的入口
在单体架构服务搭建集群后,如果尽量打散客户端的请求
Tomcat中既部署静态资源,又部署动态资源,导致Tomcat压力太大
Tomcat作为处理业务的服务器,并发能力比较差
3,了解了Nginx之后,接下来就是实际搭建Nginx并且演示Nginx的反向代理和负载均衡两大功能。
这里采用Docker搭建Nginx,用docker-compose.yml文件进行管理
docker-compose.yml 简单配置一下
注意,添加数据卷,映射容器内部的/etc/nginx/conf.d
目录,方便修改路由规则配置 。
version: '3.1'
services:
nginx:
image: nginx:1.22
container_name: nginx
ports:
- 80:80
volumes:
- ./conf.d/:/etc/nginx/conf.d/
4,了解一下Nginx的配置文件:
5,接下来需要在映射的文件中conf.d创建一个后缀名为 .conf的文本,主要是在这个文本中配置代理和集群,注意在文本中要搭建集群就得在upstream中配置
upstream minios{
server 120.76.159.196:8081;
server 120.76.159.196:8082;
}
server{
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html/;
index index.html;
}
location /read {
proxy_pass http://minios;
proxy_redirect default;
}
location /up {
proxy_pass http://120.76.159.196/8083;
}
}
6,了解一下:Nginx中的路径匹配规则
7,配置完文本之后,启动容器,接下来就直接演示集群环境下,这里启动了2个Springboot的(端口号不同)项目,
相端口号为8081,8082。
如图所示:
1,SpringBoot项目注意打成jar包,并且需要在maven里配置如下所示
<build> <finalName>serve2</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin> </plugins> </build>2,在linux上项目后台运行,执行日志存储在一个文本中,指令如下:
nohup java -jar serve2.jar >output2.log 2>&1 &
3,启动过程中遇到端口号占用情况,则需要关闭端口,指令如下:
netstat -ntlp | grep 8082 (找到端口对应的进程号)
kill -9 366721 (杀掉进程)
测试: http://120.76.159.196/read (这里不用写端口号) 不停的请求这个地址,集群默认采用轮询策略,效果如下:可以看到是一个轮询访问的状态
第一次请求
第二次请求
8,Nginx的集权下的访问策略很多,默认是采用轮询策略,基本上实际工作当中也是采用默认的轮询策略,接下来了解一下Nginx的轮询策略
1,轮询策略:默认情况下,Nginx的负载均衡策略就是轮询,不需要添加额外的配置。
轮询权重:在服务器配置不一致时,应当选择轮询权重策略,根据服务器配置的不同,或者应用的处理能力不同,设置不同的权重值,设置请求分发的比例。
upstream tomcats {
server 192.168.41.41:8081 weight=200;
server 192.168.41.41:8082 weight=50;
}
2,ip_hash
:根据客户端请求的ip地址,确定请求转发到哪台服务器,只要ip不变,路由的服务器就不变。但是很多JVM缓存同步的问题,依然无法处理
upstream tomcats {
ip_hash;
server 192.168.41.41:8081;
server 192.168.41.41:8082;
}
3,fair
:根据响应时间权重,根据服务器的响应时间决定请求转发的策略
upstream tomcats {
fair;
server 192.168.41.41:8081;
server 192.168.41.41:8082;
}
4,url_hash
:根据请求路径转请求转发
upstream tomcats {
hash $request_uri; hash_method crc32;
server 192.168.41.41:8081;
server 192.168.41.41:8082;
}
9,Nginx配置使用https过程?
具体详细参考传送门:https://blog.csdn.net/qq_30665009/article/details/121434442
总结需要做的事儿:
1,nginx需要安装ssl模块
2,需要ssl证书,分别是ssl证书的pem文件和key文件,后缀分别为 ( .crt )( .key )
3, 将证书在nginx.con文件中引起即可,注意监听443端口
10,Nginx处理高并发原理
1,Nginx通过使用异步非阻塞I/O模型来实现大量并发连接的处理,异步非阻塞I/O模型则通过使用事件驱动的方式,让服务器在等待I/O操作完成时同时处理其他连接。当某个I/O操作完成时,服务器会收到一个事件通知,然后再处理该连接。这种模型可以让服务器在同一时间内处理多个连接,从而提高并发性能。
11,Nginx选择异步非阻塞的方式来处理请求,主要是基于以下几个原因:
1,高并发性能:异步非阻塞的方式可以让Nginx同时处理多个请求,而不是按顺序逐个处理。这种方式可以大大提高服务器的并发性能,使其能够处理更多的并发连接。在高并发场景下,Nginx能够高效地处理请求,保持较低的延迟和响应时间。
2,资源利用率:异步非阻塞的处理方式可以有效地利用服务器资源。在传统的阻塞模型中,每个请求都需要等待I/O操作完成,这会导致服务器资源(如CPU、内存)的浪费。而异步非阻塞模型可以让服务器在等待I/O操作完成时同时处理其他请求,提高了资源利用率。
3,可扩展性:异步非阻塞模型具有更好的可扩展性。在传统的阻塞模型中,服务器处理请求的能力受限于单个线程或进程的处理能力。而在异步非阻塞模型中,Nginx可以通过增加worker进程数或调整事件循环机制来提高并发处理能力,以适应更高负载的需求。
4,可靠性:异步非阻塞模型还有助于提高系统的可靠性。在阻塞模型中,如果某个请求长时间等待I/O操作完成,会导致整个服务器线程或进程被阻塞,从而影响其他请求的处理。而在异步非阻塞模型中,即使某个请求出现阻塞,也不会影响到其他请求的处理,提高了系统的可靠性。
多路复用IO:
1,多路复用IO是指利用单个线程来同时监听多个文件描述符(socket连接等),并在某个文件描述符可读、可写时得到通知,从而避免无效的等待CPU资源。它主要用于网络编程中对多个客户端连接的处理,可以提高服务器的吞吐能力。
2,在实际应用中,多路复用IO的实现需要使用一些系统调用,如Linux中的epoll等。这些系统调用将多个文件描述符集合起来,并使用一个统一的数据结构(例如红黑树等)来管理这些文件描述符的状态,以便在需要时能够快速地找到可用的文件描述符。
3,多路复用IO可以有效地解决大量连接的问题,它通过减少线程切换和系统调用的次数,提高了程序的效率和响应速度。同时,多路复用IO也使得程序可以更好地利用多核CPU的并行计算能力,从而提高了服务器的整体性能。
好啦,Nginx的基本了解和应用就到此结束了...