1.基本概念:
1.1什么是nginx?
官网:nginx.org
中文网:nginx.p2hp.com
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,公开版本1.19.6发布于2020年12月15日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2022年01月25日,nginx 1.21.6发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
1.2 nginx作用
1.2.1 基本的web服务器
web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。
Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl,php。但是不支持javajava程序只能通过与tomcat配合完成,Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率能经受高负荷的考验,有报告表明能支持高达5000个并发连接数。
1.2.2正向代理服务器
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
速记:正向代理主要是害户端配置的代理,侧重的是客户端通过代理解决问题,例如过波资源。隐威客户端ip等。
1.2.3 反向代理服务器
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的谷源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务品的前置机来降低网络和服务器的负我,提高访问效率。
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何尼置就可以访问。我们只 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,晃露的是代理服务器地址,胞藏了真实服务器 1P 地址。
其中典型的应用就是接下来学习nacos集群或gateway集群的时候,需要使用反向代埋进行负载均衡。
速记:反向代理主要是服务器配置的代理,侧重的是通过反向代理实现负载均衡和隐藏服务端真实访问地址等。
总结区别:
1.2.4 负载均衡服务
负我均街 (Load Balance) 其意思就是分雄到多个操作单元上进行执行,例如Web服务器、FTP服务品、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
客户端发送多个请求到服务器,服务器处理清求,有一些可能要与数招库进行交互,服务器处理完毕后,再将结果返回给容户端。
这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特別大的时候,还容易造成服务器直接崩漹。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?
我们首先想到的可能是升级服务器的配置,比如提高CPU执行频率,加大内存等提高机器的物理性能来鮮决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是及其庞大的,那么类似上面的系统架构,椅机器都增加到现有的项级物理配置,都是不能够满足需求的。那么怎么办呢?
上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?
这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后柠请求分发到各个服务器上,柠原先请求集中到单个服务器上的情况改为柠请求分发到多个服务器上,将负我分发到不同的服务器,也就是我们所说的负载均衡。
1.2.5 动静分离
动静分商是指在web服务跟梁物中,格静志页西与动志页面成者静志内容接口和动态内容坡口分开不同系统访问的架物设计方法,进而堤
升整个服务访问性能和可维护性
思考:
2.nginx安装
https:// nginx.p2hp.com/en/download.html
2.1 window
Window下安装nginx只需要将nginx的压缩包解压到一个非中文的目录即可。
2.2 nginx下安装
2.2.1 准备工作
执行:
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
安装nginx前需要強保Inux上安装了gCE. PCRE 、zlib. OpenssL
1.安装nginx需要先将官网下我的源码进行编译,编译依赖gcc环境。
2.PCRE(Perl compatible Regular Expressions)是一个Perl库,包括perl兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在 linux 上安装pcre库,pcre-devel是使用pcre 开发的一个二次开发库。nginx也需要此库。命今:
3.zlib库提供了很多种压缩和解压缩的方式,nginx 使用zlib对http包的内容进行gzip,所以需要在Centos上安装zlib库。
4.0penSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL切议,并提供丰富的应用程序供测武或其它目的使用。nginx不仅支持http协议,还支持https(即在ssl办议上传输http),所以需要在Centos安装
OpenssL库。
执行后等待安装完毕!
2.2.2 安装nginx
•指nginx安装包上传到usr/src目录下
•解压到当前文件夹,命今为:tar-zxvf nginx-1.22.0.tar.gz
•进入到解压后的nginx文件夹中cd nginx-1.22.0
•配置当前nginx,命令为: ./configure 这里其实也是执行nginx下的configure 文件
•执行命令:make && make install
拓展
./configure (配置)、make(编泽),make install(安装)这三个命令,我们可以用&&来把命令连接起来执行,表示当前一条命令正常结束后,后面的命令才会执行,这个办法很好,既节省时间,又可以防止发生错误。例:
./configure &&make&&make &&install
2.2.3 运行ndinx
安装完nginx后,会在 路径/usr/local下自动生成 nginx 文件夹。这是自动生成的
进入sbin日录通过:./nginx命令后动nginx服务 cd /usr/local/nginx/sbin/
- rwxr-Xr-x. 1 root root 5191744 11 21 09:07 nainx [root@sunwz sbin]# ./nginx [root @sunwz sbin]#
2.2.3 配置防火墙
在windows系统中访问linux中nginx,默认不能访问,因为防火墙问题
解决办法:
1.关闭防火墙
2.开放访问的端口号,80端口
防火墙开启、关闭、禁用命令
(1)设置开机启用防火墙:systemctl enable firewalld.service
(2)没置开机禁用防火地:systemctl disable firewalld.service
(3)启动防火墙:systemctl start firewalld
(4)关闭防火墙:systemctl stop firevalld
(5)检查防火墙状态:systemctl status firewalld
firewall-cmd --list-all
使用firewall-cmd配置端口
(1)查看防火墙状态:firewall-cmd --state
(2)重新加载配置:firewall-cmd --reload
(3) 查看开放的端口:firewall-cmd --list-ports
(4)开启防火墙端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent
(5)关闭端口命令:
firewall-cmd --zone= public -remove-port=80/tcp --permanent
(6)查看端口是否打开:
firewall-cmd --zone= public --query-port=80/tcp
开放防护墙端口(设置白名单)
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
#开放80端回
firewall-cmd --permanent --add-port=80/tcp
#移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
3.nginx的基本命令和配置文件
3.1 nginx的基本命令
查看 nginx 的版本号:./nginx -v
启动 nginx :./nginx
关闭nginx :./nginx -s stop
重新加载 nginx :./nginx -s reload
3.2配置文件
3.2.1第一部分:全局块
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
user nobody
主模块命令, 指定 Nginx 的 worker 进程运行用户以及用户组,默认由 nobody 账号运行。
worker_processes
指定 nginx 要开启的进程数,单个节点的 nginx 启动有 1 个 master 进程和 n 个 worker 进程。
这里我们先查看nginx进程情况 ps -ef|grep nginx
可以尝试多配置几个进程,然后我们再次通过进程查看。
master进程介绍
(1)读取并验正配置信息;
(2)创建、绑定及关闭套接字(Socket)连接; 协议 地址 端口号
(3)启动、终止及维护worker进程的个数;
worker进程介绍
(1)接收、传入并处理来自客户端的连接;
(2)提供反向代理及过滤功能;
(3)nginx任何能完成的其它任务;
pid
用来指定进程id的存储文件位置,注释的就是pid默认存储的位置。
log
日志存放路径和和日志级别的设定,这部分没有特殊情况默认也够用。
3.2.2 第二部分:events块
events {
worker_connections 1024;
}
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work
process 下的网络连接进行序列化,是否 允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
比如 worker_connections 1024;支持的最大连接数为 1024
3.2.3第三部分:内容快
http内容块
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
http块:又包括 http全局块、server 块。http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单连接请求数上限等。
include: 设置nginx支持的多媒体文件类型,mime.types是引用nginx下的媒体类型文件。 路径在config目录下,可自行查看。
default_type默认值为application/octet-stream; 表示为二进制流传输。
log_fomat 设置log日志格式
sendfile 发送文件(默认开启)
简单来说就是启用sendfile()系统调用来替换read()和write()调用,减少系统上下文切换从而提高性能,当 nginx 是静态文件服务器时,能极大提高nginx的性能表现,而当 nginx 是反向代理服务器时,则没什么用了。下面我们来分析一下这个sendfile的工作原理:
工作原理描述:
sendfile = off 时,应用程序读取磁盘中的文件以字节流的形式从磁盘中加载文件,然后再将文件以字节流的形式复制到内核中。内核在把文件推送到NC。
sendfile = on 时,应用程序直接向内核发送指令,让内核去读文件。读完文件内核直接推送给NC。只有一次复制操作,实现异步网络IO形式。因此,性能会有很大的提升。
具体还要根据实际使用情况来配置sendfile。当读取服务不能解析大量的文件时。还是建议将sendfile配置为off。
tcp_nopush(默认no)
nginx 中,tcp_nopush 配置和 tcp_nodelay “互斥”。它可以配置一次发送数据的包大小。也就是说,它不是按时间累计 0.2 秒后发送包,而是当包累计到一定大小后就发送。
注:在 nginx 中,tcp_nopush 必须和 sendfile 搭配使用。
keepalive_timeout(默认65)
keepalive是长连接的意思。客户端发起http请求前需要先与服务端建立TCP连接,每次TCP连接都需要三次握手来确定,三次交互不仅会增加消费时间,还会增加网络流量。http请求是请求应答式,如果能知道每个请求头与响应体的长度,就可以在一个连接上执行多个请求,这个就是所谓的长连接。
注意:keepalive是tcp层长连接探活机制;keep-alive是应用层http协议使用,在其头部Connection字段中的一个值,只是代表客户端与服务之间需要保持长连接,可以理解为通过此字段来告诉nginx此连接需要维持长连接,处理完别直接关闭连接。
gzip [on | off(默认) ]
启用Gzip压缩功能, 可以使网站的css、js 、xml、html 等静态资源在传输时进行压缩,经过Gzip压缩后资源可以变为原来的30%甚至更小,尽管这样会消耗一定的cpu资源,但是会节约大量的出口带宽来提高访问速度
Gzip 的压缩页面需要浏览器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后解压并解析。浏览器那里不需要我们担心,因为目前的大多数浏览器都支持解析Gzip。
注意:不建议压缩图片和大文件:图片如jpg、png文件本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费CPU资源。(如果优化可以可以图片的生命周期设置长一点,让客户端来缓存)
而大文件资源会消耗大量的cpu资源,且不一定有明显的效果。
#开启gzip
gzip on;
#低于1kb的资源不压缩
gzip_min_length 1k;
#压缩级别1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在5左右。
gzip_comp_level 5;
#需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片.
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
#配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_disable “MSIE [1-6].”;
配置后可以通过浏览器ResposeHeader中查看是否启用压缩。
server内容块
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块, 具体结构信息反向代理中在学习。
```powershell
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://192.168.13.100:8081;
}
#location / {
# root html;
# index index.html index.htm;
#}
#location ~/ww/ {
# proxy_pass http://192.168.13.100:8080;
# root html;
# index index.html index.htm;
#}
#location ~/xx/ {
# proxy_pass http://192.168.13.2:8080;
# root html;
# index index.html index.htm;
#}
#location ~/qq/ {
# proxy_pass http://192.168.13.100:9090;
# root html;
# index index.html index.htm;
#}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
listen
表示监听的端口号,这个端口就是访问nginx时候使用的, 80是默认端口,访问时候可以省略。也可以配置其他端口
server_name
Nginx中的server_name指令主要用于配置基于名称的虚拟主机,如果没有多配置的情况下,名称可以随意指定一个就行
location
这里主要配置需要访问的资源地址,root表示哪个文件夹。index表示访问的缺省网页是哪一个。如果走代理,则配置修改为proxy_pass 方式
error_page
配置异常信息访问地址
4. 正向代理实现
在前面的案例中, 我们了解了nginx作为静态服务器时的应用,如果作为静态服务器,则nginx也只是起到了运行静态资源的用。如何通过nginx实现正向代理呢?
比如:我想百度点隐私问题- -!,想通过nginx正向代理实现对百度的访问,这样百度向上记录ip的时候就只能记录nginx服务器的ip地址,而不能知道真实访问的ip地址了。
目前访问nginx是这样的,如果访问这个地址直接显示的是百度搜索,那就证明成功了
配置文件
server {
listen 80;
location / {
proxy_pass http://www.baidu.com;
}
}
访问测试
nginx可以作为http的正向代理服务器,但是不能用做https的正向代理服务器。因为http正向代理使用的是get请求,但是https使用的确实connect请求,而nginx不支持connect请求。所以需要第三方模块ngx_http_proxy_connect_module 来支持https的正向代理。
5.反向代理
我们通过反向代理让nginx代理tomcat服务器,如果tomcat已经有运行的项目,那么我们也可以通过ip+端口直接访问,也可以通过nginx访问,如果通过nginx我们就能隐藏掉真实的项目ip,还可以实现负载均衡。
5.1安装jdk
- 将安装包存放在/usr/src 下,并解压 tar -zxvf jdk8.tar.gz
- 配置Java环境变量 cd /etc/ 找到profile文件,末尾添加
#jdk配置
export JAVA_HOME=/usr/src/jdk1.8.0_144
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JRE_HOME/lib
- #刷新配置 source /etc/profile
- #查看JDK版本 java -version
5.2安装tomcat
https://tomcat.apache.org/download-90.cgi
将安装包同样存放在/usr/src 下,并解压 tar -zxvf apache-tomcat-9.0.73.tar.gz
对外开放访问的端口(如果不在window访问可以不用开放)
#开放端口
firewall-cmd --permanent --add-port=8080/tcp
#重启防火墙
firewall-cmd --reload
开启tomcat,在bin目录下,使用 命令:./startup.sh
cd /usr/src/apache-tomcat-9.0.73/bin/
然后通过http://192.168.31.100:8080/ 访问测试是否启动成功。
5.3 反向代理单台服务器
如果我想隐藏掉http://192.168.31.100:8080/这个真实地址,只希望访问nginx就可以直接代理到这个tomcat,配置如下:
- 直接修改nginx配置文件,并重启nginx
server {
listen 80;
server_name 192.168.31.100; #默认80端口
location / {
proxy_pass http://192.168.31.100:8080; #代理的地址
}
}
此时从window下测试访问192.168.31.100 默认也会访问到tomcat,原理是由地址192.168.31.100:80通过nginx反向代理到了192.168.31.100:8080
我们可以将linux的8080端口禁止对外开放,查看效果
#移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
此时window下直接访问http://192.168.31.100:8080/ 就失败了, 如果访问http://192.168.31.100/ 还是可以成功的,那么我们真实tomcat下的应用就通过nginx反向代理被隐藏掉了。
5.4 反向代理多台服务器
如果单台服务器的反向代理是为了隐藏真实的服务器地址,那么代理多台服务器的目的除了隐藏地址还有可能是为了使用一个nginx地址反向代理多个项目,这样我们通过认为干预URL地址进行不同项目的请求,但是对于用户而言,我们的请求地址只有一个, 具体操作如下:
- 多复制一个tomcat文件夹
cp -r apache-tomcat-9.0.73 ./apache-tomcat9090
- 进入文件夹config目录找到server.xml 修改端口为9090
1. 启动并配置开放端口并访问测试
2.修改两个tomcat的/webapp/ROOT/index.jsp 区别两个tomcat 创建文件夹v1/v2 把两个文件移动到文件夹中,修改后重启两个tomcat
1. 修改nginx配置文件,并重启nginx
location ~/aaa/ {
proxy_pass http://192.168.31.2:8080;
#root aaa;
#index index1.html;
}
location ~/ww/ {
proxy_pass http://192.168.31.100:8080;
#root aaa;
#index index.html;
}
server {
listen 80;
server_name 192.168.31.100; #默认80端口
location ~/v1/ {
proxy_pass http://192.168.31.100:8080; #代理的地址
}
location ~/v2/ {
proxy_pass http://192.168.31.100:9090; #代理的地址
}
}
= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。
~:用于表示 uri 包含正则表达式,并且区分大小写。
~*:用于表示 uri 包含正则表达式,并且不区分大小写。
^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~*标识。
- 测试
5.5 本地域名解析
填写
#旅游网用户页面
127.0.0.1 www.penghai.com
127.0.0.1 activate.navicat.com
192.168.31.100 www.xxx.com
6. 负载均衡配置
6.1 负载均衡实现
负载均衡的使用场景一定是一个项目形成一个集群,为了能够雨露均沾,我们可以通过nginx进行负载。 如果项目不同那就是反向多个,但是不能起到负载均衡的作用。
我们可以将多台tomcat下的项目看做为一个集群,当我访问一个路径的时候为了分担服务区压力,我们让其通过定义nginx的负载策略实现nginx负载均衡处理
修改nginx配置如下
upstream cluster {
server 192.168.31.100:8080;
server 192.168.31.100:9090;
}
server {
listen 80;
server_name localhost;
#192.168.31.100:80
location / {
proxy_pass http://cluster;
#root shiyan6;
}
}
- 直接访问 http://192.168.31.100/ 测试 发现此时已经全部分摊处理请求。
6.2 负载均衡策略
nginx的6种负载均衡策略 轮询/加权轮询weight/ip_hash/least_conn/urlhash/fair
6.2.1 轮询策略(默认)
轮询策略其实是一个特殊的加权策略,不同的是,服务器组中的各个服务器的权重都是1
upstream backend {
server 192.168.31.100:8080 weight=1;
server 192.168.31.100:9090 weight=1;
}
6.2.2 加权轮询策略weight
通过加入 weight的值进行加权处理,权重值越大,服务器越容易被访问,因此,性能好的服务器应适当加大权重值
upstream backend {
server 192.168.31.100:8080 weight=1;
server 192.168.31.100:9090 weight=2;
}
6.2.3 ip 哈希策略
ip_hash 策略能够将某个客户端IP的请求固定到同一台服务器上,例如A用户访问服务器,通过固定算法后,被固定到 192.168.136.136 的web服务器上,那么,用户A下次访问时,依旧会到访问 192.168.136.136 服务器。因此,该策略解决了多台服务器Session不共享的问题【因为不同的客户端会被分到不同的服务器,且之后这种对应关系是不变的】
upstream backend {
ip_hash; server 192.168.31.100:8080;
server 192.168.31.100:9090;
}
该算法不能保证服务器的负载均衡,可能存在个别服务器访问量很大,很小的情况.
6.2.4 least_conn 策略
最少连接,把请求转发给连接数最少的服务器。
轮询算法/轮询加权算法会把请求按照一定比例分发请求到各服务器上,但是,有些请求占用时间长,如果把这些响应占用时间长的请求大比例发送到了某一台服务器,那么这台服务器随着时间的增加会负载比较高【因为响应较长的请求还没处理完,新的请求又来了,在这种情况下,采用 least_conn 的方式是最适合的,它能达到更好的负载均衡
upstream backend {
least_conn; server 192.168.31.100:8080;
server 192.168.31.100:9090;
}
此负载策略适合用于,请求处理时间长短不一造成服务器过载的情况
6.2.5 url_hash 策略
url_hash 和 ip_hash 类似,不同的是,客户端ip可能变,但客户端发送的请求URL不同功能模块虽说不同,但同一个功能点的URL是固定不变的,该算法主要是解决 缓存命中率的问题【例如下载文件】
upstream backend {
hash $request_uri;
server 192.168.31.100:8080;
server 192.168.31.100:9090;
}
6.2.6 智能的fair 策略
fair nginx默认不支持,需下载第三方模块采用的不是固定的轮询算法进行负载均衡,而是智能的根据页面大小、加载时间长短进行负载计算.
upstream backend {
fair;
server 192.168.31.100:8080;
server 192.168.31.100:9090;
}
#作业1 反向代理
1. 将防盗门清单项目打包 -- 部署 -- linux
2. 需要部署3个 端口分别为8080 8081 8082
3. 通过nginx反向代理且负载均衡这集群。
4. 如果连接不上数据库的,可以创建一个springboot-demo项目
#作业2 - 正向代理
小组内组长组织相互连接一下本机的linux系统。 nginx代理。
1.本通过idea运行一个项目,先让小组人员测试尝试是否能够通过ip地址访问
2.在linux环境下配置一下项目。 在window下通过nginx反向代理linux项目地址,在让小组成员通过访问nginx访问到linux的项目。
7. 动静分离配置
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案; 前后端分离。
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开
7.1 方案1
vue+SpringBoot前后端分离项目时在做演示
7.2 方案2
在Linux 系统中准备 静态资源,用于进行访问。
其中ww中存了一个网页,作用静态资源。xx中是一张图片,我们可以模拟成非静态资源。这样我们就可以用nginx区分
- nginx配置
server {
listen 80;
server_name 192.168.31.100; #默认80端口
location /ww/ {
root /data/;
}
location /xx/ {
root /data/;
autoindex on; #表示列出当前目录
}
}
访问测试:
http://192.168.31.100/ww/1.html
http://192.168.31.100/xx/
8. nginx高可用集群
8.1 集群原理
为了防止当Nginx代理服务器挂掉了后面的服务就都没有办法访问了。所有就引出了高可用集群。下面的实例将配置一主一从的高可用集群
在虚拟机中克隆一个os系统,并配置对应的ip
VM系统->右键->管理->克隆->完全克隆
原始OS ip地址为192.168.31.100 克隆新配置ip为192.168.31.101
配置ip
输入 cd /etc/sysconfig/network-scripts/ 进入到此目录下,可以看到 ifcfg-ens33文件;
重启网卡 service network restart
两个os全部启动,并通过工具连接,因为是克隆的,所以默认nginx是安装好的。
8.2 Keepalived
Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。
Keepalived是一款服务器状态检测和故障切换的工具,起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。
因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件在其配置文件中,可以配置主备服务器和该服务器的状态检测请求。也就是说keepalived可以根据配置的请求,在提供服务期间不断向指定服务器发送请求,如果该请求返回的状态码是200,则表示该服务器状态是正常的,如果不正常,那么Keepalived就会将该服务器给下线掉,然后将备用服务器设置为上线状态,而当主服务器节点恢复时,备服务器节点会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来的备用角色。
在2台服务器安装keepalived
yum install keepalived -y
查看版本:
rpm -q -a keepalived
8.3 配置keepalived
改/etc/keepalived/keepalivec.conf配置文件,主从模式主要在这个文件里配置。
如果有两个nginx,一个作为主机,一个作为备机,如果备机故障,主机可以提供服务,如果主机故障,备机一样可以提供服务。
主机配置 备机配置
vrrp_script chk_nginx_up_down {
script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
interval 2 #检测时间间隔
weight 2 #如果条件成立的话,则权重 +2
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state MASTER #来决定主从BACKUP
interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
virtual_router_id 51 # 虚拟路由的 ID 号, 两个节点设置必须一样
mcast_src_ip 192.168.31.100 #填写本机ip
priority 100 # 节点优先级,主要比从节点优先级高
#nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 # 心跳监测间隔,两个节点设置必须一样,默认 1s
authentication {
auth_type PASS
auth_pass 1111
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_nginx_up_down #执行 Nginx 监控的服务
}
virtual_ipaddress {
192.168.31.50 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
}
}
在两个系统/etc/keepalived/ 添加检测脚本nginx_check.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l
#判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
# nginx的启动目录
/usr/local/nginx/sbin/nginx
# 等待3秒再次检查nginx,如果没有重启成功,则停止keepalived,使其启动备用机
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
kill keepalived
fi
fi
给 分别给两台nginx_check.sh 这个脚本指定权限
chmod +x /etc/keepalived/nginx_check.sh
如果linux开启了防火墙, 请配置两个系统的防火墙放行vrrp协议
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload
8.4 启动观测
#启动主机的keepalived
systemctl start keepalived.service
#启动成功之后ip addr 查看主机是否有50的虚拟ip
#启动主机nginx
/usr/local/nginx/sbin/nginx
#使用192.168.31.50访问项目查看是否成功!
#启动备机keepalived
#启动成功之后ip addr 如果配置成功备机是没有50的虚拟ip,主有主机故障才有
#启动备机nginx
#测试发现访问50的ip数据一直是走主机的这是正确的。
#其他命令
systemctl stop keepalived.service
8.5 KAL宕机测试
测试主机KAL关闭后是够能否故障转移(启用备机)。
systemctl stop keepalived.service
如果已经转移那么查看备机的ip地址一定会有一个50的虚拟ip出现
恢复主机:主机默认已经当做备机使用了。谁拿到50的ip谁是主机。 ??
9. nginx 执行原理
master 和 worke机制
Nginx结合了多进程机制和异步机制对外提供服务,Nginx服务启动后,会产生一个主进程和多个工作进程。
master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程.
# 查看worker进程号,杀掉再次查看。
而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的求,worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致
过来的请求由master管理
master来管理worker进程,所以我们只需要与master进程通信就行了。master进程会接收来自外界发来的信号,再根据信号做不同的事情,比如我们前面常用的 ./sbin/nginx -c conf/nginx.conf -s reload
执行这个命令时,master收到这个信号以后先启动一个新的Nginx进程,而新的Nginx进程在解析到reload参数后,就知道是要控制Nginx来重新加载配置文件,它会向master进程发送信号,然后master会重新加载配置文件,在启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以退休了,新的worker启动之后就可以以新的配置文件接收新的请求了 – 热部署的原理.
worker进程是如何处理请求?
我们基本上知道了在操作nginx时,nginx内部所做的事情,那么worker进程是如何处理请求的呢? 在Nginx中,所有的worker进程都是平等的,每个进程处理每个请求的机会是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都可能处理这个连接。
worker进程是从master进程fork(派生、分支)过来的,而在master进程中,会先建立好需要listen的socket,然后fork出多个worker进程,当有新连接请求过来时work进程可以去处理,为了避免惊群效应,worker进程在处理请求之前先要去抢占accept_mutex,也就是互斥锁,当获得锁成功以后,就可以去解析处理这个请求。请求处理完以后再返回给客户端。
拓展:惊群效应
简单粗暴理解,惊群效应就是,给一堆睡觉的鸟群(羊群、牛群都行,随你高兴)中,扔一颗石子,结果就是会惊醒这一群的鸟,这就是所谓的惊群效应。
对应到并发编程中,当多个线程阻塞到相同资源上(比如锁)时,当这个资源ready后,资源就绪的信号唤醒了所有阻塞到这个资源上的所有线程。
master-workers 的机制的好处
首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销, 同时在编程以及问题查找时,也会方便很多。可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作。其次,采用独立的进程,可以让互相之间不会 影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当 前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。