关于java:Nginx-除了负载均衡还能做什么

28次阅读

共计 4061 个字符,预计需要花费 11 分钟才能阅读完成。

作者:jitwxs\
链接:https://jitwxs.cn/90f4b8f6.html

本文只针对 Nginx 在不加载第三方模块的状况能解决哪些事件,因为第三方模块太多所以也介绍不完,当然本文自身也可能介绍的不残缺,毕竟只是我集体应用过和理解到过的。

Nginx 能做什么

  • 反向代理
  • 负载平衡
  • HTTP 服务器(蕴含动静拆散)
  • 正向代理

以上就是我理解到的 Nginx 在不依赖第三方模块能解决的事件,上面具体阐明每种性能怎么做。

反向代理

反向代理应该是 Nginx 做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理(Reverse Proxy)形式是指以代理服务器来承受 internet 上的连贯申请,而后将申请转发给外部网络上的服务器,并将从服务器上失去的后果返回给 internet 上申请连贯的客户端,此时代理服务器对外就体现为一个反向代理服务器。

简略来说就是实在的服务器不能间接被内部网络拜访,所以须要一台代理服务器,而代理服务器能被内部网络拜访的同时又跟实在服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。上面贴上一段简略的实现反向代理的代码:

server {    
    listen       80;                                                           
    server_name  localhost;                                                 
    client_max_body_size 1024M;  
  
    location / {  
        proxy_pass http://localhost:8080;  
        proxy_set_header Host $host:$server_port;  
    }  
}  

保留配置文件后启动 Nginx,这样当咱们拜访 localhost 的时候,就相当于拜访 localhost:8080 了。

负载平衡

负载平衡也是 Nginx 罕用的一个性能,负载平衡其意思就是摊派到多个操作单元上进行执行,例如 Web 服务器、FTP 服务器、企业要害应用服务器和其它要害工作服务器等,从而共同完成工作工作。

简略而言就是当有 2 台或以上服务器时,依据规定随机的将申请散发到指定的服务器上解决,负载平衡配置个别都须要同时配置反向代理,通过反向代理跳转到负载平衡。

Nginx 目前反对自带 3 种负载平衡策略,还有 2 种罕用的第三方策略。

RR(默认)

每个申请按工夫程序逐个调配到不同的后端服务器,如果后端服务器 down 掉,能主动剔除。

upstream test {  
    server localhost:8080;  
    server localhost:8081;  
}  
server {  
    listen       81;                                                           
    server_name  localhost;                                                 
    client_max_body_size 1024M;  
  
    location / {  
        proxy_pass http://test;  
        proxy_set_header Host $host:$server_port;  
    }  
}  

负载平衡的外围代码为:

upstream test {  
    server localhost:8080;  
    server localhost:8081;  
}  

这里我配置了 2 台服务器,当然实际上是一台,只是端口不一样而已,而 8081 的服务器是不存在的,也就是说拜访不到,然而咱们拜访 http://localhost 的时候,也不会有问题,会默认跳转到 http://localhost:8080 具体是因为 Nginx 会主动判断服务器的状态,如果服务器处于不能拜访(服务器挂了),就不会跳转到这台服务器,所以也防止了一台服务器挂了影响应用的状况,因为 Nginx 默认是 RR 策略,所以咱们不须要其余更多的设置。

权重

指定轮询几率,weight 和拜访比率成正比,用于后端服务器性能不均的状况。例如

upstream test {  
    server localhost:8080 weight=9;  
    server localhost:8081 weight=1;  
}  

那么 10 次个别只会有 1 次会拜访到 8081,而有 9 次会拜访到 8080

ip_hash

下面的 2 种形式都有一个问题,那就是下一个申请来的时候申请可能散发到另外一个服务器,当咱们的程序不是无状态的时候(采纳了 session 保留数据),这时候就有一个很大的很问题了,比方把登录信息保留到了 session 中,那么跳转到另外一台服务器的时候就须要从新登录了,所以很多时候咱们须要一个客户只拜访一个服务器,那么就须要用 iphash 了,iphash 的每个申请按拜访 ip 的 hash 后果调配,这样每个访客固定拜访一个后端服务器,能够解决 session 的问题。

upstream test {  
    ip_hash;  
    server localhost:8080;  
    server localhost:8081;  
}  
fair(第三方)

按后端服务器的响应工夫来调配申请,响应工夫短的优先调配。

upstream backend {   
    fair;   
    server localhost:8080;  
    server localhost:8081;  
}  
url_hash(第三方)

按拜访 url 的 hash 后果来调配申请,使每个 url 定向到同一个后端服务器,后端服务器为缓存时比拟无效。在 upstream 中退出 hash 语句,server 语句中不能写入 weight 等其余的参数,hash_method 是应用的 hash 算法

upstream backend {   
    hash $request_uri;   
    hash_method crc32;   
    server localhost:8080;  
    server localhost:8081;  
}  

以上 5 种负载平衡各自实用不同状况下应用,所以能够依据理论状况抉择应用哪种策略模式,不过 fair 和 url_hash 须要装置第三方模块能力应用,因为本文次要介绍 Nginx 能做的事件,所以 Nginx 装置第三方模块不会再本文介绍。

HTTP 服务器

Nginx 自身也是一个动态资源的服务器,当只有动态资源的时候,就能够应用 Nginx 来做服务器,同时当初也很风行动静拆散,就能够通过 Nginx 来实现,首先看看 Nginx 做动态资源服务器。

server {  
    listen       80;                                                           
    server_name  localhost;                                                 
    client_max_body_size 1024M;  
      
    location / {  
        root   e:\wwwroot;  
        index  index.html;  
    }  
}  

这样如果拜访 http://localhost 就会默认拜访到 E 盘 wwwroot 目录上面的 index.html,如果一个网站只是动态页面的话,那么就能够通过这种形式来实现部署。

动静拆散

动静拆散是让动静网站里的动静网页依据肯定规定把不变的资源和常常变的资源辨别开来,动静资源做好了拆分当前,咱们就能够依据动态资源的特点将其做缓存操作,这就是网站动态化解决的外围思路

upstream test{    
   server localhost:8080;    
   server localhost:8081;    
}     
  
server {    
    listen       80;    
    server_name  localhost;    
  
    location / {    
        root   e:\wwwroot;    
        index  index.html;    
    }    
  
    # 所有动态申请都由 nginx 解决,寄存目录为 html    
    location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {root    e:\wwwroot;}    
  
    # 所有动静申请都转发给 tomcat 解决    
    location ~ \.(jsp|do)$ {proxy_pass  http://test;}    
  
    error_page   500 502 503 504  /50x.html;    
    location = /50x.html {root   e:\wwwroot;}    
}  

这样咱们就能够把 HTML 以及图片和 css 以及 js 放到 wwwroot 目录下,而 tomcat 只负责解决 jsp 和申请,例如当咱们后缀为 gif 的时候,Nginx 默认会从 wwwroot 获取到以后申请的动态图文件返回,当然这里的动态文件跟 Nginx 是同一台服务器,咱们也能够在另外一台服务器,而后通过反向代理和负载平衡配置过来就好了,只有搞清楚了最根本的流程,很多配置就很简略了,另外 localtion 前面其实是一个正则表达式,所以非常灵活。

正向代理

正向代理,意思是一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器获得内容,客户端向代理发送一个申请并指定指标(原始服务器),而后代理向原始服务器转交申请并将取得的内容返回给客户端,客户端能力应用正向代理。

resolver 114.114.114.114 8.8.8.8;  
server {  
  
    resolver_timeout 5s;  
  
    listen 81;  
  
    access_log  e:\wwwroot\proxy.access.log;  
    error_log   e:\wwwroot\proxy.error.log;  
  
    location / {proxy_pass http://$host$request_uri;}  
}  

resolver 是配置正向代理的 DNS 服务器,listen 是正向代理的端口,配置好了就能够在 IE 下面或者其余代理插件下面应用服务器 ip+ 端口号进行代理了。

最初说两句

启动进行及配置文件地位的命令:

/etc/init.d/nginx start/restart # 启动 / 重启 Nginx 服务  
  
/etc/init.d/nginx stop # 进行 Nginx 服务  
  
/etc/nginx/nginx.conf # Nginx 配置文件地位  

Nginx 是反对热启动的,也就是说当咱们批改配置文件后,不必敞开 Nginx,就能够实现让配置失效,Nginx 从新读取配置的命令是 nginx -s reload。最初,关注公众号 Java 技术栈,在后盾回复:面试,能够获取我整顿的 Java 系列面试题和答案,十分齐全。
近期热文举荐:

1.600+ 道 Java 面试题及答案整顿(2021 最新版)

2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0