美文网首页
docker中Nginx之https、反向代理(解决mixed

docker中Nginx之https、反向代理(解决mixed

作者: yummy觉一 | 来源:发表于2019-12-07 12:45 被阅读0次

从实际应用场景出发,应用采用微服务开发,并且通过Dockerfile构建且部署在k8s集群上。

本文默认有了以下的基础知识:
Linux的基本操作
docker命令的操作
Dockerfile的编写
对Nginx有一些了解
对http、https有一些认识
对devops理念有点了解

准备工作:
默认Linux系统,且已经安装了openssldocker
cd ~mkdir testcd test,下文所有的操作都在test目录。

一、实际场景中遇到的问题
  • 自签名证书如何生成
  • Nginx如何配置https
  • mixed content问题如何解决

关于mixed content错误,是由于https应用中存在http的请求,浏览器报的错误,本文用Nginx的反向代理来解决该问题,用https应用的Nginx容器来代理需要请求的http应用

二、本文内容
  1. 自签名证书的生成
  2. Nginx配置https
  3. Nginx配置反向代理
  4. Dockerfile编写
  5. 镜像构建及运行
三、自签名证书的生成

使用openssl生成证书及签名

第一步:生成CA私钥
$ openssl genrsa -out privatekey.pem 2048
第二步:由私钥生产对应的公钥
$ openssl rsa -in privatekey.pem -pubout -out publickey.pem
第三步:根据私钥生成证书签名请求
$ openssl req -new -key privatekey.pem -out csr.pem -subj "/C=CN/ST=BJ/L=BJ/O=HD/OU=dev/CN=hello/emailAddress=test@test.com"
第四步:生成CA私钥
$ openssl genrsa -out ca.key 2048

发送签发请求到CA进行签发,生成 x509证书,这里我们没有CA服务器,所以需要假装生成一个CA服务器

第五步:根据CA私钥生成CA的自签名证书
$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=CN/ST=BJ/L=BJ/O=HD/OU=dev/CN=ca/emailAddress=ca@test.com"
第六步:使用CA的私钥和证书对用户证书签名
$ openssl x509 -req -days 3650 -in csr.pem -CA ca.crt -CAkey ca.key -CAcreateserial -out crt.pem

最后,得到的crt.pemprivatekey.pem是我们需要的证书和私钥,在Nginx实现https时需要用到。在当前目录mkdir cert,然后 mv crt.pem ./cert/mv privatekey.pem ./cert/

四、Nginx配置https
第一步: 在当前目录vim nginx-ssl.conf
第二步:写入以下内容:
server {
    listen 443 ssl http2;
    server_name _;
    ssl_certificate conf.d/cert/crt.pem;
    ssl_certificate_key conf.d/cert/privatekey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 10m;
    client_max_body_size   20m;
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm
    }
} 
五、Nginx反向代理配置

把当前应用升级为https后,一般情况下当前应用需要调用其他的http的应用,这种情况浏览器会出现Mixed content错误,想到的解决办法有两种:
第一种:把被调用的http应用升级为https
第二种:采用Nginx反向代理,用当前的https的Nginx来代理被调用的http应用
本文采用反向代理的方式。在配置反向代理时,采用url中前缀来匹配相关的地址。

vim nginx-ssl.conf添加如下内容:

server {
    listen 443 ssl http2;
    server_name _;
    ssl_certificate conf.d/cert/crt.pem;
    ssl_certificate_key conf.d/cert/privatekey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 10m;
    client_max_body_size   20m;
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm
    }
   # 根据url前缀https代理http
   location ^~ /test1/ {
        proxy_pass http://test1.com
    }
   location ^~ /test2/ {
        proxy_pass http://test2.com
    }
} 
六、Dockerfile编写,在test目录vim Dockerfile,添加内容如下:
FROM nginx:latest
MAINTAINER <test@test.com>

ADD ./cert /etc/nginx/conf.d/cert/
ADD ./nginx-ssl.conf /etc/nginx/conf.d/
WORKDIR /usr/share/nginx/html/
ADD ./dist ./

EXPOSE 80
EXPOSE 443

ADD ./dist ./这个一般情况是webpack或者vue-cli构建后生成的文件,将它添加到Nginx的root目录就可以访问了。

七、镜像构建及运行
第一步:镜像构建
docker build -t test/mynginx:v1 .
第二步:运行容器
docker run --name mynginx-v1 -d -p 8081:80 -p 8443:443 test/mynginx:v1
最后:

可将镜像打上标签、上传到镜像仓库,然后在kubernetes集群中启动等等。本文为了演示每一步都是手动操作,但其实随着云计算的发展,基础设施变得越来越自动化,手动的方式无异于在科技时代还是使用远古时代的石器工具,其效率可想而知。如果有条件的话可以借助一些devops平台如Azure devops,如果没条件可以自己写shell脚本对流程进行编排。

相关文章

网友评论

      本文标题:docker中Nginx之https、反向代理(解决mixed

      本文链接:https://www.haomeiwen.com/subject/ekfugctx.html