1.学习Nginx 详细介绍(负载均衡、全局异常、跨域、封禁IP、路径匹配、地址重定向、Websocket反向代理、缓存、压缩)

玩转Nginx分布式架构:
1.学习Nginx 详细介绍(负载均衡、全局异常、跨域、封禁IP、路径匹配、地址重定向、Websocket反向代理、缓存、压缩)
2.使用Nginx配置域名
3.使用Nginx配置HTTPS传输协议
4.Nginx整合OpenResty+Lua (黑名单控制、内网访问限制、资源下载限速、日志分析、漏桶原理、令牌桶原理)
5.Nginx高可用解决方案LVS+KeepAlived
6.Nginx高可用后配置HTTPS传输协议

学习Nginx 详细介绍(负载均衡、全局异常、跨域、封禁IP、路径匹配、地址重定向、Websocket反向代理、缓存、压缩)

一、Nginx简介

1、什么是Nginx

官网https://nginx.org/

简介:Nginx是一个开源的高性能HTTP和反向代理服务器。它可以用于静态内容的服务和动态内容的代理,也可以作为负载均衡器、HTTP缓存和反向代理服务器,以及提供HTTP缓存和SSL终端等功能。Nginx已经成为许多大型网站和应用程序的首选服务器软件之一。

源码:Nginx是由C语言编写。

系统:Linux/Mac/Windows

2、为什么要使用Nginx

Nginx是一款非常流行的服务器软件,被广泛应用于市场上的各种场景和规模的网站和应用程序中。
1.Web服务器:Nginx可以作为静态内容的服务器,提供快速的文件传输和处理能力。它可以处理大量的并发连接,并具有高性能和低内存消耗的特点。

2.反向代理服务器:Nginx可以作为反向代理服务器,将客户端请求转发给后端的多个服务器。它可以实现负载均衡、请求分发和故障转移,提高系统的可靠性和性能。

3.负载均衡器:Nginx可以将请求分发给多个后端服务器,实现负载均衡。它可以根据不同的算法(如轮询、IP哈希、最少连接等)来分配请求,确保服务器资源的合理利用和高可用性。

4.HTTP缓存服务器:Nginx可以作为HTTP缓存服务器,缓存静态内容和动态内容的响应。这样可以减轻后端服务器的负载,提高响应速度,并减少贷款消耗。

5.SSL终端:Nginx可以作为SSL终端,处理HTTPS请求的加密和解密。它可以提供安全的通信通道,保护用户的数据安全。

总之,Nginx在市场上被广泛应用于各种规模的网站、应用程序和服务中,它的高性能可靠性灵活性使其成为许多开发者和运维人员的首选服务器之一。
在这里插入图片描述

二、什么是正向代理服务器和反向代理服务器

1、正向代理

客户端和目标服务器之间的服务器,客户端向代理发送一个请求指定目标服务器,然后代理向目标服务器请求并获得内容,并返回给客户端,平时说的代理服务器一般是正向代理服务器。

核心:用户知道自己访问的目标服务器。

场景:跳板机、访问原来无法访问的网站,比如国外的一些站点。
在这里插入图片描述

2、反向代理

客户端和目标服务器之间的服务器,客户端向代理发送一个请求,然后代理向目标服务器请求并获得内容,并返回给客户端。反向代理隐藏了真实的服务器。

核心:客户端不知道要访问的目标服务器是哪台服务器,代理会根据一定的策略选择一个真实的服务器进行请求。

场景:访问淘宝,知道访问的域名是taobao.com,但最后面提供数据的集体是什么域名或IP我们并不知道。
在这里插入图片描述

三、阿里云CentOS服务器-安装部署Nginx

1、Nginx下载

官网:https://nginx.org/

建议选择stable version 稳定版本
在这里插入图片描述
在这里插入图片描述

2、阿里云CentOS服务器

备注:请务必使用CentOS 7 以上的的版本,64位系统。
在这里插入图片描述

3、快速安装

1.准备一个远程桌面连接工具

推荐FinalShell 优点:既可以当SSH客户端有可以当做终端模拟器、免费

下载地址:http://www.hostbuf.com/
在这里插入图片描述

2.下载压缩包,并上传到阿里云服务器

快速下载:https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
在这里插入图片描述

3.安装Nginx依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl

注:请确保您具有管理员权限(例如,使用root用户或具有sudo权限的用户)来执行此命令。

  1. gcc:GNU编译器集合(GNU Compiler Collection),它是一个功能强大的编译器套件,用于编译和构建C、C++和其他编程语言的代码。
  2. zlib:Zlib是一个用于数据压缩和解压缩的库,它提供了一种高效的压缩算法,常用于许多应用程序和库中。
  3. zlib-devel:Zlib开发库,包含用于开发和构建使用zlib库的应用程序和库所需的头文件和静态库。
  4. pcre-devel:PCRE(Perl Compatible Regular Expressions)是一个正则表达式库,它提供了一种灵活和高效的方式来处理文本模式匹配。pcre-devel包含用于开发和构建使用PCRE库的应用程序和库所需的头文件和静态库。
  5. openssl:OpenSSL是一个开源的加密库,提供了一套用于加密、解密和验证数据的功能。它广泛用于安全通信和加密应用程序中。
4.安装Nginx
1.执行命令
tar -zxvf nginx-1.18.0.tar.gz
./configure 
make
make install

# 使用prefix 可自定义安装路径(./configure --prefix=/usr/local),不填写默认在/usr/local下创建一个nginx文件
# ./configure:这个命令是在源代码目录中运行的,它会检查系统环境并生成一个用于构建软件的Makefile。Makefile是一个包含了编译和链接指令的脚本文件,它告诉计算机如何编译和安装软件。

# make:这个命令会根据Makefile中的指令编译源代码,生成可执行文件。它会自动查找源代码目录中的Makefile文件,并执行其中的编译指令。

# make install:这个命令会将编译生成的可执行文件和相关的文件复制到系统的指定位置,完成软件的安装过程。通常,这些文件会被复制到系统的标准目录,以便其他程序可以找到并使用它们。
2.默认路径: /usr/local/nginx
3.访问配置并启动nginx
cd /usr/local/nginx/sbin 
./nginx

# 查看Nginx 进程: 
ps -ef  | grep nginx

在这里插入图片描述

4.防火墙开放端口,阿里云网络安全组配置80端口

在这里插入图片描述

5.Welcome to nginx!

访问:http://59.110.68.26
在这里插入图片描述

四、Nginx核心基础知识讲解

1、Nginx目录文件讲解

在这里插入图片描述

conf

所有配置文件目录

nginx.conf # 主要配置文件
nginx.conf.default #模版、示例(用于nginx.conf文件损坏或者想恢复初始配置时使用)
html

这是编译安装时Nginx的默认站点⽬录

50x.html #错误⻚⾯
index.html #默认⾸⻚
logs

nginx默认的⽇志路径,包括错误⽇志及访问⽇志

error.log #错误⽇志
nginx.pid #nginx启动后的进程id
access.log #nginx访问⽇志
sbin

nginx命令的⽬录

nginx #启动命令
常见命令
./nginx #默认配置⽂件启动
./nginx -s reload #重启,加载默认配置⽂件
./nginx -c /usr/local/nginx/conf/nginx.conf
#启动指定某个配置⽂件
./nginx -s stop #停⽌
#关闭进程,nginx有master process 和worker process,关闭master即可
ps -ef | grep nginx
kill -9 PID

2、Nginx配置文件讲解

配置文件(nginx.conf)里每个配置项由配置指令参数 2个部分构成

# Nginx 运行时会以 nobody 用户身份来执行,这是为了提高安全性,因为 nobody 用户通常具有较低的权限。
user  nobody; 

# 是一个指令,用于指定 Nginx 启动时使用的工作进程数。在这个例子中,设置为 1,表示只启动一个工作进程。工作进程是 Nginx 的核心组件,用于处理客户端请求和响应。通过设置适当的工作进程数,可以根据服务器的硬件资源和负载情况来优化 Nginx 的性能。
worker_processes  1; 

# 用于指定错误日志文件的路径和名称 常见的 Nginx 日志级别:
# debug:最详细的日志级别,用于调试目的。它会记录更多的信息,包括请求的详细数据、变量的值等。在生产环境中一般不建议使用该级别,因为会产生大量的日志数据。
# info:一般的信息级别,用于记录一般的操作和事件。这是默认的日志级别。
# notice:用于记录一些重要的系统事件和警告信息。
# warn:用于记录警告信息,表示可能存在一些问题或潜在的错误。
# error:用于记录错误信息,表示发生了一些错误的操作或事件。
# crit:用于记录严重的错误信息,表示发生了一些严重的问题,可能导致系统崩溃或无法正常工作。
# alert:用于记录需要立即采取行动的事件,表示发生了一些需要立即处理的情况。
# emerg:最高级别的日志,表示发生了紧急情况,可能导致系统无法正常工作。
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

# 用于指定 Nginx 进程 ID 文件的路径和名称
pid        logs/nginx.pid;


# 事件模块指令,⽤来指定Nginx的IO模型,Nginx⽀持的有select、poll、kqueue、epoll 等。不同的是epoll⽤在Linux平台上,⽽kqueue⽤在BSD系统中,对于Linux系统,epoll⼯作模式是⾸选
events {
 use epoll;
 # 定义Nginx每个进程的最⼤连接数, 作为服务器来说:worker_connections * worker_processes,
 # 作为反向代理来说,最⼤并发数量应该是 worker_connections * worker_processes/2。因为反向代理服务器,每个并发会建⽴与客户端的连接和与后端服务的连接,会占⽤两个连接
 worker_connections 1024;
}


http {
    # 该指令用于包含 mime.types 文件,该文件定义了 MIME 类型与文件扩展名之间的映射关系。这样可以确保 Nginx 在处理请求时能够正确地设置响应的 MIME 类型
    include       mime.types;
    # 该指令设置默认的 MIME 类型为 application/octet-stream,即未知文件类型的默认类型。当 Nginx 无法确定请求的文件类型时,将使用该默认类型。
    default_type  application/octet-stream;

  	# 日志格式:
  		# $remote_addr 表示客户端的 IP 地址
      # $remote_user 表示远程用户
  		# $time_local 表示访问时间
  		# $request 表示请求的 URL
  		# $status 表示响应状态码
  		# $body_bytes_sent 表示发送给客户端的字节数
  		# $http_referer 表示请求的来源页面
  		# $http_user_agent 表示客户端的 User-Agent 信息
  		# $http_x_forwarded_for 表示经过代理服务器后的客户端 IP 地址
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
  
		# 指定日志文件的输出位置
    access_log  logs/access.log  main;
  
		# 是否开启⾼效传输模式 on开启 off关闭
    sendfile        on;
    # 减少⽹络报⽂段的数量
    tcp_nopush     on;

  	# 该指令设置了 keep-alive 连接的超时时间为 65 秒。Keep-alive 是一种技术,允许客户端和服务器在单个 TCP 连接上进行多个 HTTP 请求和响应,以减少连接建立和关闭的开销。
    #keepalive_timeout  0;
    keepalive_timeout  65;

  	# 启用 Gzip 压缩功能
    gzip  on;

  	# 虚拟主机的配置
    server {
    		# 虚拟主机的服务端⼝
        listen       80;
    		# ⽤来指定IP地址或域名,多个域名之间⽤空格分开
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

    		# URL地址匹配
        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;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

3、搭建图片、文件服务器

使用 Nginx 搭建图像和文件服务器有以下几个好处:

  1. 高性能和可扩展性:Nginx 是一个高性能的 Web 服务器,它采用异步非阻塞的事件驱动架构,能够处理大量并发连接和高负载情况。这使得它非常适合用作图像和文件服务器,能够快速响应客户端请求并提供高吞吐量。
  2. 轻量级和资源占用低:Nginx 是一个轻量级的服务器,占用的系统资源相对较少。它的内存消耗较低,同时具有出色的性能表现。这使得它在资源受限的环境下也能够高效运行。
  3. 静态文件服务效率高:Nginx 在处理静态文件时非常高效。通过启用 sendfile 功能,Nginx 可以直接将文件内容发送给客户端,而无需将文件内容复制到用户空间。这减少了 CPU 和内存的使用,提高了文件传输的效率。
  4. 简单配置和易于管理:Nginx 的配置文件采用简洁的语法,易于理解和管理。你可以通过简单的配置指令来定义服务器监听端口、域名、文件上传路径等。这使得搭建和维护图像和文件服务器变得简单和方便。
  5. 可定制性强:Nginx 提供了丰富的配置选项和模块化的架构,使得你可以根据需要进行定制和扩展。你可以添加身份验证、限制访问权限、启用 SSL 加密等功能,以满足特定的安全和功能需求。

综上所述,使用 Nginx 搭建图像和文件服务器具有高性能、低资源占用、简单配置和可定制性强等优势,适用于快速、高效地共享和传输图像和文件的场景。

使用流程:

前端提交图片->后端处理->存储到图片服务器->拼接好访问路径存储到数据库

备注:简单使用,web项目一般会把图片上传到项目本身。很少会用这种方式。
在这里插入图片描述配置文件、图片专属访问路径:

server {
 listen 8080;
 server_name 59.110.68.26;
 
 location /uploads {
 		alias /usr/local/uploads/;
 }
}

注:1.添加配置后需要重启nginx

 ./nginx -s reload

​ 2.阿里云服务器_安全组开通8080端口号

访问地址:http://59.110.68.26:8080/uploads/1.jpg

4、挖掘accessLog日志

access.log 日志用处:

  1. 故障排查:通过查看access.log,可以了解到服务器上发生的错误、异常请求或者访问拒绝等问题,有助于快速定位和解决故障。
  2. 安全分析:access.log可以用于监控和分析潜在的安全威胁,如恶意请求、扫描行为、访问异常等。通过分析日志,可以及时采取相应的安全措施,保护服务器和网站的安全。
  3. 性能优化:通过分析access.log,可以了解网站的访问量、访问频率、热门页面等信息,有助于优化网站的性能和资源分配,提升用户体验。
  4. 统计分析:通过对access.log进行统计分析,可以了解网站的访问趋势、用户行为、流量来源等信息,为业务决策提供数据支持。

此外,access.log还可以通过日志分析工具进行进一步的处理和可视化,如ELK Stack、AWStats、GoAccess等,以便更方便地进行日志分析和监控。

默认配置:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
# 示例
118.186.5.82 - - [20/Jul/2023:14:34:35 +0800] "GET /uploads/1.jpg HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"

允许自定义日志记录的格式置项:

  1. $remote_addr:客户端的IP地址。

  2. $remote_user:客户端的用户名(如果启用了基本身份验证)。

  3. $time_local:请求的本地时间。

  4. $request:完整的HTTP请求行,包括请求方法、URL和协议版本。

  5. $status:HTTP响应的状态码。

  6. $body_bytes_sent:发送给客户端的响应体的字节数。

  7. $http_referer:引导用户访问当前页面的URL。

  8. $http_user_agent:客户端的用户代理字符串,用于标识客户端的浏览器和操作系统。

  9. $http_x_forwarded_for:如果使用了代理服务器,该变量包含了客户端的真实IP地址。

  10. $request_method:HTTP请求的方法,如GET、POST等。

  11. $scheme:请求的协议,如http或https。

  12. $host:请求的主机名。

  13. $server_protocol:服务器使用的协议版本。

  14. $request_uri:请求的URI,不包括主机名和查询参数。

  15. $uri:请求的URI,包括主机名和查询参数。

  16. $args:请求的查询参数。

  17. $http_host:请求中的Host头部字段。

  18. $http_user_agent:客户端的用户代理字符串。

  19. $http_cookie:请求中的Cookie头部字段。

  20. $http_x_forwarded_proto:如果使用了代理服务器,该变量包含了客户端请求的协议。

  21. $upstream_addr:如果使用了反向代理,该变量包含了向上游服务器发送请求的IP地址和端口号。

日志文件:
在这里插入图片描述
在这里插入图片描述

查询访问最频繁的前100个IP
awk '{print $1}' access_temp.log | sort -n|uniq -c | sort -rn | head -n 100

在这里插入图片描述
命令解析:

awk 是⽂本处理⼯具,默认按照空格切分,
$N 是第切割后第N个,从1开始
sort命令⽤于将⽂本⽂件内容加以排序,-n 按照数值排,-r 按照倒序来排案例的
sort -n 是按照第⼀列的数值⼤⼩进⾏排序,从⼩到⼤,倒序就是 sort -rn
uniq 去除重复出现的⾏列, -c 在每列旁边显示该⾏重复出现的次数。
⽇志格式增加 $request_time
从接受⽤户请求的第⼀个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间

$upstream_response_time:指从Nginx向后端建⽴连接开始到接受完数据然后关闭连接为⽌的时间

$request_time⼀般会⽐upstream_response_time⼤,因为⽤户⽹络较差,或者传递数据较⼤时,前者会耗时⼤很多

# nginx.cnf
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $request_time';
 server {
     access_log  logs/host.access.log  main;  
 }                  
                      

重启Nginx后,请求接口
在这里插入图片描述

统计耗时接⼝, 列出传输时间超过 2 秒的接⼝,显示前5条
cat time_temp.log|awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
备注:$NF 表示最后⼀列, awk '{print $NF}'

在这里插入图片描述
在这里插入图片描述

五、Nginx配置集群应用-负载均衡

1、安装OpenJDK11

sudo yum install java-11-openjdk-devel
java -version

在这里插入图片描述

2、后端应用集群构建

1.准备两个一样的jar包

demo1-1.0-SNAPSHOT.jar监听8080端⼝

下载地址:https://chick-shop-server.oss-cn-beijing.aliyuncs.com/MyServer/demo1-1.0-SNAPSHOT.jar

demo2-1.0-SNAPSHOT.jar监听8081端⼝

下载地址:https://chick-shop-server.oss-cn-beijing.aliyuncs.com/MyServer/demo2-1.0-SNAPSHOT.jar

2.接口说明

GET http://IP地址:端口号/api/demo/{id}

3.启动jar包
# I.直接启动
java -jar demo1-1.0-SNAPSHOT.jar
java -jar demo2-1.0-SNAPSHOT.jar

# II.守护进程方式
nohup java -jar demo1-1.0-SNAPSHOT.jar &
nohup java -jar demo2-1.0-SNAPSHOT.jar &

在这里插入图片描述
守护进程的方式启动完成后,输入tail -f nohup.out 查看日志
在这里插入图片描述
在这里插入图片描述

3、Nginx负载均衡upstream讲解

在这里插入图片描述

1.负载均衡(Load Balance)

1、分布式系统中⼀个⾮常重要的概念,当访问的服务具有多个实例时,需要根据某种“均衡”的策略决定请求发往哪个节点,这就是所谓的负载均衡

2、原理是将数据流量分摊到多个服务器执⾏,减轻每台服务器的压⼒,从⽽提⾼了数据的吞吐量

2.负载均衡的种类

方案一:通过硬件来进⾏解决,常⻅的硬件有NetScaler、F5、Radware和Array等商⽤的负载均衡器,但⽐较昂贵的

方案二:通过软件来进⾏解决,常⻅的软件有LVS、Nginx等,它们是基于Linux系统并且开源的负载均衡策略⽬前性能和成本来看,Nginx是⽬前多数公司选择使⽤的

3.配置案例
upstream lbs {
		server 59.110.68.26:8080;
		server 59.110.68.26:8081;
}

server {
		location /api/ {
				proxy_pass http://lbs;
				proxy_redirect default;
		}
}
4.配置后重启Nginx
cd /usr/local/nginx/sbin

./nginx -s reload

访问了6次http://59.110.68.26/api/demo/1后发现每个服务后台各打印了三条日志。

Nginx常⻅的负载均衡策略:节点轮询(默认)
在这里插入图片描述

4、Nginx常见的负载均衡策略解析

节点轮询(默认)

简介:每个请求按顺序分配到不同的后端服务器

场景:会造成可靠性低和负载分配不均衡,适合静态⽂件服务器

weight 权重配置

简介:weight和访问⽐率成正⽐,数字越⼤,分配得到的流量越⾼

场景:服务器性能差异⼤的情况使⽤

upstream lbs {
		server 59.110.68.26:8080 weight=5;
		server 59.110.68.26:8081 weight=10;
}
ip_hash(固定分发)

简介:根据请求按访问ip的hash结果分配,这样每个⽤户就可以固定访问⼀个后端服务器

场景:服务器业务分区、业务缓存、Session需要单点的情况

upstream lbs {
		ip_hash;
		server 59.110.68.26:8080;
		server 59.110.68.26:8081;
}

upstream还可以为每个节点设置状态值 down 表示当前的server暂时不参与负载

upstream lbs {
		server 59.110.68.26:8080;
		server 59.110.68.26:8081;
		server 59.110.68.26:8082 down;
}

backup 其它所有的⾮backup机器down的时候,会请求backup机器,这台机器压⼒会最轻,配置也会相对低

upstream lbs {
		server 59.110.68.26:8080;
		server 59.110.68.26:8081;
		server 59.110.68.26:8082 backup;
}

5、Nginx后端节点可用性探测

背景:如果某个应用挂了,请求不应该继续分发过去

max_fails :允许请求失败的次数,默认为1.当超过最⼤次数时就不会请求

fail_timeout : max_fails次失败后,暂停的时间,默认:fail_timeout为10s

参数解释

1.max_fails=N 设定Nginx与后端节点通信的尝试失败的次数。

2.在fail_timeout参数定义的时间内,如果失败的次数达到此值,Nginx就这个节点不可⽤。在下⼀个fail_timeout时间段到来前,服务器不会再被尝试。

3.失败的尝试次数默认是1,如果设为0就会停⽌统计尝试次数,认为服务器是⼀直可⽤的。

具体什么是nginx认为的失败呢?

可以通过指令proxy_next_upstream来配置什么是失败的尝试。

注意默认配置时,http_404状态不被认为是失败的尝试。

upstream lbs {
		server 59.110.68.26:8080 max_fails=2 fail_timeout=60s;
		server 59.110.68.26:8081 max_fails=2 fail_timeout=60s;
}

server {
		location /api/ {
				proxy_pass http://lbs;
				proxy_redirect default;
				proxy_next_upstream error timeout http_500 http_503;
		}
}

案例实操

1.暂停⼀个节点后,然后访问接⼝⼤于2次,Nginx会把这个节点剔除

2.重启这个节点,在fail_timeout周期⾥⾯不会再获取流量
在这里插入图片描述

六、Nginx经典应用案例

1、Nginx自定义全局异常

1.任何接⼝都是可能出错,4xx、5xx等

2.如果业务没有做好统⼀的错误管理,直接暴露给⽤户,⽆疑是看不懂

3.所以假如后端某个业务出错,nginx层也需要进⾏转换

4.让前端知道Http响应是200,其实是将错误的状态码定向⾄200,返回了全局兜底数据
在这里插入图片描述

location /api/ {
		proxy_pass http://lbs;
		proxy_redirect default;
		
		# 存放⽤户的真实ip
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr; 
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
 		proxy_next_upstream error timeout http_503 non_idempotent;
 		
		#开启错误拦截配置,⼀定要开启
		proxy_intercept_errors on;
}

# 不加 =200,则返回的就是原先的http错误码;配上后如果出现500等错误都返回给⽤户200状态,并跳转⾄/default_api
error_page 404 500 502 503 504 =200 /default_api;
location = /default_api {
	default_type application/json;
	return 200 '{"code":"-1","msg":"invoke fail, not found "}';
}

# 配置完成后重启
cd /usr/local/nginx/sbin
./nginx -s reload

请求一个404地址:http://59.110.68.26/api/demo/1/asdf 故意加了后缀,正常接口地址应该是:http://59.110.68.26/api/demo/1
在这里插入图片描述注:为了方便测试,我把error_page 里面配置了 404,正常情况下http_404状态不被认为是失败状态。

2、Nginx封禁恶意IP

⽹络攻击时有发⽣:

1.TCP洪⽔攻击、注⼊攻击、DOS等

2.⽐较难防的有DDOS等

数据安全,防⽌对⼿爬⾍恶意爬取,封禁IP

1.⼀般就是封禁ip

2.linux server的层⾯封IP:iptables

3.nginx的层⾯封IP ,⽅式多种 (但 req还是会打进来,让nginx 返回 403, 占⽤资源)

Nginx作为⽹关,可以有效的封禁ip

# 单独⽹站屏蔽IP的⽅法,把include xxx; 放到⽹址对应的在server{}语句块。
# 虚拟主机所有⽹站屏蔽IP的⽅法,把include xxx; 放到http{}语句块。
# nginx配置如下:
http{
		# ....
		include blacklist.conf;
}
 
location / {
	proxy_pass http://lbs;
	proxy_redirect default;
}

#blacklist.conf⽬录下⽂件内容
deny 126.168.1.82;
deny 126.168.1.83;

#重新加载配置,不中断服务
./nginx -s reload 

请求地址:http://59.110.68.26/api/demo/1 我本地IP 126.168.1.82
在这里插入图片描述
拓展-⾃动化封禁思路:
1.编写shell脚本
2.AWK统计access.log,记录每秒访问超过60次的ip,然后配合nginx或者iptables进⾏封禁
3.crontab定时跑脚本

3、Nginx配置解决浏览器跨域

跨域:浏览器同源策略 1995年,同源政策由 Netscape 公司引⼊浏览器。⽬前,所有浏览器都实⾏这个政策。 最初,它的含义是指,A⽹⻚设置的 Cookie,B⽹⻚不能打开,除⾮这两个⽹⻚"同源"。所谓"同源"指的是"三个相同"

解决⽅法:

1.JSONP

2.Http响应头配置允许跨域

3.nginx层配置

​ 协议相同 http https

​ 域名相同 www.yuming.com

​ 端⼝相同 80 81

协议相同 http https
域名相同 www.xdclass.net
端⼝相同 80 81
⼀句话:浏览器从⼀个域名的⽹⻚去请求另⼀个域名的资源时,域名、端⼝、协议任⼀不同,都是跨域。
浏览器控制台跨域提示:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

Nginx开启跨域配置

location /api/ {
		add_header 'Access-Control-Allow-Origin' $http_origin;
    	add_header 'Access-Control-Allow-Credentials' 'true';
		add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
		add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
		#如果预检请求则返回成功,不需要转发到后端
		if ($request_method = 'OPTIONS') {
				add_header 'Access-Control-Max-Age'1728000;
				add_header 'Content-Type''text/plain; charset=utf-8';
				add_header 'Content-Length' 0;
				return 200;
		}

4、路径匹配-Nginx的locatioin规则应用

正则概述:

^ 以什么开始
$ 以什么结束

^/api/user$
location 路径匹配

语法 location [ = | ~ | ~* | ^~ ] uri { … }

location = /uri

= 表示精准匹配,只要完全匹配上才能⽣效

location /uri

不带任何修饰符,表示前缀匹配

location ^~ /uri/

匹配任何已 /uri/ 开头的任何查询并且停⽌搜索

location /

通⽤匹配,任何未匹配到其他location的请求都会匹配到

正则匹配

1.区分⼤⼩写匹配(~)

2.不区分⼤⼩写匹配(~*)

优先级

注:不要写复杂,容易出问题和遗忘

精准匹配 > 字符串匹配(若有多个匹配项匹配成功,那么选择匹配⻓的并记录) > 正则匹配

案例:
server {
 server_name www.baidu.com; 
 location ~^/api/pub$ {
 ...
 }
}
^/api/pub$这个正则表达式表示字符串必须以/开始,以b $结束,中间必须是/api/pub
http://www.baidu.com/api/v1 匹配(完全匹配)
http://www.baidu.com/API/PUB 不匹配,⼤⼩写敏感
http://www.baidu.com/api/pub?key1=value1 匹配
http://www.baidu.com/api/pub/ 不匹配
http://www.baidu.com/api/public 不匹配,不能匹配正则表达式

5、地址重定向-Nginx的rewrite规则应用

Nginx的rewrite规则使用正则表达式来匹配URL,并使用指定的替换规则来重写URL。

rewrite regex replacement[flag],这是最基本的rewrite指令格式。它使用正则表达式regex来匹配URL,并使用replacement来替换匹配的部分。flag是可选的,用于指定附加的行为。

rewrite ^/(.*) https://www.baidu.com/$1 permanent
# 这是⼀个正则表达式,匹配完整的域名和后⾯的路径地址
# replacement部分是https://www.baidu.com/$1,$1是取⾃regex部分()⾥的内容

# 重定向url:
rewrite ^/old-url$ /new-url permanent; 这个规则将匹配以/old-url结尾的URL,并将其重定向到/new-url。permanent标志表示这是一个永久重定向。
# 重写URL参数:
rewrite ^/product/(.*)$ /item?id=$1 last; 这个规则将匹配以/product/开头的URL,并将其重写为/item?id=后跟匹配的部分。last标志表示这是最后一个rewrite规则。
# 阻止访问特定文件: 
location ~* .(log|txt)$ { rewrite ^(.*)$ /403.html last; } 这个规则将匹配以.log或.txt结尾的URL,并将其重写为/403.html。这样可以阻止直接访问这些文件。
# 重写URL并添加查询参数: 
rewrite ^/search/(.*)$ /search.php?q=$1&lang=en last; 这个规则将匹配以/search/开头的URL,并将其重写为/search.php?q=后跟匹配的部分和lang=en查询参数。

这只是一些rewrite规则的示例,您可以根据自己的需求进行更多的定制。请注意,rewrite规则的顺序很重要,因为Nginx将按照配置文件中的顺序逐个匹配规则。

常用正则表达式:
字符描述
^匹配输⼊字符串的起始位置
$匹配输⼊字符串的结束位置
*匹配前⾯的字符零次或者多次
+匹配前⾯字符串⼀次或者多次
?匹配前⾯字符串的零次或者⼀次
.匹配除“\n”之外的所有单个字符
(pattern)匹配括号内的pattern
rewrite 最后⼀项flag参数
标记符号说明
last本条规则匹配完成后继续向下匹配新的
breaklocation URI规则本条规则匹配完成后终⽌,不在匹配任何规
redirect则返回302临时重定向
permanent返回301永久重定向
应用场景:

1.⾮法访问跳转,防盗链

2.⽹站更换新域名

3.http跳转https

4.不同地址访问同⼀个虚拟主机的资源

6、实时通信-Nginx配置Websocket反向代理

当项目中有用到Websocket协议时使用

核⼼是下⾯的配置 其他和普通反向代理没区别, 表示请求服务器升级协议为WebSocket

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

配置

server {
 listen 80;
 server_name 59.110.68.26;
 location / {
 proxy_pass http://lbs;
 proxy_read_timeout 300s; //websocket空闲保持时⻓
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_http_version 1.1;
 
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection $connection_upgrade;

服务器处理完请求后,响应如下报⽂# 状态码为101

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade

WebSocket简介:

WebSocket是一种在Web应用程序中实现双向通信的协议。与传统的HTTP请求-响应模型不同,WebSocket允许服务器主动向客户端发送数据,而不需要客户端发起请求。以下是一些使用WebSocket的常见用途和优势:

  1. 实时数据传输:WebSocket提供了实时数据传输的能力,使得服务器可以即时向客户端推送数据。这对于需要实时更新的应用程序(如聊天应用、实时协作工具、股票市场报价等)非常有用。
  2. 降低延迟:相比于传统的轮询或长轮询方式,WebSocket可以减少延迟。它建立了一条持久的连接,避免了频繁的连接和断开操作,从而提供更快的数据传输速度。
  3. 减少网络流量:由于WebSocket使用的是长连接,相比于频繁的HTTP请求,它可以减少网络流量和服务器负载。这对于移动设备和低带宽环境下的应用程序非常有益。
  4. 更好的用户体验:WebSocket可以实现实时更新和即时通信,提供更好的用户体验。例如,在在线游戏中,玩家可以实时看到其他玩家的动作;在协作工具中,用户可以即时看到其他用户的编辑内容。
  5. 节省服务器资源:由于WebSocket的持久连接特性,服务器不需要为每个客户端请求分配额外的资源。这可以减少服务器的负载,提高应用程序的可扩展性。

WebSocket提供了一种更高效、实时和双向的通信方式,适用于需要实时数据传输和即时通信的Web应用程序。它可以改善用户体验、降低延迟、减少网络流量和节省服务器资源。

七、Nginx业务接口性能优化

1、Nginx的配置服务端缓存核心配置
常见的开发人员控制的缓存分类

1、数据库缓存

2、应用程序缓存

3、Nginx网关缓存

4、前端缓存
在这里插入图片描述

Nginx让缓存离用户更近一步

/root/cache
本地路径,⽤来设置Nginx缓存资源的存放地址

levels=1:2
默认所有缓存⽂件都放在上⾯指定的根路径中,可能影响缓存的性能,推荐指定为 2 级⽬录来存储缓存⽂件;1和2表示⽤1位和2位16进制来命名⽬录名称。第⼀级⽬录⽤1位16进制命名,如a;第⼆级⽬录⽤2位16进制命名,如3a。所以此例中⼀级⽬录有16个,⼆级⽬录有16*16=256个,总⽬录数为16 *256=4096个。

当levels=1:1:1时,表示是三级⽬录,且每级⽬录数均为16个key_zone 在共享内存中定义⼀块存储区域来存放缓存的 key和 metadata

max_size
最⼤ 缓存空间, 如果不指定会使⽤掉所有磁盘空间。当达到 disk 上限后,会删除最少使⽤的 cache

inactive
某个缓存在inactive指定的时间内如果不访问,将会从缓存中删除

proxy_cache_valid
配置nginx cache中的缓存⽂件的缓存时间,proxy_cache_valid 200 304 2m 对于状态为200和304的缓存⽂件的缓存时间是2分钟

use_temp_path
建议为 off,则 nginx 会将缓存⽂件直接写⼊指定的cache ⽂件中proxy_cache启⽤proxy cache,并指定key_zone,如果proxy_cache off表示关闭掉缓存

add_header Nging-Cache “$upstream_cache_status”
⽤于前端判断是否是缓存,miss、hit、expired(缓存过期)、updating(更新,使⽤旧的应答)

http {
		proxy_cache_path /root/cache levels=1:2 keys_zone=server_cache:10m max_size=1g inactive=60m use_temp_path=off;

		# proxy_cache_path: 指定缓存路径,这里设置为/root/cache。
		# levels=1:2: 指定缓存路径的目录层级结构,这里设置为1个主目录和2个子目录。
		# keys_zone=xd_cache:10m: 定义一个名为server_cache的缓存区域,大小为10MB,用于存储缓存键和元数据。
		# max_size=1g: 设置缓存区域的最大大小为1GB。
		# inactive=60m: 设置缓存条目在60分钟内没有被访问时被认为是不活跃的。
		# use_temp_path=off: 禁用临时文件路径,直接将缓存文件存储在指定的路径中。


		server {
				location /{
				... 
				proxy_cache server_cache;
				proxy_cache_valid 200 304 10m;
				proxy_cache_valid 404 1m;
				proxy_cache_key $host$uri$is_args$args;
				add_header Nginx-Cache "$upstream_cache_status";
				}
		}

		# proxy_cache server_cache;: 指定使用名为server_cache的缓存区域进行缓存。
		# proxy_cache_valid 200 304 10m;: 设置对于状态码为200和304的响应,缓存有效期为10分钟。
		# proxy_cache_valid 404 1m;: 设置对于状态码为404的响应,缓存有效期为1分钟。
		# proxy_cache_key $host$uri$is_args$args;: 设置缓存键的生成规则,使用请求的主机、URI和查询参数作为缓存键。
		# add_header Nginx-Cache "$upstream_cache_status";: 在响应头中添加一个名为Nginx-Cache的自定义头,值为$upstream_cache_status,表示上游缓存的状态。
}

# 重启Nginx
./nginx -s reload

配置完后,第一次能正常访问。请求地址:http://59.110.68.26/api/demo/1

注:Nginx-Cache 为MISS,说明第一次请求,没有经过缓存
在这里插入图片描述
第二次访问时发现请求失败了。请求地址:http://59.110.68.26/api/demo/1
在这里插入图片描述
不要慌,查看下Nginx logs目录下的error.log日志,发现Nginx已经开始去读取/root/cache下的缓存文件,但是报错了
在这里插入图片描述
发现有错误日志,Nginx尝试打开/root/cache/9/69/a8f478942444b07f80cc94e1ab727699.00000000025文件时被拒绝了访问,错误代码为13,表示权限被拒绝。

这个错误是由于Nginx进程以root用户身份运行,并且缓存路径/root/cache的权限设置不允许Nginx进程读取该文件。这是一个安全措施,防止非授权用户访问敏感文件。

需要再nginx.conf文件头部添加配置:

user  root;
# 使用user root;将Nginx进程的所有权和权限设置为root用户,这意味着Nginx将以root用户的身份运行。

# 重启Nginx
./nginx -s reload

重启后再次访问:http://59.110.68.26/api/demo/1
在这里插入图片描述
发现Nginx-Cache 为HIT 表示缓存命中!这个接口的返回结果是从缓存中取的

这表示Nginx成功从缓存中获取了响应,而不是向上游服务器发出请求。

当Nginx接收到客户端的请求时,它首先检查缓存中是否存在与该请求匹配的缓存条目。如果存在匹配的缓存条目且仍然有效(根据缓存的有效期),Nginx将直接从缓存中返回响应,而不是将请求转发给上游服务器。这就是所谓的"HIT",表示缓存命中。

缓存命中可以显著提高响应速度和减轻上游服务器的负载,因为Nginx无需再次请求上游服务器,而是直接返回缓存的响应。

在你的情况下,Nginx成功从缓存中获取了响应,这是一个良好的结果,说明缓存配置和使用是有效的。这有助于提高性能并减少对上游服务器的依赖。

缓存文件:
在这里插入图片描述
evels=1:2是Nginx配置中proxy_cache_path指令的一部分。它用于定义缓存路径的目录层级结构。

具体来说,levels=1:2表示缓存路径将包含1个主目录和2个子目录。这种层级结构有助于在大量缓存文件时更好地组织和管理文件。

例如,假设你的缓存路径为/root/cache,并且你有一个缓存文件的键为a8f478942444b07f80cc94e1ab727699。使用levels=1:2配置后,该缓存文件将被存储在以下路径中:

/root/cache/9/69/a8f478942444b07f80cc94e1ab727699.0000000009

其中,9是第一个子目录,69是第二个子目录,a8f478942444b07f80cc94e1ab727699.0000000009是缓存文件。

这种层级结构有助于提高文件系统的性能,因为它可以更好地分散缓存文件在不同目录中的存储,避免在单个目录中存储大量文件导致性能下降。

请注意,levels=1:2只是一个示例配置,你可以根据需要调整层级的数量。较大的层级数可能会更好地分散缓存文件,但也会增加目录的数量。因此,根据你的具体需求和文件数量,可以选择适当的层级配置。

存取文件数量

在Nginx中,每个子目录可以存储最多256个文件。因此,对于levels=1:2的配置,可以计算出可以存储的最大文件数量如下:

第一个子目录:256个文件 第二个子目录:256个文件 总计:256 * 256 = 65,536个文件

因此,使用levels=1:2配置,可以存储最多65,536个文件。

请注意,这只是一个理论上的最大数量。实际上,文件系统的限制、硬件性能和可用的磁盘空间等因素都会对实际存储的文件数量产生影响。此外,还要考虑缓存文件的大小和缓存区域的最大大小设置。

如果你需要存储更多的文件,可以考虑增加层级的数量或使用更大的文件系统来扩展存储容量。根据你的具体需求,可以调整层级配置以满足存储需求。

缓存命中率统计

1.前端打点⽇志上报

2.nginx⽇志模板增加信息 $upstream_cache_status

2、Nginx的压缩配置和实操
压缩配置

对⽂本、js和css⽂件等进⾏压缩,⼀般是压缩后的⼤⼩是原始⼤⼩的25%

#开启gzip,减少我们发送的数据量
gzip on;
gzip_min_length 1k;
#4个单位为16k的内存作为压缩结果流缓存
gzip_buffers 4 16k;
#gzip压缩⽐,可在1~9中设置,1压缩⽐最⼩,速度最快,9压缩⽐最⼤,速度最慢,消耗CPU
gzip_comp_level 4;
#压缩的类型
gzip_types application/javascript text/plain text/css application/json application/xml text/javascript;
#给代理服务器⽤的,有的浏览器⽀持压缩,有的不⽀持,所以避免浪费不⽀持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
gzip_vary on;
#禁⽤IE6以下的gzip压缩,IE某些版本对gzip的压缩⽀持很不好
gzip_disable "MSIE [1-6].";

压缩前后区别(上传js⽂件进⾏验证)

location /static {
		alias /usr/local/uploads/;
}

随便在网上扒拉一个300KB的js文件
在这里插入图片描述
在这里插入图片描述
配置后请求:http://59.110.68.26/uploads/index_fb6bebb.js
在这里插入图片描述
这样Nginx压缩配置就完成了! 注:浏览器也有页面缓存,测试时要用无痕模式。

⾯试题:压缩是时间换空间,还是空间换时间?

1.web层主要涉及浏览器和服务器的⽹络交互,⽽⽹络交互显然是耗费时间的

2.要尽量减少交互次数降低每次请求或响应数据量。

开启压缩:

1.在服务端是时间换空间的策略,服务端需要牺牲时间进⾏压缩以减⼩响应数据⼤⼩。

2.压缩后的内容可以获得更快的⽹络传输速度,时间是得到了优化。

3.所以是双向的。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您解答这个问题。 首先,您可以使用 Nginx 作为代理来处理 WebSocket 请求。但是,由于 WebSocket 是基于 HTTP 协议的,因此需要在 Nginx 配置文件中添加一些特殊的指令来支持 WebSocket 协议。 以下是一个基本的 Nginx 配置文件示例,可用于代理 Socket.io/WebSocket: ``` http { upstream websocket { # 定义负载均衡策略,这里使用轮询 # 如果您有多个 WebSocket 服务器,可以将它们添加到这个 upstream 块中 server server1:3000; server server2:3000; server server3:3000; } server { listen 80; # 这里添加一些常规的 Nginx 配置指令,例如 server_name、access_log 等 location /socket.io/ { # WebSocket 协议需要使用 HTTP/1.1 协议 proxy_http_version 1.1; # 开启长连接 proxy_set_header Connection "Upgrade"; # 开启协议升级模式 proxy_set_header Upgrade $http_upgrade; # 负载均衡 proxy_pass http://websocket; proxy_redirect off; proxy_read_timeout 60s; } # 其他 location 配置指令 } } ``` 在上面的配置中,我们使用 upstream 块来定义 WebSocket 服务器。这里使用轮询策略,将请求分发到三个服务器上。在 location 块中,我们使用 proxy_http_version、proxy_set_header 和其他一些指令来启用 WebSocket 协议和负载均衡。在 proxy_pass 指令中,我们将请求转发到定义的 upstream 服务器。 请注意,在使用 Nginx 代理 WebSocket 时,必须确保负载均衡服务器和 WebSocket 服务器之间的连接是长连接。否则,WebSocket 连接可能会因为连接关闭而中断。 希望这个回答可以帮助到您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值