捂脸斋

江山风月 🌘 本无常主 🌈 闲者便是主人 🍃🍃🍃

从输入网址到浏览器显示内容

  1. 在地址栏中输入网址

  2. 解析域名

    1. 遍历本地的hosts文件,找到待访问域名所对应的ip地址;

      image-20210312173923442

      (这是一个hosts文件)

    2. 如果hosts文件中找不到,会委托dns服务器进行解析。

      image-20210312174003928

      (192.168.17.1是当前局域网中的dns地址)

  3. 拿到ip后,和服务器建立TCP链接。

  4. 发送http请求。

  5. 接受http响应报文,渲染页面。

解决方案

只要把www.d.com解析到我们自己的ip上即可。结合域名的解析过程,有两个方案。

A

修改本地hosts文件,把www.d.com解析到127.0.0.1。但是考虑到iphone的封闭性,此方案可行性不高。

B

在局域网中搭建dns,让dns负责把www.d.com解析到127.0.0.1,然后修改iphone的dns地址或者修改整个局域网环境下的dns地址。

采用方案B实施。

配置dns,将目标域名解析到自己的ip

安装并配置内网dns服务器

  1. 安装dnsmasq

dnsmasq是一个轻量级的dns服务。mac可以使用以下命令安装。

1
brew install dnsmasq

homebrew的安装就不说了。

  1. 配置 /usr/local/etc/dnsmasq.conf

    使用vim打开此文件。uncommentstrict-order。将listen-address的值修改为mac的内网ip。

    1
    2
    3
    4
    strict-order
    # 127.0.0.1可以不写
    # 192.168.20.113替换为mac的内网ip
    listen-address=127.0.0.1,192.168.20.113
  1. 修改etc/hosts

    192.168.20.113 www.d.com添加至最后一行,注意把ip替换成mac的内网ip。这么做的目的是告诉dnsmasq将www.d.com解析到这台mac的ip。

  2. 启动dnsmasq

    1
    2
    # 一定要加sudo,虽然不加也能启动,但是不work
    sudo brew services start dnsmasq

修改iphone的dns

image-20210312181038565

至此,我们的iphone在访问www.d.com时已经能够跳到mac ip了。

如果对httphttps有了解的话,http://www.d.com访问的是80端口,相当于http://{ip}:80;而https对应的是443端口。

而我们的web服务(e.g. tomcat、apache、nodejs)一定不会绑定80和443端口,所以我们需要再做一个反向代理,将80和443端口的请求转发到真正的web服务。

另外,在做反向代理时,需要同时配置ssl证书,这样我们才能通过https访问。

使用Nginx配置反向代理和ssl

Nginx是一个性能极高的Http服务器,一般用做静态服务器、反向代理及负载均衡服务器。

  1. 申请并下载ssl证书

    阿里云提供了简单易用的ssl认证服务,具体步骤就不展开了。我们只需下载适用Nginx的证书就行了。

    下载解压后有两个文件,*.key | *.pem

    image-20210313112002190

image-20210313112020126

  1. 安装并配置Nginx

    mac使用以下命令安装。

    1
    2
    3
    4
    5
    6
    # install
    brew install nginx
    # start, stop, restart
    nginx
    nginx -s stop
    nginx -s restart

    接着我们要修改配置文件,让Nginx将请求转发到我们自己的web服务。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    vim /usr/local/etc/nginx/nginx.conf

    # 如果用户通过http访问,将请求重定向到https。
    server {
    listen 80;
    server_name ecp2020-flatland.powerstationofart.com;
    return 301 https://$server_name$request_uri;
    }

    server {
    # 只有通过https://www.d.com 才可以访问
    listen 443;
    server_name www.d.com;

    # 开启ssl认证
    ssl on;
    # pem或者crt文件路径
    ssl_certificate /etc/nginx/cert/www.d.com.crt;
    # key文件路径
    ssl_certificate_key /etc/nginx/cert/www.d.com.key;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_prefer_server_ciphers on;

    # 反向代理

    # 将 `https://www.d.com/` 代理到 `http://127.0.0.1:3000`
    location / {
    proxy_redirect off;
    rewrite ^/(.*)$ /$1 break;
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    # 下面一个location可以不写,这里只是为了举例
    # 将 `https://www.d.com/server` 代理到 `http://127.0.0.1:8082`
    location /server {
    proxy_redirect off;
    rewrite /server/(.*) /$1 break;
    proxy_pass http://127.0.0.1:8082;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }

    最后启动nginx就可以了。