我的网站 http://bavarian-joke-generator.org 正在运行。遗憾的是,我无法让 HTTPS 版本正常工作,因为自从通过 Letsencrypt.org 通过 Certbot 通过证书启用它以来,我遇到了以下问题:
我在这里缺少什么?我已经列出了以下内容,但似乎确实没有资源来了解问题的原因。
从下面的 NGINX 日志中可以看出,我的 Nginx 容器已成功发送响应。
服务器由 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 进程在 Hetzner 提供的主服务器上运行,并且 NGINX 子进程在容器内运行,如上面我的撰写文件中所述。
由于某种原因,来自容器的传出 HTTPS 响应被阻止,而新设置仅直接从主服务器传出 HTTPS 响应。
如果这是 Hetzner 问题或我的任何配置的问题,则必须进一步调查。
更多信息可以在这里找到:
有趣的项目。 Freilich(当然是巴伐利亚德语)我会尽力帮忙;)
对于提供的链接:现在 443 可以工作,但 80 给我的是 nginx 默认页面。
我有点迷失了 - 该应用程序在 docker 中运行,是吗? docker 给你一个它监听的端口?就像启动 docker 时一样,应用程序会运行,您可以通过 http://?
之类的地址访问它然后你在主机操作系统上安装了 nginx,它应该将请求代理传递到运行应用程序的 docker 容器?
如果是这样,您可以删除 nginx 配置中的所有这些位置,谷歌“docker proxy pass nginx”并使用这些配置之一。
如果你在 docker 中与你的应用程序一起运行 nginx,你想将 nginx 移出 docker 容器,或者启动第二个 docker 容器(最好的做法是不要在一个 docker 容器中启动半个进程,但至少使用多种的)。 最简单的解决方案是在 docker 中不要安装 nginx。
刚刚查看了 github 存储库:
- "127.0.0.1:8080:80"
docker compose 不是我的第一个宗教,所以我不确定,但你想在此处添加 8080:443 吗?