nginx與其他服務器的性能比較:
tomcat服務器面向java語言,是重量級的服務器,而nginx是輕量級的服務器。apache服務器穩定、開源、跨平臺,但是apache服務器不支持高并發,nginx能支持處理百萬級的tcp連接,10萬以上的并發連接,并且是一個很好的跨平臺服務器。
nginx主要優點有可以實現高并發、部署簡單、內存消耗少、成本低等,主要缺點有rewrite功能不夠強大,模塊沒有apache的多。
本篇主要講解 nginx + tomcat 反向代理和負載均衡的部署,以通俗實用為主。本篇文章每個部分之間沒有太大關系,可根據需求分開學習。
下來看一下nginx反向代理的過程:
nginx負載均衡的過程(會自動選擇壓力較小的服務器進行訪問):
可以看出,負載均衡是通過反向代理的原理實現的,所以也稱 反向代理的負載均衡 。所以我們會部署負載均衡,那么反向代理也就會了。
總的來說,負載均衡實現的方式分為軟件實現和硬件實現兩種,硬件實現運行的效率非常高,但是對應的成本也非常高。軟件實現運行效率不如硬件,但是成本相對來說低得多。而使用nginx服務器實現負載均衡,那么就是通過軟件的方式來實現負載均衡,并且nginx本身支持高并發等。故而使用nginx服務器實現負載均衡,能大大節約企業的成本,并且由于nginx是服務器軟件,其執行效率也是非常高。本篇的目的也就是幫助大家使用nginx實現負載均衡。
負載均衡的核心就是建立一個服務器集群,然后用戶首先訪問到第三方代理服務器(這里我們選用nginx),然后由代理服務器選擇一個集群中的服務器,然后將請求引入選定的服務器(這里我們選用tomcat)。
如下圖,通過反向代理我們實現下面的負載均衡,這里我們 假定 四臺服務器公網的ip,一臺做代理服務器,三臺做負載均衡下的服務器:
好了,整體架構已經基本上清晰了,下來我們來具體實現下:
提示:本篇我們基本上都是使用ssh進行相關操作的,windows下可以嘗試安裝putty,mac下直接使用系統自帶的終端工具即可。
1.linux下搭建nginx服務器
我們在 192.168.2.20 這臺服務器上搭建nginx服務器:
1)下載nginx
2)上傳服務器nginx安裝包
$?scp?~/downloads/nginx-1.10.2.tar.gz?root@192.168.2.20:/usr/local
3)安裝nginx
$?ssh?root@192.168.2.20?????????????//ssh連接 #?yum?-y?install?gcc?gcc-c++?autoconf?automake??//gcc、gcc-c++的庫文件 #?yum?install?-y?pcre?pcre-devel?????????//安裝nginx依賴包 #?yum?install?-y?zlib?zlib-devel
注意:-y表示遇到判斷全部yes,autoconf表示自動配置,automake表示自動編譯。
#?cd?/usr/local #?tar?-zxvf?nginx-1.10.2.tar.gz?????????//解壓縮 #?cd?nginx-1.10.2????????????????//切換到該目錄下 #?./configure??????????????????//配置 #?make #?make?install?????????????????//安裝
檢驗是否完成安裝:
#?cd?/usr/local #?ls??????????????????????//如果存在nginx文件夾,則安裝成功
經過上面的安裝步驟和目錄設置,nginx的啟動程序就是/usr/local/nginx/sbin/nginx,默認配置文件是/usr/local/nginx/conf/nginx.conf,但是不建議直接編輯nginx.conf,一般我們都選擇新建配置文件,然后在新建的配置文件中修改端口、反向代理路徑等。
2.nginx的啟動、停止、信號控制
1)啟動nginx服務器(格式:nginx可執行文件 -c nginx配置文件):
#?/usr/local/nginx/sbin/nginx?-c?/usr/local/nginx/conf/nginx.conf
2)停止nginx服務器:
停止nginx服務器首先要查詢nginx的主進程號(master process),假設此處查詢得到1060(方便下面演示使用):
#?ps?-ef|grep?nginx
下來看如何停止nginx服務器,停止nginx有三種方式:
從容停止:
#?ps?-ef|grep?nginx??//查看nginx的主進程號(master?process),假設此處查詢得到1060 #?kill?-quit?1060
快速停止:
#?kill?-term?1060
強制停止:
#?pkill?-9?nginx
3)重啟nginx服務器:
當我們修改了nginx配置文件,需要重啟才能生效。我們在重啟之前還需要驗證配置文件的正確性,然后進行重啟操作:
#?/usr/local/nginx/sbin/nginx?-t?-c?/usr/local/nginx/conf/nginx.conf???//驗證 #?/usr/local/nginx/sbin/nginx?-s?reload??????????????????//重啟
4)平滑升級nginx服務器
平滑升級不會停掉在運行著的進程,這些進程會繼續處理請求,但不會再接受新請求,在這些老進程在處理完還在處理的請求后,停止。此平滑升級的過程中,新開的進程會被處理。這就是平滑升級。
#?/usr/local/nginx/sbin/nginx?-v???????//查看當前版本
下面進行平滑升級:
#?cd?/usr/local #?tar?-zxvf?nginx-1.11.6.tar.gz???????//解壓縮?新版本nginx #?cd?nginx-1.11.6??????????????//切換到該目錄下 #?./configure????????????????//配置 #?make #?cd?/usr/local/nginx/sbin??????????//打開?舊版本nginx可執行文件位置 #?cp?nginx?nginx.old?????????//備份?舊版本nginx可執行文件,防止升級錯誤而無法恢復 #?cp?-rfp?/usr/local/nginx-1.11.6/objs/nginx?/usr/local/nginx/sbin???//復制新版本可執行文件到舊版本處 #?rm?-f?/usr/local/nginx-1.11.6.tar.gz????//善后工作?刪除壓縮文件 #?rm?-rf?/usr/local/nginx-1.11.6???????//刪除文件夾
至此,nginx服務器平滑升級成功。
3.nginx中負載均衡的實現
我們還是先連接ssh,然后進行下面操作(一般不建議修改默認主配置文件nginx.conf,所以我們新建負載均衡配置文件fzjh.conf,保證服務器安全,如下):
#?cd?/usr/local/nginx/conf #?touch?fzjh.conf #?vi?fzjh.conf??//用vi編輯器打開文件,然后按鍵盤的i
注意:vi編輯器中,鍵盤按 i 進入 insert 狀態,按 esc 退出 insert 狀態。
然后輸入以下配置代碼(注釋部分按需開啟):
#設置低權限用戶,為了安全而設置的 user?nobody; #工作衍生進程數 worker_processes?4; #設置錯誤文件存放路徑 #error_log?logs/error.log; #error_log?logs/error.log?notice; #error_log?logs/error.log?info; #設置pid存放路徑(pid是控制系統中重要文件) #pid?logs/nginx.pid; #設置最大連接數 events{ ??worker_connections?1024; } http{ ??#主要是用于設置一組可以在proxy_pass和fastcgi_pass指令中使用額代理服務器,默認負載均衡方式為輪詢 ??upstream?tomcat_client?{ ????#設置同一個cookie的兩次/多次請求,請求的是同一臺服務器 ????ip_hash; ????#weight權重,默認1,權重越大訪問概率越大,backup備用服務器,服務器全部崩潰后啟動 ????server?192.168.2.21:8080?weight=5; ????server?192.168.2.22:8080?weight=5; ????server?192.168.2.23:8080?weight=5?backup; ??} ??#開啟gzip壓縮,開啟后,訪問網頁會自動壓縮 ??#gzip?on; ??#指定服務器的名稱和參數 ??server?{ ????listen?80; ????server_name?test.nginxtest.net; ????#設置字符 ????#charset?koi8-r; ????#location?/?指用根目錄做負載均衡 ????location?/?{ ??????proxy_pass?http://tomcat_client; ??????proxy_redirect?default; ??????#設置代理 ??????proxy_set_header?host?$host; ??????proxy_set_header?x-real-ip?$remote_addr; ????} ??} }
輸入完成后按下esc,然后輸入:
:wq!
就可以保存并退出負載均衡的配置文件了,下來我們加載我們的配置文件:
#?/usr/local/nginx/sbin/nginx??????????????????????//啟動nginx #?/usr/local/nginx/sbin/nginx?-c?/usr/local/nginx/conf/fzjh.conf????//加載配置文件
如果存在端口占用,可以使用如下命令kill掉nginx的程序:
#?killall?-9?nginx
至此,nginx服務器部署完畢。下面我們開始部署負載均衡下的那三臺真實提供數據的服務器。
4.linux下安裝jdk
我們在192.168.2.21、192.168.2.22、192.168.2.23這三臺服務器安裝jdk,以192.168.2.21為例:
1)下載jdk
2)上傳服務器jdk安裝包
$?scp?~/downloads/jdk-8u112-linux-x64.tar.gz?root@192.168.2.21:/usr/local
3)安裝jdk
$?ssh?root@192.168.2.21?????????//ssh連接 #?cd?/usr/local #?tar?-zxvf?jdk-8u112-linux-x64.tar.gz?//解壓縮 #?mv?jdk1.8.0_112/?jdk?????????//將jdk1.8.0_112重命名為jdk #?vi?/etc/profile????????????//用vi編輯器打開文件,然后按鍵盤的i
下來我們移動光標至最后面,兩個回車換行,然后添加下面代碼配置java的環境變量:
java_home="/usr/local/jdk" class_path="$java_home/lib:$java_home/jre/lib" path=".:$path:$java_home/bin" catalina_home="/usr/local/tomcat" export?java_home?catalina_home
輸入完成后按下esc,然后輸入:
:wq!
就可以保存并退出了。此時我們想讓其立即生效,則需要繼續輸入命令:
#?source?/etc/profile
此時profile文件就更新了,此時環境變量就配置成功了。下面我們驗證一下jdk是否安裝配置成功:
#?java?-version
如果返回java版本號則安裝成功。
5.linux下搭建tomcat服務器
我們在192.168.2.21、192.168.2.22、192.168.2.23這三臺服務器搭建tomcat服務器,以192.168.2.21為例:
1)下載tomcat
2)上傳服務器tomcat安裝包
$?scp?~/downloads/apache-tomcat-8.5.9.tar.gz?root@192.168.2.21:/usr/local
3)安裝tomcat
$?ssh?root@192.168.2.21?????????//ssh連接 #?cd?/usr/local #?tar?-zxvf?apache-tomcat-8.5.9.tar.gz?//解壓縮 #?mv?apache-tomcat-8.5.9/?tomcat????//將apache-tomcat-8.5.9重命名為tomcat
4)設置tomcat網頁文件目錄
tomcat默認網頁文件的路徑是 /usr/local/tomcat/webapps/root,但是一般我們不在這里存放,我們在linux根目錄新建 data/wwwroot 目錄:
#?mkdir?/data?????????????//新建目錄 #?mkdir?/data/www #?mkdir?/data/www/root #?cd?/usr/local/tomcat/conf #?vi?server.xml????????????//用vi編輯器打開server.xml配置文件,打開后鍵盤按i
我們找到host節點下的appbase=”webapps”,修改為:appbase=”/data/www”
輸入完成后按下esc,然后輸入:
:wq!
就可以保存并退出配置文件了,然后重啟tomcat即可生效,此時tomcat的網頁文件目錄就變成了 /data/www/root 了。
配置tomcat環境變量,我們在配置jdk的時候已經配置好了,可以回頭看一下。
6.tomcat的啟動、停止
1)啟動tomcat服務器
#?/usr/local/tomcat/bin/startup.sh
2)停止tomcat服務器:
#?/usr/local/tomcat/bin/shutdown.sh
到此,nginx + tomcat 負載均衡 集群 已經部署完畢了。不過有了服務器,肯定也少不了數據庫,下面拓展一下linux下安裝mysql數據庫的方法。
7.linux下安裝mysql數據庫
我們重新找了 192.168.2.30 這臺服務器上mysql數據庫:
1)下載mysql數據庫
2)上傳mysql數據庫安裝包
$?scp?~/downloads/mysql-5.1.51.tar.gz?root@192.168.2.30:/usr/local
3)安裝mysql
$?ssh?root@192.168.2.30?????????//ssh連接 #?groupadd?mysql????????????//建立mysql的組 #?useradd?mysql?-g?mysql????????//增加用戶mysql到mysql的組中 #?yum?list|grep?ncurses #?yum?-y?install?ncurses-devel #?yum?install?ncurses-devel #?cd?/usr/local #?tar?-zxvf?mysql-5.1.51.tar.gz?????//解壓縮 #?cd?mysql-5.1.51 #?./configure?--prefix=/usr/local/mysql?--with-mysqld-ldflags=-all-static?--with-client-ldflags=-all-static?--with-readline?--with-sll? //配置,設置安裝路徑,設置編譯mysql不帶共享庫,設置編譯client不帶共享庫,設置要以rmp的方式安裝tar包,設置以rmp的方式安裝opensll #?make #?make?install?????????????//安裝,在make[4]的時候等待時間比較長,幾分鐘到十幾分鐘,都是正常現象 #?/usr/local/mysql/bin/mysql_install_db?--user????//對安裝好的mysql進行初始化 #?cp?./support-files/mysql.server?/etc/init.d/mysql?//將mysql啟動服務復制到系統中并重命名為mysql #?cp?./support-files/my-medium.cnf?/etc/my.cnf????//復制規則文件 #?chmod?755?/etc/init.d/mysql????????????//更改文件權限 //文件權限由三個數字組成,第一位:文件擁有者的權限,第二位:文件擁有者同組的人的權限,第三位:文件擁有者非同組人的權限 //7:可讀可寫可執行,5:可讀可執行 #?cd?/usr/local/mysql #?chown?-r?mysql?.??????????????????//將?/usr/local/mysql?的擁有者更改為mysql #?chgrp?-r?mysql?.??????????????????//將?/usr/local/mysql?歸到mysql組中 #?ps?-ef|grep?mysql #?kill?-9?3632??????????//將mysql所有進程號依次殺死,這里假定是3632 #?/usr/local/mysql/bin/mysql_install_db?--user=mysql????//再次初始化 #?service?mysql?start???????????????????//啟動mysql #?/usr/local/mysql/bin/mysqladmin?-u?root?password?'123456'?//設置mysql密碼
到此mysql就安裝成功了,下來我們測試一下:
#?/usr/local/mysql/bin/mysql?-u?root?-p
如果輸入密碼后可以登進mysql,那么就測試成功。下面我們設置mysql允許開啟遠程連接:
#?/usr/local/mysql/bin/mysql?-u?root?-p mysql>?grant?all?privileges?on?*.*?to?'root'@'%'?identified?by?'123456'?with?grant?option; //創建用戶用于遠程連接(root:用戶名,%:所有電腦都可以連接,也可以設置某個ip地址運行連接,123456:密碼) mysql>?flush?privileges;??????//立即生效
下面我們查詢一下數據庫的用戶:
mysql>?select?distinct?concat('user:?''',user,'''@''',host,''';')?as?query?from?mysql.user; mysql>?q??????????????//登出
找一臺電腦測試一下,使用navicat遠程登錄mysql,登進成功。