托管服务器返回 localhost/web

Hosted server returning localhost/web instead

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

该网站是用部署在 Docker 中的 Flask 编写的,并使用反向代理结合 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 returns 成功,但是当我使用 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-撰写-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

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

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

我猜这与你的 Flask 有关 SERVER_NAME

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

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

SERVER_NAME = "th3pl4gu3.com"

你的问题是你从 Flask SERVER_NAME 变量中提取 SERVER_NAME,所以它最终是 https://localhost/web 而不是你想要的 URL .

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

此外,在 Nginx 上,您可以使用 rewrite 规则

摆脱尾随 /

例如

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

告诉 Nginx 按原样解析 stream stream/

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

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;

我用 Chrome、Safari 和 Curl 测试了您的网站,但我看不到这个问题。

尝试清除缓存。

方法一:Ctrl-Shift-R

方法二:DevTool -> Application/Storage -> 清除站点数据