Nignx 应用与功能实现 2022-1-1

Nignx 应用与功能实现 2022-1-1,第1张

Nignx 应用与功能实现 2022-1-1 Java调优进阶总目录

Nginx 核心功能与配置
  • Java调优进阶总目录
  • 1 请求定位
    • 1.1 资源访问
    • 1.2 路径匹配优先级
      • 1.2.1 普通匹配
      • 1.2.2 长路径相匹配
      • 1.2.3 正则匹配
      • 1.2.4 短路匹配
      • 1.2.5 精确匹配
    • 1.3 缓存配置
      • 1.3.1 http{}模块的缓存全局定义
        • proxy_cache_path
        • proxy_temp_path
      • 1.3.2 location{}模块的缓存局部定义
        • 1 proxy_cache mycache
        • 2 proxy_cache_key
        • 3 proxy_cache_bypass $arg_age
        • 4 proxy_cache_methods GET HEAD
      • 1.3.3 Nginx 变量
        • 1 自定义变量
        • 2 内置变量
  • 2 Nginx 日志管理与自我切割
    • 2.1 日志管理范围
    • 2.2 日志管理指令
      • 2.2.1 log_format
      • 2.2.2 access_log
      • 2.2.3 error_log
      • 2.2.4 open_log_file_cache
    • 2.3 默认的/favicon.ico 请求
    • 2.4 日志自动切割
  • 3 静态代理
    • 3.1 扩展名拦截
    • 3.2 目录名拦截
    • 3.3 页面压缩
      • 1 浏览器常见的压缩协议
      • 2 常用设置
  • 4 反向代理
    • 4.1 反向代理实践
    • 4.2 反向代理的属性设置
      • 1 client_max_body_size
      • 2 client_body_buffer_size
      • 3 proxy_buffering on
      • 4 proxy_buffers 4 8k
      • 5 proxy_busy_buffers_size
      • 6 proxy_connect_timeout 60s
      • 7 proxy_read_timeout 60s
  • 5 负载均衡
    • 5.1 负载均衡工作层分类
    • 5.2 负载均衡的实现
    • 5.3 Nginx 负载均衡策略
      • 5.3.1 轮询
      • 5.3.2 ip_hash
      • least_conn
  • 6 动静分离
    • 6.1 配置实现
  • 7 虚拟主机

1 请求定位 1.1 资源访问
// 子模块
location  / 表示根目录{
	root 路径; // 从配置文件相对路径的相对路径
	index 资源文件; # 依次查找,没有找下一个
}
1.2 路径匹配优先级

优先级由低到高依次是:
普通匹配 < 长路径匹配 < 正则匹配 < 短路匹配 < 精确匹配

以匹配 ip/xxx/ooo 为例:

1.2.1 普通匹配

下面的匹配规则是:只要请求是以/xxx 开头的路径就可命中。

1.2.2 长路径相匹配

当一个请求路径既可以与一个长路径相匹配,又可以与一个短路径相匹配时,长路径优
先级高。

1.2.3 正则匹配

~表示这里是正则表达式,默认匹配是区分大小写的。

~后跟上*号,表示这是不区分大小写的正则表达式。

1.2.4 短路匹配

以^~开头的匹配路径称为短路匹配,表示只要匹配上,就不再匹配其它的了,即使是正
则匹配也不再匹配了。即其优先级要高于正则匹配的。

1.2.5 精确匹配

以等号(=)开头的匹配称为精确匹配,其是优先级最高的匹配。

1.3 缓存配置

Nginx具有很强大的缓存功能,可以对请求的response进行缓存,起到类似CDN的作用,
甚至有比 CDN 更强大的功能。同时,Nginx 缓存还可以用来“数据托底”,即当后台 web 服务器挂掉的时候,Nginx 可以直接将缓存中的托底数据返回给用户。此功能就是 Nginx 实现“服务降级”的体现。

Nginx 缓存功能的配置由两部分构成:全局定义与局部定义。在 http{}模块的全局部分
中进行缓存全局定义,在 server{}模块的各个 location{}模块中根据业务需求进行缓存局部定
义。

1.3.1 http{}模块的缓存全局定义

proxy_cache_path
  • 用于指定 Nginx 缓存的存放路径及相关配置 /usr/local//nginx/cache ;
  • levels = 1:2 使用两级目录管理, 第一个用1个字符命名,第二级目录用2个字符命名;
  • key_zone=mycache:10m , 内存中存放缓存的key,判断请求是否命中,mycache 是内存区域的名称,可随意命名, 10 MB 大小。 key — 存放的目录, 请求来之后看是否存在key, 有则从目录中取数据。
  • max_size 5GB : Nginx 缓存的存放路径的文件的最大容量。超过时优先清理安装最少使用文件
  • inactive 2 hour : 缓存第一次使用持续2hour 后清理。
  • use_temp_path : 使用临时路径,高访问量时先放临时路径不需要计算,达到容量或时间后, 经过计算后再保存到levels目录中。 默认off

向缓存空间存放的数据都需要根据key 来计算存放目录,运算相对耗时,若大量请求都需要做缓存,可以设置为on, 进行批量运算批量写入提高性能。

proxy_temp_path

指定 Nginx 缓存的临时存放目录。若 proxy_cache_path 中的 use_temp_path 设置为了 off,则该属性可以不指定。

1.3.2 location{}模块的缓存局部定义 1 proxy_cache mycache

指定用于存放缓存 key 内存区域名称。其值为 http{}模块中 proxy_cache_path 中的
keys_zone 的值。

2 proxy_cache_key

指定 Nginx 生成的缓存的 key 的组成。 主机名+url

$host$request_uri$arg_age
3 proxy_cache_bypass $arg_age

指定是否越过缓存。只要当前请求包含arg_age 参数,则不从缓存中获取数据。

4 proxy_cache_methods GET HEAD

指定客户端请求的哪些提交方法将被缓存,默认为 GET 与 HEAD,但不缓存 POST。

1.3.3 Nginx 变量 1 自定义变量

由于 Nginx 配置文件是 perl 脚本,所以其是可以使用如下方式自定义变量的。

2 内置变量
$args 请求中的参数;
$binary_remote_addr 远程地址的二进制表示
$body_bytes_sent 已发送的消息体字节数
$content_length HTTP 请求信息里的"Content-Length"
$content_type 请求信息里的"Content-Type"
$document_root 针对当前请求的根路径设置值
$document_uri 与$uri 相同
$host 请求信息中的"Host",如果请求中没有 Host 行,则等于设置的服务器名; 
$http_cookie cookie 信息
$http_referer 来源地址
$http_user_agent 客户端代理信息
$http_via 最后一个访问服务器的 Ip 地址
$http_x_forwarded_for 相当于网络访问路径。
$limit_rate 对连接速率的限制
$remote_addr 客户端地址
$remote_port 客户端端口号
$remote_user 客户端用户名,认证用
$request 用户请求信息
$request_body 用户请求主体
$request_body_file 发往后端的本地文件名称
$request_filename 当前请求的文件路径名
$request_method 请求的方法,比如"GET"、"POST"等
$request_uri 请求的 URI,带参数
$server_addr 服务器地址,如果没有用 listen 指明服务器地址,使用这个变
量将发起一次系统调用以取得地址(造成资源浪费)
$server_name 请求到达的服务器名
$server_port 请求到达的服务器端口号
$server_protocol 请求的协议版本,"HTTP/1.0"或"HTTP/1.1"
$uri 请求的 URI,可能和最初的值有不同,比如经过重定向之类的
2 Nginx 日志管理与自我切割 2.1 日志管理范围

首先,下面要讲的这些日志相关属性可以配置在任意模块。在不同的模块,记录的是不
同请求的日志信息。即,日志记录的请求范围是不同的。Nginx 日志一般可以指定三个范围:

  • http{}模块范围
  • server{}模块范围
  • location{}模块范围。
2.2 日志管理指令

Nginx 的日志分为两类:访问日志与错误日志。Nginx 整个系统的默认日志在生成预编
译文件 makefile 时就已经默认给配置好了。当然,无论是访问日志还是错误日志,其默认路径与名称在 nginx.conf 中均是可以修改的。在配置文件中不仅定义了日志文件的路径及名称,还定义了日志格式。

2.2.1 log_format 2.2.2 access_log 2.2.3 error_log 2.2.4 open_log_file_cache 2.3 默认的/favicon.ico 请求

客户端对于服务端页面会自动提交一个/favicon.ico 请求,若没有 favicon.ico 文件则会在
日志文件中报出 404。

从网上任意下载一个 ico 图标,将其重命名为 favicon.ico,然后放到 html 中。
然后再修改 nginx.conf 文件,在其中添加如下的 location{}模块。

注意,若将其添加到的位置与页面在同一个目录,下面的 location{}模块不用设置。

2.4 日志自动切割
  • 创建切割 shell 脚本文件
  • 为该文件添加可执行权限
  • 向 crontab 中添加一个定时任务
3 静态代理

Nginx 静态代理是指,将所有的静态资源,例如,css、js、html、jpg 等资源存放到 Nginx
服务器,而不存放在应用服务器 Tomcat 中。当客户端发出的请求是对这些静态资源的请求
时,Nginx 直接将这些静态资源响应给客户端,而无需提交给应用服务器处理。这样就减轻
了应用服务器的压力。

3.1 扩展名拦截

修改配置文件
在/opt/statics 目录中创建 css、js、images 扩展名的文件。
重启nignx nignx -s reload

3.2 目录名拦截

3.3 页面压缩 1 浏览器常见的压缩协议
  • deflate:是一种过时的压缩算法,是 huffman 编码的一种加强。
  • gzip:是目前大多数浏览器都支持的一种压缩算法,是对 deflate 的改进。
  • sdch:谷歌开发的一种压缩算法,一种全新的压缩思路。deflate 与 gzip 的的压缩思想是,修改传输数据的编码格式以达到减少体量的目的,其最终传输的数据并没有减少。而sdch 压缩算法的思想是,让冗余的数据仅出现一次,其最终传输的数据减少了。
  • Zopfli:谷歌开发的一种压缩算法,Deflate 压缩算法的改进。比标准的gzip -9要小 3%-8%,但压缩用时是 gzip -9 的 80 多倍。
  • br:即 Brotli,谷歌开发的一种压缩算法,是一种全新的数据格式。与 Zopfli 相比,压
    缩率能够降低 20%-26%。Brotli -1 有着与 Gzip -9 相近的压缩比和更快的压缩解压速度。
2 常用设置

  • 开启 gzip 压缩,默认为 off。
  • gzip_min_length 5k 指定最小启用压缩的文件大小。 太小文件越压缩越大。
  • gzip_comp_level 4 指定压缩级别,取值为 1-9,数字越大,压缩比越高,但压缩所用时间会越长。默认为1,建议使用 4
  • gzip_buffers “4”表示的是缓存颗粒数量(与worker 线程数有关),而“16k”表示的是缓存颗粒大小(与文件最大的大小有关)
  • gzip_vary 开启动态压缩。默认值 off (根据浏览器支持的压缩协议,来调整压缩协议)
  • gzip_types mimeType 通过 MIME 类型来指定要压缩的文件类型。默认值 text/html
4 反向代理

通过在 location{}中添加通行代理 proxy_pass可以指定当前Nginx 所要代理的真正服务器。

      location / {
              proxy_pass http://www.baidu.com;
      }
	# 增加some 后报错, 原因解释
	# 访问转到 http://www.baidu.com/some 资源不存在,所有报错
      location /some {
              proxy_pass http://www.baidu.com;
      }
4.1 反向代理实践

在虚拟机中部署Tomcat 服务, 使用Nginx 代理该服务。

  • 部署tomcat 于 虚拟机192.168.56.101 , 安装Java, 上传war 包并解压到 webapps 文件下, 其中有/some GET 请求。
  • 部署Nginx 在 虚拟机192.168.56.102。 配置代理,查看效果。


4.2 反向代理的属性设置 1 client_max_body_size

Nginx 允许客户端请求的单文件最大大小,单位字节100k。 保护Nginx,限制客户端访问的文件最大大小。防止文件过大导致Nginx 停机。

2 client_body_buffer_size

Nginx 为客户端请求设置的缓存大小。

3 proxy_buffering on

开启从后端被代理服务器的响应内容缓冲区。默认值 on。 缓存好后一次性发送客户端。效率较高。

4 proxy_buffers 4 8k

该指令用于设置缓冲区的数量4与大小8K。可以缓存4个文件,每个缓存大小是8KB。 从被代理的后端服务器取得的响应内容,会缓存到这里。

5 proxy_busy_buffers_size

高负荷下缓存大小,其默认值为一般为单个 proxy_buffers 的 2 倍。 如果高负荷下不够用了, 将上面的proxy_buffers 变为2倍。高负荷由Nginx 自己判断。

6 proxy_connect_timeout 60s

Nginx 跟后端服务器连接超时时间。默认 60 秒。

7 proxy_read_timeout 60s

Nginx 发出请求后等待后端服务器响应的最长时限。默认 60 秒。

nginx http模块添加以下参数配置:

client_header_buffer_size 64k;
large_client_header_buffers 4 64k;
client_body_buffer_size 20m;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 128k;
fastcgi_busy_buffers_size 256k;
gzip_buffers 16 8k;
proxy_buffer_size 64k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
 
keepalive_timeout 240;
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
 
proxy_connect_timeout 600s;
proxy_send_timeout 1200;
proxy_read_timeout 1200;
5 负载均衡 5.1 负载均衡工作层分类

负载均衡就其所工作的 OSI 层次,在生产应用层面分为两类:七层负载均衡与四层负载
均衡。当然,为四层负载均衡提供更为底层实现的,还有三层负载均衡与二层负载均衡。

  • 七层负载均衡:应用层,基于 HTTP 协议,通过虚拟 URL 将请求分配到真实服务器。一般应用于 B/S 架构系统。Nginx 就是七层负载均衡。
  • 四层负载均衡:传输层,基于 TCP 协议,通过“虚拟 IP + 端口号” 将请求分配到真实
    服务器。一般应用于 C /S 架构系统。例如,LVS、F5、Nginx Plus 都属于四层负载均衡。
  • 三层负载均衡:网络层,基于 IP 协议,通过虚拟 IP 将请求分配到真实服务器。
  • 二层负载均衡:链路层,基于虚拟 MAC 地址将请求分配到真实服务器。
5.2 负载均衡的实现

该机群包含一台 Nginx 服务器,两台 Tomcat 服务器。将前面打过包的 web 工程直接部
署到两台 Tomcat 主机上。然后,在 Nginx 服务器上设置对这两台 Tomcat 主机的负载均衡。

  • 首先设置 upstream 配置主机, fail_timeout=20 max_fails=3 由于网络问题不畅通,但是可以访问。增加超时参数后可正常访问,否则会失败。
  • 配置代理 proxy_pass, upstream 后 的名字 与 proxy_pass 需一致。
    upstream www.abctest.com {
        # 设置主机
        server 192.168.56.100:8080 weight=3  fail_timeout=20 max_fails=3;
        server 192.168.56.101:8080;
    }

    server {
        listen       80;
        server_name  localhost;

        location ~.*(/|/some) {
            proxy_pass http://www.abctest.com;
        }
5.3 Nginx 负载均衡策略

Nginx 内置了三种负载均衡策略,另外,其还支持第三方的负载均衡。而每种负载均衡
主机根据负载均衡策略的不同,又可设置很多性能相关的属性。

5.3.1 轮询

默认的负载均衡策略,其是按照各个主机的权重比例依次进行请求分配的。

  • backup:表示当前服务器为备用服务器。 备用服务器工作后当主角恢复后再转为备用机。
  • down:表示当前服务器永久停机。
  • fail_ timeout:表示当前主机被 Nginx 认定为停机的最长失联时间,默认为 10 秒。常与
    max_fails 联合使用。
  • max_fails:表示在 fail_timeout 时间内最多允许的失败次数。
5.3.2 ip_hash

指定负载均衡器按照基于客户端 IP 的分配方式。 相同ip 分配给固定的某一台机器。

  • 在 nginx1.3.1 版本之前,该策略中不能指定 weight 属性。
  • 该策略不能与 backup 同时使用。
  • 此策略适合有状态服务,比如 session。 相同ip 分配给固定的某一台机器
  • 当有服务器宕机,必须手动指定 down 属性,否则请求仍是会落到该服务器。
least_conn

把请求转发给连接数最少的服务器。

6 动静分离

下面要搭建的 Nginx 环境中有三台 Nginx 主机:一台用于完成负载均衡,两台用于存放
项目中的静态资源。另外,还包含前面的两台 Tomcat 主机。

6.1 配置实现

修改负载均衡 Nginx 主机。 然后启动另外 2台 Nginx 主机 和 两台 Tomcat 主机即可实现。

7 虚拟主机

现在很多生活服务类网络平台都具有这样的功能:不同城市的用户可以打开不同城市专
属的站点。用户首先打开的是平台总的站点,然后允许用户切换到不同的城市。其实,不同
的城市都是一个不同的站点。

这里我们要实现的功能是为平台总站点,北京、上海两个城市站点分别创建一个虚拟主
机。每一个虚拟主机都具有两台 Tomcat 的负载均衡主机。克隆 Tomcat 主机太过麻烦,所以这六台 Tomcat 我们使用一台主机实现。在一台主机中安装六个 Tomcat,它们分别使用六个不同的端口号。

一个Nginx 主机, 六个Tomcat, 实现3个城市站点的配置。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5691220.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存