Nginx

在 centos 上使用 nginx 配置 https 時遇到問題

  • September 26, 2018

我有一個使用 http2 和 https 在本地執行的 node.js 項目。一切執行良好,我生成了一個自簽名證書並執行該應用程序,一切正常。所以現在我正試圖將它移動到我的伺服器,這是執行 nginx 的 centos,並用於proxypass映射http://myserverip:porthttp://example.com. HTTP 工作正常並且目前正在執行,但在我嘗試轉換為 https 時,我無法讓網站顯示。請注意,https://myserverip:port一切正常並提供服務,所以我相信這與我的 nginx 配置是隔離的。

這是我為該站點設置的 nginx 配置文件:

server
{
 listen 80;
 listen [::]:80;
 server_name example.com www.example.com;

 location /
 {
   proxy_pass http://127.0.0.1:3103;
   include /etc/nginx/proxy_params;
 }
}

server {
 listen 443 ssl http2;
 listen [::]:443;
 server_name example.com www.example.com;

 ssl_certificate      /var/www/example.com/app/certs/example.crt;
 ssl_certificate_key  /var/www/example.com/app/certs/example.key;

 location / {
   proxy_pass https://127.0.0.1:3103;
 }
}

在我的 nginx 日誌中,我收到以下錯誤:no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking. 似乎很奇怪,因為我有ssl_certificate&ssl_certificate_key設置。讓我有點困惑的一件事是我的節點伺服器要求我在程式碼中載入一個證書,所以必須兩次載入同一個證書似乎很奇怪?這是來自我的伺服器的相關程式碼,因此您可以看到它在做什麼。

const spdyOptions = {
 key: fs.readFileSync( path.resolve(__dirname, `../certs/${certName}.key`) ),
 cert: fs.readFileSync( path.resolve(__dirname, `../certs/${certName}.crt`) )
}
// Export
module.exports = handle => {
 const server = express()

 server

   // Frontend
   .get('*', (req, res) => handle(req, res))

 spdy
   .createServer(spdyOptions, server)
   .listen(cf.port, listen)

}

希望我做錯了一些事情會突然出現……我對 nginx 還很陌生,所以我可能只是誤解了一些簡單的事情。如果您需要更多資訊,請詢問!謝謝!

在您目前的配置中,您嘗試使用雙 TLS 連接:從客戶端到 nginx 以及從 nginx 到節點伺服器。

這裡有兩個 TLS 連接沒有意義。

一般來說,這裡有兩種選擇:

  1. 通過普通的 http 協議實現從 nginx 到 Node 伺服器的連接。
  2. 使用 nginx streamTCP 代理功能將 TLS 數據包代理到 Node 伺服器,然後終止 TLS 連接。

我不知道這個 Node.js 模組是否確實為 HTTP/2 提供了一些額外的優化。如果是這樣,則如果您使用選項 1,則不會發生該優化。

選項 2 的缺點是您無法在 Node 應用程序上獲取客戶端 IP 地址。

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