Nginx+Tomcat實現Web服務器的負載均衡

預備

先說一下什麼是負載均衡?

負載均衡(Load Balance)其意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。
負載均衡構建在原有網絡結構之上,它提供了一種透明且廉價有效的方法擴展服務器和網絡設備的帶寬、加強網絡數據處理能力、增加吞吐量、提高網絡的可用性和靈活性。1

從其定義上看,要搭建負載均衡,是要組網的,只‘一臺電腦’(操作單元)是不行滴。

什麼是Nginx?

Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。2

說到Nginx,再提一下另一款更加常見的Web服務器–Apache3,兩者對比看一下

- Nginx Apache
1 輕量級,採用 C 進行編寫,同樣的 web 服務,會佔用更少的內存及資源 apache 的 rewrite 比 nginx 強大,在 rewrite 頻繁的情況下,用 apache
2 抗併發,nginx 以 epoll and kqueue 作爲開發模型,處理請求是異步非阻塞的,負載能力比 apache 高很多,而 apache 則是阻塞型的。在高併發下 nginx 能保持低資源低消耗高性能 ,而 apache 在 PHP 處理慢或者前端壓力很大的情況下,很容易出現進程數飆升,從而拒絕服務的現象。 apache 發展到現在,模塊超多,基本想到的都可以找到
3 nginx 處理靜態文件好,靜態處理性能比 apache 高三倍以上 apache 更爲成熟,少 bug ,nginx 的 bug 相對較多
4 nginx 的設計高度模塊化,編寫模塊相對簡單 apache 超穩定
5 nginx 配置簡潔,正則配置讓很多事情變得簡單,而且改完配置能使用 -t 測試配置有沒有問題,apache 配置複雜 ,重啓的時候發現配置出錯了,會很崩潰 apache 對 PHP 支持比較簡單,nginx 需要配合其他後端用
6 nginx 作爲負載均衡服務器,支持 7 層負載均衡 apache 在處理動態請求有優勢,nginx 在這方面是雞肋,一般動態請求要 apache 去做,nginx 適合靜態和反向。
7 nginx 本身就是一個反向代理服務器,而且可以作爲非常優秀的郵件代理服務器 apache 仍然是目前的主流,擁有豐富的特性,成熟的技術和開發社區
8 啓動特別容易, 並且幾乎可以做到 7*24 不間斷運行,即使運行數個月也不需要重新啓動,還能夠不間斷服務的情況下進行軟件版本的升級 -
9 社區活躍,各種高性能模塊出品迅速 -

兩者最核心的區別在於 apache 是同步多進程模型,一個連接對應一個進程,而 nginx 是異步的,多個連接(萬級別)可以對應一個進程。一般來說,Nginx 適合處理靜態請求和反向代理,Apache 適合處理動態請求。

正向代理和逆向代理

正向代理,意思是一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),然後代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端才能使用正向代理。4
逆向代理,通常被稱做反向代理(Reverse Proxy),服務器根據客戶端的請求,從其關聯的一組或多組後端服務器(如Web服務器)上獲取資源,然後再將這些資源返回給客戶端,客戶端只會得知反向代理的IP地址,而不知道在代理服務器後面的服務器簇的存在。5

這兩者的意思差別還是很明顯的,正向代理是,我要去訪問一個服務器,可能是由某些原因吧,我雖然知道有這麼個服務器存在但是我無法直接去訪問,所以我只能去請求另外一個服務器(代理),幫我去訪問我要訪問的服務器獲取內容並返回給我,我作爲一個客戶端,我是知道我要訪問的真正的服務器的。而逆向代理是,我(客戶端)要請求遠程服務器內容,這個遠程服務器雖然也能給你想要的數據,但是呢,這個服務器實際上他也沒有真正的內容給你,他也是從別的地方(其他的服務器)去拿數據給你,這個過程對客戶端來說,是不透明的,客戶端不知道你是自己就能直接提供數據還是你是去別的地方拿的數據給我。
舉個通俗的例子就是,正向代理,是你要訪問谷歌網站,在國內,不好意思你被‘牆’了,訪問不到,但是,如果你有臺在新加坡的阿里雲服務器或者你有臺在香港的華爲雲服務器的話,你搭個代理你就可以成功越牆了!而逆向代理,就是下面我們要做的。

用Nginx搭建負載均衡服務器

正常情況你需要準備如下配置:

服務器名稱 系統 軟件 網絡
Nginx centos7 Nginx 192.168.0.5
Tomcat A centos7 tomcat、jdk 10.50.200.66:8091
Tomcat B centos7 tomcat、jdk 10.50.200.66:8092

我這裏沒這麼多資源,就用docker在一臺服務器上模擬這3臺虛擬機,實現一個簡單的反向代理和負載均衡服務。
在這裏插入圖片描述

首先拉取nginx和tomcat的鏡像

# docker pull nginx
# docker pull tomcat:8.5
[root@master ~]# docker images
REPOSITORY                                         TAG                 IMAGE ID            CREATED             SIZE
tomcat                                             8.5                 96c4e536d0eb        11 days ago         506MB
nginx                                              latest              5a3221f0137b        2 weeks ago         126MB

這裏nginx用最新的,tomcat用8.5版本的,全部拉取官方的

啓動Nginx

docker run -d -p 11180:80 nginx
[root@master nginx]# docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                                                                                    NAMES
ffaf961f636d        nginx                   "nginx -g 'daemon of…"   10 seconds ago      Up 8 seconds        0.0.0.0:11180->80/tcp

這裏nginx的默認端口是80,我這裏服務器80被使用了,所有映射到了11180端口

ok,這樣nginx就部署好了,可以訪問看看 : ip:11180
nginx
感慨一下docker的偉大!

啓動tomcat

# docker run -d -p 8091:8080 tomcat:8.5
# docker run -d -p 8092:8080 tomcat:8.5

因爲是在一臺服務器上,所以tomcat用docker模擬兩臺,也是用端口來區分的,分別用 8091和8092,如下:
TomcatA
TomcatB

[root@master nginx]# docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                     NAMES
64b298e41e38        tomcat:8.5              "catalina.sh run"        4 seconds ago       Up 3 seconds        0.0.0.0:8092->8080/tcp    tomcatB
20573cd3ae78        tomcat:8.5              "catalina.sh run"        35 seconds ago      Up 33 seconds       0.0.0.0:8091->8080/tcp    tomcatA
e70a5b3eb4f5        nginx                   "nginx -g 'daemon of…"   15 minutes ago      Up 14 minutes       0.0.0.0:11180->80/tcp     nginx

準備你的應用

將自己的一個應用分別放到兩臺tomcat服務器應用下。然後刷新地址,如下
在這裏插入圖片描述
在這裏插入圖片描述
注意兩臺tomcat上的應用完全一樣的。

配置Nginx逆向代理這兩臺tomcat

用默認的nginx配置啓動的話,會發現無法修改nginx的配置文件,因爲進入容器裏面無法使用vi或vim命令,實際上可以把nginx的配置文件映射的本地路徑下在修改,具體操作可看我以前博客,或自己百度。
這裏我只給配置:

# nginx配置
user  nginx;
# 工作進程個數,一般跟服務器cpu核數相等,或者核數的兩倍;
# 但是我這裏只配置兩個,因爲我這服務器還有其他應用就不配那麼多了
worker_processes  2;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

# 單個進程最大連接數
events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;

    # #服務器集羣
    upstream mycluster{
        # 集羣有幾臺服務器即可配置幾臺,weight表示權重,權重越大被訪問到的機率越大
        # 這裏添加的是上面啓動好的兩臺Tomcat服務器
        server 10.50.200.66:8091 weight=1;
        server 10.50.200.66:8092 weight=1;
    }

    include /etc/nginx/conf.d/*.conf;
}
server {
    listen       80;
    server_name  localhost;

    location / {
        # 將訪問請求轉向至服務器集羣,mycluster和http中upstream mycluster 對應
        proxy_pass http://mycluster;
    }

    error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

現在訪問一下nginx頁面,就可以了
在這裏插入圖片描述
另外爲了測試是否配置的兩臺tomcat輪流調用,可以改改自己的應用,比如說標題,多刷新幾次就能發現配置是生效的,這裏我就不截圖了!

好了,以上就是Nginx反向代理和負載均衡配置。很簡單吧!



  1. 百度百科-負載均衡 ↩︎

  2. 百度百科-Nginx ↩︎

  3. 百度百科-Apache HTTP Server(簡稱Apache) ↩︎

  4. 百度百科-正向代理 ↩︎

  5. 百度百科-反向代理 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章