简介

Nginx概念

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中变现较好

Nginx专为性能优化而开发,性能是其最重要的考量,事实上非常注重效率,能经受高负载的考验,有报告表民能支持高达50000个并发连接数。

反向代理

正向代理

在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问

image-20240711100849482

反向代理

我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器IP地址

image-20240711101724468

正向代理:隐藏客户端

反向代理:隐藏服务端

负载均衡

负载均衡是在支持应用程序的资源池中平均分配网络流量的一种方法

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

不使用负载均衡的情况:

image-20240711102445214

使用负载均衡的情况:

image-20240711102715308

动静分离

为了加快网站的解析速度,我们把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力

不使用动静分离

image-20240711103142475

使用动静分离

image-20240711103220244

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
2
3
events {
worker_connections 1024;
}

http块

这算是Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

需要注意的是:http 块 也可以包括==http全局快、service块==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
http {
include mime.types;
default_type application/json;

sendfile on;

keepalive_timeout 65;

server {
listen 8080;
server_name localhost;
# 指定前端项目所在的位置
location / {
root html/hmdp;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}


location /api {
default_type application/json;
#internal;
keepalive_timeout 30s;
keepalive_requests 1000;
#支持keep-alive
proxy_http_version 1.1;
rewrite /api(/.*) $1 break;
proxy_pass_request_headers on;
#more_clear_input_headers Accept-Encoding;
proxy_next_upstream error timeout;
proxy_pass http://127.0.0.1:8081;
#proxy_pass http://backend;
}
}

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的页面

访问过程分析

image-20240711141629747

1、准备工作

  • 在linux中安装tomcat、使用默认端口8080
    • 安装在/usr/src目录下,解压
    • 进入tomcat的bin目录,./startup.sh启动tomcat

2、对外开放端口

  • sudo firewall-cmd --add-port=8080/tcp --permanent
    
    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
    测试: ![image-20240711144109706](./Nginx/image-20240711144109706.png)

演示2

  1. 要求:

​ 访问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. 环境准备

          1. 准备两个tomcat服务器,一个8080端口,一个8081端口
    
    1. 创建文件夹和测试文件夹
  2. 找到nginx的配置文件,进行反向代理配置

image-20240711171357169

  1. 测试

image-20240711171626475

image-20240711171607613

location

image-20240711151318578

Nginx配置示例-负载均衡

演示

  1. 实现效果

​ 浏览器地址栏输入地址:http://192.168.88.155/edu/a.html,负载均衡效果,平均到8080、8081端口中

  1. 准备工作

​ (1)准备两台tomcat

​ (2)在两台服务器的webapp下分别创建edu文件夹,文件夹下存放静态资源a.html

  1. 在nginx的配置文件中进行负载均衡的配置

    image-20240711173218339

  2. 测试

    image-20240711173526956

    image-20240711173534924

分配策略

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

2、weight

weight代表权重,默认为1,权重越高被分配的客户端越多

1
2
3
4
upstream myserver {
server 192.168.88.155 weight=10;
server 192.168.88.155 weight=5;
}

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况

1
2
3
4
upstream myserver {
server 192.168.88.155 weight=10;
server 192.168.88.155 weight=10;
}

3、ip_hash

每个请求访问ip的hash结果分配,这样每个访客固定访问一个后端服务器

1
2
3
4
5
6
7
upstream myserver {
ip_hash;
server 192.168.88:155;
server 192.168.89:155;
}
# 意思是,根据你ip访问得到的结果来分配。假入你用192.168.88.155去访问 得到的结果是8081,那么后面不管怎么访问,只要是通过192.168.88.155访问的 结果都是8081
# 可以解决session问题

4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

1
2
3
4
5
upstream myserver {
server 192.168.88.155;
server 192.168.89.155;
fair;
}

Nginx配置示例-动静分离

简介

Nginx动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分开,严格意义上说应该是动态请求跟静态请求分开,可以理解成使用==Nginx处理静态页面,Tomcat处理动态页面==

动静分离从目前实现角度来讲大致分为两种:

  1. 把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案

  2. 动态跟静态文件混合在一起发布,通过nginx开分开

通过 location 指定不同的后缀名实现不同的请求转发,通过expires参数设置,可以设置浏览器缓存过期时间,减少服务器之前的请求和流量。具体Expires 定义:是给一个资源设定一个过期时间,也可以是说无需去服务端验证,直接经过浏览器自身确认是否过期即可,所以不会产生额外的流量,此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expries 来缓存),比如说:设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间有没有发生变化,如果没有就不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200

image-20240711192345195

案例

  1. 在根目录下创建date文件夹

    1
    2
    3
    4
    5
    mkdir date
    # 在其下面创建static、image文件夹 用于存放动态资源和静态资源
    mkdir static
    mkdir image
    # 准备static/a.html image/i.jpg
  2. 进行nginx配置

    编辑nginx/conf/nginx.conf

    image-20240711195932463

  3. 重启nginx

    1
    ./nginx -s reload
  4. 访问页面 http://192.168.88.155/static/a.html

    image-20240711195516990

    访问页面http://192.168.88.155/image/

    image-20240711195613028

高可用集群

简介

什么是高可用集群?

image-20240711200229482

上图中 会有一个问题,当我们的nginx宕机时,请求效果无法完成,这个时候就是要用到高可用集群:顾名思义,当nginx宕机后,请求依旧可以完成

如下图所示:当主服务器挂掉之后,会切换备用服务器,这里的keepalived是用来和访问的ip绑定,当主服务器挂掉后,会让备用服务器与ip绑定

image-20240711202248933

准备工作(由于我只有一台虚拟机就没做)

  1. 配置高可用的准备工作

    (1) 需要两台服务器192.168.88.155和192.168.88.156

    (2) 在两台服务器安装nginx

    (3) 在两台服务器安装keepalived

    1
    2
    # 安装keepalived
    yum install keepalived -y # 在etc/keeplived 其中有keeplived.conf
  2. 完成高可用配置(主从配置)

    1. 修改etc/keeplived/keeplived.conf配置文件 (网上有)
    2. 在usr/local/etc添加脚本
  3. 把两台服务器上的nginx和keeplived启动

Nginx原理

master和worker

image-20240711205417552

image-20240711205515453

worker是如何工作的

image-20240711205549564

我们发起一个任务给master,master相当于管理员,master下的worker去争抢这个任务,抢到的进行反向代理

一个master多个worker的好处?

  • 可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作

  • 每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 是独立的,会继续进行争抢,实现请求过程,不会造成服务中断

设置多少个 woker 合适

worker 数和服务器的 cpu 数相等是最为适宜的

连接数 worker_connection

第一个:发送请求,占用了 woker 的几个连接数?

答案:2 或者 4 个

image-20240711205950091

第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的

最大并发数是多少?

l. 普通的静态访问最大并发数是: worker_connections(woker的个数) * worker_processes(每个woker的最大连接数) / 2,

Il. 而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes / 4。