背景 docker-compose 安装了 基于http 的应用如:nginx,tomcat,mysql,redis 等 如何使用基于https的访问请求地址呢?
此篇博客基于nginx 配置https 访问tomat应用, 如基于:tomcat ,Apache ,IIS等配置 后续再说
一,需要ssl证书
正常企业及个人版需要购买,如是有阿里ECS服务器可以免费购买1个域名的https 证书 如何申请阿里云免费SSL证书?官网引导地址
安装步骤申请购买后,验证通过 则可以下载证书进行使用 ,我们下载对应nginx的证书包括:xxx.xx.xx.key ,xxx.xx.xx.pem
二,配置证书
1,拷贝证书文件到服务器 宿主机 中nginx 的conf用于容器挂载的文件加下: conf/nginx/cert 文件下 注意:conf为docer-compose 应用的配置总目录.
2,修改用于nginx容器挂在的 conf.d/default.conf 文件 配置443 和证书文件地址(注意地址并非是宿主机文件地址,而是容器中映射挂载后的容器配置地址)
应用的监听的配置:
server {
listen 80;
server_name www.xx.abcxx.cn xx.abcxx.cn;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
client_max_body_size 100m;
proxy_pass http://tomcatcluster$request_uri;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header MY-Proxy 'outer';
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-HTTPS "on";
}
}
接着下面配置443
server {
listen 443 ssl; # 这个是https访问的端口
server_name www.xx.abcxx.cn xx.abcxx.cn;
#增加ssl
# ssl on; # 如果强制HTTPs访问,这行要打开
# root html;
# index index.html index.htm;
ssl_certificate /etc/nginx/cert/123_xx.abcxx.cn.pem; # 注意此地址为docker-compose 中nginx cert挂在后的目录
ssl_certificate_key /etc/nginx/cert/123_xx.abcxx.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; # 指定密码为openssl支持的格式
ssl_prefer_server_ciphers on; # 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
client_max_body_size 100m;
# proxy_http_version 1.1;
server_name_in_redirect off;
proxy_pass http://tomcatcluster$request_uri;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header MY-Proxy 'outer';
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-HTTPS "on";
}
}
3,修改docker-compose.yml 中的nginx代理 映射443端口
nginx:
image: nginx:latest
container_name: shop_nginx
links:
- tomcat01
- tomcat02
ports:
- 443:443 # ssl 默认是443端口,因此需要将443端口映射到宿主机上
- 80:80
volumes:
- ./conf/nginx/conf:/etc/nginx
- ./conf/nginx/logs:/var/log/nginx
- ./conf/nginx/www:/usr/share/nginx/www
- ./conf/nginx/html:/usr/share/nginx/html
- ./conf/nginx/cert:/etc/nginx/cert:ro # 注意/etc/nginx/cert这个地址就是nginx中证书地址
修改了docker-compose.yml后 需要重新启动
docker-compose down # 1先停止
docker-compose up -d # 2启动
docker-compose ps # 查看nginx 是否启动成功
成功后 浏览器输入:https://www.xx.abcxx.cn 查看能否访问tomcat中的应用
四 重点
配置过程中可能会遇到:
1) Stoping nginx... nginx: [emerg] BIO_new_file("/usr/local/nginx/conf/cert/xxxxxxxxxxx.pem") faile
证书挂在目录不对/或nginx 配置文件中 证书地址不是容器中nginx挂载后的容器配置地址(须注意,与常规配置地址不同),会导致此问题
2,证书路径正确 按读取正式失败:(注意意义对应,请勿将xxx.pem 配到ssl_certificate_key 上,却把xxx.key 配到了ssl_certificate 上)
ssl_certificate /etc/nginx/cert/123_xx.abcxx.cn.pem; # 注意此地址为docker-compose 中nginx cert挂在后的目录
ssl_certificate_key /etc/nginx/cert/123_xx.abcxx.cn.key;
3,如果以上都没问题 却不能访问,但http 都是正常的 ,http加s后 就不能访问,请查看防火墙,安全组是否放行443端口