美文网首页
nginx负载均衡

nginx负载均衡

作者: 有梦想的虫子_2018 | 来源:发表于2020-10-27 11:28 被阅读0次

    upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡

    Upstream常用参数介绍

    语法:server address [parameters]

    其中关键字server必选。 address也必选,可以是主机名、域名、ip或unix socket,也可以指定端口号。 parameters是可选参数,可以是如下参数:

    down:表示当前server已停用

    backup:表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求

    weight:表示当前server负载权重,权重越大被请求几率越大。默认是1

    max_failsfail_timeout一般会关联使用,如果某台server在fail_timeout时间内出现了max_fails次连接失败,那么Nginx会认为其已经挂掉了,从而在fail_timeout时间内不再去请求它,fail_timeout默认是10s,max_fails默认是1,即默认情况是只要发生错误就认为服务器挂掉了,如果将max_fails设置为0,则表示取消这项检查。

    ups支持的调度算法
    
    ip_hash  根据ip的hash值来做转发
    
    默认是轮询机制
    
    权重 weight=x
    
    fair 根据服务器的响应时间来分配请求
    
    url_hash
    

    综合案例

    nginx.conf

    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #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;
            
        sendfile        on;
        #tcp_nopush     on; 
          
        #keepalive_timeout  0;
        keepalive_timeout  65; 
        
        #gzip  on;
        include /usr/local/nginx/conf/conf.d/*.conf;
        
    }
    

    proxy.conf

    server {
            listen 80;
            server_name www.suzao.com;
    
            location /nginx {
                    proxy_set_header Host $host;
                    proxy_set_header interface_version $host;
                    proxy_set_header X-Real_IP $remote_addr;
                    proxy_pass http://tomcatserver;
            }
    }
    

    upstream.conf

    upstream tomcatserver {
            server 192.168.10.68:8080 weight=10;
            server 192.168.10.69:8080 weight=10;
    }
    

    创建nginx.war部署到tomcat下

    NginxController

    package com.example.springbootnginxdemo;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.servlet.http.HttpServletRequest;
    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    import java.util.*;
    
    /**
     * @ClassName NginxController
     * @Description: TODO
     * @Author mc
     * @Date 2020
     * @Version V1.0
     **/
    @RestController
    public class NginxController {
    
        @GetMapping("/getIp")
        public Object getNginxParam(HttpServletRequest request){
            String remoteAddr = request.getRemoteAddr();
            String ngip = request.getHeader("X-Real_IP");
            String param = request.getHeader("interface_version");
            List<String> addrs = test2();
    
            Map<String,Object> map = new HashMap<>();
            map.put("remoteAddr",remoteAddr);
            map.put("ngip",ngip);
            map.put("param",param);
            map.put("addrs",addrs);
            return map;
        }
        public List<String> test2() {
            List<String> addrs = new ArrayList<>();
            try {
                Enumeration<NetworkInterface> faces = NetworkInterface.getNetworkInterfaces();
                while (faces.hasMoreElements()) { // 遍历网络接口
                    NetworkInterface face = faces.nextElement();
                    if (face.isLoopback() || face.isVirtual() || !face.isUp()) {
                        continue;
                    }
                    //System.out.print("网络接口名:" + face.getDisplayName() + ",地址:");
                    Enumeration<InetAddress> address = face.getInetAddresses();
                    while (address.hasMoreElements()) { // 遍历网络地址
                        InetAddress addr = address.nextElement();
                        if (!addr.isLoopbackAddress() && addr.isSiteLocalAddress() && !addr.isAnyLocalAddress()) {
                            System.out.print(addr.getHostAddress() + " ");
                            addrs.add(addr.getHostAddress());
                        }
                    }
                    //System.out.println("");
                }
            } catch (SocketException e) {
                e.printStackTrace();
            }
            return addrs;
        }
    }
    
    

    浏览器访问

    image.png

    相关文章

      网友评论

          本文标题:nginx负载均衡

          本文链接:https://www.haomeiwen.com/subject/kbgvmktx.html