nginx做SSL並配合tomcat實現HTTPS訪問
1、確認已安裝openssl服務,使用 rpm -qa | grep -i openssl 來檢查是否安裝,如果沒有安裝以及其相關如openssl-devel,那麼就去http://rpm.pbone.net/搜尋並下載,通過rpm -ivh xxx.rpm安裝,當然如果能yum安裝最好,yum安裝就是線上安裝,rpm理解為離線安裝。
2、安裝nginx,nginx可以用原始碼安裝,記得./configure --prefix=/usr/local/nginx --with-http_ssl_module。--with-http_ssl_module表示支援SSL。
3、建立證書:
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
最重要的一行是“Common Name”。在這裡輸入您的官方網域名稱,如果您還沒有,請輸入您網站的IP位址。將挑戰密碼和可選的公司名稱留空。
刪除密碼:
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
簽署證書
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
4、配置nginx配置檔案:
upstream aaa {
ip_hash; #這個配置是nginx的一種策略,對於那種沒有做session共享的應用使用,就比如瀏覽器一開始訪問那個tomcat,那麼該tomcat的sessionid就給瀏覽器,下次訪問時,還會到這個tomcat上,只有當這個tomcat掛了,那麼這個瀏覽器才會要求使用者重新登入。
server 127.0.0.1:18080;
server 127.0.0.1:28080;
}
server {
listen 443 ssl;#開啟HTTPS訪問
server_name 192.168.101.177;#這個是keepalived生成的虛擬IP
ssl_certificate /etc/nginx/ssl/server.crt;#前面生成的證書
ssl_certificate_key /etc/nginx/ssl/server.key; #前面生成的證書
location /xxx {#工程名,注意如果應用必須帶工程名,那麼工程名只能寫到這,而不能寫到127.0.0.1:18080/xxx那邊,會報錯
proxy_pass http://aaa; 這裡的aaa就是上面upstream的aaa
#配置 Nginx 的轉發選項
proxy_set_header HOST $host; #其中Host $host:$server_port; 非80埠 要port。用80埠時 不需要$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;
}
}
server {
listen 80;
server_name 192.168.101.177;
rewrite ^(.*) https://$server_name$1 permanent;強制重定向到https服務
location /xxx {
proxy_pass http://aaa;
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_set_header X-Forwarded-Proto $scheme;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
5、配置tomcat的server.xml
在Engine 模組下配置一個 Value:
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For"protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>非80埠時,要再加一個httpsServerPort="xxx" 這種方式實現了外部通過https訪問,但nginx和tomcat還是走http協議。 參考http://blog.csdn.net/woshizhangliang999/article/details/51861998 和http://blog.csdn.net/cangzihu/article/details/53488996以及http://blog.csdn.net/vfush/article/details/51086274、http://blog.csdn.net/hanshileiai/article/details/54579948