1. 程式人生 > >nginx反向代理tomacat+keepalived實現動靜分離、負載均衡、高可用

nginx反向代理tomacat+keepalived實現動靜分離、負載均衡、高可用

時間 超時 error css 權限命令 上傳 轉發 onf ioc

本文的動靜分離主要是通過nginx+tomcat來實現,其中nginx處理圖片、html、JS、CSS等靜態文件,tomcat處理jsp、servlet等動態請求

服務器名稱 系統版本 預裝軟件 IP地址

Nginx服務器 CentOS 7 最小安裝 Nginx 192.168.22.228

Web服務器A CentOS 7 最小安裝 tomcat+jdk 192.168.22.229

Web服務器B CentOS 7 最小安裝 tomcat+jdk 192.168.22.300

Nginx服務器做負載均衡、高可用、反向代理和動靜分離,服務器A,B做集群。

Nginx安裝(192.168.22.228)

官網下載:http://nginx.org/en/download.html
版本號: nginx-1.8.0.tar.gz

① 解壓文件

[root@localhost ~]# cd /usr/local/software/
[root@localhost software]# tar -zxvf  nginx-1.8.0.tar.gz

② 進步Nginx目錄進行編譯安裝

[root@localhost local]# cd /usr/local/software/nginx-1.8.0
[root@localhost nginx-1.8.0]# ./configure --prefix=/usr/local/nginx
[root@localhost nginx-1.8.0]# make & make install

③ 啟動Nginx

[root@localhost local]#  /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
[root@localhost local]#ln –s  /usr/local/nginx/sbin/nginx   /usr/local/sbin/    
 #這樣執行命令就不用決定路徑了

常見錯誤

在進行./configure 命令的時候經常會因為缺少庫文件而報錯,如下:

錯誤一:缺少gc++庫文件

解決方式:在線安裝gcc gcc-++

yum -y install gcc  gcc-++ autoconf automake

錯誤二:缺少PCRE庫
./configure: error: the HTTP rewrite module requires the PCRE library.

解決方式:安裝pcre-devel解決問題

yum -y install pcre-devel
 

錯誤三:
錯誤提示:./configure: error: the HTTP cache module requires md5 functions
from OpenSSL library. You can either disable the module by using

解決方式:

yum  -y install openssl openssl-devel
安裝後繼續執行configure命令,即可完成Nginx的安裝
[root@localhost nginx-1.8.0]# ./configure --prefix=/usr/local/nginx 
[root@localhost nginx-1.8.0]# make & make install

Nginx的啟動、停止、重啟

首先介紹如何查看Nginx的進程號:
用命令:ps -ef|grep nginx 查看

[root@localhost local]# ps -ef|grep nginx

root 13421 1 0 02:55 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

nobody 13422 13421 0 02:55 ? 00:00:00 nginx: worker process

root 13448 7858 0 03:04 pts/0 00:00:00 grep --color=auto nginx

① 啟動方式

【Nginx啟動文件地址】 -c 【Nginx配置文件地址】

例如:

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
當然上面ln做了軟鏈接  直接輸入 nginx 即可啟動
 
② 關閉方式
強制停止 : pkill -9 nginx
          nginx stop

③ 重啟

第一種reload命令:

    [root@localhost local]# cd /usr/local/nginx/sbin/
    [root@localhost sbin]# ./nginx -s reload
至此Linux環境下 Nginx的安裝配置以及啟動停止都已經講解完成了
 

TomCat安裝配置(192.168.22.229-192.168.22.300)兩臺安裝配置一樣

軟件環境:jdk1.8
軟件下載目錄:/usr/lcoal/software
軟件安裝目錄:/usr/local/

jdk環境安裝配置:

下載jdk包:

jdk官網下載地址,下載需要的Linux版本rpm包:jdk-8u65-linux-x64.rpm

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

開始安裝:

① 檢查系統是否自帶jdk,如果系統自帶jdk,需要先將它卸載掉.然後安裝我們需要的jdk.

檢查是否安裝jdk命令:

rpm -qa | grep jdk
技術分享圖片

刪除自帶jdk的命令:

rpm -e --nodeps  java-1.6.0-openjdk-1.6.0.0-1.41.1.10.4.el6.x86_64

或者用 yum -y remove 命令刪除:

 yum -y remove  java-1.6.0-openjdk-1.6.0.0-1.41.1.10.4.el6.x86_64
執行完後,檢查是否刪除成功:
技術分享圖片
②通過xmanager將安裝包上傳至服務器 /storage/sdc-data/software/ 目錄下

③獲取文件權限

獲取文件權限命令:

chmod -R 777   /storage/sdc-data/software/jdk-8u65-linux-x64.rpm 

這個命令是給資源添加執行權限,如果沒有這步,下一步會提示權限不夠。綠色代表有寫的權限

④安裝jdk

執行安裝命令:

rpm -ivh  /storage/sdc-data/software/jdk-8u65-linux-x64.rpm

該命令將jdk默認安裝到了/usr/java目錄下

技術分享圖片

⑤.將jdk安裝目錄,重命名並且移動到目錄/usr/local/下。並查看是否移動成功

mv命令用於文件改名,移動文件位置。

mv /usr/java/jdk1.8.0_45 /usr/local/jdk1.8

技術分享圖片

用vi命令 打開文件,打開後默認是命令模式,輸入a或i可進入編輯模式

vi /etc/profile

在文件最後配置如下變量,編輯完成按ESC鍵退出編輯,然後輸入:wq或者:x保存退出

JAVA_HOME=/usr/local/jdk1.8

PATH=$JAVA_HOME/bin:$PATH

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME export

PATH export CLASSPATH

然後輸入source /etc/profile命令,使配置文件生效。
source /etc/profile

⑦.java -version

出現如下版本信息,則說明一切安裝配置成功。至此,Linux環境安裝配置JDK完成,開始安裝tomcat

3.安裝tomcat

① 進入軟件包所在目錄

[root@localhost local]# cd /usr/local/software/
[root@localhost software]# ls
apache-tomcat-8.0.30.tar.gz  jdk-8u45-linux-x64.rpm  redis-3.0.5.tar.gz

② 解壓tomcat

[root@localhost software]# tar -zxvf apache-tomcat-8.0.30.tar.gz 
apache-tomcat-8.0.30/bin/catalina.sh
apache-tomcat-8.0.30/bin/configtest.sh
apache-tomcat-8.0.30/bin/daemon.sh
apache-tomcat-8.0.30/bin/digest.sh
apache-tomcat-8.0.30/bin/setclasspath.sh
apache-tomcat-8.0.30/bin/shutdown.sh
apache-tomcat-8.0.30/bin/startup.sh
apache-tomcat-8.0.30/bin/tool-wrapper.sh

③ 移動並更名

[root@localhost software]# mv apache-tomcat-8.0.30 /usr/local/tomcat8
④ 啟動tomcat
[root@localhost local]# cd /usr/local/tomcat8/bin/ 
[root@localhost bin]# ./startup.sh 
Using CATALINA_BASE: /usr/local/tomcat8 
Using CATALINA_HOME: /usr/local/tomcat8 
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp 
Using JRE_HOME: /usr/local/jdk1.8 
Using CLASSPATH: /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar 
Tomcat started. 
[root@localhost bin]# 
⑤ 客戶機瀏覽器訪問
技術分享圖片
 

PS:遠程測試前,需要將Linux防火墻關閉。

CentOS7關閉防火墻命令:

systemctl stop firewalld (臨時關閉防火墻)

systemctl disable firewalld (永久關閉防火墻)

tomcat可以理解為小型的web服務器,默認首頁路徑

/usr/local/tomcat8/webapps/examples\index.html

nginx反向代理和負載均衡

解釋:正向代理就是我們訪問外國網站,我們本身是訪問不了的,帶可以通過使用代理上

反向代理就是代理服務器,比如我們這裏nginx代理tomcat ,客戶訪問tomcat時其實先通過nginx

以下了配置好了負載均衡和反向代理的nginx.conf

worker_processes 2;
events{
worker_connections 1024;
}
http{
keepalive_timeout 65;
gzip on;
upstream mycluster{ #配置負載均衡
server 192.168.22.299:8080 weight=1;
server 192.168.24.300:8080 weight=1;
}

server{
listen 8088; #這裏不用默認的80,80也是可以用的
server_name 192.168.22.298;
location /{
proxy_pass http://mycluster; #反向代理

#如果沒配置負載均衡,其實只要這裏指定後面服務器ip的即可實現反向代理,當然這裏配置了負載均衡,所以要指定後面服務器的IP列表,比如這裏的兩個tomcat 的 ip地址,下面的proxy配置可以不要
proxy_set_header X-Real-IP $remote_addr; # 真實的客戶端IP
proxy_set_header Host $host; # 請求頭中Host信息
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理路由信息,此處取IP有安全隱患
proxy_set_header X-Forwarded-Proto $scheme; # 真實的用戶訪問協議
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
這樣nginx反向代理和負載均衡就配置完成了,當客戶訪問192.168.22.298,當負載均衡訪問的是192.168.22.299-192.168.22.300

附加

upstream backend { #如果負載均衡集群只要一臺服務器,就需要配置ip_hash

ip_hash;

server backend1.example.com max_fails=3 fail_timeout=30s;

server backend2.example.com down;

}

如果使用了該指令,那麽將會導致客戶端的請求以客戶端的ip地址分布在upstream中的server之間,它的關鍵技術在於對這個請求客戶端ip地址進行哈希計算,這種方式保證了客戶端總是能夠傳遞到同一臺後臺服務器,但是如果該服務器被認定為無效,那麽這個客戶端的請求將會被傳遞到其他服務器。因此這種機制是一個高概率將客戶端請求總是連接到同一臺服務器

如果使用這個指令,就不能使用weight方法,如果一個upstream中指定一臺s的erver,這個服務器需要移除,那麽需要在該IP或者機器名之後添加down參數。

為了區分訪問192.168.22.228會自動負載均衡先訪問到192.168.22.229,在刷新就訪問到192.168.22.300,為了方便測試,把兩臺tomcat的默認首頁該下內容區分

小結

這篇文章通過Nginx反向代理實現了Tomcat服務器集群的負載均衡效果。從這個Demo中,我們可以簡單地感受到反向代理為我們所做的事情,並體會到什麽是負載均衡。當然這次只是簡單的使用了一下Nginx,做了一些很簡單的配置,後續會做一些針對負載均衡的優化配置,還有就是Session共享的問題,以及Nginx高可用的問題,這些知識後續博客會介紹到,萬丈高樓平地起,一步一步來。

nginx動靜分離配置

新建測試目錄drp(mkdir –p /usr/local/tomcat8/webapps/drp)。(兩個tomcat同樣配置)

建立JSP動態頁面,vim /usr/local/tomcat8/webapps/drp/index.jsp

<%@ page language="java" contentType="text/html; charset=GB18030"

pageEncoding="GB18030"%>

<HTML>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GB18030">

<title>Nginx動靜分離測試</title>

</head>

<body>

<h1>您正在訪問:192.168.22.229</h1>

<img src="/drp/img/girl.jpg" alt="女孩" />

</body>

</html>

Jsp放到drp目錄中(mkdir –p /usr/local/tomcat8/webapps/drp),添加一個圖片標簽,加載Tomcat根目錄下 /usr/local/tomcat8/webapps/drp/img/girl.jpg圖片文件(可以換成其他圖片)。啟動Tomcat測試是否能夠訪問。(兩個tomcat同樣配置)

瀏覽器輸入網址:http://192.168.22.229:8080/drp/index.jsp

瀏覽器輸入網址:http://192.168.22.300:8080/drp/index.jsp 測試訪問正常後再繼續

對Nginx進行配置,完整的Nginx配置文件:

user nobody;

worker_processes 2;

events{

worker_connections 1024;

}

http{ #設置默認類型為二進制流

default_type application/octet-stream; #這裏的路徑好像不對,因為文檔是湊出來的,

server_names_hash_bucket_size 128;

#指定來自客戶端請求頭的headerbuffer大小,設置為32KB

client_header_buffer_size 32k;

#指定客戶端請求中較大的消息頭的緩存最大數量和大小,這裏是4個32KB

large_client_header_buffers 4 32k;

#上傳文件大小

client_max_body_size 356m;

#nginx的HttpLog模塊指定,指定nginx日誌的輸出格式,輸出格式為access

log_format access ‘$remote_addr - $remote_user [$time_local] "$request" ‘

‘$status $body_bytes_sent "$http_referer" ‘ ‘"$http_user_agent"

"$http_x_forwarded_for"‘;

#access日誌存在未知

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

#開啟高效模式文件傳輸模式,將tcp_nopush和tcp_nodelay兩個指另設置為on,用於防止網絡阻塞。

sendfile on;

tcp_nopush on;

tcp_nodelay on;

#設置客戶端連接保持活動的超時時間

keepalive_timeout 65;

server_tokens off;

#客戶端請求主體讀取緩存

client_body_buffer_size 512k;

proxy_connect_timeout 5;

proxy_send_timeout 60;

proxy_read_timeout 5;

proxy_buffer_size 16k;

proxy_buffers 4 64k;

proxy_busy_buffers_size 128k;

proxy_temp_file_write_size 128k;

#開啟gzip

gzip on;

#允許壓縮的最小字節數

gzip_min_length 1k; #4個單位為16k的內存作為壓縮結果流緩存

gzip_buffers 4 16k;

#設置識別HTTP協議版本,默認是1.1

gzip_http_version 1.1;

#gzip壓縮比,可在1~9中設置,1壓縮比最小,速度最快,9壓縮比最大,速度最慢,消耗CPU

gzip_comp_level 2;

#壓縮的類型

gzip_types text/plain application/x-javascript text/css application/xml;

#讓前端的緩存服務器混村經過的gzip壓縮的頁面

gzip_vary on;

upstream mycluster{

server 192.168.22.229:8080 weight=1;

server 192.168.22.300:8080 weight=1;

}

server{

listen 8088; server_name 192.168.22.228;

charset utf-8; #設置編碼為utf-8;

#location / {

# root html;

# index index.html index.htm;

#}

#location ~ .*\.(jsp|do|action)$

location / {

proxy_next_upstream http_502 http_504 error timeout invalid_header;

proxy_pass http://mycluster; #① 全部的請求均轉發給Tomcat進行處理

# 真實的客戶端IP

proxy_set_header X-Real-IP $remote_addr;

# 請求頭中Host信息

proxy_set_header Host $host;

# 代理路由信息,此處取IP有安全隱患

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# 真實的用戶訪問協議

proxy_set_header X-Forwarded-Proto $scheme;

}

#② 個別的請求比如:html,js,css等靜態資源請求,由Nginx進行處理

#靜態文件交給nginx處理

location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {

root /usr/local/webapps; expires 30d; }

#靜態文件交給nginx處理

location ~ .*\.(js|css)?$ {

root /usr/local/webapps;

expires 1h;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

測試Nginx動靜分離

根據上述配置文件,完成動靜分離和負載均衡的配置,然後啟動Nginx。
訪問網址:http://192.168.22.228:8088/drp/index.jsp

技術分享圖片

可以看到圖片沒有加載出來。這是因為靜態資源訪問請求已經被Nginx攔截,由Nginx進行處理。但是Nginx服務器的 /usr/local/webapps 目錄下並沒有圖片資源,所以圖片沒有加載出來。index.jsp頁面能夠顯示,說明動態的請求已經轉發到了Tomcat,Tomcat對index.jsp進行了解析。

在Nginx服務器 /usr/local/webapps 目錄下放置圖片文件,將tomcat上drp整個目錄拷貝到其中。

技術分享圖片

然後再次刷新瀏覽器,圖片能夠正常顯示。這裏的192.168.22.230是192.168.22.300,做實驗的時候設置的

由下來顯示就可以看出,上面顯示的 192.168.22.230動態文件index.jsp是由tomcat處理

下面的圖片是由nginx處理

技術分享圖片

最後nginx高可用配置(nginx+keepalived)

nginx反向代理tomacat+keepalived實現動靜分離、負載均衡、高可用