1. 程式人生 > >通過nginx實現https以及https二級域名轉發

通過nginx實現https以及https二級域名轉發

/**僅記錄自己的學習歷程,為以後的自己留一個參考**/

最近在倒騰微信小程式,研究小程式怎麼和伺服器通訊,上一篇部落格裡通過nginx實現了http的二級域名轉發,結果發現https實現二級域名轉發又是另一會事,心累啊哭

目的:https://abc.com訪問主域名,使用nginx將訪問https://shop.abc.com二級域名的請求轉發到https://abc.com:3000埠

1.給域名搞個ssl證書

我偷懶直接從阿里雲申請了一個免費的證書,阿里雲的證書服務裡面有介紹如何使用證書,唯一要注意就是阿里雲的免費證書只能對一個域名有效,即不管你是主域名還是二級域名都需要單獨申請一個ssl證書,否則不能使用https訪問。

2.主域名配置nginx

找到nginx目錄下的nginx.conf檔案,進行如下配置,和http服務的配置類似,多新增一個證書服務

server {
      listen 443 ssl;
      server_name abc.com;
      server_name_in_redirect off;

      ssl_certificate   cert/xxx.pem;       #新增證書服務
      ssl_certificate_key  cert/xxx.key;
      
      ssl_session_timeout 5m;
      ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_prefer_server_ciphers on;
      
      location / {
          tcp_nodelay     on;
          proxy_set_header Host            $host;
          proxy_set_header X-Real-IP       $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
          root html;
          index index.html index.htm;
      }
  }
3.二級域名配置nginx https的轉發要麻煩一點,因為ssl證書不一樣,所以不能在主域名的server中進行二級域名轉發。找到nginx目錄下的nginx.conf檔案,在主域名server下面增加一個server
server {
        listen 443 ssl;
        server_name shop.abc.com;
        server_name_in_redirect off;
        
        #可以設定獨立的ssl認證
        ssl_certificate   cert/xxx.pem;
        ssl_certificate_key  cert/xxx.key;
        
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        
        location / {
          tcp_nodelay     on;
          proxy_set_header Host            $host;
          proxy_set_header X-Real-IP       $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
          proxy_pass http://abc.com:3000;
        }
  }
對於為什麼二級域名裡面轉發的是http地址,我是這麼理解的:如果Nginx作為前端代理的話,則後臺伺服器根本不需要自己處理 https,全是Nginx處理的。使用者首先和Nginx建立連線,完成SSL握手,而後Nginx 作為代理以 http 協議將請求轉給 後臺伺服器 處理,Nginx再把後臺伺服器 的輸出通過SSL 加密發回給使用者,這中間是透明的,所以後臺伺服器只是在處理 http 請求而已。因此,這種情況下只需要配置 Nginx 的SSL 和 Proxy。可以參考SSL證書與Https應用部署小結這篇文章

4.重啟nginx

/安裝路徑/sbin/nginx -t 

/安裝路徑/sbin/nginx -s reload

tips:這是我目前的解決方法,應該還有其它更好的方法,歡迎大家指正。