Nginx配置Tomcat集群

Nginx

Nginx常用功能

  • Http代理,反向代理:作為web服務(wù)器最常用的功能之一,尤其是反向代理。
Nginx反向代理說明圖

Nginx在做反向代理時,提供性能穩(wěn)定,并且能夠提供配置靈活的轉(zhuǎn)發(fā)功能。Nginx可以根據(jù)不同的正則匹配,采取不同的轉(zhuǎn)發(fā)策略,比如圖片文件結(jié)尾的走文件服務(wù)器,動態(tài)頁面走web服務(wù)器,只要你正則寫的沒問題,又有相對應的服務(wù)器解決方案,你就可以隨心所欲的玩。并且Nginx對返回結(jié)果進行錯誤頁跳轉(zhuǎn),異常判斷等。如果被分發(fā)的服務(wù)器存在異常,他可以將請求重新轉(zhuǎn)發(fā)給另外一臺服務(wù)器,然后自動去除異常服務(wù)器。

  • 負載均衡
負載均衡說明圖1
負載均衡說明圖2

Nginx提供的負載均衡策略有2種:內(nèi)置策略和擴展策略。內(nèi)置策略為輪詢,加權(quán)輪詢,Ip hash。擴展策略,就天馬行空,只有你想不到的沒有他做不到的啦,你可以參照所有的負載均衡算法,給他一一找出來做下實現(xiàn)。

Nginx配置文件結(jié)構(gòu)

看一下nginx的默認配置

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml     application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##



    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;


}

嵌入其他配置文件

這個點是我一開始掉坑的地方,因為需求來了直接上手看的nginx,但是一直在默認配置中找不到已經(jīng)上線的應用配置,最后才了解到include嵌入其他的配置文件了,最后根據(jù)嵌入文件的路徑成功地找到了引入的配置文件,正是我想要的

Nginx worker進程運行的用戶及用戶組

默認 user nobody nobody;
user用于設(shè)置master進程啟動之后,fork出的worker進程運行在哪個用戶和用戶組下

Nginx worker進程個數(shù)

在master/worker運行方式下指定worker進程的個數(shù)
worker進程的數(shù)量會直接影響性能,每個worker進程都是單線程的進程,它們會調(diào)用各模塊以實現(xiàn)多種多樣的功能,如果這些模塊確定不會出現(xiàn)阻塞時的調(diào)用,那么有多少CPU內(nèi)核就應該配置多少個進程;反之,如果可能存在多個可能阻塞的調(diào)用,則需要多為worker分配一些進程

  • 例如磁盤IO一直是后端服務(wù)的一個瓶頸,如果分配的worker進程都是在執(zhí)行阻塞式的IO服務(wù),那么這個時候Nginx的效率可能會大大降低,這個時候就需要為Nginx多分配一點工作進程
  • 多worker進程可以充分利用多核的系統(tǒng)架構(gòu),但若worker進程的數(shù)量多于CPU內(nèi)核數(shù)的話,這樣同樣會增大進程之間來回切換造成的消耗(Linux是搶占式內(nèi)核),一般情況下與內(nèi)核相等的worker進程,就可以綁定到CPU內(nèi)核上

虛擬主機與請求分發(fā)

由于IP地址數(shù)量有限,一次你經(jīng)常存在多個諸暨域名對應同一個IP地址情況,這時在nginx.conf中就可以按照server_name(對應用戶請求中的主機域名)并通過server塊來定義虛擬主機,每個server塊就是個虛擬主機,他只處理與之相對應的主機域名請求

主機名稱

server_name后可以跟多個主機名稱,在開始處理一個HTTP請求時,Nginx會取出header中的Host,與每個server中的server_name進行匹配,決定到哪個server塊來處理這個請求,匹配規(guī)則也是有優(yōu)先級的①首先選擇所有字符串都完全匹配的server_name②其次選擇通配符在前的③選擇通配符在后的④最后選擇正則表達式匹配的

location

location會嘗試根據(jù)用戶請求中的URI來匹配/uri表達式,如果可以匹配,就會選擇這個location塊中的配置來處理用戶請求

文件路徑的定義

以root方式設(shè)置資源路徑比如說一條HTPP請求是一條請求資源的請求,這個時候就可以使用server和location匹配到這一條資源請求,并且使用root指定這條資源請求的目錄,實現(xiàn)資源訪問,同樣實現(xiàn)資源文件的訪問還可以在location匹配到url請求之后使用alias,這兩者間的配置有一些小的差別

一個用戶如果通過一條HTTP請求需要訪問到/user/local/nginx/conf/nginx.conf文件可使用如下兩種配置

location /conf {
    alias /usr/local/nginx/conf/;
}
location /conf {
    root /usr/local/nginx/;
}

使用alias時,在URI向?qū)嶋H文件路徑的映射過程中,已經(jīng)把location后的部分字符串丟棄掉了,因此,/conf/nginx.conf請求將根據(jù)alias path映射為path/nginx.conf
root則不一樣,他會根據(jù)完整的URI請求進行映射,因此/conf/nginx.conf將會被映射未root path/conf/nginx.conf,這也是為什么root可以放置到http、server、location中而alias只能存在于location中的原因

使用HTTP proxy module配置一個反向代理服務(wù)器

反向代理(reverse proxy)方式是指用代理服務(wù)器來接受Internet上的連接請求,然后根據(jù)請求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)中的上游服務(wù)器,并將從上有服務(wù)器上得到的結(jié)果返回Internet上請求連接的客戶端,此時代理服務(wù)器對外的表現(xiàn)就是一個web服務(wù)器,充當反向代理服務(wù)器也是nginx的通常用法

一般來說如果nginx作為反向代理服務(wù)器,接收到的請求若是針對靜態(tài)文件,則直接通過nginx將請求映射到本地的靜態(tài)資源上,如果需要動態(tài)的結(jié)果,即發(fā)出的是一條動態(tài)的請求,則需要繼續(xù)反向代理到真正的web服務(wù)器

當客戶端發(fā)來HTTP請求的時候,Nginx并不會立刻轉(zhuǎn)發(fā)到上游服務(wù)器,而是先把用戶的請求(包括HTTP包體)完整地接收到Nginx所在服務(wù)器的硬盤或者內(nèi)存中,然后再向上游服務(wù)器發(fā)起連接,把緩存的客戶端請求轉(zhuǎn)發(fā)到上游服務(wù)器,而其余的一些反向代理服務(wù)器采用的策略是邊接收客戶端的請求,邊進行轉(zhuǎn)發(fā)到上游服務(wù)器

Nginx這中工作方式存在一個明顯的缺點,很明顯,這種緩存策略相當于是延長了一個HTTP請求的時間,并增加了用于緩存請求內(nèi)容的內(nèi)存和磁盤空間,而優(yōu)點是降低了上游服務(wù)器的負擔,將負擔更多的放在了自己身上

但是Nginx的這個策略同時也大大提高了效率更降低了上游服務(wù)器的負擔,比如一個場景是一個客戶端想要上傳1G的文件,這個時候如果是別的一些反向代理服務(wù)器,則在剛與客戶端建立連接還沒有開始接收包體的時候,就開始向上游服務(wù)器進行發(fā)起連接,因為客戶端和反向代理服務(wù)器之間基本都是走外網(wǎng),這個時間加上自身網(wǎng)絡(luò)情況,上傳1G大小的文件通常是一個很耗時的操作,這個時候,這些反向代理服務(wù)器就要一直保持著和客戶端的關(guān)系,又要保持著和上游服務(wù)器的關(guān)系,這樣一個上傳文件操作就成了一個既耗時又耗資源的一個操作,而這個時候Nginx和客戶端建立連接之后完整地接收包體之后,通過內(nèi)網(wǎng)與上游服務(wù)器之間建立連接,這個速度和資源損耗就遠遠小于其余一些反向代理服務(wù)器了

在介紹nginx反向代理之前,搭了一個小型的tomcat集群,這樣的話就可以通過nginx做反向代理服務(wù)器,并且使用負載均衡策略,向上游的兩臺服務(wù)器按照指定的權(quán)重策略進行分發(fā)請求

搭建Tomcat服務(wù)器集群

首先,熟悉基于J2EE規(guī)范以及使用Spring框架開發(fā)的開發(fā)者應該都接觸過Tomcat這種并發(fā)量適中的小型web應用服務(wù)器,可是,如果有一天,你的項目訪問量,甚至說并發(fā)量到達了一定的級別,你會如何處理這種情況,原始的架構(gòu)只是單Tomcat服務(wù)器,但是這種結(jié)構(gòu)肯定不足以支撐對整個后端服務(wù)的運營,這個時候怎么辦,首先要想到的就是在有限的一臺服務(wù)器上鼓搗一個Tomcat集群,讓多臺Tomcat同時工作,并且使用nginx作為反向代理服務(wù)器,配置負載均衡策略,這樣去解決單臺Tomcat負擔過大訪問量的單臺服務(wù)器瓶頸

簡易搭建Tomcat集群

  • 首先需要確保自己的電腦或者服務(wù)器上有安裝過后的兩臺Tomcat服務(wù)器

    我為這兩臺服務(wù)器分別起名為main以及secoundary便于區(qū)分,并且修改了webapps中ROOT文件夾下的圖標,這樣的話一會兒在測試的環(huán)節(jié)上就能區(qū)分出nginx分發(fā)請求到了哪一臺上游服務(wù)器

    解壓后的兩臺Tomcat服務(wù)器
  • 修改/etc/profile

    添加如下字段

    /etc/profile
  • 修改secondary中/bin/catalina.sh文件,注意這里不要修改main中的catalina.sh

    在OS結(jié)點下添加如下信息,使secondary開啟的時候使用/ect/profile中配置的第二條配置啟動

    修改catalina.sh
  • 修改secondary中conf/server.xml

    找到Server結(jié)點修改為,main中Server結(jié)點端口為8005


    修改Server結(jié)點
  • 修改Connector結(jié)點,并且為了防止亂碼增加URIEncoding屬性,main為8080默認端口

    修改Connector結(jié)點
  • 修改AJP端口

    修改AJP端口

    AJP Connector
    The AJP Connector element represents a Connector component that communicates with a web connector via the AJP protocol.
    AJP連接器可以通過AJP協(xié)議和一個web容器進行交互

    當你想讓Apache和Tomcat結(jié)合并且你想讓Apache處理靜態(tài)內(nèi)容的時候用AJP,或者你想利用Apache的SSL處理能力時

    特殊于HTTP Connector,AJP還可以與engine元素上的jvmRoute結(jié)合使用來實現(xiàn)負載均衡功能

配置nginx.conf

修改nginx.conf
  • 簡單說一下這一段的配置

  • upstream結(jié)點

    upstream結(jié)點用來配置上游服務(wù)器ip以及端口,用于nginx轉(zhuǎn)發(fā)使用,在這里這個www.dzjissz.com域名是在本地hosts中配置指向127.0.0.1的域名,所以就相當于指向本地服務(wù)器ip

  • server結(jié)點中的server_name

    簡單地來說,location塊需要結(jié)合server_name和location后的uri進行匹配,并且根據(jù)location塊中的proxy_pass配置確定轉(zhuǎn)發(fā)的upstream結(jié)點

  • 這一段nginx的配置主要就是當用戶通過www.dzjissz.com這個域名作為url訪問服務(wù)的時候,nginx匹配到了這個請求,并且向上游兩個開啟的8080和9080的tomcat服務(wù)器進行轉(zhuǎn)發(fā),因為沒有指定權(quán)重,所以兩臺服務(wù)器的權(quán)重weight默認都為1, 我們來看一下效果

main
secondary

可以看出當使用localhost訪問服務(wù)的時候,相當于www.dzjissz.com作為url進行請求,可以看到nginx將請求轉(zhuǎn)發(fā)到了兩臺開啟在不同端口的tomcat服務(wù)器。

到這里簡單的tomcat集群也就搭建完成了,修改完配置文件和環(huán)境變量文件記得使其生效,否則等于啥都沒干

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,697評論 19 139
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 33,039評論 24 1,002
  • 上一篇《WEB請求處理一:瀏覽器請求發(fā)起處理》,我們講述了瀏覽器端請求發(fā)起過程,通過DNS域名解析服務(wù)器IP,并建...
    七寸知架構(gòu)閱讀 81,807評論 21 356
  • Page 1:nginx 服務(wù)器安裝及配置文件詳解 CentOS 6.2 x86_64 安裝 nginx 1.1 ...
    xiaojianxu閱讀 8,695評論 1 41
  • 嚴格意義上來說,今天是我失業(yè)的第一天…… 自畢業(yè)到現(xiàn)在的十三年時間,還從來沒有出現(xiàn)過現(xiàn)在的狀況,之前雖然是已經(jīng)失業(yè)...
    俺家有狗閱讀 227評論 0 0

友情鏈接更多精彩內(nèi)容