从实际应用场景出发,应用采用微服务开发,并且通过Dockerfile构建且部署在k8s集群上。
本文默认有了以下的基础知识:
Linux的基本操作
docker命令的操作
Dockerfile的编写
对Nginx有一些了解
对http、https有一些认识
对devops理念有点了解
准备工作:
默认Linux系统,且已经安装了openssl
、docker
cd ~
→mkdir test
→cd test
,下文所有的操作都在test
目录。
一、实际场景中遇到的问题
- 自签名证书如何生成
- Nginx如何配置https
-
mixed content
问题如何解决
关于
mixed content
错误,是由于https应用中存在http的请求,浏览器报的错误,本文用Nginx的反向代理来解决该问题,用https应用的Nginx容器来代理需要请求的http应用
二、本文内容
- 自签名证书的生成
- Nginx配置https
- Nginx配置反向代理
-
Dockerfile
编写 - 镜像构建及运行
三、自签名证书的生成
使用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.pem
和privatekey.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脚本
对流程进行编排。
网友评论