2017-07-06 23 views
0

我有一個Nginx服務器處理http請求,並向上遊的某些節點服務器進行代理傳遞,如果域名匹配其中一個啓用的站點,則所有數據包都重定向到一個節點服務器,只有當通道是SSL時,否則301到https版本:是否有可能讓上游服務器處理Nginx服務器後面的SSL證書?

server { 
    listen   80; 
    server_name something.com 
    return 301  https://$host$request_uri; 
} 

server { 
    listen 433; 
    server_name something.com; 

    ssl_certificate   /etc/nginx/cert.crt; 
    ssl_certificate_key  /etc/nginx/cert.key; 

    ssl on; 
    ssl_session_cache builtin:1000 shared:SSL:10m; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; 
    ssl_prefer_server_ciphers on; 

    location/{ 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_set_header X-NginX-Proxy true; 

     proxy_pass http://127.0.0.1:3000/; 
     proxy_redirect off; 
    } 
} 

所有的工作,但證書管理,SSL握手等都是由Nginx製作的。我希望讓每個節點服務器上游管理自己的SSL首選項,因此我不依賴Nginx來實現這一點。我的節點服務器已經支持https請求,但我不明白是否有可能告訴Nginx:

  • 聽80,如果有事情做301做它的https版本。
  • 聽433,不用擔心了SSL,只是代理通過一切爲localhost:3000

  • 和節點服務器監聽端口3000處理SSL

+0

如果您只有一個站點並且希望節點處理SSL,爲什麼不讓節點偵聽端口443? –

+1

接受的答案不再準確:請參閱https://stackoverflow.com/questions/46412934/forward-https-traffic-thru-nginx-without-ssl-certificate/46413105 – fragmentedreality

回答

1

聽到433,不用擔心SSL,只需代理將所有內容傳遞給localhost:3000

不,不用nginx,你w生病必須使用端口轉發。

nginx將不得不使用一些SSL密鑰,並可能使用SSL將代碼傳遞給某些Node應用程序,這將意味着Node和nginx都必須管理自己的SSL密鑰(客戶端-nginx連接的nginx和用於nginx-nodeApp連接的節點應用程序)。

或者nginx可以使用沒有SSL的HTTP代理對使用SSL的節點的請求,這將意味着client-nginx連接將是不安全的,只有nginx-NodeApp連接將是安全的。這也意味着https://www.example.com/將不起作用 - 儘管http://www.example.com:443/會。

如果您希望節點處理SSL密鑰而不是反向代理(因爲它通常已完成),那麼您將不得不使用TCP/IP級別的端口轉發將流量傳遞到節點應用程序,而無需使用一個反向代理(nginx)。

通常會使用反向代理,以便應用程序不必處理用於客戶端連接(等等)的SSL密鑰。如果您希望節點應用程序使用SSL密鑰而不是反向代理,那麼您應該首先重新考慮使用反向代理。

+0

實際上,nginx可以從版本1.9開始。 0。請參閱nginx流模塊。 –

相關問題