2014年3月14日 星期五

[記事] 使用 Nginx 做為 Jboss 的反向代理、負載平衡

屬於阿宅世界的技術文章,想看的再點開,切莫自誤 !

人老了不習慣新事物,看到Application Server直接對外,雖然也沒什麼不可以,但就是覺得怪怪的。玩Nginx時順便試了一下,是可以做到的反向代理及負載平衡的

環境

Nginx : 10.0.0.1 listen on 80
Jboss AS (7) 01 : 10.0.0.2 listen on 8080 with Application /App1
JBoss AS (8) 02 : 10.0.0.2 listen on 8081 with Application /App2
JBoss AS (7) 03 : 10.0.0.3 listen on 8080 with Application /App1

nginx 中的設定很簡單

單獨存取 JBoss 02 上的App2 的話,Nginx 中 http 的設定可以這樣寫
http {
  # <略>
  server { 
    listen    80;
    #<略>

    location /App2 {
      proxy_pass              http://10.0.0.2:8081 ;
      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;
    }
}

這樣就可以透過 http://10.0.0.1/App2存取了,但有個小問題是 JBoss 的Access log 吃到的來源 IP 通通會變成 10.0.0.1
必須將 JBoss 的 log pattern做點小修改
<access-log pattern="%{X-Real-IP}i %a %l %u %D %t %r %s %b %{Referer}i %{User-Agent}i"/>

如果是有兩台 Application Server 做負載平衡去存取 /App1 ,也差不多簡單,多一個 upstream的區塊去定義伺服器群就好
http {
  # <略>
  upstream Jboss {
      server 10.0.0.2:8080;
      server 10.0.0.3:8080;
  }
  server { 
    listen    80;
    #<略>

    location /App1 {
      proxy_pass              http://Jboss ;
      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;
    }
}

如果架構沒那麼雜,沒有說什麼網頁要去那一區Application Server,另外的什麼網頁要去另一區,那location 後頭指向 "/" 就好。

另外這個 proxy 的功能還能指定權重、備用server等,還算可以用。

比較悲催的是 health check 的部份,預設就有max_fail、fail_timeout、slow_start這些參數,但組不出太聰明的機制,如果要聰明版的health_check nginx 有這個功能,罷特,要在 nginx plus 這個收錢的版本才有,如果用免錢的..
在維修或是重啟 application server 的時候,還是去改一下 nginx.conf (拿掉維修的 server 或是在該 server 後頭加一個 down 的關鍵字) 吧


0 意見:

張貼留言