準備1臺 192.168.2.224 安裝Nginx,2檯安裝tomcat 192.168.2.222 192.168.2.223java
一、安裝Nginx:python
上傳pcre-8.36.tar.gz、zlib-1.2.8.tar.gz到服務器linux
下載地址:pcre-8.36.tar.gz https://o3cex9zsl.qnssl.com/libs/nginx/pcre-8.36.tar.gznginx
zlib-1.2.8.tar.gz https://o3cex9zsl.qnssl.com/libs/nginx/zlib-1.2.8.tar.gzweb
#######新建nginx用戶和nginx組正則表達式
[root@nginx]# groupadd -r nginx && useradd -r -g nginx -s /bin/false -M nginx 算法
#######yum安裝nginx必須的依賴庫apache
[root@nginx]#yum -y install openssl openssl-devel libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embedbootstrap
#######官網下載Nginx1.9.0的tar包,而後解壓到服務器上vim
[root@nginx jason]# wget -c http://nginx.org/download/nginx-1.9.0.tar.gz
[root@nginx jason]# tar -zxf nginx-1.9.0.tar.gz && cd nginx-1.9.0
上傳pcre-8.36.tar(支持Nginx的Rewrite功能)、zlib-1.2.8.tar(支持Nginx的Gzip壓縮功能)
#######新建Nginx1.9.0安裝時所須要的目錄
[root@nginx nginx-1.9.0]# cd /var/tmp/ && mkdir -p /var/tmp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
[root@nginx tmp]# mkdir -p /var/run/nginx && cd /home/jason/nginx-1.9.0
[root@nginx nginx-1.9.0]#
./configure --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --conf-path=/usr/local/nginx/conf/nginx.conf --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --sbin-path=/usr/sbin/nginx
具體的含義:
[root@nginx nginx-1.9.0]make && make install
上傳腳本Nginx到/etc/init.d 並賦予只讀權限,將Nginx服務添加到啓動項並給予開機自動啓動,啓動Nginx服務
Nginx
1 #! /bin/bash 2 # 3 # nginx - this script starts and stops the nginx daemon 4 # 5 # chkconfig: - 85 15 6 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ 7 # proxy and IMAP/POP3 proxy server 8 # 9 # processname: nginx 10 # config: /etc/nginx/nginx.conf 11 # pidfile: /var/run/nginx/nginx.pid 12 13 # Source function library. 14 . /etc/rc.d/init.d/functions 15 16 # Source networking configuration. 17 . /etc/sysconfig/network 18 19 # Check that networking is up. 20 [ "$NETWORKING" = "no" ] && exit 0 21 22 nginx="/usr/sbin/nginx" 23 prog=$(basename $nginx) 24 25 NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" 26 27 [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx 28 29 lockfile=/var/lock/nginx.lock 30 31 start() { 32 [ -x $nginx ] || exit 5 33 [ -f $NGINX_CONF_FILE ] || exit 6 34 echo -n $"Starting $prog: " 35 daemon $nginx -c $NGINX_CONF_FILE 36 retval=$? 37 echo 38 [ $retval -eq 0 ] && touch $lockfile 39 return $retval 40 } 41 42 stop() { 43 echo -n $"Stopping $prog: " 44 killproc $prog -QUIT 45 retval=$? 46 echo 47 [ $retval -eq 0 ] && rm -f $lockfile 48 return $retval 49 } 50 51 restart() { 52 configtest || return $? 53 stop 54 sleep 1 55 start 56 } 57 58 reload() { 59 configtest || return $? 60 echo -n $"Reloading $prog: " 61 killproc $nginx -HUP 62 RETVAL=$? 63 echo 64 } 65 66 force_reload() { 67 restart 68 } 69 70 configtest() { 71 $nginx -t -c $NGINX_CONF_FILE 72 } 73 74 rh_status() { 75 status $prog 76 } 77 78 rh_status_q() { 79 rh_status >/dev/null 2>&1 80 } 81 82 case "$1" in 83 start) 84 rh_status_q && exit 0 85 $1 86 ;; 87 stop) 88 rh_status_q || exit 0 89 $1 90 ;; 91 restart|configtest) 92 $1 93 ;; 94 reload) 95 rh_status_q || exit 7 96 $1 97 ;; 98 force-reload) 99 force_reload 100 ;; 101 status) 102 rh_status 103 ;; 104 condrestart|try-restart) 105 rh_status_q || exit 0 106 ;; 107 *) 108 echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" 109 exit 2 110 esac
[root@nginx init.d]chkconfig --add nginx
[root@nginx init.d]chkconfig nginx on
[root@nginx init.d]service nginx start
查看安裝的Nginx1.9.0的詳細信息
[root@nginx init.d]# nginx -V
nginx version: nginx/1.9.0
built by gcc 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC)
configure arguments: --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --conf-path=/usr/local/nginx/conf/nginx.conf --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --sbin-path=/usr/sbin/nginx
二、安裝tomcat
查看現有版本、卸載並安裝jdk1.8
[root@nginx jason]# java -version
java version "1.7.0_51"
[root@nginx jason]# rpm -qa |grep jdk
[root@nginx jason]# yum remove java-1.7.0-openjdk
[root@nginx jason]# ls
apache-tomcat-9.0.4.tar.gz Desktop Documents Downloads jdk-8u11-linux-x64.rpm Music Pictures Public Templates Videos
[root@nginx jason]# rpm -ivh jdk-8u11-linux-x64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:jdk-2000:1.8.0_11-fcs ################################# [100%]
Unpacking JAR files...
rt.jar...
jsse.jar...
charsets.jar...
tools.jar...
localedata.jar...
jfxrt.jar...
[root@nginx jason]# java -version
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)
[root@nginx jason]# cd /usr/local/
[root@nginx local]# mkdir tomcat
[root@nginx local]# ls
bin etc games include lib lib64 libexec sbin share src tomcat
解壓apache-tomcat-9.0.4並移動到/usr/local/tomcat/
[root@nginx jason]# mv apache-tomcat-9.0.4 /usr/local/tomcat/
打開文件 /etc 目錄下的 profile 文件,將以下代碼追加到 profile 文件末尾:
# idea - tomcat9 config start - 2018-7-24 export CATALINA_HOM=/usr/local/tomcat/apache-tomcat-9.0.4 export CATALINA_BASE=/usr/local/tomcat/apache-tomcat-9.0.4 export TOMCAT_HOME=/usr/local/tomcat/apache-tomcat-9.0.4
# idea - tomcat9 config end - 2018-7-24
修改 tomcat 的端口號和字符編碼
vim /usr/local/tomcat/apache-tomcat-9.0.4/conf/server.xml
找到以下代碼:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
將其中的 8080 改爲 HTTP 協議的默認端口 80,改後的代碼以下:
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
增長 manager-gui 圖形化管理界面的訪問權限(不須要的話,此步驟可忽略):
[root@nginx tomcat]# cd apache-tomcat-9.0.4/conf/
[root@nginx conf]# ls
catalina.policy catalina.properties context.xml jaspic-providers.xml jaspic-providers.xsd logging.properties server.xml tomcat-users.xml tomcat-users.xsd web.xml
[root@nginx conf]# vim tomcat-users.xml
<role rolename="admin-gui"/> <role rolename="admin-script"/> <role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="manager-jmx"/> <role rolename="manager-status"/> <user username="tomcat" password="mytomcatadmin" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui"/>
進入
[root@nginx apache-tomcat-9.0.4]# cd webapps/manager/META-INF/
[root@nginx META-INF]# vi context.xml
進入
[root@nginx]#cd /usr/local/tomcat/apache-tomcat-9.0.4/webapps/host-manager/META-INF/
[root@nginx META-INF]# vim context.xml
(或者和上面的同樣註釋掉)
這裏設置的 username 是tomcat;password 都是 mytomcatadmin,角色爲 manager-gui;
若是要某網段能夠訪問tomcat
在tomcat-users.xml裏添上幾句便可
打開webapps下的host-manager和manager,都有一個共同的文件夾META-INF,裏面都有context.xml,這個文件的內容是:
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />
</Context>
經過查看官方文檔,知道,這段代碼的做用是限制來訪IP的,127.d+.d+.d+|::1|0:0:0:0:0:0:0:1,是正則表達式,表示IPv4和IPv6的本機環回地址,因此這也解釋了,爲何咱們本機能夠訪問管理界面,可是其餘機器確403。
找到緣由了,那麼修改一下這裏的正則表達式便可,好比咱們只容許內網網段192.168.2訪問管理頁面,那麼改爲這樣就能夠:
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192.168.2.*" />
</Context>
修改完畢,關閉瀏覽器,從新打開tomcat,問題解決!
進入到 /usr/local/tomcat/apache-tomcat-9.0.0.M4/bin 目錄中:
cd ../bin/
打開 vi catalina.sh 文件:
在 # OS specific support. 上面一行加入以下代碼(不能有空格):
JAVA_HOME=/usr/java/jdk1.8.0_11/
JRE_HOME=$JAVA_HOME/jre
查看java_home目錄
[root@nginx bin]# rpm -qa|grep jdk
jdk-1.8.0_11-fcs.x86_64
[root@nginx bin]# rpm -ql jdk-1.8.0_11-fcs.x86_64
啓動 tomcat 服務:
./startup.sh
打印以下信息則代表啓動 Tomcat 服務成功:
[root@nginx bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat/apache-tomcat-9.0.4
Using CATALINA_HOME: /usr/local/tomcat/apache-tomcat-9.0.4
Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-9.0.4/temp
Using JRE_HOME: /usr/java/jdk1.8.0_11//jre
Using CLASSPATH: /usr/local/tomcat/apache-tomcat-9.0.4/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-9.0.4/bin/tomcat-juli.jar
Tomcat started.
打開瀏覽器輸入 IP(修改測試頁面)
進入
/usr/local/tomcat/apache-tomcat-9.0.4/webapps/ROOT
修改index.jsp
簡化啓動服務
cd /etc/init.d/
vim tomcat
# idea - tomcat config start - 2018-2-1 #!/bin/bash # description: Tomcat Start Stop Restart # processname: tomcat # chkconfig: 2345 20 80 JAVA_HOME=/usr/java/jdk1.8.0_11/ export JAVA_HOME PATH=$JAVA_HOME/bin:$PATH export PATH CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.4 case $1 in start) sh $CATALINA_HOME/bin/startup.sh ;; stop) sh $CATALINA_HOME/bin/shutdown.sh ;; restart) sh $CATALINA_HOME/bin/shutdown.sh sh $CATALINA_HOME/bin/startup.sh ;; esac exit 0 #chmod 755 tomcat #chkconfig --add tomcat #chkconfig --level 2345 tomcat on #chkconfig --list tomcat # idea - tomcat config end - 2018-2-1
[root@nginx conf] chmod +x tomcat
[root@nginx conf]chkconfig --add tomcat
[root@nginx conf]chkconfig tomcat on
啓動tomcat
進入/usr/local/tomcat/apache-tomcat-9.0.4/bin
[root@python bin]# ./startup.sh
[root@python bin]# ./shutdown.sh (更改配置文件以後從新加載須要中止tomcat再啓用)
開機自動啓動
vi /etc/rc.d/rc.local 添加
/usr/local/tomcat/apache-tomcat-9.0.4/bin/startup.sh
linux 系統中的 /etc 目錄表示「設備」,意爲與硬件設備相關的信息;
/etc/init.d 目錄下的文件表示當前設備的初始化配置信息;
命令 chkconfig 表示添加(--add)、刪除(--del)、查看(--list)
三、修改Nginx配置文件(192.168.2.224
cd /usr/local/nginx/conf
vim nginx.conf
在server配置的上面新增upstream 配置,後面的「server_tomcat」至關於該配置別名,供後面的「proxy_pass」配置使用。
upstream 裏面配置的就是2個tomcat的訪問地址,IP:端口號,不用寫http:// 。
proxy_pass 轉發定位到upstream 裏面配置的多臺服務器proxy_pass 配置的http:// 必需要寫。(不是https)
修改完成後,從新加載nginx服務的配置
nginx -s reload
看到這,確定會有人有疑問,若是有一臺服務器忽然掛掉了怎麼辦?別急,這種狀況nginx已經給咱們處理了,當有臺服務器掛掉了,nginx默認不會訪問掛掉的服務,繼續訪問其餘正在運行的服務,提供了很好的容錯機制。
能不能讓兩臺服務器訪問的機率不同了?能,nginx給咱們提供了 weight這個屬性,能夠給各個服務器分配權重,配置以下:
weight 默認爲1.weight越大,負載的權重就越大。
經過上面的配置,刷新頁面,會發現訪問tomcat1的機率明顯比訪問tomcat2的機率大。
PS:upstream目前支持5種方式的分配
一、輪詢(默認)
每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。
二、weight
指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況。
例如:
三、ip_hash
每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。
例如:
四、fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
五、url_hash(第三方)
按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。
例:在upstream中加入hash語句,server語句中不能寫入weight等其餘的參數,hash_method是使用的hash算法
在須要使用負載均衡的server中增長
proxy_pass http://bakend/;
每一個設備的狀態設置爲:
1.down 表示單前的server暫時不參與負載
2.weight 默認爲1.weight越大,負載的權重就越大。
3.max_fails :容許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤
4.fail_timeout:max_fails次失敗後,暫停的時間。
5.backup: 其它全部的非backup機器down或者忙的時候,請求backup機器。因此這臺機器壓力會最輕。
nginx支持同時設置多組的負載均衡,用來給不用的server來使用。
client_body_in_file_only 設置爲On 能夠講client post過來的數據記錄到文件中用來作debug
client_body_temp_path 設置記錄文件的目錄 能夠設置最多3層目錄
location 對URL進行匹配。能夠進行重定向或者進行新的代理 負載均衡
三、安裝keepalive
yum install -y keepalived
修改config文件
vim /etc/keepalived\keepalived.conf
keepalived.conf各項的含義
MASTER
! Configuration File for keepalived #全局配置 global_defs { #keepalived切換的時候,發消息到指定的email,可配置多個email notification_email { feinik1@foxmail.com feinik2@foxmail.com } #通知郵件從哪一個地址發出 notification_email_from feinik@foxmail.com #通知郵件的smtp地址 smtp_server smtp.exmail.qq.com #鏈接smtp服務器的超時時間,單位秒 smtp_connect_timeout 30 #Keepalived的機器標識,一個網絡內保持惟一 router_id nginx-master } #執行腳本配置 vrrp_script chk_nginx { #腳本所在路徑 script "/home/project/keepalived/check_nginx.sh" #腳本執行間隔時間,秒 interval 2 #優先級 weight 2 } #keepalived實例配置 vrrp_instance VI_1 { #指定實例的初始狀態,MASTER或BACKUP兩種狀態,而且須要大寫 state MASTER #實例綁定的網卡 interface ens33 #虛擬路由標識,是一個數字,整個VRRP內惟一,若是keepalived配置了主備,須要相同 virtual_router_id 51 #優先級,數值愈大,優先級越高 priority 100 #MASTER與BACKUP之間同步檢查的時間間隔,單位爲秒 advert_int 1 #通訊驗證 authentication { auth_type PASS auth_pass feinik } #追蹤外圍腳本 track_script { #這裏配置vrrp_script的名稱 chk_nginx } #虛擬ip配置,可配置多個 virtual_ipaddress { 192.168.10.200 } }
BACKUP
! Configuration File for keepalived #全局配置 global_defs { #keepalived切換的時候,發消息到指定的email,可配置多個email notification_email { feinik1@foxmail.com feinik2@foxmail.com } #通知郵件從哪一個地址發出 notification_email_from feinik@foxmail.com #通知郵件的smtp地址 smtp_server smtp.exmail.qq.com #鏈接smtp服務器的超時時間,單位秒 smtp_connect_timeout 30 #Keepalived的機器標識,一個網絡內保持惟一 router_id nginx-master } #執行腳本配置 vrrp_script chk_nginx { #腳本所在路徑 script "/home/project/keepalived/check_nginx.sh" #腳本執行間隔時間,秒 interval 2 #優先級 weight 2 } #keepalived實例配置 vrrp_instance VI_1 { #指定實例的初始狀態,MASTER或BACKUP兩種狀態,而且須要大寫 state BACKUP #實例綁定的網卡 interface ens33 #虛擬路由標識,是一個數字,整個VRRP內惟一,若是keepalived配置了主備,須要相同 virtual_router_id 51 #優先級,數值愈大,優先級越高 priority 99 #MASTER與BACKUP之間同步檢查的時間間隔,單位爲秒 advert_int 1 #通訊驗證 authentication { auth_type PASS auth_pass feinik } #追蹤外圍腳本 track_script { #這裏配置vrrp_script的名稱 chk_nginx } #虛擬ip配置,可配置多個 virtual_ipaddress { 192.168.10.200 } }
個人實驗配置
master
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 3 weight 2 } vrrp_instance VI_1 { state MASTER interface enp0s17 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PAS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.2.226 } }
backup
! Configuration File for keepalived global_defs { ... } rrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 3 weight 2 } vrrp_instance VI_1 { state BACKUP interface enp0s17 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.2.226 } }
查看VIP(ip addr)
nginx_check.sh腳本(賦予只讀權限 chmod +x nginx_check.sh)
若是 nginx 中止運行,嘗試啓動,若是沒法啓動則殺死本機的 keepalived 進程,keepalived將虛擬 ip 綁定到 BACKUP 機器上。內容以下:
#!/bin/bash A=`ps -C nginx –no-header |wc -l` if [ $A -eq 0 ];then /home/wangzi/soft/nginx/sbin/nginx sleep 5 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi
測試