Nginx

nginx 1.13.8 上偶爾出現 SSL 錯誤,讓我們加密證書

  • January 25, 2018

我正在使用帶有附加模組 brotli 和 headers-more-nginx-module 的自編譯 nginx/1.13.8 但我的錯誤發生獨立於啟動 brotli 與否。伺服器正在執行 Debian 9。大多數情況下一切正常,但有時一個或幾個請求(例如對 css/js 資源)會導致以下錯誤。所有請求都通過 http/2 提供服務:

:ERR_SPDY_PROTOCOL_ERROR

火狐:載入失敗

野生動物園:kCFErrorDomainCFNetwork 錯誤 303

edge:(同樣的錯誤,現在無法測試;稍後會更新)

我的 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 repo 中的 nginx 很可能沒有發生錯誤,但我不確定。

我的猜測是它與密碼有關,因為由於我將它們從最後一個值更改為錯誤發生的頻率較低。伺服器日誌似乎很好:例如:

**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?

順便說一句,這發生在具有不同作業系統的不同設備上。

我想我找到了解決方案(但我不是 100% 確定!)。正如錯誤日誌所說(請參閱我在問題下的評論)在/var/lib/nginx/proxy/**. 當 nginx 作為“nginx”執行時,那裡的所有目錄和文件都屬於“nobody”。我將 nginx 程序的所有者更改為“nobody”,現在它可以工作了。

無論如何,它怎麼能在 90% 的時間和 10% 的時間崩潰?在我看來,被拒絕的許可要麼一直受到打擊,要麼永遠不會……但有時呢?

根據被代理文件的大小,nginx 可以緩衝到磁碟。

我的猜測是失敗的文件比成功的文件大。因此,只有在那些情況下,它才會嘗試緩衝它並失敗。

您得到的不是 SSL 錯誤,而是 http/spdy 協議錯誤。很可能是因為 Content-length 標頭中設置的大小與傳輸的數量不匹配。我希望這能回答你為什麼失敗的問題。

引用自:https://serverfault.com/questions/893653