Nginx
简介
Nginx概念
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中变现较好
Nginx专为性能优化而开发,性能是其最重要的考量,事实上非常注重效率,能经受高负载的考验,有报告表民能支持高达50000个并发连接数。
反向代理
正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
反向代理
我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器IP地址
正向代理:隐藏客户端
反向代理:隐藏服务端
负载均衡
负载均衡是在支持应用程序的资源池中平均分配网络流量的一种方法
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
不使用负载均衡的情况:
使用负载均衡的情况:
动静分离
为了加快网站的解析速度,我们把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力
不使用动静分离
使用动静分离
nginx安装
1、进入官网:https://nginx.org/en/
2、安装相关依赖
安装pcre依赖
# Linux中安装pcre wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz # 将其移动到 /usr/src目录下 mv pcre-8.37.tar.gz /usr/src # 解压 tar -xvf pcre-8.37.tar.gz # 进入文件夹执行./configure cd pcre-8.37/ ./configure #这个时候可能会报: You need a C++ compiler for C++ support. 需要执行:yum install -y gcc gcc-c++ 再执行./configure # 安装依赖 make && make install
1
2
3
- ```bash
pcre-config --version # 查看版本号
安装openssl、zlib
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
1
2
3
4
5
6
7
8
9
10
11
12
13
3、安装nginx
- 去[https://nginx.org/en/download.html]()下载tar.gz文件,上传到Linux
- ```bash
# 解压 /usr/src
tar -xvf nginx-1.20.2.tar.gz
# 进入目录
cd nginx-1.20.2/
./configure
# 安装
make && make install
4、安装成功后,在usr下会多出来一个local/nginx文件夹,在nginx中有个sbin文件夹,启动脚本在里边
# 启动 ./nginx
1
2
3
4
5
6
7
8
9
10
11
12
5、默认防火墙是不会开放这个端口的,所以要开启这个端口
```bash
# 查看开放的端口
firewall-cmd --list-all
# 设置开放的端口
firewall-cmd --add-service=http -permanent
sudo firewall-cmd --add-port=80/tcp --permanent
# 重启防火墙
systemctl stop firewalld
systemctl start firewalld
常用命令
使用nginx命令的前提:必须进入nginx目录[/usr/local/nginx/sbin]
- 查看nginx版本号
1 | ./nginx -v |
- 启动nginx
1 | ./nginx |
- 关闭nginx
1 | ./nginx -s stop |
- 重新加载nginx
1 | ./nginx -s reload |
配置文件
/usr/local/nginx/conf/nginx.conf
nginx的配置文件由三部分组成
全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令
比如:worker_processes 1;
worker_processes值越大;可以支持的并发处理了也越多
1 | worker_processes 1; |
event块
events块涉及的指令主要影响Nginx服务器与用户的网络连接
比如:worker_connections 1024; 支持的最大连接数
1 | events { |
http块
这算是Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块 也可以包括==http全局快、service块==
1 | http { |
http全局快
http全局快配置的指令包含文件引入、MIME-TYPE定义、日志自定义、连接超时时间、但连接请求数上限等
server块
这块和虚拟机由密切关系
每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机
每个server也分为全局server块、以及可以同时包含多个location块。
全局server块
最常见的配置是本虚拟机主机的监听配置和本虚拟机主机的名称或IP配置
location块
一个server块可以配置多个location块
这块的主要作用是基于Nginx服务器接收到的请求字符串(server_name/uri-string)对虚拟主机名称(也可以是IP别名)之外的字符串(如前面的uri-string)进行匹配,对特定的请求进行处理,地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行
配置实例
Nginx配置示例-反向代理
演示1
当我们访问www.123.com时 跳转到tomcat的页面
访问过程分析
1、准备工作
- 在linux中安装tomcat、使用默认端口8080
- 安装在/usr/src目录下,解压
- 进入tomcat的bin目录,./startup.sh启动tomcat
2、对外开放端口
sudo firewall-cmd --add-port=8080/tcp --permanent
测试: ![image-20240711144109706](./Nginx/image-20240711144109706.png)1
2
3
4
5
6
7
8
9
10
11
12
- 在windows的`C:/windows/system/drivers/etc/hosts`文件中添加:192.168.88.155 www.123.com
- 进入linux中的`/usr/local/nginx/conf/`编辑nginx.conf文件夹
![image-20240711143524764](./Nginx/image-20240711143524764.png)
意思时当访问192.168.88.155时 会跳转到127.0.0.1:8080
```bash
# 重新运行nginx
./nginx
演示2
- 要求:
访问http:192.168.17.129:9001/edu/ 直接跳转到127.0.0.1:8080
访问http:192.168.17.129:9001/vod/ 直接跳转到127.0.0.1:8081
环境准备
1. 准备两个tomcat服务器,一个8080端口,一个8081端口
- 创建文件夹和测试文件夹
找到nginx的配置文件,进行反向代理配置
- 测试
location
Nginx配置示例-负载均衡
演示
- 实现效果
浏览器地址栏输入地址:http://192.168.88.155/edu/a.html,负载均衡效果,平均到8080、8081端口中
- 准备工作
(1)准备两台tomcat
(2)在两台服务器的webapp下分别创建edu文件夹,文件夹下存放静态资源a.html
在nginx的配置文件中进行负载均衡的配置
测试
分配策略
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
2、weight
weight代表权重,默认为1,权重越高被分配的客户端越多
1 | upstream myserver { |
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
1 | upstream myserver { |
3、ip_hash
每个请求访问ip的hash结果分配,这样每个访客固定访问一个后端服务器
1 | upstream myserver { |
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
1 | upstream myserver { |
Nginx配置示例-动静分离
简介
Nginx动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分开,严格意义上说应该是动态请求跟静态请求分开,可以理解成使用==Nginx处理静态页面,Tomcat处理动态页面==
动静分离从目前实现角度来讲大致分为两种:
把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案
动态跟静态文件混合在一起发布,通过nginx开分开
通过 location 指定不同的后缀名实现不同的请求转发,通过expires参数设置,可以设置浏览器缓存过期时间,减少服务器之前的请求和流量。具体Expires 定义:是给一个资源设定一个过期时间,也可以是说无需去服务端验证,直接经过浏览器自身确认是否过期即可,所以不会产生额外的流量,此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expries 来缓存),比如说:设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间有没有发生变化,如果没有就不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200
案例
在根目录下创建date文件夹
1
2
3
4
5mkdir date
# 在其下面创建static、image文件夹 用于存放动态资源和静态资源
mkdir static
mkdir image
# 准备static/a.html image/i.jpg进行nginx配置
编辑
nginx/conf/nginx.conf
重启nginx
1
./nginx -s reload
高可用集群
简介
什么是高可用集群?
上图中 会有一个问题,当我们的nginx宕机时,请求效果无法完成,这个时候就是要用到高可用集群:顾名思义,当nginx宕机后,请求依旧可以完成
如下图所示:当主服务器挂掉之后,会切换备用服务器,这里的keepalived是用来和访问的ip绑定,当主服务器挂掉后,会让备用服务器与ip绑定
准备工作(由于我只有一台虚拟机就没做)
配置高可用的准备工作
(1) 需要两台服务器192.168.88.155和192.168.88.156
(2) 在两台服务器安装nginx
(3) 在两台服务器安装keepalived
1
2# 安装keepalived
yum install keepalived -y # 在etc/keeplived 其中有keeplived.conf完成高可用配置(主从配置)
- 修改
etc/keeplived/keeplived.conf
配置文件 (网上有) - 在usr/local/etc添加脚本
- 修改
把两台服务器上的nginx和keeplived启动
Nginx原理
master和worker
worker是如何工作的
我们发起一个任务给master,master相当于管理员,master下的worker去争抢这个任务,抢到的进行反向代理
一个master多个worker的好处?
可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作
每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 是独立的,会继续进行争抢,实现请求过程,不会造成服务中断
设置多少个 woker 合适
worker 数和服务器的 cpu 数相等是最为适宜的
连接数 worker_connection
第一个:发送请求,占用了 woker 的几个连接数?
答案:2 或者 4 个
第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的
最大并发数是多少?
l. 普通的静态访问最大并发数是: worker_connections(woker的个数) * worker_processes(每个woker的最大连接数) / 2,
Il. 而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes / 4。