天天看點

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

  • 下載下傳nginx位址:http://nginx.org/en/download.html

本版本采用1.8版本,如圖:

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡
  • nginx安裝
  1. 安裝依賴
yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel
           
Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

2.下載下傳好nginx-1.8.1.tar.gz存放到 伺服器Centos 7 上的 /usr/local/ 下

3.解壓 nginx-1.8.1.tar.gz

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

4.進行 configure配置(ps:目前我在 /usr/local/ 的位置,執行以下指令)

cd /usr/local/nginx-1.8.1 && ./configure --prefix=/usr/local/nginx
           

5.編譯安裝(ps:4步驟執行後,馬上進行5步驟)

make && make install
           

安裝完畢後,将在 /usr/local/下看到 nginx檔案夾,nginx檔案夾中有四個檔案夾: conf 存放配置檔案 html 存放靜态頁面 logs 存放日志檔案 sbin 執行檔案 6.啟動 nginx

/usr/local/nginx/sbin/nginx //啟動
    /usr/local/nginx/sbin/nginx -s stop //關閉
    /usr/local/nginx/sbin/nginx -s reload //重新開機
    附帶:檢視啟動狀态
    ps -ef | grep nginx
           

啟動成功如圖:

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

浏覽器通路即可,出現下圖經典歡迎頁面表示 nginx 安裝成功

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

ps:如果登入不到,就可能是防火牆屏蔽80端口,需要如下代碼釋放80端口:

firewall-cmd --permanent --zone=public --add-port=80/tcp
   firewall-cmd --permanent --zone=public --add-port=80/udp
   firewall-cmd --reload 
           
  • nginx配置

nginx 的配置檔案預設位于 /usr/local/nginx/conf/ 下的 nginx.conf

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

nginx簡單的配置講解(ngnix.conf檔案)

#開啟程序數 <=CPU數 
      worker_processes  1;
      #自定義錯誤日志儲存位置,全局設定,預設logs/error.log
      #error_log  logs/error.log;
   #每個程序最大連接配接數(最大連接配接=連接配接數x程序數)每個worker允許同時産生多少個連結,預設1024
      events {
          worker_connections  1024;
      }
      #
      http {
          #檔案擴充名與檔案類型映射表
          include       mime.types;
          #預設檔案類型
          default_type  application/octet-stream;
          #自定義日志檔案輸出格式 全局設定
          log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
          #自定義全局請求日志儲存位置,全局設定,預設logs/access.log, 定義格式:檔案存儲位置 + 日志輸出格式
          #access_log  logs/access.log  main;
          #打開發送檔案
          sendfile        on;
          #連接配接逾時時間
          #keepalive_timeout  0;
          keepalive_timeout  65;
          #打開gzip壓縮
          #gzip  on;
          #配置虛拟主機,基于域名、ip和端口,可以配置多個server
          server {
              #監聽端口,可以是ip:port 或者 port
              listen       80;
              #監聽域名,可以是ip或者域名,server_name有三種比對方式:精準比對(www.domain.com)、通配符比對(*.domain.com 、www.*)、正規表達式比對(~^(?.+)\.domain\.com$)
              server_name  localhost;
              #自定義請求日志,局部,目前server有效
              #access_log  logs/host.access.log  main;
              #錯誤頁面及其傳回位址
              error_page   500 502 503 504  /50x.html;
              #請求比對,同樣有精準(= /index.html)、模糊(~ index)、正則,允許配置多個location
              location / {
                  #傳回根路徑位址(相對路徑:相對于/usr/local/nginx/)
                  root   html;
                  #預設首頁
                  index  index.html index.htm;
              }
              #
              location /html {
                  root   html;
                  index  index.html index.htm;
              }
              #
          }
          #
      }
           
  • nginx反向代理、動靜分離、負載均衡

反向代理:要說 反向代理,我們就先要了解 正向代理  ,下面我們就談談正向代理和反向代理吧。 正向代理:一個位于用戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得内容,用戶端向代理發送一個請求并指定目标(原始伺服器),然後代理向原始伺服器轉交請求并将獲得的内容傳回給用戶端。用戶端才能使用正向代理。(摘自百度百科) 如下圖:

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

正向代理好比,你去找工作,首先你不知道哪裡有工作,但是你可以把你的要求資訊告訴别人,這時别人知道你想找什麼樣的工作了。他就幫你問,然後又合适的工作後,别人告訴你這裡有符合你要求的工作,你就可以去試試了。 正向代理總結就一句話:代理端代理的是用戶端。

反向代理: 反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連接配接請求,然後将請求,發給内部網絡上的伺服器,并将從伺服器上得到的結果傳回給internet上請求連接配接的用戶端,此時代理伺服器對外就表現為一個反向代理伺服器。(摘自百度百科) 如下圖:

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

反向代理好比,你去超市或者購物中心購物,超市、購物中心就好比一個代理。你隻關心你去超市、購物中心購買你想買的商品,具體商品從哪裡來你并不關心。但是超市本沒有商品,是以超市、購物中心自身去進貨,這個過程你并不知道,沒有感覺。這時代理端代理的是超市、購物中心,你并看不到供貨商。 反向代理總結就一句話:代理端代理的是服務端。 下面我們就來看看nginx的反向代理如何做了,反向代理前後如圖:

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

nginx反向代理其實主要通過配置 proxy_pass 參數即可代理到某個伺服器

vim /usr/local/nginx/conf/nginx.conf
           

添加如下配置即可:

location / {  //在對應的 location 中配置,配置中的監聽端口為80
           proxy_pass http://127.0.0.1:8081  #我這裡tomcat的端口為8081
           root   html;
           index  index.html index.htm;
        }
           

啟動 tomcat 、 nginx , /usr/local/nginx/sbin/nginx

tomcat
    啟動: /usr/local/tomcat8/bin/startup.sh
    關閉: /usr/local/tomcat8/bin/shutdown.sh
   ngnix
   啟動: /usr/local/nginx/sbin/nginx 
   關閉: /usr/local/nginx/sbin/nginx -s stop 
   測試:http://192.168.2.144/
           
Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

但是當我們通路 http://192.168.2.144/demo.jsp ,如下圖: demo.jsp ,将demo.jsp拷貝到 tomcat 中 ROOT 下,中代碼如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Welcome to my demo.jsp</title>
    </head>
    <body>
    歡迎 my demo.jsp<br/>
    通路的 ip 位址:   <%=request.getHeader("real_ip") %> <br/>
    nginx server ip is: <%=request.getRemoteAddr()%>
    </body>
    </html>
           

我們得到的是nginx代理伺服器的ip,但是我們并不想要代理伺服器的ip,我們想要的是用戶端真實的通路ip,是以我們可以通過nginx中擷取真實ip,然後傳給真實伺服器。 同樣,我們需要到 nginx.conf 中配置,如下 : proxy_set_header real_ip $remote_addr;

location / {
   #設定真實ip
   proxy_set_header real_ip $remote_addr;  //real_ip 設定變量名,可以通過web端擷取
   proxy_pass http://127.0.0.1:8081;
   root   html;
   index  index.html index.htm;
}
           

接下來,重新開機 nginx 、 tomcat,通路浏覽器

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡
  • 動态資源、靜态資源分離

動态資源、靜态資源分離是讓動态網站裡的動态網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以後,我們就可以根據靜态資源的特點将其做緩存操作,這就是網站靜态化處理的核心思路 動态資源、靜态資源分離簡單的概括是:動态檔案與靜态檔案的分離。 為什麼要做動 、靜分離? 在我們的軟體開發中,有些請求是需要背景處理的(如:.jsp,.do等等),有些請求是不需要經過背景處理的(如:css、html、jpg、js等等檔案),這些不需要經過背景處理的檔案稱為靜态檔案,否則動态檔案。是以我們背景處理忽略靜态檔案。這會有人又說那我背景忽略靜态檔案不就完了嗎。當然這是可以的,但是這樣背景的請求次數就明顯增多了。在我們對資源的響應速度有要求的時候,我們應該使用這種動靜分離的政策去解決。 動、靜分離将網站靜态資源(HTML,JavaScript,CSS,img等檔案)與背景應用分開部署,提高使用者通路靜态代碼的速度,降低對背景應用通路。這裡我們将靜态資源放到nginx中,動态資源轉發到tomcat伺服器中。

是以,動态資源轉發到tomcat伺服器我們就使用到了前面講到的反向代理了。 vim /usr/local/nginx/conf/nginx.conf

location / {
            #設定真實ip
            proxy_set_header real_ip $remote_addr;
            proxy_pass http://127.0.0.1:8081;
            root   html;
            index  index.html index.htm;
        }
           

修改為:

//動态資源
 location ~ \.(jsp|jspx|do|action)(\/.*)?$ { 
//動态請求轉發到tomcat伺服器,比對方式可自定義 
#設定真實
ip proxy_set_header real_ip $remote_addr; //real_ip 設定變量名,可以通過web端擷取 
proxy_pass http://127.0.0.1:8080; 
} 
//靜态資源 
location ~ .*\(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { 
//靜态資源到nginx伺服器下static(具體目錄自定義)擷取 
root static; 
}
           

啟動 tomcat 、 nginx ,通路 http://192.168.58.149/123.jpg 和 http://192.168.58.149/demo.jsp,如圖: 靜态資源:

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

動态資源:

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡
  • 負載均衡

負載均主要衡解決網絡擁塞問題,提高伺服器響應速度,服務就近提供,達到更好的通路品質,減少背景伺服器大并發壓力。主要根據算法政策将請求分攤到多台背景伺服器處理。我們以 weight (權重)政策為例:

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

nginx 實作負載均衡主要通過 upstream , 以兩個tomcat伺服器為例: 192.168.58.149:8080   和   192.168.58.150:8080 nginx.conf 配置如下: 在   http   下配置:

upstream balance {
 #weight 值越大,負載權重越大,請求次數越多
 #max_fails 允許請求失敗的次數,超過失敗次數後,轉發到下一個伺服器,當有max_fails個請求失敗,就表示後端的伺服器不可用,預設為1,将其設定為0可以關閉檢查 
#fail_timeout 指定時間内無響應則失敗, 在以後的fail_timeout時間内nginx不會再把請求發往已檢查出标記為不可用的伺服器 
#down 表示目前server不參與負載
#backup 其他非backup server都忙的時候,backup server作為備用伺服器,将請求轉發到backup伺服器 
server 192.168.2.190:8081 weight=1 max_fails=2 fail_timeout=30s; 
server 192.168.2.39:8081 weight=1 max_fails=2 fail_timeout=30s;
server 127.0.0.1:8081 down;
#server 192.168.58.152:8080 backup;
}

location / { 
#設定真實ip 
proxy_set_header real_ip $remote_addr; 
#real_ip 設定變量名,可以通過web端擷取 
proxy_pass http://balance;  //配置上面添加的負載伺服器 
}
注意upstream放在http下,和server為同級,不然會報 nginx: [emerg] "xxx" directive is not allowed here in xxxx 之類報錯。
           

啟動 149的tomcat、150的tomcat 、 nginx ,通路浏覽器試試吧: 連續通路兩次效果圖如下: 第一次:

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

第二次:

Centos 7 安裝nginx 并結合 tomcat 反向代理 負載均衡

除了上面提到的 weight 權重政策,還有 ip_hash、url_hash 哈希政策,後續有時間再補上吧。

繼續閱讀