整个部署过程使用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)配置
- 首先需要给要配置ssl证书的域名申请ssl证书,二级域名一级域名都可以。
- 下载申请好的准备作为访问前端的域名证书(nginx版本的)放在对应的文件夹中,我这里的是
/root/nginx/cert
因为在编写docker-compose.yml文件时这个文件夹是作为证书文件夹映射到nginx容器中的,名字和路径可以自己定义,做好对应就行了。 - 编写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)配置
- 编写配置文件以及java代码
首先去申请证书的地方下载JKS证书包 将.jks
文件放在resources文件夹(名字可修改)下
在配置文件(application.yml)中添加配置,密码在另一个文件中
2. 在启动类下方编写代码
@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;
}
- 将后台使用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反向代理到不同的端口号