使用nginx配置https需要使用到证书,可以去阿里云申请免费的https证书,有效期一年,一年过后可以再次申请。这里记录下如何使用Docker Nginx配置Springboot应用实现https。

证书文件

在阿里云申请证书后,下载对应的Nginx证书,如下文件

3808462__mxblog.com.cn.key
3808462__mxblog.com.cn.pem

下载Nginx

//下载nginx镜像
docker pull nginx
//启动nginx镜像
docker run --name mynginx -p 80:80 -idt nginx:latest

启动后,我们可以通过浏览器访问 当前IP+80端口号,验证ngnix,如下图。

修改nginx配置文件,支持https

nginx成功启动后,我们可以针对nginx的配置文件进行修改以支持https协议。

可以使用宿主机挂载nginx的方式进行启动nginx服务器。

//复制nginx配置文件到宿主机/home/admin/nginx/目录
docker cp mynginx:/etc/nginx/nginx.conf /home/admin/nginx/
docker cp mynginx:/etc/nginx/conf.d /home/admin/nginx/

创建cert目录,存放上述下载的证书文件。最终目录如下:

然后进行关键的一步,修改nginx.conf文件内容,配置如下:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
<!--配置ssl,开启https配置-->
server {
    <!--确保对应的ecs开启443监听端口-->
    listen 443 ssl;
    <!--域名-->
    server_name  mxblog.com.cn www.mxblog.com.cn;

    client_max_body_size 4M;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

   <!--开启ssl配置-->
    ssl on;
    root html;
    index index.html index.htm;
    <!--证书文件-->
    ssl_certificate /etc/nginx/cert/3808462__mxblog.com.cn.pem;
    ssl_certificate_key  /etc/nginx/cert/3808462__mxblog.com.cn.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

   location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        <!--反向代理 对应的springboot应用地址-->
        proxy_pass http://127.0.0.1:7001/;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
server {
    listen       80;
    server_name  mxblog.com.cn www.mxblog.com.cn;
    add_header Strict-Transport-Security max-age=15768000;
    <!--访问http地址强制跳转https地址-->
    return 301 https://$host$request_uri;
    }
}

上述配置文件已经注释很清楚了,可以按照上述配置修改自己所对应的信息。域名、证书、反向代理地址、强制跳转等。

启动nginx

上述配置文件修改后,就可以启动nginx服务器进行验证了,启动之前首先要确保 springboot应用可以正常访问,也就是上述配置文件中的 127.0.0.1:7001对应的应用页面是可以正常打开的。

使用如下docker脚本进行启动nginx

docker run -d \
-p 80:80 -p 443:443 \
--name nginx \
-v /home/admin/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /home/admin/nginx/conf.d:/etc/nginx/conf.d \
-v /home/admin/nginx/logs:/var/log/nginx \
-v /home/admin/nginx/cert:/etc/nginx/cert \
nginx:latest

稍加解释下脚本内容

-p 80:80 443:443 启动增加端口映射,这里需要映射80和443端口
--name 给nginx容器起一个名字
--v 挂载宿主机文件

这里挂载的文件都是上述准备好配置文件,nginx.conf、conf.d、cert、logs。日志目录,可以自行创建。

通过上述命令启动后,就可以使用对应的域名,进行https访问了。如下图