Nginx反向代理与负载均衡

原文链接:https://www.haicheng.website/...

简介

Nginx是一款轻量级的Web服务器和反向代理服务器及电子邮箱代理服务器。Nginx主要提供反向代理、负载均衡、动静分离等服务。

安装Nginx

  1. 镜像网站选择合适的Nginx版本并复制其地址,在服务器端使用wget命令下载
wget https://mirrors.huaweicloud.com/nginx/nginx-1.16.1.tar.gz
  1. 解压压缩文件
tar -zxvf nginx-1.16.1.tar.gz
  1. 安装必要的依赖
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel -y
  1. 配置
# 进入nginx-1.16.1目录,并分别执行
./configure
make & make install
  1. 进入/usr/local/nginx/sbin目录执行启动服务器
./nginx
  1. 如果使用的是云服务器需要开启服务器自身的端口(Nginx默认80端口)和安全组策略
# 开启防火墙
systemctl start firewalld
# 开放80端口
firewall-cmd --add-port=80/tcp --permanent
# 重新加载配置
firewall-cmd --reload
# 查看已开放的端口
firewall-cmd --list-ports
  1. 检查进程并查看页面,至此Nginx已经安装成功

image

正向代理与反向代理

  • 正向代理
手动配置代理服务器IP和端口,客户端请求代理服务器,再由代理服务器代替客户端访问Web服务器;
Nginx反向代理与负载均衡_第1张图片
  • 反向代理
客户端访问代理服务器,再由代理服务器根据策略访问具体的Web服务器;
Nginx反向代理与负载均衡_第2张图片
  • 总结

    正向代理服务于客户端,此时Web服务器无法获取客户端信息

    反向代理服务于服务器端,此时客户端无法获取Web服务器的真实信息

配置Nginx

Nginx的配置文件是/usr/local/nginx/conf目录下的nginx.conf。配置文件由三部分组成

  • 全局块

从文件开始到至events之间就是全局块,这里定义了工作进程的数量,错误日志及项目pid的保存路径。Nginx有一个主进程(master process)和几个工作进程(worker process)。主进程主要用于读取配置文件和评估配置,以及维护工作流程;工作进程主要用于处理请求。配置文件中的worker_processes表示工作进程数量,一般配置为CPU核心数。
image

  • events块

events主要影响Nginx与用户的网络连接,worker_connections表示每个worker进程支持的最大连接数

  • http块

Nginx最重要的的配置区域,负载均衡,请求代理都在此配置。http块由多个server块组成。

http {
    # 用于配置文件拆分
    include       mime.types;
    # 默认响应类型
    default_type  application/octet-stream;

    server {
        # 监听端口
        listen       80;
        # 虚拟主机名称
        server_name  localhost;
        location / {
            ....
        }
    }
}

加载配置文件

/usr/local/nginx/sbin目录下进行配置文件的验证,重新加载
  • 验证配置文件是否正确
./nginx -t
  • 重新加载配置文件
./nginx -s reload
  • 关闭nginx(立即关闭)
./nginx -s stop
  • 优雅的关闭nginx(等待工作进程完成当前请求后,再关闭nginx)
./nginx -s quit

实例

静态文件缓存

对于项目开发中涉及到的图片、视频和文件等内容,可以使用Nginx完成文件的下载和引用。日常开发中,有些资源需要保存方便后期使用,那么可以搭建一个基于Nginx的文件下载服务器。

  • 在服务器创建保存文件的目录

Nginx反向代理与负载均衡_第3张图片

  • 配置Nginx
location /download {
    # 静态文件保存路径
    alias  /tmp/download;
    # 开启索引功能
    autoindex on;
    # 显示文件大小(kb,mb,gb)
    autoindex_exact_size off;
    # 显示本机时间而非GMT时间
    autoindex_localtime on;
    # utf-8防止中文文件名的乱码
    charset utf-8;
}
  • 访问http://ip/download就可以看到创建的文件夹,受限于服务器的配置,文件下载速度最大在600上下。这里是我自己的一个下载站,保存了常用的软件。
  • 在之前的配置中使用了root,现在又使用了alias,两者的区别如下:

    • root:root会追加location中的路径到url后面;例如:

      location /download {
          root  /tmp/file;
      }

      用户访问http://192.168.1.1/download,但Nginx访问的文件路径是:/tmp/file/download

    • alias:只映射配置的路径,不做任何调整

      location /download {
          alias  /tmp/file;
      }

      用户访问http://192.168.1.1/download,Nginx访问的文件路径是:/tmp/file

请求转发

对于后端接口,常通过在url添加后缀代理至真实的项目。例如:在服务器端启动Tomcat后,因为某种原因无法开放8080端口,可以使用如下配置:

# 访问地址:http://127.0.0.1就会跳转tomcat界面
server {
    listen       80;
    server_name  localhost;
    location / {
        # 将80端口的请求代理至8080端口
        proxy_pass http://localhost:8080/;
    }
}

# 访问地址:http://127.0.0.1/tomcat就会跳转tomcat界面
server {
    listen       80;
    server_name  localhost;
    location /tomcat {
        # 将80端口的请求代理至8080端口
        proxy_pass http://localhost:8080/;
    }
}

负载均衡

基于Nginx的负载均衡属于软负载。在多个应用实例前部署负载均衡组件是会优化资源利用率,最大化吞吐量,减少延迟和确保容错配置;Nginx目前支持的负载均衡算法是:轮询(round-robin)、最少连接(least-connected)、权重(Weighted )、ip-hash。在服务器端部署三个实例,通过设置不同的负载均衡算法,显示相应的内容;接口如下所示:

    @GetMapping(value = "/get")
    public String get() {
        // 第一个  第二个 第三个
        return "第一个";
    }

轮询(默认负载均衡算法)

通过如下配置,请求被均分到8081、8082、8083端口所至的服务

http {
    ...
    upstream tomcat {
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
        server 127.0.0.1:8083;
    }
    server {
        ...
        location / {
            root      /get;
            proxy_pass http://tomcat/;
        }
        ...
    }
}

浏览器依次显示:
Nginx反向代理与负载均衡_第4张图片

最小连接

根据服务器当前的连接情况进行负载均衡的,当请求到来时,会选取当前连接数最少的一台服务器来处理请求

http {
    ...
    upstream tomcat {
        leasst_conn;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
        server 127.0.0.1:8083;
    }
    server {
        ...
        location / {
            root      /get;
            proxy_pass http://tomcat/;
        }
        ...
    }
}

权重

通过给每个实例配置权重,实现请求访问倾斜

http {
    ...
    upstream tomcat {
        server 127.0.0.1:8081 weight=4;
        server 127.0.0.1:8082 weight=2;
        server 127.0.0.1:8083;
    }
    server {
        ...
        location / {
            root      /get;
            proxy_pass http://tomcat/;
        }
        ...
    }
}

访问页面,“第一个”出现的频率明显多于“第二个”和“第三个”

ip_hash

通过客户端的IP地址决定访问那个实例

http {
    ...
    upstream tomcat {
        ip_hash;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
        server 127.0.0.1:8083;
    }
    server {
        ...
        location / {
            root      /get;
            proxy_pass http://tomcat/;
        }
        ...
    }
}

配置后,我此时的IP只能访问第一个实例,页面返回”第一个“

你可能感兴趣的:(nginx,反向代理,负载均衡,linux,centos7)