1. 前言

本文的核心主要是将前四篇博文的内容进行一个综合练习,通过 Nginx 部署开源框架 Ruoyi-Vue 这个需求进行实现动静分离。

准备工作

2. 问题思考?

  1. 为什么不使用 Apache Tomcat 处理动静分离?

    • Apache Tocmat 严格来说是一款 java EE 服务器,主要是用来处理 servlet 请求。例如 SpringBoot 中内置的就是 Tomcat 服务器。
  2. 静态资源(html、css、js、图片)交给谁处理?

    • 将静态文件交给 Nginx 处理,可以提高系统的访问速度,减少 Tomcat 的请求次数,有效的给后端服务器降压。
  3. 静态资源一定是和 Nginx 放在同一台服务器的吗?

    • 是的,本质上来说 Nginx 配置本身就是一个静态资源的服务器。例如,我们打的前端 Docker 镜像本质上一个 Nginx 服务器。
  4. 那动静分离之后,静态资源如何跟动态请求交互呢?

    • 静态资源是通过浏览器和动态资源进行交互的。

    888dce6baa76ca30e5892d8f9d16f4a

3. 具体需求

本过程也可以在一台服务器中进行,但为了更好的理解动静分离,本人用到的是两台服务器 server1server2

  • server1 :部署的是 nginx 和 前端文件服务;
  • server2 :部署的是后端 jar 服务;

实现流程如下:

  • 首先,当客户端通过 http://ip:port/path 进行访问。
  • 然后,当请求达到服务器之后,通过 Nginx 代理 转发到真正的目标服务器上。
  • 最后,返回请求信息。
  • 具体流程如下图

image-20230512004958119

4. Nginx 配置 Ruoyi-Vue 框架

具体步骤如下:

  1. server1 :上传静态资源。
  2. server1 :创建 nginx 配置文件,并使其生效。
  3. server2 :修改 ruoyi-admin.jar 中的数据库和 Redis 连接信息,并使其生效。
  4. server1 :通过 crul 命令是否可以访问该端口。
  5. 客户端访问

4.1. 实现步骤

  1. server1 :上传静态资源。

    • 文件路径:/home/ruoyi

      image-20230512010402361

  2. server1 :创建 nginx 配置文件,并使其生效。

    • nginx 配置文件路径 /etc/nginx/cond.d

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      # 虚拟主机server块
      server {
      # 监听端口
      listen 8003;
      # 匹配请求中的host值
      server_name localhost;
      charset utf-8;

      # 监听请求静态资源路径
      location / {
      root /home/ruoyi;
      try_files $uri $uri/ /index.html;
      index index.html index.htm;
      }

      # 监听请求静态资源路径
      location /prod-api/ {
      #nginx的主机地址
      proxy_set_header Host $http_host;

      #用户端真实的IP,即客户端IP
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

      # 配置代理服务器, 这里 如果是本机就直接使用 http://localhost:port,如果不是就是用目标服务器的 ip + 端口。
      proxy_pass http://localhost:8080/;
      }

      error_page 500 502 503 504 /50x.html;
      location = /50x.html {
      root html;
      }
      }
    • 刷新 nginx 配置文件

      1
      2
      3
      4
      5
      [root@VM-0-9-centos conf.d]# /usr/sbin/nginx -t 
      nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
      nginx: configuration file /etc/nginx/nginx.conf test is successful
      [root@VM-0-9-centos conf.d]# /usr/sbin/nginx -s reload
      [root@VM-0-9-centos conf.d]#
    • server1 :开放防火墙端口,刷新配置。

      如果为 阿里云 或者 腾讯云 需要配置安全组规则。例如:阿里云-配置安全组规则

      1
      2
      3
      4
      5
      [root@VM-0-9-centos images]# firewall-cmd --zone=public --add-port=8003/tcp --permanent # 开放8003端口
      success
      [root@VM-0-9-centos images]# firewall-cmd --reload # 刷新防火墙配置
      success
      [root@VM-0-9-centos images]#
  3. server2 :修改 ruoyi-admin.jar 中的连接信息,并使其生效。

    • 通过压缩工具打开jar包,可以通过 360压缩 或者 7z 打开

      image-20230511163533665

    • 修改 BOOT-INF\classes 文件下 application-druid.yml 文件中的 数据库连接信息

      关于Linux下的MySQL安装可以参考我的博客 《Linux-Shell-MySQL

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      # 数据源配置
      spring:
      datasource:
      type: com.alibaba.druid.pool.DruidDataSource
      driverClassName: com.mysql.cj.jdbc.Driver
      druid:
      # 主库数据源
      master:
      url: jdbc:mysql://server:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
      username: root
      password: P@ssw0rd
      ......
    • 修改 BOOT-INF\classes 文件下 application.yml 文件中的 Redis 连接信息

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      # redis 配置
      redis:
      # 地址
      host: server
      # 端口,默认为6379
      port: 6379
      # 数据库索引
      database: 0
      # 密码
      password:
      # 连接超时时间
      timeout: 10s
      lettuce:
      pool:
      # 连接池中的最小空闲连接
      min-idle: 0
      # 连接池中的最大空闲连接
      max-idle: 8
      # 连接池的最大数据库连接数
      max-active: 8
      # #连接池最大阻塞等待时间(使用负值表示没有限制)
      max-wait: -1ms
    • 创建 ry 数据库

      1
      2
      # 创建 ruoyi 数据库 jdbc:mysql://server:3306/ry
      CREATE DATABASE `ry` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
    • 将百度网盘中的 ry_20230223.sql 文件导入 ry 数据库中

      image-20230512010835821

    • 上传至 /home/ruoyi 盘符

      image-20230512011020342

    • 启动项目

      1
      2
      [root@VM-24-4-centos ruoyi]# java -jar ruoyi-admin.jar &
      [1] 6556
    • 查看日志

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      [root@VM-24-4-centos ruoyi]# tail -f nohup.out 
      ..............
      00:21:26.908 [main] INFO c.r.RuoYiApplication - [logStarted,61] - Started RuoYiApplication in 28.295 seconds (JVM running for 29.96)
      (♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙
      .-------. ____ __
      | _ _ \ \ \ / /
      | ( ' ) | \ _. / '
      |(_ o _) / _( )_ .'
      | (_,_).' __ ___(_ o _)'
      | |\ \ | || |(_,_)'
      | | \ `' /| `-' /
      | | \ / \ /
      ''-' `'-' `-..-'
    • 如果为 阿里云 或者 腾讯云 需要配置安全组规则。例如:阿里云-配置安全组规则

      1
      2
      3
      4
      5
      [root@VM-24-4-centos ruoyi]# firewall-cmd --zone=public --add-port=8080/tcp --permanent # 开放8080端口
      success
      [root@VM-24-4-centos ruoyi]# firewall-cmd --reload # 刷新防火墙配置
      success
      [root@VM-24-4-centos ruoyi]#
  4. server1 :通过 crul 命令是否可以访问该端口

    1
    2
    [root@VM-0-9-centos home]# curl http://server2:8080/
    欢迎使用RuoYi后台管理框架,当前版本:v3.8.5,请通过前端地址访问。
  5. 客户端进行访问

    image-20230512011246341

5. 参考博文

什么是NGINX的动静分离;什么是负载均衡