部署SpringBoot项目(jar+nginx+fastdfs)

部署SpringBoot项目(jar+nginx+fastdfs)

1、依赖/使用的程序软件

  • mysql:数据存储服务器
  • nginx:反向代理,用于访问图片
  • fastDFS:分布式上传下载图片
  • docker:提供容器服务

2、操作

(1)MySQL

  • 使用docker安装MySQL,服务器无需安装MySQL
  1. 搜索mysql容器

    docker search mysql
    

在这里插入图片描述

  1. 拉取mysql

    docker pull mysql
    

在这里插入图片描述

  1. 查看mysql镜像

    docker images
    

部署SpringBoot项目(jar+nginx+fastdfs)_第1张图片
mysql镜像已经下载好

  1. 启动mysql服务
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=xxxx -d mysql:latest
  • --name:指定一个容器的名字,后续可以用这个名字进行一些操作
  • -p:将容器的3306端口映射到docker宿主机的3306端口
  • -e:设置参数的值,这里MYSQL_ROOT_PASSWORD是设置MySQLroot用户的密码
  • -d:指定启动哪个镜像
# 查看mysql是否启动成功
docker ps

在这里插入图片描述
已经启动成功

  1. 连接mysql

    docker exec -it mysql bash
    

    使用上述命令进入容器中,连接mysql

    mysql -u root -p xxx
    

部署SpringBoot项目(jar+nginx+fastdfs)_第2张图片

mysql连接成功,说明mysql已经配置好了。想要操作mysql就需要进入到docker已经开启的mysql容器中进行操作

  1. 关闭/重启mysql
docker stop mysql  # 关闭mysql
docker start mysql # 开启mysql
docker restart mysql # 重启mysql
docker ps          # 查看正在运行的容器
docker ps -a       # 包括未运行的容器

C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20201103165106697.png
在这里插入图片描述

(2)fastDFS和nginx

nginx和fastDFS需要一起使用

  • 所有安装包

    • libfastcommonV1.0.7.tar.gz:fastDFS依赖程序

    • FastDFS_v5.05.tar.gz:fastDFS安装包

    • fastdfs-nginx-module_v1.16.tar.gz:nginx和fastdfs的桥梁插件模块

    • nginx-1.8.1.tar.gz:nginx安装包

在这里插入图片描述

  • 安装过程

    1. 安装编译环境

      apt install gcc g++
      
    2. 安装libfastcommon

      cd /usr/local/package  # /usr/local/package存放安装包
      tar -xzf libfastcommonV1.0.7.tar.gz
      cd libfastcommon-1.0.7
      ./make.sh
      ./make.sh install
      cp /usr/lib64/libfastcommon.so /usr/lib
      
    3. 创建fastDFS数据存储的目录

      mkdir -p /usr/local/apps/fastDFS/tracker   # fastDFS跟踪器数据目录
      mkdir -p /usr/local/apps/fastDFS/storage   # fastDFS存储节点数据目录
      mkdir -p /usr/local/apps/fastDFS/client
      
    4. 安装fastDFS

      cd /usr/local/package
      tar -zxf FastDFS_v5.05.tar.gz
      cd FastDFS
      ./make.sh
      ./make.sh install
      cd conf
      cp * /etc/fdfs
      
    5. 配置fastDFStracker节点

      vim /etc/fdfs/tracker.conf
      base_path=/usr/local/apps/fastDFS/tracker/  # 设置此变量,就是刚才创建的目录
      
    6. 启动tracker节点

      /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
      

      此时可以看到tracker跟踪器节点已经启动:

      在这里插入图片描述

    7. 配置storage节点

      vim /etc/fdfs/storage.conf
      base_path=/usr/local/apps/fastDFS/storage/
      store_path0=/usr/local/apps/fastDFS/storage/
      tracker_server=172.16.49.5:22122  # 服务器需要改为公网ip
      
    8. 启动storage节点

      /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
      

      此时可以看到storage存储节点已经启动
      在这里插入图片描述

    9. 测试fastDFS

      1. 从编译完的FastDFS目录(/usr/local/package/FastDFS/)复制libfastclient.so/usr/lib目录

        cd /usr/local/package/FastDFS
        cp libfastclient.so /usr/lib
        
      2. 修改测试的配置文件

        vim /etc/fdfs/client.conf
        base_path=/usr/local/apps/fastDFS/client
        tracker_server=172.16.49.5:22122  # 和上诉设置得一样
        
      3. 开始测试上传

        echo hello > test.txt  # 新建一个测试文件
        /usr/bin/fdfs_test /etc/fdfs/client.conf upload test.txt  #上传文件
        

        可以看到文件已经上传成功了:

        部署SpringBoot项目(jar+nginx+fastdfs)_第3张图片
        进入到M00/00/00/rBAxBV-hInOARQxgAAAABncc3SA130_big.txt目录中去看一下文件是否存在,数据目录就是前面设置的/usr/local/apps/fastDFS/storage
        在这里插入图片描述
        文件存在。

    10. 安装nginx需要的依赖包

      sudo apt-get install openssl libssl-dev  # openssl
      sudo apt-get install libpcre3 libpcre3-dev # pcre
      sudo apt-get install zlib1g-dev # zlib
      
    11. 解压fastdfs-nginx-module_v1.16.tar.gz

      cd /usr/local/package 
      tar -zxf fastdfs-nginx-module_v1.16.tar.gz
      
    12. 修改fastdfs-nginx-module的配置文件

      cd fastdfs-nginx-module/src/
      vim config
      

    在这里插入图片描述

    修改图中的两个变量。
    
    1. 复制fastdfs-nginx-module/src/mod_fastdfs.conf/etc/fdfs目录下,并编辑

      vim /etc/fdfs/mod_fastdfs.conf
      
      tracker_server=172.16.49.5:22122  # 和上述ip一样
      url_have_group_name=true
      storage_server_port=23000
      group_name=group1
      store_path0=/usr/local/apps/fastDFS/storage
      
    2. 安装nginx

      cd /usr/local/package
      tar -xvf nginx-1.8.1.tar.gz
      cd nginx-1.8.1
      ./configure --add-module=/usr/local/package/fastdfs-nginx-module/src/
      make
      make install
      

      在make的时候可能出现的问题

      • 把警告当错误处理

        src/core/ngx_murmurhash.c: In function ‘ngx_murmur_hash2’:
        src/core/ngx_murmurhash.c:37:11: error: this statement may fall through [-Werror=implicit-fallthrough=]
                 h ^= data[2] << 16;
                 ~~^~~~~~~~~~~~~~~~
        src/core/ngx_murmurhash.c:38:5: note: here
             case 2:
             ^~~~
        src/core/ngx_murmurhash.c:39:11: error: this statement may fall through [-Werror=implicit-fallthrough=]
                 h ^= data[1] << 8;
                 ~~^~~~~~~~~~~~~~~
        src/core/ngx_murmurhash.c:40:5: note: here
             case 1:
             ^~~~
        

        /usr/local/apps/nginx-1.8.1/objs/Makefile中的CFLAGS中的-Werror去掉

      • 编译错误

        src/os/unix/ngx_user.c: 在函数‘ngx_libc_crypt’中:
        src/os/unix/ngx_user.c:36:7: 错误:‘struct crypt_data’没有名为‘current_salt’的成员
        cd.current_salt[0] = ~salt[0];
        

        /usr/local/apps/nginx-1.8.1/os/unix/ngx_user.c中报错这句话注释掉:
        在这里插入图片描述

    3. 配置nginx访问fastdfs的文件资源

      cd /usr/local/nginx/conf
      vim nginx.conf
      
      server {
      	listen       80;
      	server_name  localhost;
      	location ~ /group[0-9]/ {
                  ngx_fastdfs_module;
          }
      }
      
    4. 启动nginx

      /usr/local/nginx/sbin/nginx
      
    5. 测试nginxfastdfs整合的效果

      找到之前上传的文件其返回的图片路径:
      部署SpringBoot项目(jar+nginx+fastdfs)_第4张图片

      浏览器输入:http://xxx.xx.xx.x/group1/M00/00/00/rBAxBV-hInOARQxgAAAABncc3SA130_big.txt

      效果如下:
      部署SpringBoot项目(jar+nginx+fastdfs)_第5张图片

      至此nginxfastdfs的安装和整合就成功了

(3)SpringBoot和nginx的整合

  1. 运行SpringBoot项目

    java -jar background-system-0.0.1-SNAPSHOT.jar --server.port=8899
    

    指定一下项目监听的端口为8899,因为nginx监听的端口是80,所以这里需要设置为其他的端口

  • 如果部署项目是在XShell上部署的,则在退出XShell的时候项目会自动关闭。可以使用下面的命令在退出XShell的时候也运行。
 nohup java -jar background-system-0.0.1-SNAPSHOT.jar --server.port=8899 >log.txt &

&:表示后台运行。可使用jobs查看后台运行程序,fg [id]调到前台运行
>log.txt:表示将输出信息重定向到log.txt文件中
nohup:意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行,当用nohup命令执行作业时,缺省情况下该作业的所有输出被重定向nohup.out的文件中,除非另外指定了输出文件。
2. 配置nginx

vim /etc/local/nginx/conf/nginx.conf

部署SpringBoot项目(jar+nginx+fastdfs)_第6张图片

配置nginx的转发,将nginx80端口收到的请求转发到服务器的其他端口的程序上去。

  1. 此时直接使用80端口访问项目也能访问到以8899端口运行的SpringBoot项目了

(4)SpringBoot和fastDFS整合

  1. 添加fastDFS依赖

    
    <dependency>
        <groupId>com.luhuiguogroupId>
        <artifactId>fastdfs-spring-boot-starterartifactId>
        <version>0.2.0version>
    dependency>
    
  2. 添加配置

    fdfs:
      # 连接Tracker服务器超时时间
      connect-timeout: 10000
      # storage服务器响应的超时时间
      so-timeout: 3000
      #  trakcer服务器的数量
      tracker-list:
      - 120.78.223.0:22122
    
      pool:
        # 连接池最大数量
        max-total: 200
        # 每个tracker地址的最大连接数
        max-total-per-key: 50
        # 连接耗尽时等待获取连接的最大毫秒数
        max-wait-millis: 5000
    
  3. 编写Controller

    /**
     * 用于上传资源
     */
    @Controller
    @RequestMapping("/upload")
    public class UploadController {
    
        @Autowired
        private FastFileStorageClient storageClient;
    
        @ResponseBody
        @RequestMapping("uploadImages")
        public String uploadsImages(HttpServletRequest request, @RequestParam(value = "editormd-image-file", required = false) MultipartFile myFile, Map<String,Object> map){
            if(myFile.isEmpty()){
                map.put("success",0);
                map.put("message","上传失败");
                map.put("url","null");
                return JSON.toJSONString(map);
            }
            // myFile.getOriginalFilename():取到文件的名字
            // FilenameUtils.getExtension(""):取到一个文件的后缀名
            String extension = FilenameUtils.getExtension(myFile.getOriginalFilename());
    
            // group1:指storage服务器的组名
            // myFile.getInputStream():指这个文件中的输入流
            // myFile.getSize():文件的大小
            // 这一行是通过storageClient将文件传到storage容器
            StorePath uploadFile = null;
            try {
                uploadFile = storageClient.uploadFile("group1", myFile.getInputStream(), myFile.getSize(), extension);
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            // 返回它在storage容器的的路径
            String fullUrl = "http://xx.xx.xx.xx/" + uploadFile.getFullPath();
            System.out.println(fullUrl);
            map.put("success",1);
            map.put("message","上传成功");
            map.put("url",fullUrl);
            return JSON.toJSONString(map);
        }
    
    
    }
    

3、其他

(1)添加nginx.shfastdfs.sh文件

  • 作用

    由于都是源码安装,fastdfsnginx的启动不太方便,所以编写两个脚本文件方便这两个程序的启动和关闭,并且方便调试的时候重启。这两个文件全部放在**/usr/bin**目录下,方便直接访问

  • 使用

    fastdfs.sh start/stop/restart  # 开启、停止、重启fastdfs
    nginx.sh start/stop/restart   # 开启、停止、重启nginx
    
  • 内容

    ## fastdfs.sh
    #!/bin/bash
    
    cmd=$1
    
    if [ ! $cmd ]
    then
        echo "Please use: fastdfs < start | stop | restart >"
        exit
    fi
    
    
    function stop_fastdfs(){
        local tracker_pid=`ps aux | grep tracker | awk '$11 ~ /tracker/ {print $2}'`
        local storage_pid=`ps aux | grep storage | awk '$11 ~ /storage/ {print $2}'`
        if [ $storage_pid ]
        then
            kill $storage_pid
            if [ $? -eq 0 ]
            then
                echo "stop storage success!"
            else
                echo "stop storage faild!"
                return -1
            fi
        else
            echo "storage is stoped!"
        fi
        if [ $tracker_pid ]
        then
            kill $tracker_pid
            if [ $? -eq 0 ]
            then
                echo "stop tracker success!"
            else
                echo "stop tracker failed!"
                return -2
            fi
        else
            echo "tracker is stoped!"
        fi
        return 0
    }
    function start_fastdfs(){
        local tracker_pid=`ps aux | grep tracker | awk '$11 ~ /tracker/ {print $2}'`
        local storage_pid=`ps aux | grep storage | awk '$11 ~ /storage/ {print $2}'`
        if [ ! $tracker_pid ]
        then
            /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
            if [ $? -eq 0 ]
            then 
                echo "start tracker success"
            else
                echo "start tracker failed"
                return -1
            fi
        else
            echo "tracker is running!"
        fi
        if [ ! $storage_pid ] 
        then
            /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
            if [ $? -eq 0 ]
            then
                echo "start storage success"
            else
                echo "start storage failed"
                return -2
            fi
        else
            echo "storage is running!"
        fi
        return 0
    }
    
    function exec_status(){
        if [ $1 -eq 0 ]
        then
            echo "$2 fastdfs success!"
        else
            echo "$2 fastdfs failed!"
        fi
    
    }
    if [ $cmd = "start" ]
    then
        start_fastdfs
        exec_status $? "start"
    
    elif [ $cmd = "stop" ]
    then
        stop_fastdfs
        exec_status $? "stop"
    elif [ $cmd = "restart" ]
    then
        stop_fastdfs
        if [ $? -ne 0 ]
        then
            echo "stop fastdfs error,exit."
            exit
        fi
        start_fastdfs
        if [ $? -ne 0 ]
        then
            echo "start fastdfs error,.exit:"
            exit
        fi
        echo "restart fastdfs ok!"
    else
        echo "nothing to do"
    fi
    
    
    ## nginx.sh
    #!/bin/bash
    
    nginx_pid=`ps aux | grep nginx | awk '$12 ~ /master/ {print $2}'`
    cmd=$1
    
    if [ ! $cmd ]
    then 
        echo "Plase use:  nginx.sh < start | stop | restart >."
        exit
    fi
    
    if [ $cmd = "start" ]
    then
        if [ $nginx_pid ] 
        then
            echo "nginx is running, pid is `$nginx_pid`"
            exit
        fi
        /usr/local/nginx/sbin/nginx
        if [ $? -ne 0 ]
        then 
            echo "start nginx faild"
            exit
        else
            echo "start nginx success!"
            exit
        fi
    elif [ $cmd = "stop" ]
    then
        if [ $nginx_pid ] 
        then
            kill $nginx_pid
            if [ $? -eq 0 ]
            then
                echo "stop nginx success!"
                exit
            else
                echo "stop nginx failed"
                exit
            fi
        else
            echo "nginx is stoped, not to stop it"
            exit
        fi
    elif [ $cmd = "restart" ]
    then
        if [ $nginx_pid ]
        then
            kill $nginx_pid
            if [ $? -eq 0 ]
            then
                echo "stop nginx server"
            else
                echo "stop nginx server faild"
                exit
            fi
        fi
        /usr/local/nginx/sbin/nginx
            if [ $? -eq 0 ]
            then
                echo "start nginx server"
            else
                echo "start nginx server failed"
                exit
            fi
    else
        echo "Plase use:  nginx.sh < start | stop | restart >."
    fi
    
    

4、总结

  • 之前开发SpringBoot项目上传图片一直有问题,突然看到FastDFS可以用于上传下载图片
  • 花费了一天的时间将FastDFS整合到我的项目中去,同时将nginx也和SpringBoot项目整合在一起
  • 之前使用FastDFS是准备用docker容器搭建,最开始使用的是season/fastdfs,但是这个镜像没有整合nginx,所以换了另一个镜像delron/fastdfs,这个虽然整合了nginx,但是只要一重启storage节点就失败,查看容器日志发现一直缺了一个storaged.log文件,重启的时候会自动把这个文件删除,然后启动失败。试了很久发现不能用之后,只有不用docker进行安装。

你可能感兴趣的:(Java,操作系统,docker,linux,mysql,java,fastdfs)