Docker-compose部署vue+springboot项目配置ssl证书

整个部署过程使用docker-compose容器编排实现

已经部署成功!
博客地址:我的博客

1. 编排整个项目环境

docker-compose.yml

mysql:sql_mode修改

nginx:文件同步,名字和路径可以自己命名,自己要记得就行

version: "3"
services:
  nginx: # 服务名称,用户自定义
    image: nginx:latest  # 镜像版本
    ports:
      - "80:80"
      - "443:443"
    volumes: # 挂载
      - /root/nginx/cert:/root/nginx/cert # 证书目录
      - /root/nginx/html:/usr/share/nginx/html # 前端代码
      - /root/nginx/nginx.conf:/etc/nginx/nginx.conf # 配置文件
    privileged: true # 这个必须要,解决nginx的文件调用的权限问题
  mysql:
    restart: always
    image: mysql:5.7.19
    ports:
       - 3306:3306
    environment: # 指定用户root的密码
       - MYSQL_ROOT_PASSWORD=sunjun
    command:
       --sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  redis:
    image: redis:latest
  know:
    image: know:latest
    build: . # 表示以当前目录下的Dockerfile开始构建镜像
    ports:
      - 8087:8087 # 这是后端https的端口
      - 8086:8086 # 这是后端http的端口
    depends_on: # 依赖与mysql、redis,其实可以不填,默认已经表示可以
      - mysql
      - redis

2. Dockerfile文件编写

运行springboot项目

FROM java:8

EXPOSE 8087

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo ‘Asia/Shanghai’ >/etc/timezone

ADD know-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java", "-jar", "/app.jar", "--spring.profiles.active=dev"]

3. nginx配置文件编写(重点)

1. 前端(vue)配置
  1. 首先需要给要配置ssl证书的域名申请ssl证书,二级域名一级域名都可以。
    Docker-compose部署vue+springboot项目配置ssl证书_第1张图片

  2. 下载申请好的准备作为访问前端的域名证书(nginx版本的)放在对应的文件夹中,我这里的是/root/nginx/cert因为在编写docker-compose.yml文件时这个文件夹是作为证书文件夹映射到nginx容器中的,名字和路径可以自己定义,做好对应就行了。

    Docker-compose部署vue+springboot项目配置ssl证书_第2张图片

  3. 编写nginx配置文件我的放在/root/nginx/nginx.conf在编写docker-compose.yml作为配置文件映射到nginx容器中的。

    #user  root;
    worker_processes  1;
    events {
      worker_connections  1024;
    }
    http {
      include       mime.types;
      default_type  application/octet-stream;
      sendfile        on;
      keepalive_timeout  65;
      server {
          listen	  80;
          server_name domain_name; # domain_name是你的访问前端的域名
          rewrite ^(.*)$ https://$host$1 permanent; # 当访问80端口时是http请求重定向到https
      }
      server {
          # SSL 访问端口
          listen      443 ssl;
          # 绑定证书域名
          server_name  domain_name; # domain_name是你的访问前端的域名
          # 证书文件
          ssl_certificate     /root/nginx/cert/domain_nam.pem; # 注意! 这里是映射到容器内部的证书文件夹,文件名可以自定 后缀要注意!!!
          # 私钥文件
          ssl_certificate_key /root/nginx/cert/domain_nam.key; # 注意! 这里是映射到容器内部的证书文件夹,文件名可以自定 后缀要注意!!!
          ssl_session_timeout 5m;
          # 配置协议
          ssl_protocols       TLSv1.2 TLSv1.3;
          #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
          ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
          ssl_prefer_server_ciphers on;
          location / {
              root   /usr/share/nginx/html; # 静态文件地址 也是映射到容器内部的文件夹地址
              try_files $uri $uri/ /index.html last; # 别忘了这个哈
              index  index.html index.htm;
          }
      }
    }
    
2.后端(springboot)配置
  1. 编写配置文件以及java代码

    首先去申请证书的地方下载JKS证书包 将.jks文件放在resources文件夹(名字可修改)下

    在配置文件(application.yml)中添加配置,密码在另一个文件中

Docker-compose部署vue+springboot项目配置ssl证书_第3张图片
2. 在启动类下方编写代码

Docker-compose部署vue+springboot项目配置ssl证书_第4张图片

@Value("${server.port}")
Integer port;

@Bean
public ServletWebServerFactory servletContainer() {
  TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory () {
    @Override
    protected void postProcessContext(Context context) {
      SecurityConstraint constraint = new SecurityConstraint();
      constraint.setUserConstraint("CONFIDENTIAL");
      SecurityCollection collection = new SecurityCollection();
      collection.addPattern("/*");
      constraint.addCollection(collection);
      context.addConstraint(constraint);
    }
  };
  tomcat.addAdditionalTomcatConnectors(httpConnector());
  return tomcat;
}

@Bean
public Connector httpConnector() {
  Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
  connector.setScheme("http");
  // Connector监听的http的端口号
  connector.setPort(8086); // 这是http端口
  connector.setSecure(false);
  // 监听到http的端口号后转向到的https的端口号
  connector.setRedirectPort(port); // 这是 https 端口 也就是项目的端口号
  return connector;
}
  1. 将后台使用nginx反向代理

    下载后端访问域名的nginx证书,与前端类似 直接把这段放在和前端同级位置

    server {
      listen 80;
      server_name domain_name; # domain_name 是访问后台的域名
      rewrite ^(.*)$ https://$host$1 permanent; # 访问http重定向到https
    }
    server {
      # 访问端口
      listen      443;
      # 绑定证书域名
      server_name  domain_name; # domain_name 是访问后台的域名
      # 证书文件
      ssl_certificate     /root/nginx/cert/api-know.sjun7.com.pem; # 注意! 这里是映射到容器内部的证书文件夹,文件名可以自定 后缀要注意!!!
      # 私钥文件
      ssl_certificate_key /root/nginx/cert/api-know.sjun7.com.key; # 注意! 这里是映射到容器内部的证书文件夹,文件名可以自定 后缀要注意!!!
    
      location / {
        proxy_pass https://domain_name:8087/;   # 这里通过反向代理把后端访问的端口映射到二级域名上            
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;               
        proxy_set_header X-Forwarded-Proto $scheme;               
        proxy_set_header X-Forwarded-Port $server_port;
    	}
    }
    

注意所有的域名或二级域名映射的都是服务器地址,只是会通过nginx反向代理到不同的端口号

你可能感兴趣的:(docker,vue.js,spring,boot,ssl)