日记 - 20180420

611 字
4 分钟
...阅读
...评论
天气晴☀️

今天在一个非常低级的问题上耗了一天。

起因是我想把 www.monkeyrun.net 设置为 http 自动 301 到 https 上,由于部署在阿里云的容器服务上,上面用的负载均衡,设置起来会稍微麻烦一点。

需要起一个 nginx 的容器,然后将 http 请求绑定到 nginx 的端口上,然后 nginx 再反向代理到 https 站点上

操作起来不复杂,但是发现一个很蛋疼的问题,设置好之后,80 端口和 443 端口的站点都访问不了了。

后来调试的时候,又发现,把 80 端口禁掉,443 端口竟然访问不了。

开始以为是负载均衡或者容器服务的配置问题,发工单给阿里的人,耗了几个小时,没给出啥有效的答案。

再后来发现,首页访问不了是因为服务端做了 api 请求,如果没有 api 请求的页面是可以访问的,所有的 api 请求返回 504 Gateway Timeout。

api 请求是通过 http-proxy-middleware,代理到 api.www.monkeyrun.net 上去了,一直以为是因为这个中间件的问题。甚至把 nuxt 项目的架构都调整了,直接换成了 @nuxtjs/axios@nuxtjs/proxy 两个组件,结果发现问题依然存在。

后来恼怒了,猜测会不会是 https 的请求代理到 http 的 api 上的问题,打算给 api 也搞个 https 证书,干脆全部上 https 试试。然后发现了真正的问题所在!

那就是,api 和前端站点因为都在一个 Docker 集群上,也是公用的一个负载均衡 😂,停了 80 端口,api 就挂了,因为 api 还没启用 https,当然访问不了了!傻逼了!

最终配置成功!

前端域名解析到负载均衡 A(外网 IP)上,https: 443 端口监听容器集群的 9080 端口,http: 80 端口监听容器集群的 80 端口

容器集群的 80 端口是 nginx,nginx 的配置为:

user  nginx;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  65535;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    keepalive_timeout  65;
    gzip  on;
    server {
        listen       80;
        server_name  www.monkeyrun.net;
        return 301 https://$host$request_uri;
    }
}

后端域名解析到负载均衡 B(内网 IP)上,https: 443 端口监听容器集群的 9080 端口

node 将前端/api 的所有请求代理到后端域名上,由于都在阿里云容器集群内,所以内网可通。

评论区
Copyright © Bean Deng