Nginx核心功能
Nginx核心功能
1.基本介绍
1.Nginx 是什么? 能干什么?
1.是什么:Nginx ("engine x") 是一个高性能的 HTTP 和反向代理 WEB 服务器
2.能干什么:反向代理 负载均衡 动静分离
3.牛逼之处:高性能,高负载 有报告表明能支持高达 50,000 个并发连接数
4.详细说明:https://lnmp.org/nginx.html
2.官方资料
使用文档:https://nginx.org/en/docs/
2.Nginx核心功能
1.正向代理
如果我们要访问 www.google.com 但是直接访问不到,则需要通过代理服 务器来访问,这种代理服务就称为正向代理
- 我们知道 www.google.com , 但是访问不到
- 所以使用代理服务器帮助我们(即客户端)来上网, 注意帮助的对象是客户端, 这种代理, 我们称为正向代理.
- 正向代理同时也隐藏了客户端信息.
- 再次说明,正向代理帮助的是客户端, 因此可以把客户端+正向代理服务 , 视为一个整 体
2.反向代理
客户端将请求发送到代理服务器,由代理服务器去选择目标服务器获取数 据后,返回给客户端,这种代理方式为反向代理
- 项目设计者, 不希望客户端直接访问目标 Web 服务器(比如目标 Web 服务器是集群, 如 果直接访问就会提供多个公网 IP), 而是希望提供一个统一的访问 IP, 这个是理解反向代理 的前提,即为什么要反向代理.
- 反向代理帮助的对象是目标 Web 服务器
- 当客户端请求达到反向代理服务后,由反向代理服务来决定如何访问目标 Web 服务器 (或者是哪个 Web 服务器), 这个过程对客户端是透明的.
- 反向代理服务会暴露公共的 IP, 只要能上网,就可以访问,但是对于反向代理服务器 管 理的/代理的 Web 服务器通常是在局域网内,不能直接访问,只能通过反向代理来访问.
- 我们可以将 反向代理服务+反向代理服务代理的 Web 服务器 视为一个整体
- 反向代理会屏蔽 内网服务器(也就是他代理的服务)信息, 并实现负载均衡访问
3.负载均衡
当客户端向反向代理服务器(比如 Nginx)发出请求,如果 Nginx 代理了多个 WEB 服务器(集群),Nginx 会将请求/负载分发到不同的服务器,也就是负载均衡
- 示意图
4.动静分离
为了加快网站的解析速度,可以把动态资源和静态资源由不同的服务器来 解析,降低单个服务器的压力
传统的项目资源部署
- 示意图
动静分离项目资源部署
- 示意图
3.Nginx 下载&安装&启动
1.下载
下载地址:https://nginx.org/en/download.html
版本:nginx-1.20.2.tar.gz
2.安装
1.搭建 gcc 环境
yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
一定要保证当前的 linux 系统, 可以连接外网, 因为 yum 需要到外网,获取数据
执行上面指令的时候, 可能会报 Centos Another app is currently holding the yum lock..错误, 是因为 yum 不时会自动升级, 占用了端口或文件。
解决方案
(1)可以重启 Linux, 立即执行该指令
(2)或者等一会再执行
(3) 或者参考 https://www.cnblogs.com/lzxianren/p/4254059.html
2.将 nginx-1.20.2.tar.gz 上传到 Linux /opt/nginx 目录
3.切换到/opt 目录, 解压 nginx-1.20.2.tar.gz
tar -zxvf nginx-1.20.2.tar.gz
4.将解压后的文件放到指定位置(/usr/local/nginx)
mv nginx-1.20.2 /usr/local/nginx
5.进入文件目录
cd /usr/local/nginx
6.配置 nginx 路径
./configure --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/temp/nginx/client --http-proxy-temp-path=/var/temp/nginx/proxy --http-fastcgi-temp-path=/var/temp/nginx/fastcgi --http-uwsgi-temp-path=/var/temp/nginx/uwsgi --http-scgi-temp-path=/var/temp/nginx/scgi --conf-path=/usr/local/nginx/nginx.conf
7.补全 nginx 配置目录
mkdir /var/temp/nginx -p
8.编译并安装
#在/usr/local/nginx目录下执行
make && make install
9.测试配置与 nginx 是否正常,当出现 successful 即可
#在/usr/local/nginx目录下执行
./sbin/nginx -t
10.启动 nginx
./sbin/nginx -c nginx.conf
netstat -anp | more
11.查看进程/或端口(默认端口是 80)
ps -ef | grep nginx
3.启动 Nginx 可能的错误 和解决方案
1.解决 nginx 启动报错 nginx: [emerg] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)
这个问题在虚拟机重启之后会出现
#在/usr/local/nginx目录下执行
/usr/local/nginx/sbin/nginx -c nginx.conf
4.验证是否安装成功
1.nginx 默认监听端口 80,出现 Welcome to nginx!该页面就是搞定了
2.Linux 的浏览器:http://ip
5.配置防火墙,让 Windows 访问 Nginx
1.方式一设置开放端口
1.说明:默认情况下 Windows 是不能访问 Nginx , 因为防火墙是关闭 80 端口的
2.具体配置
- 查看开放的端口号
firewall-cmd --list-all
- 设置开放的端口号
#firewall-cmd --add-service=http --permanent #增加了一个 http 服务,理解
firewall-cmd --add-port=80/tcp --permanent
- 重启防火墙
firewall-cmd --reload
2.方式二关闭防火墙
#关闭防火墙
systemctl stop firewalld.service
#禁止防火墙开机启动
systemctl disable firewalld.service
#查看防火墙状态
systemctl status firewalld.service
#重启防火墙
firewall-cmd --reload
4.将Nginx安装成系统服务
1.创建服务脚本
vi /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
2.重新加载系统服务
systemctl daemon-reload
3.启动服务
#启动nginx
systemctl start nginx.service
#重启nginx
systemctl restart nginx.service
4.nginx开机启动
systemctl enable nginx.service
5.Nginx 命令行参数
1.指令说明
1.地址:https://nginx.org/en/docs/switches.html
2.使用演示
# 启动
/usr/local/nginx/sbin/nginx -c nginx.conf
# 停止
/usr/local/nginx/sbin/nginx -s stop
# 重新加载(不需要重启)
/usr/local/nginx/sbin/nginx -s reload
# 查看版本
/usr/local/nginx/sbin/nginx -v
# 查看版本、配置参数
/usr/local/nginx/sbin/nginx -V
6.基本运行原理
Nginx的进程是使用经典的「Master-Worker」模型,Nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。worker进程主要处理基本的网络事件,多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。
去掉注释的简单版如下:
#允许进程数量,建议设置为cpu核心数或者auto自动检测,注意Windows服务器上虽然可以启动多个processes,但是实际只会用其中一个
worker_processes 1;
events {
#单个进程最大连接数(最大连接数=连接数*进程数)
#根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。
worker_connections 1024;
}
http {
#文件扩展名与文件类型映射表(是conf目录下的一个文件)
include mime.types;
#默认文件类型,如果mime.types预先定义的类型没匹配上,默认使用二进制流的方式传输
default_type application/octet-stream;
#sendfile指令指定nginx是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度。
sendfile on;
#长连接超时时间,单位是秒
keepalive_timeout 65;
#虚拟主机的配置,nginx可以同时运行多个主机每隔主机互相之间保护干扰
server {
#监听端口
listen 80;
#域名、主机名ip地址,可以有多个,用空格隔开
server_name localhost;
# http://test.com/llp/index.html --> localtion:/llp/index.html
#配置根目录以及默认页面
location / {
#匹配到后从那个目录去找这个页面 比如:root目录
root html;
#默认页
index index.html index.htm;
}
#出错页面配置,比如访问http://test.com/llp/index.html出错了
#则会访问http://test.com/50x.html
error_page 500 502 503 504 /50x.html;
#/50x.html文件所在位置
location = /50x.html {
root html;
}
}
}
最小配置
worker_processes 1; 默认为1,表示开启一个业务进程
worker_connections 1024; 单个业务进程可接受连接数
include mime.types; 引入http mime类型
default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。
keepalive_timeout 65;长连接超时时间,单位是秒
sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
未开启sendfifile
开启后
7.nginx.conf配置文件
1.基本说明
1.Nginx 的配置文件位置
1、文件位置
- 安装目录\conf\nginx.conf
- 安装目录\nginx.conf
2、两个文件是一样的
3、使用 /usr/local/nginx/sbin/nginx 启动 Nginx ,默认用的是 安装目录 \nginx.conf 配置文件
4、作用:完成对 Nginx 的各种配置,包括端口,并发数,重写规则等
2.nginx.conf组成
全局块
events 块
http 块
3.nginx.conf 详细文档https://blog.csdn.net/liuchang19950703/article/details/110792007
2.nginx.conf讲解
1.图解nginx.conf结构
2.全局块
1.说明
- 从配置文件开始到 events 块之间的内容
- 主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx
服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径
和类型以及配置文件的引入等
2.简单分析
1、#这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持
的并发处理量也越多,但是会受到硬件、软件等设备的制约
2、配置举例:
worker_processes 1;
3.events 块
1.说明
- events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接
- 常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时
接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同
时支持的最大连接数等
2.简单分析
1、上述例子就表示每个 work process 支持的最大连接数为 1024, 这部分的配置对Nginx 的性能影响较大,在实际中应根据实际情况配置
2、配置举例
events {
worker_connections 1024;
}
4.http 块
1.说明
- 这是 Nginx 服务器配置中最复杂的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里
- http 块也可以包括 http 全局块、server 块
2.http 全局块
1、http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时
间、单连接请求数上限等
2、配置举例:
http {
include mime.types;
default_type application/octet-stream;
#开启文件传输
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
}
3.server 块
- 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全
一样的,该技术的产生是为了节省互联网服务器硬件成本。 - 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
- 每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。
- 全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。 - location 块
一个 server 块可以配置多个 location 块
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
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;
}
}
- 小 结 : 这 块 的 主 要 作 用 是 基 于 Nginx 服 务 器 接 收 到 的 请 求 字 符 串 ( 例 如server_name/uri-string),对虚拟主机名称(也可0 以. 是 IP 别名) 之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。比如地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
实例 1:修改nginx默认端口
在/usr/local/nginx/conf目录下,修改外层的配置文件也是可以的,不过我这里配置nginx自启动服务时指定的时conf目录下的配置文件
cd /usr/local/nginx/conf/
vim nginx.conf
#在/usr/local/nginx目录下
./sbin/nginx -s reload
#关闭防火墙|开放10000端口
实例 2:配置多个 server
server {
listen 10000;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 20000;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
}
8.反向代理-快速入门
1.需求说明/图解
1、需求说明/图解
- 在浏览器输入 www.llp.com(windows), 可以访问到 tomcat
- 使用 Nginx 反向代理功能, 完成需求.
2、如图
2.反向代理配置-思路分析/图解
- 思路分析示意图
3.实现步骤
1.安装jdk
1、安装步骤
1) mkdir /opt/jdk
2) 通过 xftp6 上传到 /opt/jdk 下
3) cd /opt/jdk
4) 解压 tar -zxvf jdk-8u261-linux-x64.tar.gz
5) mkdir /usr/local/java
6) mv /opt/jdk/jdk1.8.0_261 /usr/local/java
7) 配置环境变量的配置文件 vim /etc/profile
8) export JAVA_HOME=/usr/local/java/jdk1.8.0_261
9) export PATH=$JAVA_HOME/bin:$PATH
10) source /etc/profile [让新的环境变量生效]
2、测试是否安装成功
2.安装tomcat
1、步骤
1)上传安装文件,并解压缩到/opt/tomcat
2)进入解压目录/bin , 启动 tomcat ./startup.sh
3)开放端口 8080 , 回顾 firewall-cmd
2、测试是否安装成功
在 windows、Linux 下 访问 http://linuxip:8080
3.修改 C:\Windows\System32\drivers\etc\hosts 配置虚拟主机名
#配置nginx-llp虚拟机 域名
192.168.79.111 llp.com
4.修改 安装目录\nginx.conf
server {
listen 80;
# Nginx要代理的服务名-使用ip
server_name 192.168.79.111;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
# 当请求192.168.79.111/XXX就会转发到127.0.0.1:8080/XXX
proxy_pass http://127.0.0.1:8080;
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;
}
}
5.小技巧: 如何查看 nginx.conf 的配置错误
#检测默认配置文件
./sbin/nginx -t
#指定检测配置文件
- nginx -t -c 配置文件
./sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
4.完成测试
1.重启 或者 重新加载 Nginx
#/usr/local/nginx目录下执行
./sbin/nginx -s reload
2.windows 浏览器输入: http://www.llp.com
5.注意事项和细节
1.Nginx 对外提供访问入口,充当反向代理服务器,Tomcat 的端口就无需对外暴露-防火墙关闭8080端口,之对外暴露Nginx监听的端口
2.开启和关闭防火墙的端口
● 以 8080 端口为例,关闭 8080 端口
firewall-cmd --remove-port=8080/tcp --permanent
firewall-cmd --reload
● 以 8080 端口为例,开放 8080 端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
● 查看防火墙状态
firewall-cmd --list-all
9 反向代理配置-Location实例
1.需求说明/图解
- 效果示意图
windows 浏览器输入[注意带上端口]:
http://www.llpmall.com:10000/product/hi.html
http://www.llppmall.com:10000/member/hi.html
2.反向代理配置-思路分析/图解
3.Location 语法规则
1.参考 Location 文档-location 语法规则
2.解读 2-nginx 的 location 解析过程
4.实现步骤
1.修改 C:\Windows\System32\drivers\etc\hosts 配置虚拟主机名
#www.llpmall.com域名解析到nginx所在服务器域名
192.168.79.111 www.llpmall.com
2.修改 安装目录\nginx.conf
server {
#配置nginx监听端口,不同的server块可以监听不同的端口
listen 10000;
#nginx要代理的服务名-使用ip,
#比如浏览器使用www.llpmall.com访问,而该域名解析的ip是
#192.168.79.111 则这里就是配置这个ip地址
server_name 192.168.79.111;
# ~ 表示正则匹配,区分大小写
# www.llpmall.com:10000/product/xxx
# 注意 ~ /之间有一个空格
location ~ /product/ {
#反向代理的服务器ip和端口
proxy_pass http://192.168.79.111:8080;
}
location ~ /member/ {
#因为我是在本机模拟,这里的ip是让虚拟机访问宿主机的ip,可以通过ipconfig获取VMnet8所对应的ip
proxy_pass http://192.168.79.1:8080;
}
}
#查看监听的端口
netstat -anp|more
3.在 Linux 的 Tomcat 创建 webapps\product\hi.html
<h1>linux tomcat product!!!</h1>
4.在 windows 的 Tomcat 创建 webapps\member\hi.html
<h1>windows tomcat member!!!</h1>
5.linux 防火墙打开 10000 端口
firewall-cmd --permanent --add-port=10000/tcp
firewall-cmd --reload
6.保证 linux 可以访问 Windows Tomcat 【即:可以访问 Windows 的 8080 端口, 可暂时关闭 windows 防火墙,测完恢复】
5.完成测试
windows 浏览器输入[注意带上端口]:
http://www.llpmall.com:10000/product/hi.html
http://www.llppmall.com:10000/member/hi.html
10.负载均衡-配置实例
1.需求说明/图解
2.负载均衡配置-思路分析/图解
3.负载均衡配置规则
负载均衡就是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快
linux 下有 Nginx、LVS、Haproxy 等等服务可以提供负载均衡服务, Nginx 提供了几种分
配方式(策略):
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔
除
2、weight(权重)
weight 代表权,重默认为 1,权重越高被分配的客户端越多
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如
upstream llpservers{
server 192.168.79.111:8080 weight=1;
server 192.168.79.111:8081 weight=2;
}
3、ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享的问题。
例如:
upstream llpservers{
ip_hash;
server 192.168.79.111:8081;
server 192.168.79.111:8080;
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream llpservers{
server 192.168.79.111:8080;
server 192.168.79.111:8081;
fair;
}
4.实现步骤
1.修改 C:\Windows\System32\drivers\etc\hosts 配置虚拟主机名
192.168.79.111 www.llpcrm.com
2.修改 安装目录\nginx.conf
#1.配置要进行负载均衡的服务器ip和端口 llpservers由可以根据实际情况命名
#2.注意upstream上游服务器配置在http全局块中
upstream llpservers {
server 192.168.79.111:8080;
server 192.168.79.111:8081;
}
#配置nginx要监听的端口和ip
server {
listen 80;
server_name 192.168.79.111;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
# proxy_pass http://127.0.0.1:8080;
#1.指定要对那一组服务器进行负载均衡
#2.llpservers在前面进行了配置
proxy_pass http://llpservers;
index index.html index.htm;
}
执行./sbin/nginx -t
可以检查配置哪里有问题
修改完nginx配置,别忘了重新加载一下
./sbin/nginx -s reload
3.在 Linux 的 Tomcat8080 创建 webapps\search\look.html
<h1>tomcat 8080 search.... </h1>
4.在 Linux 下重新安装一份 Tomcat, 并将端口修改成 8081
#cp拷贝 -rf递归拷贝目录下的文件
cp -rf ./apache-tomcat-8.5.59 ./apache-tomcat-8.5.59-8081
- 修改 tomcat 的 conf\server.xml , 注意要修改如下位置,否则该 Tomcat 是不能正常工作.
- 细节说明:不同版本的 tomcat 修改的端口还不一样
5.在 Linux 的 Tomcat8081 创建 webapps\search\look.html
<h1>tomcat 8081 search.... </h1>
6.linux 防火墙打开 80 端口, 保证外网可以访问
[root@bogon conf]# firewall-cmd --query-port=80/tcp
yes
5.完成测试
1.启动 Linux 下两个 Tomcat
1、查看启动的端口, 确保有 8080 和 8081 端口在监听(提示: 如果 tomcat 没有监听
对应端口, 说明启动失败了, 可以尝试先执行 shutdown.sh 再执行 startup.sh 解决)
netstat -anp|more
2、在 linux 下可以正常访问到两个页面
启动 或者 重新加载 Nginx
windows 浏 览 器 输 入 ( 保 证 浏 览 器 不 是 无 痕 上 网 ):
http://www.llpcrm.com/search/look.html
6.注意事项和避免的坑
-
nginx.conf 的 upstream 不能带下划线, 否则会失败, 但是语法检测不到
-
如果你的浏览器是无痕上网, 负载均衡可能失效, 因为 Nginx 无法采集到相关信息, 老师
就遇到这个情况. 改用其它浏览器即可(比如 chrome) -
提示: 如果某 tomcat 没有监听对应端口, 说明启动失败了, 可以尝试先执行
shutdown.sh 再执行 startup.sh 解决 -
如果你的电脑上装了代理vpn可以能会影响到本机hosts的测试结果
7.几个小实现-多测试
1.文档: Nginx 的 upstream 配置技巧
1、基本介绍
Nginx 是一个反向代理软件,大部分的网站都采用 Nginx 作为网站/平台的服务器软件。Nginx 除了可以直接作为 web 服务器使用外,更多的情况是通过反向代理将请求转发给上游服务器配置上游服务器可以使用 upstream 进行设置,通过 upstream 可以实现服务的负载均衡规则,可以提高服务器的高可用性。
2、Nginx的upstream配置技巧: Nginx的upstream配置技巧
proxy_connect_timeout 3s;
proxy_next_upstream_timeout 60s;
proxy_next_upstream_tries 3;
upstream llpservers {
server 192.168.79.111:9000 max_fails=5 fail_timeout=100;
server 192.168.79.112:9000 max_fails=3 fail_timeout=60;
server 192.168.79.113:9000 backup;
}
3、 如果停掉 1 个 Tomcat, 会怎样?
挂掉的tomcat会被nginx从负载均衡服务中剔除,后续客户端发起的请求会被分配到其他服务器上
4、如果停掉 1 个 Tomcat, 然后又恢复,会怎样?
之前配置的负载均衡策略会恢复
5、如何给不同的服务,分配权重 weight
upstream llpservers {
server 192.168.79.111:8080 weight=10;
server 192.168.79.111:8081 weight=1;
}
11.动静分离-应用实例
1.什么是动静分离
- Nginx 动静分离简单来说就是把动态跟静态请求分开,可以理解成使用 Nginx 处理静态
页面/资源,Tomcat 处理动态页面/资源。 - 动静分离可以减轻 Tomcat 压力,静态请求由 Nginx 处理,提供系统整体性能.
- 回顾前面-示意图
2.需求说明/图解
3.动静配置-思路分析/图解
- 示意图
4.先使用传统方式实现
- 创建tomcat\webapps\search\cal.jsp [说明: 为了测试方便, 在tomcat2也对应创建一
份]
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<img src="image/cal.jpg"/>
<h1>JSP, 计算器 tomcat 8080 </h1>
<%
int i = 20;
int j = 70;
int res = i + j;
out.println(i + " + " + j + " = " + res);
%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<img src="image/cal.jpg"/>
<h1>JSP, 计算器 tomcat 8081 </h1>
<%
int i = 80;
int j = 70;
int res = i + j;
out.println(i + " + " + j + " = " + res);
%>
</body>
</html>
- 拷贝 cal.jpg 到 tomcat\webapps\search\image 目录, [说明: 为了测试方便, 在
tomcat2 也对应创建一份] - 浏览器访问 http://www.llpcrm.com/search/cal.jsp 就可以看到正确页面
5.动静分离优化步骤
1.修改 安装目录\nginx.conf
location /search/image/ {
#也可配置为 root html; 默认在nginx html目录
root /usr/local/nginx/html;
}
2.创 建 /usr/local/nginx/html/search/image 目 录 , 因 为 图 片 路 径 其 实 是
ip/search/image
3.将 Linux 的 两 个 Tomcat\webapps\search\image 目 录 删 除 , 在
/usr/local/nginx/html/search/image 目录下放入图片
rm -rf image/
4.linux 防火墙打开 80 端口, 保证外网可以访问
6.完成测试
1、启动 或者 重新加载 Nginx
./sbin/nginx -s reload
解读
- 这时图片就是从 Nginx 直接返回的
- 而请求 cal.jsp 才转发到对应 tomcat 完成
2、windows 浏览器输入 http://www.llpcrm.com/search/cal.jsp
3、如果有 css js 文件 需要动静分离,按照规则配置即可
12.Nginx 工作机制&参数设置
1.master-worker 机制
1.master-worker 工作原理图
- 图解
- 一个 master 管理多个 worker
这里只有一个work process是因为nginx默认设置的worker_processes 为1
2.一说 master-worker 机制
- 争抢机制示意图
图解
1、一个 master Process 管理多个 worker process, 也就是说 Nginx 采用的是多进程结构, 而不是多线程结构
2、当 client 发出请求(任务)时,master Process 会通知管理的 worker process
3、worker process 开始争抢任务, 争抢到的 worker process 会开启连接,完成任务
4、每个 worker 都是一个独立的进程,每个进程里只有一个主线程
5、Nginx 采用了 IO 多路复用机制(需要在 Linux 环境), 使用 IO 多路复用机制, 是 Nginx 在
使用为数不多的 worker process 就可以实现高并发的关键
3.二说 master-worker 机制
- 二说 Master-Worker 模式
上图说明
- Master-Worker 模式
1、Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。
2、Master 进程 接收来自外界的信号,向各 worker 进程发送信号,每个进程都有可能来处理这个连接。
3、Master 进程能监控 Worker 进程的运行状态,当 worker 进程退出后(异常情况下),会
自动启动新的 worker 进程。
- accept_mutex 解决 "惊群现象"/理论
1、所有子进程都继承了父进程的 sockfd,当连接进来时,所有子进程都将收到通知并“争
着”与它建立连接,这就叫“惊群现象”。
2、大量的进程被激活又挂起,只有一个进程可以 accept() 到这个连接,会消耗系统资源。
3、Nginx 提供了一个 accept_mutex ,这是一个加在 accept 上的一把共享锁。即每个
worker 进程在执行 accept 之前都需要先获取锁,获取不到就放弃执行 accept()。有了这
把锁之后,同一时刻,就只会有一个进程去 accpet(),就不会有惊群问题了。
4、当一个 worker 进程在 accept() 这个连接之后,就开始读取请求,解析请求,处理请
求,产生数据后,再返回给客户端,最后才断开连接,完成一个完整的请求。
5、一个请求,完全由 worker 进程来处理,而且只能在一个 worker 进程中处理。
- 用多进程结构而不用多线程结构的好处/理论
1、节省锁带来的开销, 每个 worker 进程都是独立的进程,不共享资源,不需要加锁。在编程以及问题查上时,也会方便很多。
2、独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快重新启动新的 worker 进程
- 实现高并发的秘密-IO 多路复用
1、对于 Nginx 来讲,一个进程只有一个主线程,那么它是怎么实现高并发的呢?
2、采用了 IO 多路复用的原理,通过异步非阻塞的事件处理机制,epoll 模型,实现了轻量
级和高并发
3、nginx 是如何具体实现的呢,举例来说:每进来一个 request,会有一个 worker 进程去
处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后
端)服务器转发 request,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他
会在发送完请求后,注册一个事件:"如果 upstream 返回了,告诉我一声,我再接着干"。
于是他就休息去了。此时,如果再有 request 进来,他就可以很快再按这种方式处理。而
一旦上游服务器返回了,就会触发这个事件,worker 才会来接手,这个 request 才会接着
往下走。由于 web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中,
实际上花费在 server 机器上的时间片不多,这就是几个进程就能解决高并发的秘密所在
- 小结:Nginx 的 master-worker 工作机制的优势
1、支持 nginx -s reload 热部署, 这个特征在前面我们使用过
2、对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同
时在编程以及问题查找时,也会方便很多
3、每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的
方式/IO 多路复用 来处理请求, 即使是高并发请求也能应对.
4、采用独立的进程,互相之间不会影响,一个 worker 进程退出后,其它 worker 进程还在
工作,服务不会中断,master 进程则很快启动新的 worker 进程
5、一个 worker 分配一个 CPU , 那么 worker 的线程可以把一个 cpu 的性能发挥到极致
2.参数设置
1.worker_processes
- 需要设置多少个 worker
每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
- 设置 worker 数量, Nginx 默认没有开启利用多核 cpu,可以通过增加 worker_cpu_affinity
配置参数来充分利用多核 cpu 的性能
#2 核 cpu,开启 2 个进程
worker_processes 2;
#01第一个工作进程用的是第一个cup内核,10第二个进程用的是第二个cup内核
worker_cpu_affinity 01 10;
#2 核 cpu,开启 4 个进程,
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
#4 核 cpu,开启 2 个进程,0101 表示开启第一个和第三个内核,1010 表示开启第二个和
第四个内核;
worker_processes 2;
worker_cpu_affinity 0101 1010;
#4 个 cpu,开启 4 个进程
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
#8 核 cpu,开启 8 个进程
worker_processes 8;
#00000001 8位第一个进程对应第一个cpu内核
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
- worker_cpu_affinity 理解
- 配置实例
1、vi /usr/local/nginx/nginx.conf
worker_processes 2;
worker_cpu_affinity 01 10;
2、重新加载 nginx
./sbin/nginx -s reload
3、查看 nginx 的 worker process 情况
2.worker_connection
1、worker_connection 表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes
(1)默认:worker_connections: 1024
(2)调大:worker_connections: 60000,(调大到 6 万连接)
(3)同时要根据系统的最大打开文件数来调整.
系统的最大打开文件数>= worker_connections*worker_process
根据系统的最大打开文件数来调整,worker_connections 进程连接数量要小于等于系统的最大打开文件数,worker_connections 进程连接数量真实数量= worker_connections * worker_process也就是说worker_connections * worker_process要小于等于系统的最大打开文件数
查看系统的最大打开文件数
ulimit -a|grep "open files"
#新装的linux默认最大打开文件数为1024
#open files (-n) 1024
1、根据最大连接数计算最大并发数:如果是支持 http1.1 的浏览器每次访问要占两个连接,
所以普通的静态访问最大并发数是: worker_connections * worker_processes /2
,而如果
是 HTTP 作 为 反 向 代 理 来 说 , 最 大 并 发 数 量 应 该 是 worker_connections *worker_processes/4
。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端
服务的连接,会占用两个连接, 看一个示意图
3.配置 Linux 最大打开文件数
1、使用 ulimit -a 可以查看当前系统的所有限制值,使用 ulimit -n 可以查看当前的最大打
开文件数。
2、新装的 linux 默认只有 1024,当作负载较大的服务器时,很容易遇到 error: too many open
files。因此,需要将其改大。
3、使用 ulimit -n 65535 可即时修改,但重启后就无效了。(注 ulimit -SHn 65535 等效 ulimit
-n 65535,-S 指 soft,-H 指 hard)
4、有如下三种修改方式:
- 在/etc/rc.local 中增加一行 ulimit -SHn 65535
- 在/etc/profile 中增加一行 ulimit -SHn 65535
- 在/etc/security/limits.conf 最后增加如下两行记录
* soft nofile 65535
* hard nofile 65535
在 CentOS 中使用第 1 种方式无效果,使用第 3 种方式有效果,而在 Debian 中使用第 2 种有效果
5、修改之后可能遇到的问题处理,在/etc/pam.d/login配置文件,在最后添加以下一条内容:
session required pam_limits.so
再次重启即可,参考: https://blog.csdn.net/weixin_43055250/article/details/124980838
13.搭建高可用集群
1.Keepalived+Nginx 高可用集群(主从模式)
1.集群架构图
1、准备两台 nginx 服务器, 一台做主服务器, 一台做备份服务器
2、两台 Nginx 服务器的 IP 地址, 可以自己配置
3、安装 keepalived , 保证主从之间的通讯
4、对外提供统一的访问 IP(虚拟 IP-VIP)
- 示意图
这里tomcat1和tomcat2其实应该部署在别的服务器,但这里为了节省资源没有在搭建虚拟机了,因此在master和slave中都启动tomcat来模拟nginx高可用集群负载均衡的效果
2.具体搭建步骤
1.搭建高可用集群基础环境
1、准备两台 Linux 服务器 192.168.79.112 和 192.168.79.113
(1)可以克隆来完成
(2)也可以直接拷贝一份(建议拷贝)
Job for network.service failed虚拟机无法重启网络问题:https://blog.csdn.net/weixin_63303688/article/details/124762288
2、在两台 Linux 服务器, 安装并配置好 Nginx
(1)安装配置 Nginx, 如果你克隆的 Linux, 本身就有安装好了 Nginx, 直接使用即可.
(2) 验证安装是否成功, 在 windows 可以通过 IP 访问到 Nginx, 具体的操作步骤和注意事
项, 前面也都是说过了
(3)因为我们是拷贝了一份 Linux , 而新的 Linux 的 Ip 已经变化了, 所以需要克隆的 Linux的 nginx.conf 文件中的 IP 地址, 做相应的修改
3、在两台 Linux 服务器, 安装 keepalived
(1)下载 keepalived-2.0.20.tar.gz 源码安装包, https://keepalived.org/download.html
(2)上传到两台 Linux /root 目录下
(3)mkdir /root/keepalived
(4)解压文件到指定目录: tar -zxvf keepalived-2.0.20.tar.gz -C ./keepalived
(5)cd /root/keepalived/keepalived-2.0.20
(6)./configure --sysconf=/etc --prefix=/usr/local
说明: 将配置文件放在 /etc 目录下, 安装路径在 /usr/local
(7)make && make install
说明: 编译并安装,注意目录在/root/keepalived/keepalived-2.0.20目录下
(8)如果成功, 就会安装好 keepalived 【可以检查一下】说明: keepalived 的配置目录在 /etc/keepalived/keepalived.conf
#keepalived 的启动指令
/usr/local/sbin/keepalived
(9)提示: 两台 Linux 都要安装 keepalived
2.完成高可用集群配置
1 、 将 其 中 一 台 Linux( 比 如 192.168.79.112) 指 定 为 Master :
vi /etc/keepalived/keepalived.conf
2 、 将 其 中 一 台 Linux( 比 如 192.168.79.113) 指 定 为 Backup( 备 份 服 务 器 ) :
vi /etc/keepalived/keepalived.conf
3、启动 两台 Linux 的 keepalived 指令
#关闭keepalive
ps -ef|grep keepalived
#启动keepalived
/usr/local/sbin/keepalived
4、观察两台 linux 的 ens33 是否已经绑定 192.168.198.18
3.注意事项和细节
1、keepalived 启动后无法 ping 通 VIP,提示 ping: sendmsg: Operation not permitted
https://blog.csdn.net/xjuniao/article/details/101793935
2、nginx+keepalived 配置说明和需要避开的坑
https://blog.csdn.net/qq_42921396/article/details/123074780
3、测试
1、首先保证 windows 可以连通 192.168.198.18 这个虚拟 IP
2、访问 nginx 如图
说明:大家可以看到, 因为 192.168.79.112 是 Master 他的优先级高, 所以访问的就是192.168.79.112 的 Nginx, 同时仍然是支持负载均衡的.
3、停止 192.168.79.112 的 keepalived 服务, 否则直接关闭 192.168.79.112 主机, 再次访问 http://192.168.198.18/search/cal.jsp , 这时虚拟 IP 绑定发生漂移, 绑定到192.168.79.113 Backup 服务, 这里我们直接关闭 192.168.79.112 Master 的 keepalived 来测试,访问效果如图
4.自动检测 Nginx 异常, 终止 keepalived
需求说明 :当master服务器的nginx发生异常时,我们需要停止keepalived才能实现主机和备机之间的切换,因此我们需要配置一个脚本监控主机master服务器nginx的运行状态,当发生异常时,终止keepalived进行主备切换。
1.实现步骤
1、编写 shell 脚本: vi /etc/keepalived/chnginx.sh
简单说明: 下面的脚本就是去统计
ps -C nginx --no-header
的行数, 如果为 0 , 说明 nginx已经异常终止了, 就执行 killall keepalived
如果提示killall keepalived为找到killall指令,执行yum install psmisc -y
指令进行安装
#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];then
killall keepalived
fi
2、修改 ch_nginx.sh 权限
chmod 755 chnginx.sh
3、修改 192.168.79.112 主 Master 配置文件, 指令:
vi /etc/keepalived/keepalived.conf
4、重新启动 192.168.79.112 Master 的 keepalived , 这时因为 Master 的优先级高,会争夺到 VIP 优先绑定.
/usr/local/sbin/keepalived
5、手动关闭 192.168.79.112 Master 的 Nginx
# 在/usr/local/nginx目录下(nginx安装目录)
./sbin/nginx -s stop
6、再次访问 nginx , 发现 这个虚拟 IP 又和 192.168.79.113备份服务器绑定了.
2.注意事项
1、keepalived vrrp_script 脚本不执行解决办法
- 打开日志观察
tail -f /var/log/messages
- 重启 keepalived
systemctl restart keepalived.service
- 说明: 出现过文件找不到 可以修改执行脚本文件名,不要有_ (下划线)就OK了
2、如果配置有定时检查 Nginx 异常的脚本, 需要先启动 nginx ,在启动 keepalived ,否则keepalived 一启动动就被 killall 了
5.配置文件 keepalived.conf 详解
#这里只注释要修改的地方
global_defs {
notification_email {
test@foxmail.com #接收通知的邮件地址
}
notification_email_from Alexandre.Cassen@firewall.loc #发送邮件的邮箱
smtp_server 192.168.200.1 #smtp server 地址
smtp_connect_timeout 30
router_id Node132 #Node132 为主机标识
vrrp_skip_check_adv_addr
#vrrp_strict #这里需要注释,避免虚拟 ip 无法 ping 通
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #主节点 MASTER 备用节点为 BACKUP
interface ens33 #网卡名称
virtual_router_id 51 #VRRP 组名,两个节点的设置必须一样,指明属于同一 VRRP 组
priority 100 #主节点的优先级(1-254 之间),备用节点必须比主节点优先级低
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虚拟 IP, 两个节点设置必须一样
192.168.200.16
}
}