• Nginx


    Nginx

    Nginx 三大功能:

    1. 请求转发:

    在大型的项目中,因为服务器在后端较多,访问端口不同,此时就会造成请求每个服务器路径的端口号不一致,这样不方便跳转增加代码整体复杂程度,此时就需要nginx,所有的访问路径使用一个请求端口,由nginx将请求转发到具体的服务器(根据地址中包含的唯一标识)

    1. 负载均衡

    2. 动静分离

    一、Linux 安装Nginx

    下载链接:

    Index of /download/ (nginx.org)

    下载 .tar.gz 的安装包即可

    使用 xftp 将下载好的 tar 包,放到 nginx 目录下,并进行解压:

    tar -xzvf nginx-1.21.6

    解压好并进入到 nginx-1.21.6 目录 中,依次安装环境:

    # 安装 gcc 环境,如果有可跳过
    yum install -y gcc
    # 安装 perl 库,如果有可跳过
    yum install -y pcre pcre-devel
    # 安装 zlib 库,如果有可跳过
    yum install -y zlib zlib-devel
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    编译安装,同时也可以使用本命令检查需要哪些环境,也可以指定安装位置:

    # 不指定安装位置
    ./configure
    # 指定安装位置
    ./configure --prefix=/usr/local/nginx
    
    • 1
    • 2
    • 3
    • 4

    进入到 nginx-1.21.6 目录中进行编译:

    make #编译
    make install   #安装
    
    • 1
    • 2

    启动关闭命令:

    必须在 /usr/local/nginx/sbin 目录下

    ./nginx 启动 
    ./nginx -s stop 快速停止 
    ./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求 
    ./nginx -s reload 重新加载配置
    
    • 1
    • 2
    • 3
    • 4

    启动 nginx 后,浏览器输入 虚拟机IP地址即可:

    如果出现以下内容,表示启动成功 :

    1652349456561

    如果访问失败,可能是你的防火墙没有关闭。

    # 关闭防火墙
    systemctl start firewalld.service
    # 查询防火墙启动状态
    systemctl status firewall.service
    
    • 1
    • 2
    • 3
    • 4

    创建 Nginx 脚本设置成系统服务:

    vi /usr/lib/systemd/system/nginx.service
    
    • 1

    将以下内容粘贴进去:

    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    重新加载系统服务:

    systemctl daemon-reload
    
    • 1

    启动服务:

    systemctl start nginx.service
    
    • 1

    如果在启动失败,并提示 nginx.pid 没有,那么就在 /usr/local/nginx/logs/ 目录下创建一个 nginx.pid 就好了。

    touch nginx.pid
    
    • 1

    设置开机自启动:

    # 设置开机自启动
    systemctl enabled nginx.service
    # 查看开机自动状态
    systemctl is-enabled nginx.service
    
    • 1
    • 2
    • 3
    • 4

    二、Nginx 的基本使用

    1、目录介绍

    sbin

    ​ ---- nginx : Nginx 的主程序

    logs

    ​ ---- nginx.pit : 记录 Nginx 的主进程号

    ​ ---- error.log : 记录 Nginx 的错误信息

    ​ ---- access.log : 记录访问信息

    html ---- 用于存放静态资源

    ​ ---- index.html : 浏览器访问 IP 地址时展现的静态欢迎页面,可以编辑修改

    ​ ---- 50x.html : 错误页面

    conf ---- 所有的 Nginx 配置文件

    2、Nginx 进程原理图

    1652350880900

    Nginx 是多进程的,Master为主进程,Worker 为子进程

    ​ 主进程只负责对所有的子进程协调工作,并不会参与到 请求处理中…

    ​ 子进程负责 所有的请求处理,以及页面响应…

    3、nginx.conf 配置文件详解

    省略了注释部分

    # 开启的进程数,默认就是 1 
    worker_processes  1;
    
    events {
    	# 每个进程可以连接数
        worker_connections  1024;
    }
    
    http {
    	# 引入外部配置文件
    	# mime.types 文件里,保存了文件后缀和类型的对应关系
    	# 其实在浏览器区分文件的类型,并不是根据后缀名来区分的
    	# 而是根据文件后缀对应的类型
        include       mime.types;
        # mime中没有的类型。默认使用 application/octet-stream;
        default_type  application/octet-stream;
    
    	# Nginx 在进行数据传输时,会有更少的数据拷贝动作
        sendfile        on;
    
    
        keepalive_timeout  65;
    
    	# 一个 server 代表一个虚拟主机
    	# 可以配置多个主机
        server {
        	# 监听的端口
            listen       80;
            # 域名-主机名
            server_name  localhost;
            
            # 访问路径 / 跳转的页面 html
            location / {
            	# 根目录
                root   html;
                # 默认页名称
                index  index.html index.htm;
            }
            # 服务器内部的错误,跳转到的错误页面
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
        }
    
    }
    
    • 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
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    对 sendfile on 的理解:

    普通的数据传输方式:

    1. 调用read函数,文件数据拷贝到内核缓冲区
    2. read函数返回,数据从内核缓冲区拷贝到用户缓冲区
    3. 调用write/send函数,将数据从用户缓冲区拷贝到内核socket缓冲区
    4. 数据从内核socket缓冲区拷贝到协议引擎中

    最终会通过网络接口响应给浏览器【互联网】,此过程经历了四次拷贝:

    ​ 硬盘—>内核缓冲区—>用户缓冲区—>内核socket缓冲区—>协议引擎

    开启 sendfile on 后:

    1. sendfile系统调用利用DMA引擎将文件数据拷贝到内核缓冲区,之后数据被拷贝到内核socket缓冲区中

    2. DMA引擎将数据从内核socket缓冲区拷贝到协议引擎中

          硬盘—>内核缓冲区—>内核socket缓冲区—>协议引擎  
      
      • 1

    没有用户缓冲区的切换,大大提升了传输性能。

    1652352169724

    三、实战篇

    3.1、虚拟主机实战篇

    HTTP 协议详解:

    (35条消息) HTTP 协议_2022加油呀的博客-CSDN博客

    域名:

    • 通常域名是指向 IP 地址,为了记忆方便,不需要在地址栏上输入访问的 IP 地址,因此出现了域名

    域名由什么组成:

    • 拿 baidu.com 来说,后边的 .com 就是域名【顶级域名】,常见的比如:.vn .org .net …等等
      • taobao 是二级域名,如果 ju.taobao.com 那么,ju 就是 三级域名
    • 域名的不同通常对应不同的业务模块,因为一个项目中,多个域名对应同一个 IP 地址是非常常见的。
    • 如果需要别人从外网访问 自己的IP ,需要注册购买的 !

    1、修改本机域名

    找到本机上的 hosts 文件,这种方式外网访问不到

    1652433436328

    该域名对应我的虚拟机地址: 192.168.200.132

    在本机上只需访问该域名就能映射到我的 IP 地址

    2、阿里云购买域名

    交易首页-域名交易首页-万网-阿里云旗下品牌 (aliyun.com)

    通过购买对应的域名 映射到 具体的 IP 地址 !

    购买跟着提示进行操作即可。

    买完后,进行解析:

    1652438150945

    注意:

    1、购买完的域名,需要进行解析才能使用

    2、如果修改 DNS 域名解析器,需要等待 对多 48 小时,才能生效

    3、或者手动设置本机 IPv4 的 DNS 为公用DNS 114.114.114.114

    3、俩种方式配置虚拟主机

    创建站点目录:

    /

    ​ ---- www

    ​ ---- a

    ​ ---- index.html

    ​ ---- b

    ​ ---- index.html

    3.1 基于不同的端口的形式

    修改 nginx.conf

    
        # 第一个端口
        server {
            listen       80;
            server_name  localhost;
           
            location /{
                root   /www/a;
                index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
        }
    
        # 第二个端口
        server {
            listen       88;
            server_name  localhost;
           
            location /{
            	# 站点的根目录
                root    /www/b;
                index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
        }
    
    • 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

    修改完重启 nginx 服务

    systemctl reload nginx
    
    • 1

    这时通过访问不同的端口,就可以访问不同的 页面

    192.168.200.132:88

    192.168.200.132:80

    3.2 基于不同的域名的形式

    注意:

    端口号 + 域名必须是唯一的 ,不能重复 !

        server {
            listen       80;
            # 设置域名
            server_name  a.yzgcf.vip;
    
            location / {
                root   /www/a;
                index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    
        server {
            listen       80;
            # 设置域名
            server_name  b.yzgcf.vip;
    
            location / {
                root   /www/b;
                index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    
    • 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

    3.2 server_name 匹配方式

    server_name 域名/主机 匹配规则 :

    完整匹配 :完整的域名,并且能匹配多个,中间用空格分开

    server_name b.yzgcd.vip bbbbb.yzgcd.vip;
    
    • 1

    通配符匹配

    server_name *.yzgcd.vip;
    
    • 1

    通配符结束匹配

    server_name a.yzgcd.*;
    
    • 1

    正则匹配

    server_name ~^[0-9]+\.yzgcf\.vip$;
    
    • 1

    注意:

    如果所有的 server_name 都没有匹配上,默认匹配第一个 server!!

    3.3 基于域名的几种互联网需求

    1、多级域名

    1652513429750

    2、短网址

    短网址顾名思义 将域名缩短,变成一个相对较短的网址,减少字节数

    1652513745787

    1652514070887

    四、反向代理、负载均衡

    反向代理

    1652514865902

    正向代理

    1652515759350

    可以这么理解:

    正向代理 基于 客户端架构的,真正代理的是 客户端 ,向外网发送请求

    反向代理 基于 服务器架构的,真正代理的是 服务器 ,代替服务器接受/发送 请求/数据

    负载均衡

    由 Nginx 将工作分步到多个服务器中, 来提高网站、应用、数据库或其他服务的性能和可靠性。

    1652517042693

    配置反向代理

        server {
            listen       80;
            server_name  *.yzgcf.vip;
    
            location / {
            	# 访问根目录时,会自动代理到 百度
    			proxy_pass http://www.baidu.com;
               # root   /www/b;
              #  index  index.html index.htm;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    可以代理 IP 地址,或者多个 IP 地址

    配置负载均衡

        # 配置负载均衡
        upstream httpds{
          server 192.168.200.133;
          server 192.168.200.134;
        }
        server {
            listen       80;
            server_name  *.yzgcf.vip;
    
            location / {
            	# httpds 是与 负载均衡设置的名字一致的
    			proxy_pass http://httpds;
                # root   /www/b;
                #  index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    如果有多台服务器 IP ,采用的是轮询的工作方式,一台服务器访问一次 !

    负载均衡策略 — 权重 weight

    默认为1,权重越高处理的数据就会越多!

        # 配置负载均衡
        upstream httpds{
          server 192.168.200.133 weight=8;
           server 192.168.200.134 weight=2;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    负载均衡策略 — down

    不参与负载均衡

        # 配置负载均衡
        upstream httpds{
          server 192.168.200.133 weight=8 down;
           server 192.168.200.134 weight=2;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    负载均衡策略 — backup

    指定备用服务器,当所有的服务器都down掉之后,启动备用服务器

        # 配置负载均衡
        upstream httpds{
          server 192.168.200.133 weight=8 backup;
           server 192.168.200.134 weight=2 down;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    五、动静分离配置

    动静分离其实就是将项目的静态资源全部交给 Nginx 来处理

    将web项目项目放到 192.168.200.133 这台虚拟机的 Tomcat的 webapp的 ROOT 目录下:

    1、通过 192.168.200.132 这台服务器反向代理到 192.168.200.133 服务器上

    2、将 192.168.200.133 中项目的静态资源存放到192.168.200.132 的 Nginx 的 html 目录中。然后通过 配置 location 访问。

    1652526317959

    配置192.168.200.132的反向代理、location:

        server {
            listen       80;
            server_name  *.yzgcf.vip;
    
            location / {
    	proxy_pass http://192.168.200.133:8080;
            }
    
            location /static/css{
                root   html;
                index  index.html index.htm;
            }
            location /static/img{
                root   html;
                index  index.html index.htm;
            }
    
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    location 匹配规则:

    / 通用匹配,任何请求都会匹配到。

    = 精准匹配,不是以指定模式开头

    ~ 正则匹配,区分大小写

    ~* 正则匹配,不区分大小写

    通过正则表达式配置多个静态资源目录,不用写多个 location:

            location ~*(/static/css|/static/img){
                root   html;
                index  index.html index.htm;
            }
    
    • 1
    • 2
    • 3
    • 4

    location 匹配顺序

    多个正则 location 直接按书写顺序匹配,成功后就不会继续往后面匹配

    普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)

    当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配

    所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)

    六、UrlRewrite 重写

    语法:

    rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,

    重定向到replacement,结尾是flag标记。

    ​ rewrite [flag];

    ​ 关键字 正则 替代内容 flag标记

    关键字:其中关键字error_log不能改变

    flag标记说明:

    last 	#本条规则匹配完成后,继续向下匹配新的location URI规则 
    
    break 	#本条规则匹配完成即终止,不再匹配后面的任何规则 
    
    redirect	 #返回302临时重定向,浏览器地址会显示跳转后的URL地址 
    
    permanent	 #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    网关服务器

    1652614698644

    七、防盗链基本配置

    Nginx 用于实现防盗链功能的模块为 **refer 模块 **, 其依据的原理是:

    如果网站盗用了你的图片,那么用户在点击或者查看这个盗链内容时,发送 http 请求的头部中的 referer 字段将为该盗版网站的 url

    配置在不想让别人访问的 location 地址中:

    location ~*(/static/css|/static/img){
    	# 防盗链设置
    	valid_referers 192.168.200.132; 
    	if ($invalid_referer) { 
    	return 403; 
    	} 
        root   html;
        index  index.html index.htm;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    none, 检测 Referer 头域不存在的情况。

    blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以

    “http://” 或 “https://” 开头。

    server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。

    使用 Curl 测试:

    安装 curl

    yum install curl
    
    • 1
    curl -I http://192.168.44.101/img/logo.png
    # 带引用
    curl -e "http://baidu.com" -I http://192.168.44.101/img/logo.png
    
    • 1
    • 2
    • 3

    防盗链配置返回错误页面

            location ~*(/static/css|/static/img){
    	# 防盗链设置
    	valid_referers 192.168.200.132; 
    	if ($invalid_referer) { 
    	return 403; 
    	} 
                root   html;
                index  index.html index.htm;
            }
    
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
            # 跳转到自定义页面
            error_page   403  /403.html;
            location = /403.html {
                root   html;
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    防盗链配置返回错误图片

    location ~*(/static/css|/static/img){
    	# 防盗链设置
    	valid_referers 192.168.200.132; 
    	if ($invalid_referer) {
        # 返回错误图片
    	rewrite ^/ /static/img/code.bmp break;
    	# return 403; 
    	} 
        root   html;
        index  index.html index.htm;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    八、Keepalived 高可用

    对 Nginx 进行一个备份,使用 keepalived 互相监测 是否还在正常运行

    提供一个 Vip【虚拟 ip】与 正在运行的 Nginx 连接,如果该 Nginx 突然 down 掉,则与另一个 Nginx 相连

    1652618683813

    安装 Keepalived

    yum install -y keepalived
    
    • 1

    简单配置 keepalived :

    192.168.200.132

    ! Configuration File for keepalived
    
    global_defs {
    
       router_id lb132
    
    }
    
    vrrp_instance VI_1 {
        state MASTER
       # 网卡名
        interface ens33
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
       # VIp 地址
        virtual_ipaddress {
    	192.168.200.150
        }
    }
    
    
    • 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

    192.168.200.133

    ! Configuration File for keepalived
    
    global_defs {
    
       router_id lb133
    
    }
    
    vrrp_instance VI_1 {
        # 备用机
        state BACKUP
       # 网卡名
        interface ens33
        virtual_router_id 51
       # 优先级
        priority 50
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
       # VIp 地址
        virtual_ipaddress {
    	192.168.200.150
        }
    }
    
    
    • 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
  • 相关阅读:
    Vue中如何进行自定义动画与动画效果设计(如CSS动画、Web动画)
    uniapp条件编辑语法
    POI 和 EasyExcel
    jQuery的使用
    什么是站内搜索引擎?如何在网站中加入站内搜索功能?
    GPT-3被超越?解读低能耗、高性能的GlaM模型
    Golang 中的调试技巧
    Windows11安装配置Git
    快应用开发初体验
    22 行为型模式-状态模式
  • 原文地址:https://blog.csdn.net/aetawt/article/details/126673621