關於Tomcat+Nginx負載均衡與Jmeter服務器測壓的日記


Jmeter測壓

  1.Jmeter-5.1.1下載:http://mirror.bit.edu.cn/apache//jmeter/binaries/apache-jmeter-5.1.1.zip

  2.Jmeter-5.1.1依賴java環境,只支持java8以上的版本,java8官網下載太慢(30k/s),所以我在騰訊軟件中心下載的(5M/s)

  3.java8解壓后,運行.exe文件進行安裝,配置環境變量:JAVA_HOME,PATH,CLASS_PATH后,再cmd執行javac命令,沒有報錯表示安裝完成

  4.解壓Jmeter,在/bin目錄下找到jmeter.bat,點擊運行,彈出黑框啟動客戶端

            

 

  5.Jmeter默認英文,但支持中文,設置Options->Choose Language->Chinese

  6.准備完成之后,在Test Plan下新建線程組,設置線程數(並發數),啟動時間(花費多長時間達到最大線程數),循環次數(每個線程發送多長次請求,選擇永遠則一直發)

 

  7.在線程組下添加http請求,填寫內容如下圖

  

8.選擇監聽器,相當於看測壓結果的窗口,如下圖,各種花里胡哨的圖表報告,選擇完想看的圖表報告之后,點擊運行,就開始做給服務器做壓力測試了

 

Tomcat+Nginx負載均衡:

  1.做了測試之后發現Tomcat只能正常支持200多個並發量,當然是可以通過修改Tomcat的默認配置來改變,比如默認內存、默認並發量等。當測試數據達到300后,就會有20%的請求失敗,所以需要看看tomcat集群的處理效果怎么樣

  2.我搭建環境用的版本是:java8,Tomcat8.5.41解壓版(下載:https://tomcat.apache.org/download-70.cgi),nginx-1.16.0(下載:http://nginx.org/en/download.html)

  3.首先保證java服務正常啟動,解壓tomcat,多復制幾個,具體幾個看需要;然后挨個該配置文件,第一步:打開/conf/server.xml配置文件修改其中的8005、8009、8080端口,這一步是保證多tomcat之前彼此不重復,第二步:打開/bin/shutdown.bat(停止tomcat)和/bin/startup.bat(運行tomcat),在第一行‘@echo off’下面新啟一行,寫入‘SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0_191’,這一步是讓tomcat能夠找到Java環境,然后保存,第三步打開/bin/startup.bat以運行tomcat,打開瀏覽器測試tomcat是否運行成功。之后的tomcat都重復此操作。

  4.tomcat全部打開后,開始編輯nginx配置文件,打開/conf/nginx.conf,把配置文件改為如下內容,后保存。ip_hash表示Nginx會根據ip來給請求的用戶分配tomcat,同一個用戶將會被分配給同一個tomcat處理,解決了session保存問題,但是這樣會導致請求分配不均勻。

  5.此時運行ngin.exe,就OK了。訪問Nginx監聽的端口,會發現請求安裝配置文件正常的分配給各個tomcat,負載均衡就完成了

  6.當然nginx的功能遠不止如此,此處只是單純實現負載均衡,比如根據url用正則判斷實現動靜分離、其他的各項設置可以滿足各種實際需求,nginx雖然小但功能還是挺強大的,貼一段配置文件詳解:

運行用戶
user nobody;
啟動進程,通常設置成和cpu的數量相等
worker_processes 1;

全局錯誤日志及PID文件
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;

pid logs/nginx.pid;
工作模式及連接數上限
events {
worker_connections 1024;#單個后台worker process進程的最大並發鏈接數
}
設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
#設定mime類型,類型由mime.type文件定義
include mime.types;
default_type application/octet-stream;
#設定日志格式
#access_log logs/access.log main;
#sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,
#必須設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設置為 off,以平衡磁盤與網絡I/O處理速度,降低系統的uptime.
sendfile on;
#tcp_nopush on;
#連接超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
#服務器設置的最大上傳文件大小
client_max_body_size 200m;
#開啟gzip壓縮
gzip on;
gzip_comp_level 2;
gzip_types text/css application/javascript application/json;
gzip_disable “MSIE [1-6].”;

#設定負載均衡的服務器列表
upstream collectionBackend {
#本機上的Squid開啟7002端口
server 127.0.0.1:7002;
}

server {
#偵聽80端口
listen 80;
#定義使用localhost訪問
server_name localhost;

#默認值90s, nginx連接到后端服務器的連接超時時間
proxy_connect_timeout 90;

#設置了發送請求給upstream服務器的超時時間。超時設置不是為了整個發送期間,而是在兩次write操作期間。如果超時后,upstream沒有收到新的數據,nginx會關閉連接
proxy_send_timeout 90;

設置與代理服務器的讀超時時間。它決定了nginx會等待多長時間來獲得請求的響應。這個時間不是獲得整個response的時間,而是兩次reading操作的時間。
proxy_read_timeout 90;

nginx設置目錄瀏覽及中文亂碼問題解決方案:
#charset koi8-r;

#設定日志格式
#access_log logs/host.access.log main;

在這個location配置段中,如果URL請求“/public/logo.gif”,那么nginx將會在服務器上查找“F:/workspace/cloud/bv-frontend-dev/public/logo.gif”文件,即請求的URL中location后面的部分會被追加到alias指定的目錄后面,而location后面的“/public”路徑將會被自動丟棄。
location /public/ {
alias F:/workspace/cloud/bv-frontend-dev/public/;
}

location / {
#rewrite的主要功能是實現RUL地址的重定向
rewrite ‘^/simple/.*.(html)$’ /simple-index/simple.html last;

rewrite ‘^/simple/.*config.js$’ /simple-index/config.js last;

rewrite ‘^/simple/./custom/(.)’ /simple-index/custom/$1 last;

rewrite ‘^/simple/./api/(.)’ /api/$1 last;

rewrite ‘^/simple/custom/(.*)’ /simple-index/custom/$1 last;

rewrite ‘^/simple/api/(.*)’ /api/$1 last;

alias同上含義:
alias F:/workspace/bestvike/collection-handle/static/;
index index.html;
}

location /simple-index {
alias F:/workspace/bestvike/collection-handle/static/;
}

location /resources/ {
rewrite ‘^/resources/simple/(.*.html)$’ /simple-index/simple/$1 last;
alias F:/workspace/bestvike/collection-handle/static/simple/;
}

location /api/ {

proxy_set_header:允許重新定義或者添加發往后端服務器的請求頭.該值可以包含文本、變量和它們的組合。在沒有定義proxy_set_header時會繼承之前定義的值。默認情況下,只有兩個字段被重定義:proxy_set_header Host $proxy_host 和 proxy_set_header Connection close

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header REMOTE-HOST $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass URL,URL為要設置的被代理服務器的地址,包含傳輸協議、主機名稱或IP地址加端口號、URI等要素。
proxy_pass http://collectionBackend/api/;
}

error_page:當發生錯誤的時候能夠顯示一個預定義的地址,實際上產生了一個內部跳轉(internal redirect),當訪問出現500、502、503、504的時候就能返回50x.html中的內容。同時我們也可以自己定義這種情況下的返回狀態碼。

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

   7.nginx基本命令   

nginx #打開 nginx
nginx -t    #測試配置文件是否有語法錯誤
nginx -s reopen #重啟Nginx
nginx -s reload   #重新加載Nginx配置文件,然后以優雅的方式重啟Nginx
nginx -s stop  #強制停止Nginx服務
nginx -s quit  #優雅地停止Nginx服務(即處理完所有請求后再停止服務)


nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]

-?,-h           : 打開幫助信息
-v              : 顯示版本信息並退出
-V              : 顯示版本和配置選項信息,然后退出
-t              : 檢測配置文件是否有語法錯誤,然后退出
-q              : 在檢測配置文件期間屏蔽非錯誤信息
-s signal       : 給一個 nginx 主進程發送信號:stop(強制停止), quit(優雅退出), reopen(重啟), reload(重新加載配置文件)
-p prefix       : 設置前綴路徑(默認是:/usr/share/nginx/)
-c filename     : 設置配置文件(默認是:/etc/nginx/nginx.conf)
-g directives   : 設置配置文件外的全局指令

  8.nginx常用的正則表達試

 

 

 

最后,今天因為一些原因沒用給負載均衡測壓,之后再補測

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM