【Nginx】反向代理与负载均衡搭建

linux下Nginx安装

1、安装gcc

安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:

yum install gcc-c++

2、PCRE pcre-devel 安装

PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:

yum install -y pcre pcre-devel

3、zlib 安装

zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

yum install -y zlib zlib-devel

4、OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

yum install -y openssl openssl-devel

5、下载安装包

手动下载.tar.gz安装包,地址:https://nginx.org/en/download.html

image-20230407102942448

下载完毕上传到服务器上 /root

6、解压

tar -zxvf nginx-1.18.0.tar.gzcd nginx-1.18.0

img

7、配置

使用默认配置,在nginx根目录下执行

./configure --with-http_ssl_module
make
make install

查找安装路径: whereis nginx

image-20230406105234357

Nginx常用命令

cd /usr/local/nginx/sbin/
./nginx  启动
./nginx -s stop  停止
./nginx -s quit  安全退出
./nginx -s reload  重新加载配置文件
ps aux|grep nginx  查看nginx进程

反向代理

1、应用安装

1、准备一个Linux环境(推荐使用数审镜像)
2、配置好IP以及DNS,确保网络可达。

image-20230407093711480

3、安装宝塔应用
curl -sSO http://download.bt.cn/install/install_panel.sh && bash install_panel.sh

SSL选择关闭,其他均为yes

出现以下页面及安装成功

image-20230411165335348

关闭安全入口

rm -f /www/server/panel/data/admin_path.pl

点击链接即可访问

image-20230407095230335

使用上面的账号密码登录

image-20230407095329694

注册一个宝塔账号

登录后即可进入应用

image-20230407095456106

修改账号密码

image-20230407101808808

2、Nginx配置修改

1、Nginx添加上述应用代理

修改以下配置

listen:修改为需要监听的端口

proxy_pass:修改为上述ip端口

    server {
        listen 82;
        server_name _;

        location / {
            proxy_pass http://172.24.3.187:19222/login; # 设置要转发的目标服务器
            proxy_set_header Host 172.24.3.187:19222; # 设置 Host 头信息
            proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 头信息
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Fo/www/server/panel/BTPanel/staticrwarded-For 头信息
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
            add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
            proxy_redirect off;
            client_max_body_size 10m;
            client_body_buffer_size 128k;
            proxy_buffers           32 4k;
            proxy_connect_timeout   600;
            proxy_send_timeout      600;
            proxy_read_timeout      600;
        }
        # 反向代理时,静态资源文件读取地址不是实际服务器地址,而是nginx的地址,需要如下配置才能真正读取到静态资源
        location ~ .* {
            proxy_pass	http://172.24.3.187:19222; 
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
        }
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

修改完配置之后,重新加载Nginx

进入sbin目录

cd /usr/local/nginx/sbin/
./nginx -s reload
2、Nginx完整配置示例
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}


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;

    server {
        listen 80;
        server_name _;

        location / {
            proxy_pass http://172.24.3.231:11879/login; # 设置要转发的目标服务器
            proxy_set_header Host 172.24.3.231:11879; # 设置 Host 头信息
            proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 头信息
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Fo/www/server/panel/BTPanel/staticrwarded-For 头信息
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
            add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
            proxy_redirect off;
            client_max_body_size 10m;
            client_body_buffer_size 128k;
            proxy_buffers           32 4k;
            proxy_connect_timeout   600;
            proxy_send_timeout      600;
            proxy_read_timeout      600;
        }
        # 反向代理时,静态资源文件读取地址不是实际服务器地址,而是nginx的地址,需要如下配置才能真正读取到静态资源
        location ~ .* {
            proxy_pass	http://172.24.3.231:11879; 
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
        }
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
        server {
        listen 82;
        server_name _;

        location / {
            proxy_pass http://172.24.3.187:19222/login; # 设置要转发的目标服务器
            proxy_set_header Host 172.24.3.187:19222; # 设置 Host 头信息
            proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 头信息
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Fo/www/server/panel/BTPanel/staticrwarded-For 头信息
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
            add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
            proxy_redirect off;
            client_max_body_size 10m;
            client_body_buffer_size 128k;
            proxy_buffers           32 4k;
            proxy_connect_timeout   600;
            proxy_send_timeout      600;
            proxy_read_timeout      600;
        }
        # 反向代理时,静态资源文件读取地址不是实际服务器地址,而是nginx的地址,需要如下配置才能真正读取到静态资源
        location ~ .* {
            proxy_pass	http://172.24.3.187:19222; 
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
        }
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen 81;
        server_name _;

        location / {
            proxy_pass http://xxx.xx.xx.xx:33920/login; # 设置要转发的目标服务器
            proxy_set_header Host $http_host; # 设置 Host 头信息
            proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 头信息
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Fo/www/server/panel/BTPanel/staticrwarded-For 头信息
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
            add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
            proxy_redirect off;
            client_max_body_size 10m;
            client_body_buffer_size 128k;
            proxy_buffers           32 4k;
            proxy_connect_timeout   600;
            proxy_send_timeout      600;
            proxy_read_timeout      600;
        }
        # 反向代理时,静态资源文件读取地址不是实际服务器地址,而是nginx的地址,需要如下配置才能真正读取到静态资源
        location ~ .* {
            proxy_pass	http://172.24.2.4:33920; 
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
        }
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}

其中多个server可以对应多个监听的端口,扩展配置只需要复制server修改ip端口即可。

到此代理以及完成!

3、nginx代理出现静态资源读取不到

原因:读取到是nginx服务器地址下的静态资源,而非被代理服务器的静态资源。
解决:设置如下,形似动静分离

# 反向代理时,静态资源文件读取地址不是实际服务器地址,而是nginx的地址,需要如下配置才能真正读取到静态资源
location ~ .* {
	proxy_pass 	http://192.168.93.105;
	proxy_set_header Host $http_host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
}

主要作用是 proxy_set_header Host h t t p h o s t ∗ ∗ 中 ∗ ∗ http_host** 中 ** httphosthttp_host,如果 $host 依旧不会有效。该处原因暂未明确

反向代理可以直接在location 中指定 proxy_pass http://192.168.93.105:8082; 或者 通过 upstream domain 指定服务组,然后指定服务组名(domain)进行代理:proxy_pass http://server_8082; 。

location / {
	# 反向代理。负载均衡可通过upstream设置多个服务器
	proxy_pass	http://server_8082; 
	# proxy_pass	http://192.168.93.105:8082;
	# 下面几个配置,意思是将http头转发给后端应用,不然你后端应用服务拿客户端IP地址的时候拿到的是nginx代理的地址而不是客户端的。
	#proxy_set_header Host $host;
	#proxy_set_header X-Real-IP $remote_addr;
	#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #root   html;
    index  index.html index.htm;
}
# 设置负载服务器池(服务组),如果有域名采用域名作为名称
upstream server_8082 {
	server	192.168.93.105:8082 weight=2;
	#server	192.168.0.105:8083 weight=1;
}
server {
    listen       8082;
    server_name  localhost;
     
    location / {
		# 反向代理。负载均衡可通过upstream设置多个服务器
		proxy_pass	http://server_8082; 
		# proxy_pass	http://192.168.93.105:8082;
		# 下面几个配置,意思是将http头转发给后端应用,不然你后端应用服务拿客户端IP地址的时候拿到的是nginx代理的地址而不是客户端的。
		#proxy_set_header Host $host;
		#proxy_set_header X-Real-IP $remote_addr;
		#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #root   html;
        index  index.html index.htm;
    }

	# 反向代理时,静态资源文件读取地址不是实际服务器地址,而是nginx的地址,需要如下配置才能真正读取到静态资源
	location ~ .* {
		proxy_pass	http://server_8082; 
		# proxy_pass	http://192.168.93.105:8082;
		proxy_set_header Host $http_host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
	}
	 
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

负载均衡

由于需要使用分布式部署,所以搭建的应用需要支持Session共享多模块

1、依赖安装

安装Redis

下载地址 http://download.redis.io/releases/redis-5.0.7.tar.gz

  1. 下载获得 redis-5.0.7.tar.gz 后将它放到我们Linux的目录下 /opt

  2. /opt 目录下,解压命令 : tar -zxvf redis-5.0.7.tar.gz

  3. 解压完成后出现文件夹:redis-5.0.7

  4. 安装依赖

    yum install gcc-c++

  5. 进入目录: cd redis-5.0.7

  6. 在 redis-5.0.7 目录下执行 make 命令

  7. 如果make完成后继续执行 make install

  8. 查看默认安装目录:

修改配置文件

image-20230411160424296

# 允许任何主机连接、访问
bind 127.0.0.1 改为 bind 0.0.0.0
 
# 关闭保护模式
protected-mode yes 改为 protected-mode no
 
# 允许启动后在后台运行,即关闭命令行窗口后仍能运行
daemonize no 改为 daemonize yes
防火墙添加6379端口
后台启动redis
cd /usr/local/bin
nohup redis-server /usr/local/redis-5.0.7/redis.conf &
测试

image-20230411160759481

有响应即可

2、应用安装

ROUYI最新版本(2018-11-22)集成redis,将session放入redis,可实现集群部署;

地址:https://gitee.com/duzunwu512/RuoYi

1、通过git下拉代码
2、修改配置文件中的账号密码,ip端口
3、修改mysql版本

image-20230411155418139

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.29</version>
</dependency>
4、修改连接池配置

image-20230411155533395

主要修改数据源配置url、username、password

修改redis的配置host、port

两个环境使用同一个mysql以及redis

# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
              url: jdbc:mysql://xxx.xx.xx.x:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
              username: root
              password: ********
            # 从库数据源
            slave:
                # 从数据源开关/默认关闭
                enabled: false
                url:
                username:
                password:
            # 初始连接数
            initial-size: 10
            # 最大连接池数量
            max-active: 100
            # 最小连接池数量
            min-idle: 10
            # 配置获取连接等待超时的时间
            max-wait: 60000
            # 打开PSCache,并且指定每个连接上PSCache的大小
            pool-prepared-statements: true
            max-pool-prepared-statement-per-connection-size: 20
            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            timeBetweenEvictionRunsMillis: 60000
            # 配置一个连接在池中最小生存的时间,单位是毫秒
            min-evictable-idle-time-millis: 300000
            validation-query: SELECT 1 FROM DUAL
            test-while-idle: true
            test-on-borrow: false
            test-on-return: false
            stat-view-servlet:
                enabled: true
                url-pattern: /monitor/druid/*
            filter:
                stat:
                    log-slow-sql: true
                    slow-sql-millis: 1000
                    merge-sql: false
                wall:
                    config:
                        multi-statement-allow: true
                        
    redis:
      # Redis开关/默认关闭
      enabled: true
      database: 0
      password:
      host: xxx.xx.xx.x
      port: 6379
      lettuce:
          pool:
            max-active:  100 # 连接池最大连接数(使用负值表示没有限制)
            max-idle: 100 # 连接池中的最大空闲连接
            min-idle: 50 # 连接池中的最小空闲连接
            max-wait: 6000 # 连接池最大阻塞等待时间(使用负值表示没有限制)
      timeout: 1000                        
5、修改服务端口

image-20230411160926720

image-20230411160940678

6、打包

使用maven打包即可,找到图中对应的jar包

image-20230411161055852

image-20230411161137882

7、初始化数据库

使用Navicat连接数据库,新建ry数据库

image-20230411161519361

将以下两个sql文件初始化到库中

image-20230411161708710

8、部署

将上述jar包上传至任意目录,直接执行

nohup java -jar ruoyi-admin.jar &

同时在多个环境执行都可以

查看日志出现下图即启动成功

image-20230411162009836

记录部署环境ip即服务端口,可直接页面访问。

image-20230411162103021

3、Nginx配置修改

1、直接替换下述配置文件
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}


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;


    upstream testServer {
        server 172.24.2.4:8088;
        server 172.24.3.231:8088;
    }

    server {
        listen 80;
        server_name _;

        location / {
            proxy_pass http://testServer;
            proxy_set_header Host http://testServer; # 设置 Host 头信息
            proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 头信息
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Fo/www/server/panel/BTPanel/staticrwarded-For 头信息
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
            add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
            proxy_redirect off;
            client_max_body_size 10m;
            client_body_buffer_size 128k;
            proxy_buffers           32 4k;
            proxy_connect_timeout   600;
            proxy_send_timeout      600;
            proxy_read_timeout      600;
        }
        location ~ .* {
            proxy_pass	http://testServer; 
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
        }
    }

}

2、主要修改以下内容,替换其中的ip端口为上述若依应用的ip端口即可
upstream testServer {
        server 172.24.2.4:8088;
        server 172.24.3.231:8088;
}
3、配置后重新加载Nginx配置
4、直接访问Nginx的服务加端口即可

image-20230411162458074

通过日志可以发现,是两台服务随机处理的请求

image-20230411162641709

到此、负载均衡部署成功!

5、负载均衡策略
策略描述
轮询默认方式
weight权重方式
ip_hash依据ip分配方式
least_conn最少连接方式
1、轮询

最基本的配置方法,上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。

  • 在轮询中,如果服务器down掉了,会自动剔除该服务器。
  • 缺省配置就是轮询策略。
  • 此策略适合服务器配置相当,无状态且短平快的服务使用。
2、weight
#动态服务器组
    upstream dynamic_zuoyu {
        server localhost:8080   weight=2;
        server localhost:8081;  
        server localhost:8082   backup;
        server localhost:8083   max_fails=3 fail_timeout=20s;
    }
参数描述
fail_timeout与max_fails结合使用。
max_fails设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了,
fail_time服务器会被认为停机的时间长度,默认为10s。
backup标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
down标记服务器永久停机了。
  • 权重越高分配到需要处理的请求越多。
  • 此策略可以与least_conn和ip_hash结合使用。
  • 此策略比较适合服务器的硬件配置差别比较大的情况。
3、ip_hash
#动态服务器组
    upstream dynamic_zuoyu {
        ip_hash;    
        server localhost:8080   weight=2;
        server localhost:8081;  
        server localhost:8082;  
        server localhost:8083   max_fails=3 fail_timeout=20s;
    }
  • ip_hash不能与backup同时使用。
  • 此策略适合有状态服务,比如session。
  • 当有服务器需要剔除,必须手动down掉。

此方式对接口只会一直走同一个ip上的服务,固定访问一个后端服务器

4、least_conn
#动态服务器组
    upstream dynamic_zuoyu {
        least_conn;    #把请求转发给连接数较少的后端服务器
        server localhost:8080   weight=2;
        server localhost:8081;
        server localhost:8082 backup;
        server localhost:8083   max_fails=3 fail_timeout=20s;
    }

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值