HTTPS/SSL 响应被阻止,HTTP 响应工作正常

问题描述 投票:0回答:2

我的网站 http://bavarian-joke-generator.org 正在运行。遗憾的是,我无法让 HTTPS 版本正常工作,因为自从通过 Letsencrypt.org 通过 Certbot 通过证书启用它以来,我遇到了以下问题:

我的服务器的响应似乎被阻止或以某种方式被拦截

  • 火狐:

  • 野生动物园:

我的问题是:

我在这里缺少什么?我已经列出了以下内容,但似乎确实没有资源来了解问题的原因。

详情:

从下面的 NGINX 日志中可以看出,我的 Nginx 容器已成功发送响应。

  • HTTPS 最终被阻止的响应:
  • HTTP 按预期工作的响应:

服务器由 Hetzner 提供,并且以下 UFW 防火墙设置处于活动状态(被阻止的 IP 地址不是我的):

整个代码可以在其 GitHub 存储库中看到

但我特别想提一下所使用的 NGINX 配置。另请注意,NGINX 作为容器运行,作为广告 docker-compose 文件的一部分:

  • 配置:
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

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;

    sendfile on;
    #tcp_nopush on;

    keepalive_timeout 65;

    gzip on;
    proxy_max_temp_file_size 0;

    include /etc/nginx/conf.d/*.conf;
}
  • 上面包含模板
server {
    server_name bavarian-joke-generator.org www.bavarian-joke-generator.org;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate /etc/nginx/ssl/live/bavarian-joke-generator.org/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/bavarian-joke-generator.org/privkey.pem;
    listen 80;
    listen [::]:80;
    add_header Strict-Transport-Security 'max-age=63072000; includeSubDomains; preload' always;

    add_header Content_Security-Policy "default-src 'self'; script-src 'sha384-7FvcOpf85HsGS89sLrvOOHZYqgaEqbfUi87HhpbqbndTSFw+XpzbDMK5ZcxD28fe'; frame-ancestors: 'self'; form-action 'self'; base-uri 'self';";
    add_header X-Content-Type-Options: "nosniff";
    root /usr/share/nginx/html;
    error_page 400 /errors/400_wrong_input.html;
    error_page 404 /errors/404_joke_not_found.html;

    location / {
    }

    # SSL Certificate:
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location /errors/ {
        root /usr/share/nginx/html;
        internal;
    }

    location ^~ /assets/ {
        root /usr/share/nginx;
    }

    location ^~ /RegEx/ {
        root /usr/share/nginx;
    }

    location ^~ /ssr/ {
        # pass will exchange ssr/ for /:
        proxy_pass "http://${SSR_HOST}:${SSR_PORT}/";
        proxy_http_version 1.1;
        proxy_set_header   "Connection" "";
        proxy_intercept_errors on;
    }

    location ^~ /auth/ {
        # pass will exchange auth/ for /:
        proxy_pass "http://${AUTH_HOST}:${AUTH_PORT}/";
        proxy_http_version 1.1;
        proxy_set_header   "Connection" "";
        # No error pages -> Do not intercept errors
    }

    location ~ \.(?:js|.css)$ {
        root /usr/share/nginx/html;
    }
}

我已经尝试过:

  • 将 NGINX 服务器块一分为二,分别监听端口 80 和一个监听 443 端口,并重定向到 HTTPS 块
  • 再次启用ufw规则
  • 更新我的 ssl 证书
  • 检查是否可以通过 sslhoper.com 找到我的 ssl 证书
  • 检查是否存在任何其他防火墙并正在阻止
nginx docker-compose https webserver hetzner-cloud
2个回答
0
投票

所以我无法解决这个问题但是我能够规避它:


我现在有一个父 NGINX 进程在 Hetzner 提供的主服务器上运行,并且 NGINX 子进程在容器内运行,如上面我的撰写文件中所述。

由于某种原因,来自容器的传出 HTTPS 响应被阻止,而新设置仅直接从主服务器传出 HTTPS 响应。


如果这是 Hetzner 问题或我的任何配置的问题,则必须进一步调查。

更多信息可以在这里找到:


0
投票

有趣的项目。 Freilich(当然是巴伐利亚德语)我会尽力帮忙;)

对于提供的链接:现在 443 可以工作,但 80 给我的是 nginx 默认页面。

我有点迷失了 - 该应用程序在 docker 中运行,是吗? docker 给你一个它监听的端口?就像启动 docker 时一样,应用程序会运行,您可以通过 http://?

之类的地址访问它

然后你在主机操作系统上安装了 nginx,它应该将请求代理传递到运行应用程序的 docker 容器?

如果是这样,您可以删除 nginx 配置中的所有这些位置,谷歌“docker proxy pass nginx”并使用这些配置之一。

如果你在 docker 中与你的应用程序一起运行 nginx,你想将 nginx 移出 docker 容器,或者启动第二个 docker 容器(最好的做法是不要在一个 docker 容器中启动半个进程,但至少使用多种的)。 最简单的解决方案是在 docker 中不要安装 nginx。

刚刚查看了 github 存储库:

https://github.com/SturmDerLiebe/bavarian_joke_generator/blob/main/docker-compose.production.yaml#L64

      - "127.0.0.1:8080:80"

docker compose 不是我的第一个宗教,所以我不确定,但你想在此处添加 8080:443 吗?

© www.soinside.com 2019 - 2024. All rights reserved.