乐趣区

使用nginx-docker镜像部署服务器配置https附带java后端部署例子

背景

- 需求 https,已有备案通过域名
- 腾讯云服务器,所以从腾讯云上申请了免费的 https 证书(阿里云服务器上阿里云申请)- 服务器安全组打开 443 端口
- 纯 docker 部署(nginx、java 后端)- 服务器上准备好 nginx 镜像:docker pull nginx
- 使用 docker-compose 编排

步骤

域名解析至目标服务器,在目标服务器新增目录nginx-config,用于存放 nginx 配置文件。

下载 https 证书,它有多种部署方案的证书选择(Apache、IIS、Nginx、Tomcat),将 Nginx 使用的证书储存至目标服务器 nginx-config 目录下,它包含两个文件:

1_[这里是你的域名].top_bundle.crt
2_[这里是你的域名].key

nginx-config 目录下新建文件:

docker-compose.yml
service.conf

当前服务器 nginx-config 目录结构:

/root/nginx-config/docker-compose.yml
/root/nginx-config/service.conf
/root/nginx-config/1_[这里是你的域名]_bundle.crt
/root/nginx-config/2_[这里是你的域名].key

修改 docker-compose.yml,完整代码:

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - 443:443
    volumes:
      - "/root/nginx-config/service.conf:/etc/nginx/conf.d/service.conf"
      - "/root/nginx-config/1_[这里是你的域名]_bundle.crt:/etc/nginx/1_[这里是你的域名]_bundle.crt"
      - "/root/nginx-config/2_[这里是你的域名].key:/etc/nginx/2_[这里是你的域名].key"
  java:
    image: java:8
    ports:
      - 8088:8088
    volumes: 
      - "/root/java/[java 打包后的 jar 包].jar:/root/java/[java 打包后的 jar 包].jar"
    command: ["java", "-jar", "/root/java/java 打包后的 jar 包.jar"]

docker-compose.yml 解读

两个 docker 镜像

nginx:
    image: nginx:latest
    
java:
    image: java:8

nginx 使用 443 端口。左边为宿主机端口,右边为容器端口。https 使用的是 443 端口,http 使用的是 80 端口

java 服务使用 8088 端口

ports:
  - 443:443
  
  
ports:
  - 8088:8088

挂载文件至容器。nginx 配置文件和 java 配置文件分别挂载至对应的容器下。

volumes:
      - "/root/nginx-config/service.conf:/etc/nginx/conf.d/service.conf"
      - "/root/nginx-config/1_[这里是你的域名]_bundle.crt:/etc/nginx/1_[这里是你的域名]_bundle.crt"
      - "/root/nginx-config/2_[这里是你的域名].key:/etc/nginx/2_[这里是你的域名].key"
      
      
      
volumes: 
      - "/root/java/[java 打包后的 jar 包].jar:/root/java/[java 打包后的 jar 包].jar"

commond,在容器内执行的 shell 命令。这里为启动服务。

command: ["java", "-jar", "/root/java/java 打包后的 jar 包.jar"]

修改 service.conf:

upstream javaserver {server [宿主机内网 ip]:[后端 java 服务 docker 容器的端口];
}

server {
    listen         443 ssl;
    server_name   [这里是你的域名];

    ssl_certificate      1_[这里是你的域名]_bundle.crt; # https 的证书文件路径
    ssl_certificate_key  2_[这里是你的域名].key; # https 的证书文件路径
    ssl_session_timeout  5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    # 这里是腾讯云的配置,阿里云的 ssl_ciphers 请上阿里云查看
    ssl_prefer_server_ciphers on;

    location /api {
        # 接口前缀为 /api 开头的,全部转发至 java 后端服务,可以配置多个 location
        proxy_pass http://javaserver;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {root   /usr/share/nginx/html;}
}

启动服务:

进入 docker-compose.yml 所在目录
$ cd ngixn-config

前台启动,可以看到 log:$ docker-compose up

后台启动:$ docker-compose up -d

关闭服务:$ docker-compose down

附:

从本地上传文件至服务器命令:

scp -r [本地文件路径][服务器登录名]@[服务器公网 IP]:[服务器路径]

例子:

scp -r /Users/lnxbyu/JsProject/docker-compose.yml root@188.88.88.88:/root/nginx-config/docker-compose.yml

欢迎纠错。

退出移动版