Nginx反向代理和负载均衡

200 阅读7分钟

一、Nginx安装

官网:nginx.org/

1). 安装依赖包

    yum -y install gcc pcre-devel zlib-devel openssl openssl-devel

2). 下载Nginx安装包

    yum install wget
    wget https://nginx.org/download/nginx-1.16.1.tar.gz
    执行完wget指令后,就会在当前所在目录看到下载下来的文件。

3). 解压nginx压缩包

    tar -zxvf nginx-1.16.1.tar.gz

4). 配置Nginx编译环境

    cd nginx-1.16.1
    ./configure --prefix=/usr/local/nginx
    说明:
        --prefix 指定的目录,就是我们安装Nginx的目录。

5). 编译&安装

    make & make install

二、Nginx目录

1.通过tree查看目录

yum install tree 安装tree指令
tree nginx

image.png

2.重点目录和文件如下:

目录/文件说明备注
conf配置文件的存放目录
conf/nginx.confNginx的核心配置文件conf下有很多nginx的配置文件,我们主要操作这个核心配置文件
html存放静态资源(html, css, )部署到Nginx的静态资源都可以放在html目录中
logs存放nginx日志(访问日志、错误日志等)
sbin/nginx二进制文件,用于启动、停止Nginx服务

三、Nginx命令

如果没有给Nginx配置环境变量,要在/usr/local/nginx/sbin/目录下执行命令。

Nginx默认端口 80

1. 查看版本
    ./nginx -v

2. 检查配置文件    
    ./nginx -t

3. 启动Nginx
    ./nginx
    可以通过ps -ef指令来查看nginx的进程是否存在。
    注意: nginx服务启动后,默认就会有两个进程。如果nginx无法访问,检查防火墙和80端口.

4. 停止Nginx
    ./nginx -s stop

5. 重新加载Nginx配置文件(修改配置文件后,要重新加载配置文件才能生效,在Nginx启动的情况下执行命令。)
    ./nginx -s reload

1. Nginx配置环境变量

1. 编辑/etc/profile文件, 在PATH环境变量中增加nginx的sbin目录,
每个环境变量的添加,都要以冒号来分隔。

    export PATH=/usr/local/nginx/sbin:其他环境变量:其他环境变量

2. 修改完配置文件之后,需要执行 source /etc/profile 使文件生效。

四、Nginx的配置文件结构

nginx的配置文件(conf/nginx.conf)整体上分为三部分: 全局块、events块、http块。

在http块中可以包含多个server块,每个server块可以配置多个location块。

区域职责
全局块配置和nginx运行相关的全局配置
events块配置和网络连接相关的配置
http块配置代理、缓存、日志记录、虚拟主机等配置

image.png

五、Nginx部署静态资源

Nginx可以作为静态web服务器来部署静态资源。

将文件复制到Nginx安装目录下的html目录中即可。

server {
    listen 80;			#监听端口	
    server_name localhost;	#服务器名称
    location / {		#匹配客户端请求url
        root html;		#指定静态资源根目录
        index index.html;	#指定默认首页
    }
}

配置完成后,记得通过nginx -s reload命令重新加载配置,让配置生效。
配置完成后,可以通过nginx -t 检查配置是否正确。
如果我们需要将hello.html作为nginx的首页,可以修改location的index指令,配置为hello.html

六、Nginx反向代理

1. 正向代理

正向代理:客户端知道目标服务器的地址,但无法直接访问目标服务器,就找一台可以访问目标服务器的机器作为代理,将请求发给这个代理,然后由代理访问目标服务器获取数据,返回给客户端。

目标服务器收到的请求是代理服务器发来的,所以不知道客户端的地址信息。

正向代理一般是在客户端设置代理服务器,通过代理服务器转发请求,最终访问到目标服务器。

正向代理特点:可以隐藏客户端的信息。

image.png

2. 反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源,反向代理服务器负责将请求转发给目标服务器。用户不需要知道目标服务器的地址,也无须在用户端作任何设定,对于用户来说,访问反向代理服务器是完全无感知的。

反向代理特点:

  1. 隐藏了目标服务器的地址,保护web不受侵害
  2. 可以通过代理服务器实现负载均衡(也就是将大量请求分发到多个服务器上,减轻各个目标服务器处理请求的压力)

image.png

反向代理举例:

server {
    listen 82;
    server_name localhost;
    location / {
        proxy_pass http://192.168.200.201:8080; 	#反向代理配置,将请求转发到指定服务
    }
}

当我们访问nginx的82端口时,根据反向代理配置,会将请求转发到 http://192.168.200.201:8080 对应的服务上。

3. 测试

需求:在192.168.200.201这台服务器中部署了java应用,运行端口为8080,并提供了一个可访问的链接 /hello。现在我们需要在访问nginx的82端口时,通过nginx将请求转发到192.168.200.201:8080的服务。

实现步骤:

1). 在192.168.200.201部署服务并启动
2). 在192.168.200.200中的nginx.conf中配置反向代理,vim nginx.conf
        
        在http块中,再添加一个server块虚拟主机的配置,监听82端口,并配置反向代理proxy_pass:
        server {
            listen 82;
            server_name localhost;
            location / {
                proxy_pass http://192.168.200.201:8080;  #反向代理配置,将请求转发到指定服务
            }
        }
        
        客户端访问浏览器的82端口,Nginx就会将请求转发到192.168.200.201:8080端口上来。
        
3). 检查配置文件,并重新加载
        nginx -t
        nginx -s reload
        
4). 访问, 访问前记得关闭防火墙或者开放相应的端口

开放端口
    firewall-cmd --zone=public --add-port=82/tcp --permanent
    firewall-cmd --reload

七、Nginx负载均衡

业务流量越来越大并且业务逻辑也越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器组成应用集群,进行性能的水平扩展以及避免单点故障出现。

应用集群:将同一应用部署到多台机器上,组成应用集群,接收负载均衡器分发的请求,进行业务处理并返回响应数据

负载均衡器:将用户请求根据对应的负载均衡算法分发到应用集群中的一台服务器进行处理

通过Nginx这个负载均衡器来代理多台服务器,将客户端的请求分发到多台服务器中进行处理。

1.负载均衡实现

1. 将项目jar包上传到192.168.200.201,192.168.200.202服务器上。
2. 运行上传上来的两个jar包,运行端口分别是 8080 , 8081
3. 在nginx中配置负载均衡,将负载均衡配置在http代码块中。

        #upstream指令可以定义一组服务器
        upstream targetserver{	
            server 192.168.200.201:8080;
            server 192.168.200.202:8081;
        }

        server {
            listen       8080;
            server_name  localhost;
            location / {
                proxy_pass http://targetserver;
            }
        }
4. 重新加载nginx配置文件,访问
        nginx -s reload
        
5. 访问测试

    访问nginx的8080端口(<http://192.168.200.200:8080>), 此时nginx会根据负载均衡策略,
    将请求转发到后面的两台服务器。 模式的负载均衡策略是轮询。

a. 负载均衡策略

处理上述默认的轮询策略以外,在Nginx中还提供了其他的负载均衡策略,如下:

名称说明特点
轮询默认方式
weight权重方式根据权重分发请求,权重大的分配到请求的概率大
ip_hash依据ip分配方式根据客户端请求的IP地址计算hash值, 根据hash值来分发请求, 同一个IP发起的请求, 会发转发到同一个服务器上
least_conn依据最少连接方式哪个服务器当前处理的连接少, 请求优先转发到这台服务器
url_hash依据url分配方式根据客户端请求url的hash值,来分发请求, 同一个url请求, 会发转发到同一个服务器上
fair依据响应时间方式优先把请求分发给处理请求时间短的服务器

权重方式的负载均衡举例:

#upstream指令可以定义一组服务器
upstream targetserver{	
    server 192.168.200.201:8080 weight=10;
    server 192.168.200.202:8081 weight=5;
}

上述配置的weight权重是相对的,在上述的配置中,效果就是,在大数据量的请求下,最终8080接收的请求数是8081的两倍。