托管服务器返回 localhost/web

时间:2021-04-10 18:15:35

标签: docker ubuntu nginx docker-compose nginx-reverse-proxy

我在 Digital Ocean 的服务器上有一个网站主机,它的行为很奇怪。

该网站是用 Flask 编写的,它部署在 Docker 中,并使用反向代理结合 Let's Encrypt 来托管在网络上。

该网站的域名是 mes.th3pl4gu3.com。

如果我继续 mes.th3pl4gu3.com/web/,网站会出现并正常运行。

如果我继续 mes.th3pl4gu3.com/web,它会在 URl 中给我 http://localhost/web/ 并且连接失败。

但是,当我在本地运行它时,它工作正常。

我检查了我的 nginx 日志,当我浏览 mes.th3pl4gu3.com/web/ 时,access_logs 返回成功,但是当我使用 mes.th3pl4gu3.com/web 时,日志中没有任何内容。

有没有人知道是什么导致了这种情况?

以下是一些可能有助于故障排除的代码。

server {

server_name   mes.th3pl4gu3.com;

  location / {
    access_log  /var/log/nginx/mes/access_mes.log;
    error_log  /var/log/nginx/mes/error_mes.log;
    proxy_pass  http://localhost:9003; # The mes_pool nginx vip
  }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/..........
    ssl_certificate_key /etc/letsencrypt/........
    include /etc/letsencrypt/.........
    ssl_dhparam /etc/letsencrypt/......

}

server {
    if ($host = mes.th3pl4gu3.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot



  listen        80;
  server_name   mes.th3pl4gu3.com;
    return 404; # managed by Certbot


}

Docker 实例:

7121492ad994   docker.pkg.github.com/mervin16/mauritius-emergency-services-api/mes:1.2.5     "uwsgi 
app.ini"          4 weeks ago    Up 4 weeks   0.0.0.0:9002->5000/tcp   mes-instace-2
f4dc063e33b8   docker.pkg.github.com/mervin16/mauritius-emergency-services-api/mes:1.2.5     "uwsgi app.ini"          4 weeks ago    Up 4 weeks   0.0.0.0:9001->5000/tcp   mes-instace-1
fb269ed2229a   nginx                                                                         "/docker-entrypoint.…"   4 weeks ago    Up 4 weeks   0.0.0.0:9003->80/tcp     nginx_mes
2ad5afe0afd1   docker.pkg.github.com/mervin16/mauritius-emergency-services-api/mes:1.2.5     "uwsgi app.ini"          4 weeks ago    Up 4 weeks   0.0.0.0:9000->5000/tcp   mes-backup

docker-compose-instance.yml

version: "3.8"

# Contains all Production instances
# Should always stay up
# In case both instances fails, backup instance will takeover
services:
  mes-instace-1:
    container_name: mes-instace-1
    image: "docker.pkg.github.com/mervin16/mauritius-emergency-services-api/mes:${MES_VERSION}"
    networks:
      - mes_net
    volumes:
      - ./data:/app/data
    env_file:
      - secret.env
    ports:
      - "9001:5000"
    restart: always
    environment:
      - MES_VERSION=${MES_VERSION}

  mes-instace-2:
    container_name: mes-instace-2
    image: "docker.pkg.github.com/mervin16/mauritius-emergency-services-api/mes:${MES_VERSION}"
    networks:
      - mes_net
    volumes:
      - ./data:/app/data
    env_file:
      - secret.env
    ports:
      - "9002:5000"
    restart: always
    environment:
      - MES_VERSION=${MES_VERSION}

networks:
  mes_net:
    name: mes_network
    driver: bridge

docker-compose.yml

version: "3.8"

# Contains the backup instance and the nginx server
# This should ALWAYS stay up

services:
  mes-backup:
    container_name: mes-backup
    image: "docker.pkg.github.com/mervin16/mauritius-emergency-services-api/mes:${MES_VERSION}"
    networks:
      - mes_net
    volumes:
      - ./data:/app/data
    env_file:
      - secret.env
    ports:
      - "9000:5000"
    restart: always
    environment:
      - MES_VERSION=${MES_VERSION}

  nginx_mes:
    image: nginx
    container_name: nginx_mes
    ports:
      - "9003:80"
    networks:
      - mes_net
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./log/nginx:/var/log/nginx
    depends_on:
      - mes-backup
    restart: always

networks:
  mes_net:
    name: mes_network
    driver: bridge

我有多个用于跨应用负载平衡的实例。

有人可以帮忙吗,或者有人知道为什么会发生这种情况吗?

3 个答案:

答案 0 :(得分:1)

只要我测试了页面 https://mes.th3pl4gu3.com/web 的结尾有或没有 / 结尾,它就可以正常工作。 (Ubuntu 上的 Firefox 87 版
也许您的网络浏览器或您正在运行的任何类型的 VPN/代理存在错误/问题。确保所有这些都关闭。

另外,在 Nginx 上,您可以使用 / 规则去除尾随 rewrite

例如

location = /stream {
    rewrite ^/stream /stream/;
}

它告诉 Nginx 解析 stream,因为它是 stream/

为了确保您不会因为缓存数据而面临任何问题,请禁用并清除所有缓存。在您的网络浏览器上点击 F12 -> 转到控制台选项卡,点击 F1 并禁用缓存。在 Nginx 上为标头设置“无缓存”,例如

add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
etag off;

答案 1 :(得分:1)

我使用 Chrome、Safari 和 Curl 测试了您的网站,但没有发现该问题。

尝试清除缓存。

方法一:Ctrl-Shift-R

方法二:DevTool -> 应用/存储 -> 清除站点数据

答案 2 :(得分:0)

我猜这与你的 Flask SERVER_NAME

如您所说,本地您的 SERVER_NAME 可能设置为 localhost:8000。

但是,在生产中,它需要类似于

SERVER_NAME = "th3pl4gu3.com"

您的问题是您正在从 Flask SERVER_NAME 变量中提取 SERVER_NAME,因此它最终为 https://localhost/web 而不是您想要的 URL。