Java进阶——带你入门分布式中的Nginx

文章讲述了Nginx的负载均衡配置方法,包括轮询、权重、ip_hash和第三方模块如fair的应用,同时提到Java面试中算法与数据结构的重要性,推荐相关学习资源。
摘要由CSDN通过智能技术生成

用户不直接访问后端服务器,而是访问负载均衡服务器,由负载均衡服务器再次转发到后端服务器。如果这个时候有一台后端服务器挂掉了,那么负载均衡服务器会剔除掉它,将后续请求都转发到好的那台,这样就不影响网站的正常运行。这个时候我们也需要考虑负载均衡服务器会不会挂掉,那就引入第二个负载均衡服务器来缓解一下。

Java进阶——带你入门分布式中的Nginx

负载均衡的配置

通过配置负载均衡服务器的 Nginx 中的 upstream 指令可以实现。

不同负载均衡配置的特点如下图所示:

配置方式说明轮询方式(默认)每个请求按照时间顺序逐一分配到不同的后端服务器,如果有服务器宕机,会自动剔除。权重方式(weight)利用 weight 制定轮询的权重比率,与访问率成正比,用于后端服务器性能不均的情况,性能好的服务器 weight 高一点。ip_hash使每个访客固定访问一个后端服务器,这样可以解决 session 共享的问题。第三方模块(fair、url_hash)nginx 默认不包含第三方模块,使用时需要安装第三方模块采用 fair,按照每台服务器的响应时间来分配,响应时间短的优先分配。如果第三方模块采用的是 url_hash,则安装 url 的 hash 值来分配。

一般轮询配置

server{

listen 80;

server_name test.test;

location / {

proxy_pass http://web_server; #反向代理

}}#配置负载均衡服务器组upstream web_server {

server 192.168.78.128;

server 192.168.78.129;}

加权轮询配置

#配置负载均衡服务器组upstream web_server {

server 192.168.78.128 weight=1;

server 192.168.78.129 weight=3;}

这里面的权值总和为一个循环,这里以 4 次为一个循环,那么就是每四次请求中,三次会被分派到 129 这个服务器,一次分配到 128,但是具体三次并不会顺序执行,而是按照算法分散执行。

我们也可以设置每台 web 服务器在负载均衡调度中的状态。

upstream web_server{

server 192.168.78.128 weight=1 max_fails=1 fail_timeout=2; #允许请求失败次数,在请求max_fail次数失败后,暂停服务的时间

server 192.168.78.200 backup; #预留的备份服务器

server 192.168.78.33 down; #当前服务器不参与负载均衡}

ip_hash 配置

upstream web_server{

ip_hash;

server 192.168.78.120;

server 192.168.78.123;

server 192.168.78.33 down; #如果这台服务器宕机,则用down表示当前服务器暂不参与负载均衡}

使用 ip_hash 的时候,不能使用 weight 和 backup。

第三方模块(fair)

  1. 备份已安装的 Nginx

由于使用第三方模块,需要重新编译 Nginx,所以需要关闭已经开启的 Nginx 进程,对已经安装好的 Nginx 进行备份,便于恢复。

cp -r /usr/local/nginx /usr/local/nginx_old

  1. 重新编译安装 Nginx

先从 github 获取 fair 模块,下载到 zip 到 root 目录下,解压。

unzip nginx-upstream-fair-master.zip #解压mv nginx-upstream-fair-master nginx-upstream-fair #重命名

如果没有 unzip 命令,则需要用 yum install unzip 安装。

cd nginx-1.10.1#配置./configure \

–prefix=/usr/local/nginx \

–with-http_ssl_module \

–add-module=/root/nginx-upstream-fair#编译安装make && make install

  1. 配置 fair 的负载均衡

打开新安装的 Nginx 配置文件,在 http 块下实现 fair 的负载均衡。

server{

listen 80;

server_name test.test;

location / {

proxy_pass http://web_server }}upstream web_server{

server 192.168.78.128;

server 192.168.78.132;

fair; #使用fair}

缓存配置

对于一些含有大量内容的网站来说,随着访问量的增多,对于经常被访问的内容,如果每一次都从服务器中获取,则给服务器很大的压力。所以我们可以利用反向代理服务器对访问频率较多的内容进行缓存,有利于节省后端服务器的资源。

原理

web 缓存服务器位于内容源 web 服务器和客户端之间,当客户端访问一个 url 时,缓存服务器请求内容源服务器,并将响应结果缓存到内存或硬盘,当下一次请求同一个 url 时,缓存服务器直接将已缓存的内容输出给客户端,这样就减少了再次向内容源服务器请求的次数。

Java进阶——带你入门分布式中的Nginx

永久缓存配置(proxy_store)

Nginx 提供了 proxy_store 指令用于缓存内容服务器响应到本地,若不手动删除,则一直存在。

server{

listen 80;

server_name test.test;

location / {

root cache; #制定个缓存文件的保存目录

proxy_store on; #开启本地缓存

proxy_store_access user:rw group:rw all:r; #设置缓存的读写规则

proxy_temp_path cache_tmp; #设置反向代理时接收的数据临时存储文件的目录,该目录会自动创建

#利用正则匹配缓存文件、目录或符号链接是否存在,如果不存在再执行块语句

if(!-e $request_filename){

proxy_pass http://192.168.78.128;

}

}}

临时缓存(proxy_cache)

Nginx 服务器提供了 proxy_cache 指令设置临时缓存。采用 md5 算法将请求链接进行 hash 后,根据具体配置生成缓存文件目录,保存响应数据。

在缓存服务器上配置 nginx.conf 中的 **http** 块。

#代理临时目录proxy_temp_path /usr/local/nginx/proxy_temp_dir; #设置缓存服务器接收内容服务器响应内容使用的临时目录#web缓存目录和参数设置proxy_cache_path /usr/local/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:50minactive=1m max_size=500m; #自定义保存目录,

配置 server 块:

server {

listen 80;

server_name test.test;

#增加两个响应头,用于获取访问的服务器地址与缓存是否成功

add_header X-Via $server_addr;

add_header X-Cache $upstream_cache_status;

location /{

proxy_cache cache_one; #设置缓存区域名称

proxy_cache_key h o s t host hosturi i s _ a r g s is\_args is_argsargs; #以域名、uri、参数组合成web缓存的key,nginx根据key值哈希

proxy_cache_valid 200 10m; #对200状态码设置缓存时间

proxy_cache_valid 304 1m;

proxy_cache_valid any 1m; #其他未设置的缓存1分钟

结局:总结+分享

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱

  • Java互联网工程师面试1000题

image.png

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。

  • 程序员代码面试指南–IT名企算法与数据结构题目最优解

image.png

  • 其余像设计模式,建议可以看看下面这4份PDF(已经整理)

image.png

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

image.png

以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!

解》,里面近200道真实出现过的经典代码面试题。

  • 程序员代码面试指南–IT名企算法与数据结构题目最优解

[外链图片转存中…(img-gzaJFL6C-1714501407835)]

  • 其余像设计模式,建议可以看看下面这4份PDF(已经整理)

[外链图片转存中…(img-kE3XrfRz-1714501407835)]

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

[外链图片转存中…(img-leLIq3bN-1714501407836)]

以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值