使用 let's encrypt 证书时,nginx 1.13.8 上偶尔会出现 SSL 错误

使用 let's encrypt 证书时,nginx 1.13.8 上偶尔会出现 SSL 错误

我使用的是自编译的 nginx/1.13.8,带有附加模块 brotli 和 headers-more-nginx-module,但我的错误与是否激活 brotli 无关。服务器运行的是 Debian 9。大多数时候一切正常,但有时一个或几个请求(例如对 css/js 资源的请求)会导致以下错误。所有请求都通过 http/2 提供:

铬合金:错误信息

火狐:加载失败

苹果浏览器: kCFErrorDomainCFNetwork 错误 303

边缘:(同样的错误,现在无法测试;稍后会更新)

我的 nginx SSL 配置(根据 ssllabs 的说法,这似乎很好(A+)):

ssl_certificate      "/etc/letsencrypt/live/***/fullchain.pem";
ssl_certificate_key  "/etc/letsencrypt/live/***/privkey.pem";
ssl_protocols TLSv1.2;
ssl_dhparam /etc/ssl/dhparam.pem;

ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  10m;

    #raymii.org/s/tutorials/Strong_SSL_Secruity_On_nginx.html
ssl_ciphers  'EECDH-AESGCM:EDH+ESGCM:AES256+EECDH:AES256+EDH';
    ssl_prefer_server_ciphers  on;

由于我是服务器和服务器管理方面的新手,我不知道如何调试此问题。我只知道该错误很可能不是发生在 Debian 存储库中的 nginx 上,但我不确定。

我猜想这与密码有关,因为自从我更改了它们的最后一个值后,错误发生的频率就降低了。Server-Log 似乎没问题:例如:

**MY-IP** - - [23/Jan/2018:10:33:06 +0100] TLSv1.2/ECDHE-RSA-AES256-GCM-SHA384 "GET /portal HTTP/2.0" 200 383 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
**MY-IP** - - [23/Jan/2018:10:33:06 +0100] TLSv1.2/ECDHE-RSA-AES256-GCM-SHA384 "GET /styles.a01bb74b47d88d296c44.bundle.css HTTP/2.0" 200 24238 "***" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
**MY-IP** - - [23/Jan/2018:10:33:06 +0100] TLSv1.2/ECDHE-RSA-AES256-GCM-SHA384 "GET /inline.bfe190f13378e2257d4e.bundle.js HTTP/2.0" 200 731 "***" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
**MY-IP** - - [23/Jan/2018:10:33:06 +0100] TLSv1.2/ECDHE-RSA-AES256-GCM-SHA384 "GET /polyfills.74b809925dee18bd9f89.bundle.js HTTP/2.0" 200 19182 "***" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
**MY-IP** - - [23/Jan/2018:10:33:06 +0100] TLSv1.2/ECDHE-RSA-AES256-GCM-SHA384 "GET /scripts.1cd17589767e3c3fbdfe.bundle.js HTTP/2.0" 200 40807 "***" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"

**MY-IP** - - [23/Jan/2018:10:33:06 +0100] TLSv1.2/ECDHE-RSA-AES256-GCM-SHA384 "GET /main.c0a6975cd3e3b14f7b2a.bundle.js HTTP/2.0" 200 0 "***" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
--> The one that failed in this case! - looks fine?

顺便说一下,这种情况发生在不同操作系统的不同设备上。

答案1

我想我找到了解决方案(但我不是 100% 确定!)。正如错误日志所述(请参阅我在问题下的评论),存在权限被拒绝的问题/var/lib/nginx/proxy/**。当 nginx 以“nginx”身份运行时,那里的所有目录和文件都属于“nobody”。我将 nginx 进程的所有者更改为“nobody”,现在它可以正常工作了。

无论如何,为什么它 90% 的时间都正常工作,而只有 10% 的时间崩溃了?在我看来,拒绝许可应该总是发生,或者永远不会发生……但有时呢?

答案2

根据代理文件的大小,nginx 可以缓冲到磁盘。

我猜想失败的文件比成功的文件大。因此,只有在这些情况下,它才会尝试缓冲并失败。

您收到的不是 SSL 错误,而是 http/spdy 协议错误。很可能是因为 Content-length 标头中设置的大小与传输量不匹配。我希望这能回答您为什么会失败的问题。

相关内容