参考链接: https://www.bilibili.com/video/BV1zJ411w7SV?p=4
Nginx简介:
Nginx (engine x) 是一款开源的轻量级的 Web 服务器,可以接受响应 HTTP请求,可以作为反向代理服务器,邮件代理服务器和通用 TCP/UDP 代理服务器。
Nginx 采用 epoll(Linux 2.6 内核)、kqueue(FreeBSD)、evenport(Solaris10)作为网络I/O 模型,因此具备极高的性能。在高并发连接请求的场景下,Nginx 能够支持高达 50000个并发连接数的响应,而同时对CPU,内存等系统资源的消耗却非常低,运行非常稳定,几乎可以做到 7x24 小时不间断运行。
Nginx 通常用在反向代理、负载均衡 和 HTTP 缓存。其特点是高并发,高性能和低内存。
- nginx做为HTTP服务器,有以下几项基本特性:
- 处理静态文件,索引文件以及自动索引;
- 打开文件描述符缓冲.无缓存的反向代理加速,简单的负载均衡和容错.
- FastCGI,简单的负载均衡和容错.
- 模块化的结构。包括gzipping,byte ranges, chunked responses,以及SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则此项处理可以并行运行,而不需要相互等待。
- 支持SSL和 TLSSNI.
反向代理
-
正向代理
正向代理:在客户端(浏览器)配置代理服务器,局域网中的客户端要访问Internet,需要通过代理服务器进行互联网访问,这种代理服务就称正向代理。
-
反向代理
客户端不需要做任何配置,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实的服务器IP地址。
负载均衡
- 基本的请求与响应流程:
- 负载均衡
负载均衡(Load Balancing)用来在多个服务器中分配负载,原本单个服务器解决不了的请求,通过增加服务器数量,然后将原本集中在单个服务器上的请求分发到多个服务器上,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
使用带有负载均衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。 - 负载均衡原理
系统的扩展可分为纵向(垂直)扩展和横向(水平)扩展。
纵向扩展,是从单机的角度通过增加硬件处理能力,比如 CPU 处理能力,内存容量,磁盘等方面,实现服务器处理能力的提升,不能满足大型分布式系统(网站),大流量、高并发、海量数据的问题。
因此需要采用横向扩展的方式,通过添加机器来满足大型网站服务的处理能力。 当一台机器不能满足,则增加两台或者多台机器,共同承担访问压力。 - 负载均衡的作用(解决的问题):
1.解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力);
2.提供故障转移,实现高可用;
3.通过添加或减少服务器数量,提供网站伸缩性(扩展性);
4.安全防护;(负载均衡设备上做一些过滤,黑白名单等处理)
动静分离
- 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
Docker部署nginx
编写dockerfile
FROM registry.cn-beijing.aliyuncs.com/qianjia2018/qianjia_public:node-new as build-stage
COPY . /app
WORKDIR /app
RUN yarn config set registry http://39.106.145.141:9000/repository/node-public \
&& yarn \
&& yarn docs:build \
&& yarn build
FROM registry.cn-beijing.aliyuncs.com/qianjia2018/qianjia_public:dist-nginx as production-stage
COPY --from=build-stage /app/docs/.vuepress/dist /usr/share/nginx/html
COPY --from=build-stage /app/dist /usr/share/nginx/html/qjsl
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
构建镜像
docker build -t nginx:qjsl-web-new /root/QJSL_web_new
准备映射目录,COPY nginx配置文件到宿主机目录
mkdir -p /usr/local/docker/nginx/conf
docker run -d --rm --name nginx nginx:qjsl-web-new
docker cp nginx:/etc/nginx/nginx.conf . && docker cp nginx:/etc/nginx/conf.d . && docker cp nginx:/usr/share/nginx/html/ .
docker stop nginxls
docker部署nginx
docker run -d --name nginx --restart=unless-stopped \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html \
-v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /usr/local/docker/nginx/logs:/var/log/nginx \
nginx:qjsl-web-new
Linux部署nginx
安装pcre依赖
- 解压压缩文件
tar -xvf pcre-8.44.tar.gz - 进入解压目录
执行./configure - 编译安装
make && make install
查看安装版本
pcre-config --version - 安装openssl、zlib
yum install -y gcc zlib zlib-devel pcre-devel openssl openssl-devel
安装nginx
- 解压安装压缩文件
tar -xvf nginx-1.19.6.tar.gz
进入解压目录
执行./configure - 编译安装
make && make install
安装完成,在/usr/local/nginx/sbin中生成nginx启动脚本,在目录下启动nginx
./nginx
查看nginx进程
ps -ef | grep nginx
部署完成
- 查看nginx端口
cat /usr/local/nginx/conf/nginx.conf
- 设置开放端口
sudo firewall-cmd --add-port=80/tcp --permanent - 查看开放的端口
firewall-cmd --list-all
重载防火墙
firewall-cmd --reload - 访问nginx
192.168.10.186:80
nginx常用命令
使用操做命令的前提条件:必须进入nginx的/usr/local/nginx/sbin目录
- 查看nginx版本号
./nginx -v - 启动nginx
./nginx - 停止nginx
./nginx -s stop - 重新加载nginx(重新加载nginx配置文件 <nginx.conf> 生效)
./nginx -s reload
nginx配置文件
-
路径
cd /usr/local/nginx/conf
cat nginx.conf -
构成
大致分为3部分
1.全局配置
从配置文件开始到events之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配文件的引入等。
worker process,nginx服务器并发处理的值,数值越大表示支持的并发处理量越多,会受到硬件、软件等设备的制约。
2.events块
主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多 worker process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 worker process 可以同时支持的最大连接数等。
指定nginx中每个worker process支持的最大连接数是多少,此配置对nginx性能影响较大,需根据实际情况灵活配置。
3.http块
配置最为频繁部分,主要是代理、缓存和日志等绝大部分功能以及第三方配置模块所在,其中还包括http全局块、server块。
①http全局块
表示指令包含文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
②server块
与虚拟主机关系密切,等同于完全独立的硬件主机,节省互联网硬件成本。
每个http块可以包括多个server块,每个Server块相当于一个虚拟主机。
每个Server块分为全局Server块,以及可以同时包含多个location块。
— 全局Server块
最常见的配置是本虚拟主机的监听配置以及本虚拟主机的名称或IP配置。
— location块
一个Server块可配置多个location块。
主要基于nginx服务器收到的请求字符串,对虚拟主机名称或IP别名之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能, 还有许多第三方模块的配置。
location指令说明:
用于配置URL
语法:location [= ~ ~* ^~] uri { }
-
如果uri包含正则表达式,则必须要有
~
或~*
标识
=
:用于不含正则表达式的uri
前,表示要求请求字符串与uri
严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
~
:表示uri
包含正则表达式,并且区分大小写。
~*
:表示uri
包含正则表达式,并且不区分大小写。
^~
:用于不含正则表达式的uri前,要求nginx
服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location
处理请求,而不再使用location
块中的正则uri
和请求字符串做匹配。
nginx配置实例
反向代理①
浏览器地址栏输入地址www.sss.com,跳转到Linux系统tomcat主页面
安装tomcat
Linux系统中安装tomcat,使用默认端口8080
-
解压安装文件
tar -xvf apache-tomcat-9.0.41 -
进入解压后的目录,启动tomcat
cd apache-tomcat-9.0.41/bin
执行./startup.sh
-
查看日志
cd … && cd logs
tail -f catalina.out
-
对外开放访问的端口
sudo firewall-cmd --add-port=8080/tcp --permanent
重载防火墙
firewall-cmd --reload
查看开放的端口
firewall-cmd --list-all -
查看tomcat主页面
反向代理配置
-
配置IP地址到域名的映射(域名映射)
vim /etc/hosts
192.168.10.186 www.sss.com -
nginx中配置请求转发(配置反向代理)
vim /usr/local/nginx/conf/nginx.conf
-
启动nginx
cd /usr/local/nginx/sbin
./nginx
nginx需处于停止状态,否则直接启动nginx会因端口占用而报错,启动后配置文件生效。或使用./nginx -s reload命令直接使配置文件生效。 -
测试
反向代理②
安装tomcat
部署两个tomcat,使用端口:8080
& 8081
访问 http:192.168.10.186:9001/edu/ 跳转到192.168.10.186:8080
访问 http:192.168.10.186:9001/vod/ 跳转到192.168.10.186:8081
- 增加一个tomcat,端口8081
解压安装文件
tar -xvf apache-tomcat-9.0.41 - 修改端口
- 进入解压后的目录,启动tomcat
cd … && cd bin
执行./startup.sh
新建测试页面
新建文件夹和测试页面
- 8080
cd /root/tests/tomcat/apache-tomcat-9.0.41/webapps
mkdir edu
vim a.html
<h1>8080</h1>
- 8081
cd /root/tests/tomcat/tomcat8081/apache-tomcat-9.0.41/webapps
mkdir vod
vim a.html
<h1>8081</h1>
反向代理配置
-
编辑nginx配置文件
cd /usr/local/nginx/conf/
vim nginx.conf
-
开放对外访问端口号
sudo firewall-cmd --add-port=8080/tcp --permanent
重载防火墙
firewall-cmd --reload
查看开放的端口
firewall-cmd --list-all -
加载配置文件
cd /usr/local/nginx/sbin
加载nginx配置文件使配置生效
./nginx -s reload -
测试
负载均衡
将访问http://192.168.10.186/edu/a.html的请求,平均分配在8080和8081端口,达到负载均衡效果。
使用两台tomcat服务器,8080和8081
分别在两台tomcat的webapps目录中,创建名称为edu的文件夹,并分别在文件夹中创建页面a.html用于测试访问效果。
- 配置8081访问页面
/root/tests/tomcat/tomcat8081/apache-tomcat-9.0.41/webapps
mkdir edu
cd vod && cp a.html …/edu - 启动8081
/root/tests/tomcat/tomcat8081/apache-tomcat-9.0.41/bin
./startup.sh
负载均衡配置
- 编辑nginx配置文件
cd /usr/local/nginx/conf
vim nginx.conf
- 启动nginx
cd /usr/local/nginx/sbin
加载nginx配置文件使配置生效
./nginx -s reload - 测试
nginx服务器分配策略
-
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果服务器宕机,会自动剔除。 -
weight
weight代表权重,默认为1,权重越高被分配的客户端越多。
-
ip_hash(哈希)
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享的问题。
-
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
动静分离
概述:
将动态请求和静态请求分离,使用nginx处理静态页面tomcat处理动态页面,提高访问效率,减少不必要的请求消耗,同时能减少请求的延时。
- 动静分离的实现方式:
1、目前较推崇的主流方案,把静态文件独立成单独的域名,放在独立服务器上。
2、动态和静态文件混合在一起发布,通过nginx来分离。
3、通过location指定不同的后缀名实现不同的请求转发。通过配置expires参数设置,可以设置浏览器缓存过期时间,减少与服务器之间的请求和流量。
设置expires参数之后(3d),表示三天内访问此地址,不需要再去请求服务器,直接通过浏览器的缓存处理。期间会比对服务器的文件是否发生变化,根据变化会重新下载,无变化返回304(浏览器的缓存),有变化返回200,Expires浏览器缓存不适于经常变化更新的资源。
动静分离配置
- 准备访问使用的静态资源
cd /
mkdir data && cd data
mkdir www image
cd www
vim a.html
cd … && cd image/<h1>test</h1>
scp -r sbw@192.168.10.30:/home/sbw/1.jpg .1.jpg 100% 304KB 68.0MB/s 00:00
- 修改nginx配置文件
cd cd /usr/local/nginx/conf/
vim nginx.conf
autoindex on;
#列出当前文件夹内容 - 启动nginx
cd /usr/local/nginx/sbin
加载nginx配置文件使配置生效
./nginx -s reload - 测试
访问静态资源
nginx配置高可用集群
高可用的负载均衡服务
目前,比较主流的Nginx高可用方案就是:keepalived+nginx实现主备方案。
1、什么是keepalived
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
2、keepalived工作原理
keepalived是以VRRP协议为实现基础的,VRRP全称 Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址,该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。VRRP模块是来实现VRRP协议的。
keepalived+nginx实现主备过程:
nginx高可用配置
-
准备主、备nginx服务器,192.168.10.186 和 192.168.10.232
-
主、备服务器安装keepalived
-
配置虚拟ip
-
主nginx安装
-
备nginx安装
// 更新包
apt-get update
// 下载安装nginx
apt-get install nginx -
主nginx服务器上安装keepalived(186)
yum install keepalived -y
查看安装
rpm -q -a keepalivedkeepalived-1.3.5-19.el7.x86_64
cd /etc/keepalived/
keepalived配置文件
keepalived.conf -
备nginx服务器上安装keepalived(232)
安装依赖
apt-get install libssl-dev openssl libpopt-dev
安装keepalived
apt-get install keepalived
查看版本
keepalived -versionKeepalived v2.0.19 (10/19,2019)
新建keepalived配置文件
vim /etc/keepalived/keepalived.conf -
添加检测脚本( 主、备,文件位置,脚本内容相同,nginx存活性检测。)
cd /usr/local/src/
vim nginx_ckeck.sh#!/bin/sh A='ps -C nginx -no-header |wc -l' if [$A -eq 0];then /usr/local/nginx/sbin/nginx # nginx启动脚本位置(检测存活性) sleep 2 if [ 'ps -C nginx --no-header |wc -l' -eq 0 ];then killall keepalived # 主服务器宕机就将全部配置杀掉,以启用备服务器 fi fi
-
配置主、备模式
修改nginx主,keepalived配置文件
vim /etc/keepalived/keepalived.confglobal_defs { //全局配置 notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.10.186 smtp_connect_timeout 30 router_id LVS_DEVEL # 定义一个主机ID,使能访问到主机 } vrrp_script chk_service_ok { //脚本配置 script "/usr/local/src/nginx_ckeck.sh" # 检查nginx是否存在 interval 2 # 每两秒钟检查一次 weight 2 # 设置当前服务器的权重,服务器宕机后让其权重发生改变 } vrrp_instance VI_1 { //虚拟ip配置 state MASTER # 角色,主机为MASTER,备机为BACKUP interface enp0s3 # 指定网卡,表示虚拟IP绑定到哪张网卡 virtual_router_id 51 # 虚拟路由id,相同的ID表示在相同的组 priority 100 # 优先级,MASTER的优先级要比BACKUP的大 advert_int 1 # 检测心跳,主从服务器同步检查的时间间隔,以秒为单位 authentication { # 权限校验的方式 auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.141 # 虚拟IP地址,即VIP(可绑定多个) } }
修改nginx备,keepalived配置文件
vim /etc/keepalived/keepalived.confglobal_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.10.232 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_service_ok { script "/usr/local/src/nginx_ckeck.sh" # nginx存活性检测 interval 2 # 每两秒钟检查一次 weight 2 } vrrp_instance VI_1 { state BACKUP # 角色,主机为MASTER,备机为BACKUP interface enp0s3 # 指定网卡 virtual_router_id 51 # 虚拟路由id,相同的ID表示在相同的组 priority 90 # 优先级,MASTER的优先级要比BACKUP的大 advert_int 1 # 主从服务器同步检查的时间间隔,以秒为单位 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.141 # 虚拟IP地址,即VIP } }
-
启动主、备nginx,keepalived
主nginx、keepalived
cd /usr/local/nginx/sbin/
./nginx(如果nginx正在运行,先停掉nginx)
systemctl start keepalived.service
查看进程
$ ps -ef | grep keepalived
root 5603 1 0 04:33 ? 00:00:00 /usr/sbin/keepalived -D
root 5607 3995 0 04:33 pts/0 00:00:00 grep --color=auto keepalived备nginx、keepalived
service nginx start
service keepalived start
查看进程
$ ps -ef | grep keepalived
root 187980 1 0 17:02 ? 00:00:00 /usr/sbin/keepalived --dont-fork
root 187999 187980 0 17:02 ? 00:00:00 /usr/sbin/keepalived --dont-fork
root 188201 163300 0 17:29 pts/0 00:00:00 grep --color=auto keepalived -
测试
使用虚拟ip进行访问$ ip a
停止主nginx服务器和keepalived
./nginx -s stop && systemctl stop keepalived
$ ip a
nginx原理
nginx最基本的工作流程
nginx启动之后在Linux系统中是有两个进程的,master 和 worker(管理员和工人),master相当于领导进程,一般master将任务分配到领导的各个worker,worker来执行具体的任务。
worker的工作原理:
当客户端发送一个请求,请求到nginx中首先要经由master,master得到请求后把请求分发给worker,由worker来执行具体的工作。master下可能worker众多,worker获取任务的机制并非平均分配或轮询的方式,而是通过争抢的方式瓜分客户端发送的请求来进行具体的操作。nginx本身是不直接支持java的,所以对java的操作还需要依赖于tomcat,所以worker还要进行一些类似于请求转发或者是反向代理,通过tomcat查询数据库来得到最终的结果。
单master多worker机制:
- master-worker机制的好处:
1、可以使用nginx -s reload 热部署,不需要对nginx进行启停操作就可以使修改好的配置生效。单master多worker机制更有利于热部署方式的使用,在线上运行的项目中nginx是不能被停止的,单master多worker机制中当nginx已经运行在某个worker之上,那么当nginx -s reload 热部署时,新的nginx请求发布时已经运行了nginx任务的worker便不再参加争抢,而是由其他worker争抢 运行新的任务,从而保证nginx不间断运行。
2、每个worker都是独立占用一个进程,不需要加锁,方便操作节省资源。当一个worker进程退出时,其他worker进程可以保持正常工作参与争抢,服务不会中断。 - worker数目设置:
nginx同Redis类似,同样采用了io多路复用机制,使每个worker都是一个独立进程,每个进程中只有一个主线程,通过异步非阻塞的方式可以处理成千上万请求,每个worker线程可以把一个cpu性能发挥到最佳的限度。
worker数和服务器的CPU数相等是最为适宜的。 - 连接数worker_connection:
1、处理一个请求,会占用worker的2个或4个连接数。
①处理一个普通的静态资源访问请求时,访问的请求和响应会分别占用一个连接数。
②worker除了处理请求时,请求的链接与响应会占两个连接数,由于worker本身不支持java,涉及到数据库查询时要依赖于tomcat,与tomcat间的请求与响应仍会占用两个连接数。
2、nginx中单个master与多个worker之间,每个worker支持最大连接数1024,那worker支持的最大并发数是(worker能承受多少个请求计算):
①普通的静态访问:worker数×1024(单个worker支持最大连接数)/2
②作为HTTP或反向代理时:worker数×1024(单个worker支持最大连接数) /4