整个部署过程使用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证书,二级域名一级域名都可以。
  2. springboot使用jsch springboot jks_springboot使用jsch

  3. 下载申请好的准备作为访问前端的域名证书(nginx版本的)放在对应的文件夹中,我这里的是/root/nginx/cert因为在编写docker-compose.yml文件时这个文件夹是作为证书文件夹映射到nginx容器中的,名字和路径可以自己定义,做好对应就行了。
  4. 编写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)中添加配置,密码在另一个文件中

springboot使用jsch springboot jks_springboot使用jsch_02


2. 在启动类下方编写代码

springboot使用jsch springboot jks_vue.js_03

@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反向代理到不同的端口号