托管服务器返回 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 -> 清除站点数据
我在 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 -> 清除站点数据