SSL方案:
1、NGINX做ssl握手,其與TOMCAT之間仍舊HTTP協議(當NGINX和TOMCAT在同一相對安全的內網時這樣做可以減少SSL握手次數)。NGINX的代理轉寄(proxy_redirect:反向替換proxy_pass或上遊,如TOMCAT返回的URL),從HTTP的替換成HTTPS。可包括多條proxy_redirect配置。注意連接埠號碼如需要替換也要寫入。
2、NGINX強制將接收到的HTTP請求rewrite為HTTPS
3、NGINX做最佳化方案,包括keepalive_timeout,開啟ssl的session緩衝。
4、TOMCAT和項目代碼及設定檔(目前)不需要變更。
5、需要注意的是,程式從HTTP頭部擷取的資訊,包括HTTPS協議,連接埠號碼,客戶IP等,資料是正確的。但,若用request.getScheme();(HTTP or HTTPS)request.isSecure();(是否安全,boolean)request.getRequestURL().toString();(URL,帶協議名)request.getRemoteAddr();(客戶IP地址)等,擷取則是錯誤的,request的資訊有nginx轉寄到tomcat,並未做替換處理,因此擷取到的都是nginx的資訊,如有需要,在tomcat的server.xml設定一個valve。
-------------------------
nginx配置:
(1)、自訂設定檔,放置於/etc/nginx/conf.d檔案夾下,xxx.conf
(2)、引入該檔案nginx/nginx.conf檔案的http模組最後加入include /etc/nginx/conf.d/*.conf
(3)、nginx.conf檔案中做ssl最佳化配置,http模組最後加入
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
(4)、自訂設定檔xxx.conf中做如下配置:
#HTTP serverserver {#監聽連接埠 listen 80;#監聽網域名稱/IP server_name abc.e-lingcloud.com;#請求的重新導向,該功能的含義及用法請搜尋rewrite,該命令可添加在server、location、if模組下。#本例由於要求轉寄所有80的http請求,因此rewrite放置於server模組下,且location已登出。 rewrite ^(.*) https://$host$1 permanent; #location / { # proxy_pass http://192.168.1.111:8080; # proxy_set_header Host $host; # proxy_redirect http://192.168.1.111:8080 http://abc.e-lingcloud.com:59998; # proxy_set_header X-Real-Ip $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_set_header X-Forwarded-Proto $scheme; # proxy_set_header Upgrade $http_upgrade; # proxy_set_header Connection "upgrade"; #}}#HTTPS serverserver {#監聽HTTPS預設連接埠443 listen 443;#開啟SSL ssl on;#監聽網域名稱/IP server_name abc.e-lingcloud.com;#HTTPS(若不在SSL的模組內,該命令預設為HTTP保持串連的時間長度)保持串連的時間長度,單位秒。具體用法自行搜尋。 keepalive_timeout 70;#SSL認證(公開金鑰),認證產生方法參考購買認證的網站說明,本例中的認證來自於Godaddy,該認證包括中間認證和發給自己的認證。 ssl_certificate /etc/ssl/private/e-lingcloud.crt;#SSL私密金鑰,該私密金鑰通常在申請認證前產生。記得備份檔案。需要注意的是,私密金鑰非常重要,不可泄露,需要存放在訪問受限的檔案中,當然,nginx主進程必須有讀取密鑰的許可權。私密金鑰和認證可以存放在同一個檔案中。 ssl_certificate_key /etc/ssl/private/e-lingcloud.key; location / { proxy_pass http://192.168.1.111:8080;#代理重新導向,作用是將上遊伺服器返回連結中的第一個參數替換為第二個參數。此處比較重要,tomcat和程式不做任何特定配置的話(如tomcat新加valve將http頭資訊賦到request中),上遊伺服器(如tomcat)將返回http協議及其連結,用此處重新導向為https和指定的伺服器網域名稱返回給用戶端。proxy_redirect http://abc.e-lingcloud.com https://abc.e-lingcloud.com; proxy_redirect https://192.168.1.111:8443 https://abc.e-lingcloud.com; proxy_redirect http://192.168.1.111:8080 https://abc.e-lingcloud.com;#以下為nginx轉寄給tomcat的時候,將資料加到http頭資訊中。具體參數含義和變數的用法請搜尋。 proxy_set_header Host $host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; #proxy_set_header Upgrade $http_upgrade; #proxy_set_header Connection "upgrade"; }
-----------------------------------------
資料連結及其說明:
nginx的一些配置,需要注意,有錯誤的地方。
http://blog.csdn.net/na_tion/article/details/17334669
nginx與tomcat之間傳遞http,使用request.getScheme()取到的仍為http,需要注意,個人建議程式裡別用request.getScheme,而是取http頭部資訊,用該文章提供的方案需要侵入tomcat做配置。
http://feitianbenyue.iteye.com/blog/2056357
與第二條資料配合,tomcat官網關於valve參數的API。告訴你配置的這幾項作用是什麼。
http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html
與第二條資料配合,第二條資料的靈感出處。需要注意的地方同第二條。
http://han.guokai.blog.163.com/blog/static/136718271201211631456811/
以上就介紹了SSL在NGINX的配置方法實踐無需修改tomcat和程式配置,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。