1. 程式人生 > >nginx 反向代理 tomcat (https、虛擬主機)

nginx 反向代理 tomcat (https、虛擬主機)

nginx

背景:

有一個JSP開發的網站,需要放在tomcat裏面運行,考慮到tomcat處理http請求不是那麽強,計劃前端添加一個nginx作為反向代理,並且提供https服務,並且通過虛擬主機開代理到指定域名的服務。

我們的域名是www.wzlinux.com。

1、首先是安裝nginx和tomcat

2、nginx配置文件如下

包含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;
    }
}

3、tomcat虛擬主機的設定

修改conf/server.xml文件,添加如下內容

<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="brandquest_log." suffix=".txt"
               pattern="%{X-Forwarded-For}i %l %u %t &quot;%r&quot; %s %b" />
</Host>

就是這麽簡單啦!!!!!


附錄: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地址, 這通常是一個比較可靠的信息來源。



技術分享

本文出自 “運維點滴記錄” 博客,請務必保留此出處http://wzlinux.blog.51cto.com/8021085/1956163

nginx 反向代理 tomcat (https、虛擬主機)