背景:前端
有一個JSP開發的網站,須要放在tomcat裏面運行,考慮到tomcat處理http請求不是那麼強,計劃前端添加一個nginx做爲反向代理,而且提供https服務,而且經過虛擬主機開代理到指定域名的服務。linux
咱們的域名是www.wzlinux.com。nginx
一、首先是安裝nginx和tomcatweb
二、nginx配置文件以下apache
包含301調整,以及https證書的設定,個人證書是在阿里雲申請的,免費的哦
後端
# # HTTPS server configuration # server { listen 80; server_name www.wzlinux.com; # enforce https return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name www.wzlinux.com; ssl on; ssl_certificate /etc/nginx/cert/214226183630572.pem; ssl_certificate_key /etc/nginx/cert/214226183630572.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # location / { proxy_send_timeout 30; 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_pass http://10.0.1.7:8080; } }
三、tomcat虛擬主機的設定緩存
修改conf/server.xml文件,添加以下內容tomcat
<Host name="www.wzlinux.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase= "/usr/local/tomcat/webapps/wzlinux" reloadable="true" crossContext="true" /> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="wzlinux." suffix=".txt" pattern="%{X-Forwarded-For}i %l %u %t "%r" %s %b" /> </Host>
就是這麼簡單啦!!!!!bash
附錄:nginx中proxy_set_header Host $host的做用服務器
nginx爲了實現反向代理的需求而增長了一個ngx_http_proxy_module模塊。其中proxy_set_header指令就是該模塊須要讀取的配置文件。在這裏,全部設置的值的含義和http請求同中的含義徹底相同,除了Host外還有X-Forward-For。
nginx爲了實現反向代理的需求而增長了一個ngx_http_proxy_module模塊。其中proxy_set_header指令就是該模塊須要讀取的配置文件。在這裏,全部設置的值的含義和http請求同中的含義徹底相同,除了Host外還有X-Forward-For。
Host的含義是代表請求的主機名,由於nginx做爲反向代理使用,而若是後端真是的服務器設置有相似防盜鏈或者根據http請求頭中的host字段來進行路由或判斷功能的話,若是反向代理層的nginx不重寫請求頭中的host字段,將會致使請求失敗【默認反向代理服務器會向後端真實服務器發送請求,而且請求頭中的host字段應爲proxy_pass指令設置的服務器】。
同理,X_Forward_For字段表示該條http請求是有誰發起的?若是反向代理服務器不重寫該請求頭的話,那麼後端真實服務器在處理時會認爲全部的請求都來在反向代理服務器,若是後端有防***策略的話,那麼機器就被封掉了。所以,在配置用做反向代理的nginx中通常會增長兩條配置,修改http的請求頭:
proxy_set_header Host $http_host;
proxy_set_header X-Forward-For $remote_addr;
這裏的$http_host和$remote_addr都是nginx的導出變量,能夠再配置文件中直接使用。若是Host請求頭部沒有出如今請求頭中,則$http_host值爲空,可是$host值爲主域名。所以,通常而言,會用$host代替$http_host變量,從而避免http請求中丟失Host頭部的狀況下Host不被重寫的失誤。
X-Forwarded-For:簡稱XFF頭,它表明客戶端,也就是HTTP的請求端真實的IP,只有在經過了HTTP 代理或者負載均衡服務器時纔會添加該項。 它不是RFC中定義的標準請求頭信息,在squid緩存代理服務器開發文檔中能夠找到該項的詳細介紹。標準格式以下:X-Forwarded-For: client1, proxy1, proxy2。
這一HTTP頭通常格式以下:
X-Forwarded-For: client1, proxy1, proxy2;
其中的值經過一個 逗號+空格 把多個IP地址區分開, 最左邊(client1)是最原始客戶端的IP地址, 代理服務器每成功收到一個請求,就把請求來源IP地址添加到右邊。 在上面這個例子中,這個請求成功經過了三臺代理服務器:proxy1, proxy2 及 proxy3。請求由client1發出,到達了proxy3(proxy3多是請求的終點)。請求剛從client1中發出時,XFF是空的,請求被髮往proxy1;經過proxy1的時候,client1被添加到XFF中,以後請求被髮往proxy2;經過proxy2的時候,proxy1被添加到XFF中,以後請求被髮往proxy3;經過proxy3時,proxy2被添加到XFF中,以後請求的的去向不明,若是proxy3不是請求終點,請求會被繼續轉發。
鑑於僞造這一字段很是容易,應該謹慎使用X-Forwarded-For字段。正常狀況下XFF中最後一個IP地址是最後一個代理服務器的IP地址, 這一般是一個比較可靠的信息來源。