环境准备
为了快速测试以及节省不必要的时间,整个实验我都以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}$1 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:\Windows\System32\drivers\etc的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}$1 permanent;
#access_log /var/log/nginx/host.access.log main;
location / {
#root /usr/share/nginx/html;
...........
这时候会发现windows上http访问就会自动跳转https了。