参考链接: https://www.bilibili.com/video/BV1zJ411w7SV?p=4
Nginx (engine x) 是一款开源的轻量级的 Web 服务器,可以接受响应 HTTP请求,可以作为反向代理服务器,邮件代理服务器和通用 TCP/UDP 代理服务器。
Nginx 采用 epoll(Linux 2.6 内核)、kqueue(FreeBSD)、evenport(Solaris10)作为网络I/O 模型,因此具备极高的性能。在高并发连接请求的场景下,Nginx 能够支持高达 50000个并发连接数的响应,而同时对CPU,内存等系统资源的消耗却非常低,运行非常稳定,几乎可以做到 7x24 小时不间断运行。
Nginx 通常用在反向代理、负载均衡 和 HTTP 缓存。其特点是高并发,高性能和低内存。
正向代理
正向代理:在客户端(浏览器)配置代理服务器,局域网中的客户端要访问Internet,需要通过代理服务器进行互联网访问,这种代理服务就称正向代理。
反向代理
客户端不需要做任何配置,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实的服务器IP地址。
编写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
安装pcre依赖
安装nginx
部署完成
使用操做命令的前提条件:必须进入nginx的/usr/local/nginx/sbin目录
路径
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
和请求字符串做匹配。
浏览器地址栏输入地址www.sss.com,跳转到Linux系统tomcat主页面
Linux系统中安装tomcat,使用默认端口8080
解压安装文件
tar -xvf apache-tomcat-9.0.41
进入解压后的目录,启动tomcat
cd apache-tomcat-9.0.41/bin
执行./startup.sh
对外开放访问的端口
sudo firewall-cmd --add-port=8080/tcp --permanent
重载防火墙
firewall-cmd --reload
查看开放的端口
firewall-cmd --list-all
配置IP地址到域名的映射(域名映射)
vim /etc/hosts
192.168.10.186 www.sss.com
启动nginx
cd /usr/local/nginx/sbin
./nginx
nginx需处于停止状态,否则直接启动nginx会因端口占用而报错,启动后配置文件生效。或使用./nginx -s reload命令直接使配置文件生效。
部署两个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
新建文件夹和测试页面
<h1>8080</h1>
<h1>8081</h1>
开放对外访问端口号
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用于测试访问效果。
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果服务器宕机,会自动剔除。
ip_hash(哈希)
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享的问题。
将动态请求和静态请求分离,使用nginx处理静态页面tomcat处理动态页面,提高访问效率,减少不必要的请求消耗,同时能减少请求的延时。
2、动态和静态文件混合在一起发布,通过nginx来分离。
3、通过location指定不同的后缀名实现不同的请求转发。通过配置expires参数设置,可以设置浏览器缓存过期时间,减少与服务器之间的请求和流量。
设置expires参数之后(3d),表示三天内访问此地址,不需要再去请求服务器,直接通过浏览器的缓存处理。期间会比对服务器的文件是否发生变化,根据变化会重新下载,无变化返回304(浏览器的缓存),有变化返回200,Expires浏览器缓存不适于经常变化更新的资源。
<h1>test</h1>
cd … && cd image/1.jpg 100% 304KB 68.0MB/s 00:00
autoindex on;
#列出当前文件夹内容目前,比较主流的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协议的。
准备主、备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 keepalived
keepalived-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 -version
Keepalived 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.conf
global_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.conf
global_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 a
停止主nginx服务器和keepalived
./nginx -s stop && systemctl stop keepalived
$ ip a
nginx启动之后在Linux系统中是有两个进程的,master 和 worker(管理员和工人),master相当于领导进程,一般master将任务分配到领导的各个worker,worker来执行具体的任务。
当客户端发送一个请求,请求到nginx中首先要经由master,master得到请求后把请求分发给worker,由worker来执行具体的工作。master下可能worker众多,worker获取任务的机制并非平均分配或轮询的方式,而是通过争抢的方式瓜分客户端发送的请求来进行具体的操作。nginx本身是不直接支持java的,所以对java的操作还需要依赖于tomcat,所以worker还要进行一些类似于请求转发或者是反向代理,通过tomcat查询数据库来得到最终的结果。