为了快速测试以及节省不必要的时间,整个实验我都以docker为基础,当然你也可以手动搭建。
整个环境资源包括windows10和一台VMware上的centos7(防火墙已经关闭)
安装docker安装方法,这里采用存储库的方法来安装。
- 安装yum-utils包(提供yum-config-manager 实用程序)并设置稳定存储库
yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装最新版本的 Docker Engine 和 containerd
yum install docker-ce docker-ce-cli containerd.io
- 安装特定版本的 Docker Engine,需要在 repo 中列出可用版本,然后选择并安装,我安装了20.10.6版本
yum install docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io
- 启动docker
systemctl start docker #启动Docker systemctl enable docker #设置Docker为开机启动
具体的使用方法,这里就不多赘述了。
搭建两个后端服务后端我采用了python的flask搭建了两个简单的接口
我这里先手动把docker镜像拉取到了本地
docker pull python:3.8.12 #拉取镜像 docker images #显示本地的镜像
编写Dockerfile
FROM python:3.8.12 WORKDIR /python COPY . . RUN pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple EXPOSE 5000 5001 CMD [ "python", "test.py" ]
在同目录下创建一个test.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'i am no.1!' if __name__ == '__main__': app.run(host='0.0.0.0',port=5000)
同目录运行命令构建镜像,构建完成会发现多了一个web1的镜像
docker build -t web1 . docker images
修改test.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'i am no.2!' if __name__ == '__main__': app.run(host='0.0.0.0',port=5001)
同目录运行命令构建镜像,构建完成会发现多了一个web2的镜像
docker build -t web2 . docker images
运行容器
docker run -itd -p 5000:5000 --name web1 web1 docker run -itd -p 5001:5001 --name web2 web2
测试服务是否成功启动
docker ps -a #看见两个容器正常运行 curl 127.0.0.1:5000 #输出i am no.1! curl 127.0.0.1:5001 #输出i am no.2!搭建nginx
nginx不用我们构建直接下载启用即可
docker pull nginx docker run -itd -p 80:80 -p 443:443 -v /home/ndmiao/nginx/:/etc/nginx/ -v /home/ndmiao/pem/:/opt/ --name nginx nginx
测试是否搭建成功
curl 127.0.0.1 # 或者本地windows直接访问虚机地址用nginx做代理进行端口转发
首先查看两个python容器的地址
docker inspect web1 #拉到最后IPAddress即容器的地址
因为做了容器存储的本地映射,所以我们可以直接在主机上修改配置文件,来到/home/ndmiao/nginx/conf.d/,重命名default.conf为web1.conf,增加charset utf-8,修改sever_name和proxy_pass。
server { listen 80; listen [::]:80; #server_name localhost; charset utf-8; server_name 172.17.0.2; rewrite ^(.*)$ https://${server_name} permanent; #access_log /var/log/nginx/host.access.log main; location / { #root /usr/share/nginx/html; #index index.html index.htm; proxy_pass http://172.17.0.2:5000; } .............
重启容器
docker restart nginx
此时可以发现浏览器直接访问虚机地址的页面内容为 i am no.1!
nginx根据域名进行转发首先在windows上配置本地代理,C:WindowsSystem32driversetc的hosts增加两个代理
我的虚机地址为192.168.10.200
192.168.10.200 www.ndmiao.com 192.168.10.200 www.ndmiao2.com
回到虚机中配置conf.d下的文件
首先修改web1.conf,将server_name修改为域名
server_name www.ndmiao.com;
复制web1.conf为web2.conf,修改两处
server_name www.ndmiao2.com; proxy_pass http://172.17.0.3:5001; #根据自己web2的地址
重启容器
docker restart nginx
这时候就可以直接在windows通过两个域名来访问web1和web2了
nginx只允许域名访问在虚机的/home/ndmiao/nginx/conf.d/下增加一个default.conf
server { listen 80 default; server_name _; return 404; }
重启容器后会发现通过虚机IP访问就会直接返回404
nginx配置ssl证书这里我用到了mkcert来生成本地证书,安装包可以在https://github.com/FiloSottile/mkcert/releases/latest下载,我安装了windows版本的,因为我在windows上做的代理。cmd到安装包目录,运行
mkcert -install # 让电脑信任CA证书 mkcert www.ndmiao.com www.ndmiao2.com 192.168.10.200 ::1 # 产生证书文件
将两个文件拷贝到虚机的/home/ndmiao/pem/下,修改ndmiao.conf,新增一下内容,不要修改!
server { listen 443 ssl; server_name www.ndmiao.com; ssl_certificate /opt/www.ndmiao.com+3.pem; ssl_certificate_key /opt/www.ndmiao.com+3-key.pem; #转发 location / { proxy_pass http://172.17.0.2:5000; } }
重启容器后,回到windows发现可以通过htpps加域名访问了
nginx强制https访问如果想让域名强制https那么只需要如下位置加一句rewrite ^(.*)$ https://${server_name}$1 permanent;
server { listen 80; listen [::]:80; #server_name localhost; charset utf-8; server_name www.ndmiao.com; rewrite ^(.*)$ https://${server_name} permanent; #access_log /var/log/nginx/host.access.log main; location / { #root /usr/share/nginx/html; ...........
这时候会发现windows上http访问就会自动跳转https了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)