环境准备

为了快速测试以及节省不必要的时间,整个实验我都以docker为基础,当然你也可以手动搭建。

整个环境资源包括windows10和一台VMware上的centos7(防火墙已经关闭)

安装docker

安装方法,这里采用存储库的方法来安装。

  1. 安装yum-utils包(提供yum-config-manager 实用程序)并设置稳定存储库
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装最新版本的 Docker Engine 和 containerd
yum install docker-ce docker-ce-cli containerd.io
  1. 安装特定版本的 Docker Engine,需要在 repo 中列出可用版本,然后选择并安装,我安装了20.10.6版本
yum install docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io
  1. 启动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: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}$1 permanent;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        #root   /usr/share/nginx/html;
 ...........

这时候会发现windows上http访问就会自动跳转https了。

Last modification:January 17, 2022
如果觉得我的文章对你有用,请随意赞赏