Nginx

概述

什么是Nginx

Nginx 是一个高性能的HTTP和[反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAPIPOP3)代理服务器,在BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。

Nginx作为服务器

nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php等。但是不支持 java。Java程序只能通过与tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50,000个并发连接数。

反向代理

Nginx不仅可以做反向代理,实现负载均衡,还能用作正向代理进行上网等功能。

正向代理

​ 如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet则需要通过代理服务器访问,这种代理服务就叫做正向代理

image-20230322200230560

反向代理

其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将服务发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实的服务器IP地址

image-20230322211415109

负载均衡

负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。(见得太多了,不用说太多)

动静分离

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

image-20230322213151583

image-20230322213235358

Nginx安装

在CentOS7下的Linux系统中安装Nginx

官网下载http://nginx.org/en/download.html

使用winSCP将压缩包带入虚拟机中(/usr/local/Nginx)

解压文件

1
tar -xvf Nginx压缩包名

进入解压后的包中

执行命令

1
./configure

image-20230323084124742

安装nginx所需要的配置环境

1
2
3
4
yum -y install gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

安装完成后开始编译nginx

1
make	

安装完成后可以在/usr/local下看到一个新生成的nginx包

访问/usr/local/nginx/sbin

image-20230323084831485

开启nginx服务

1
./nginx

提前开启端口80

1
2
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

访问ip地址+端口80

image-20230323085214177

当开启服务时

进入/usr/local/nginx/sbin/

Nginx常用命令

1
./nginx -v (查看版本)

image-20230323090126372

1
2
./nginx -s stop(关闭服务)
./nginx -s reload(重新加载)

Nginx配置文件

nginx的配置文件在 /usr/local/nginx/conf中

image-20230323092053738

nginx中分为三部分

  • 第一部分:全局块

这里的配置主要影响了nginx服务器整体运行的配置指令,包括配置运行Nginx服务器的用户(组)、允许生成worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入

image-20230323092437729

例如以下配置 ,这时Nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量就越多,但是受到硬件和软件等设备的制约

1
worker_process=1  
  • 第二部分 event块

image-20230323092834388

events 块涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 wordprocess 可以同时支持的最大连接数等。

上述例子就表示每个work process支持的最大连接数为1024,这部分的配置对Nginx的性能影响较大,在实际中应该灵活配置。

  • 第三部分 http块

    image-20230323093240520

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

  • Http全局块

http 全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。

  • server块

    这块和虚拟主机有密切关系,虚拟主机从用户的角度看,和一台独立的硬件主机是完全一样的,该技术产生是为了节省互联网服务器硬件成本

    每个http 块可以包括多个server 块,而每个server 块就相当于一个虚拟主机。而每个server 块也分为全局server块,以及可以同时包含多个locaton块。

    • 全局server块
      • 最常见的配置时本虚拟机主机的监听配置和本虚拟主机的名称和IP配置
    • location 块
      • 这块的主要作用是基于Nginx服务器接收到的请求字符串(例如server_name/uri-string ),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri-string )进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

Nginx配置实例

反向代理(一)

​ 要达成的效果:打开浏览器,在浏览器地址栏中输入地址:www.123.com跳转到linux系统重的tomcat页面

image-20230323101629796

首先要将Tomcat安装到Linux并开启服务(别忘了开启防火墙端口8080)

image-20230323110317756

打开本地C:\Windows\System32\drivers\etc目录下的hosts文件

向其中添加配置

image-20230323165257067

然后重启nginx

1
./nginx -s restart

然后访问www.123.com

image-20230323165811079

通过配置和达成效果图我们就可以更好的理解注解中的内容

首先 我们在地址栏中输入 www.123.com ,浏览器就在本地域名上查找发现本地域名服务(具体配置在hosts)中将www.123.com这个域名请求到192.168.26.128这个服务器上,nginx服务打开时在随时监听本地IP(192.168.26.128)的80端口,发现请求来了将其解析为 http://127.0.0.1:8080这个请求

反向代理(二)

要实现的效果,我们的虚拟机下有两台tomcat服务器8080 8081 在其/webapps包下分别由/edu/a.html 与 /vod/a.html ,当前端请求端口为9001时nginx将端口抓发到这两个tomcat中,此时如果请求路径中为/vod/*则转发到8081中,若请求路径中有/edu/ *则转发到8080端口中返回不同页面

image-20230323200651114

首先配置两个不同的tomcat,在其config包下将配置文件进行修改,其中 标签connector中的端口为外部所访问tomcat的端口号,默认为8080。配置为一个8080一个8081,在tomcat的安装包下的webapps包下分别创建 目录 vod 加入a.html (输入内容为8081),目录 edu 加入a.html (输入内容为8080)

修改Nginx配置文件

添加以下配置

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 9001;
server_name 192.168.26.128;

location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}

location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}

其中~ /vod/ 为正则表达式,表示为请求路径中有/vod/

=精确匹配路径,用于不含正则表达式的 uri 前,如果匹配成功,不再进行后续的查找;
^~ 用于不含正则表达式的 uri 前,表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找;
~ 表示用该符号后面的正则去匹配路径,区分大小写;
~* 表示用该符号后面的正则去匹配路径,不区分大小写。跟 ~优先级都比较低,如有多个location的正则能匹配的话,则使用正则表达式最长的那个;
如果 uri 包含正则表达式,则必须要有 ~~* 标志。

重启nginx

1
./nginx -s reload

image-20230323201834526

image-20230323201852307

负载均衡

要到达的效果

image-20230323205725157

继续引用反向代理的两个tomcat服务器

在nginx配置文件中修改配置

  • 在http{} 配置中添加
1
2
3
4
upstream myserver{
server 192.168.26.128:8080;
server 192.168.26.128:8081;
}
  • 添加配置

    server {
    listen 80;
    server_name 192.168.26.128;
    location / {
    root html;
    proxy_pass http://myserver;
    index index.html index.htm;
    }
    }

实际上我们在反向代理的基础之上做了一个负载均衡,在反向代理示例1中我们做好的第二个配置但其中稍有修改,我们将转发到的请求(proxy_pass)改为了 一个地址组 myserver

重启nginx服务

image-20230323211618816

image-20230323211634617

负载均衡策略

轮询(默认)

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

例如我们的8080和8081 , 他们轮询顺序即为 8080 、8081、 8080 、8081……

但如果8081或8080其中一台服务挂掉,后面的所有服务都会访问到另一台服务器上

权重

weight代表权重,权重默认为1,权重越高,被分配的客户端请求就会越多。相当于指定了轮训的几率weight和访问率成正比,多用于性能不均的情况

例如:实验室的一台服务器QOS为8000 ,家中的服务器为2000。如果二者为一个tomcat集群,Nginx来做负载均衡,我们就可以根据两台服务器的性能分配权重(实验室weight=4 ,家中weight=1)

我们在配置文件中的配置

image-20230323212838283

image-20230323212757929

ip_hash

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

image-20230323213310684

当我请求路径,点击了N下刷新后(还是它,“真”一直不变)

image-20230323213348810

fair

根据后端服务器的响应时间来分配请求,响应时间短的优先分配(高版本已被删除)

动静分离

Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx :处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。

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

在根目录下创建目录data,在其中创建两个目录image和www,image目录中加入图片123.jpg www其中加入 a.html 如何运用动静分离将这些静态资源访问到

首先在nginx配置文件中

      server {
        listen       80;
        server_name  192.168.26.128;


    location  /www {
        root  /data;
         index  index.htm index.html;
    }
    location /image {
       root  /data;
     autoindex on; 
     }
}

root 类似于将访问路径的前缀加上 /data autoindex on ;进入文件夹后是否要创建一个首页面去展示文件内容

重启nginx

image-20230324131648604

image-20230324131713209

高可用集群