1. 程式人生 > >nginx(四) nginx+keepalived 實現主備+雙主熱備模型的高可用負載均衡代理服務

nginx(四) nginx+keepalived 實現主備+雙主熱備模型的高可用負載均衡代理服務

nginx(四) nginx+keepalived 實現主備+雙主熱備模型的高可用負載均衡代理服務

       在前面《nginx配置:反向代理 負載均衡 後端健康檢查 快取》等幾篇文章中,我們配置了nginx的反向代理負載均衡WEB叢集,而在《keepalived 及 keepalived配置LVS高可用叢集》進行keepalived配置LVS高可用叢集。下面將在前文的一些基礎上,用keepalived分別實現主備模型和雙主模型的nginx反向代理伺服器的高可用。

1、配置環境準備

1-1、模擬環境

1、各伺服器主機系統:CentOS 6.4 x86_64

2、反向代理伺服器:

node1: IP:192.168.18.241 (host name:node1.tjiyu.com);

node2: IP:192.168.18.242 (host name:node2.tjiyu.com);

VIP1:192.168.18.240;(主備模型只使用VIP1)

VIP2:192.168.18.250;

service:nginx 1.10.2 提供反向代理、負載均衡服務;

keepalived 為nginx(VIP)提供高可用服務;

3、後端兩臺realserver:

realserver1: IP:192.168.18.251 (host name:realserver1.tjiyu,com);

realserver2: IP:192.168.18.252 (host name:realserver2.tjiyu.com);

service:nginx 1.10.2 提供WEB服務

1-2、配置前所需要的準備

各主機需要做以下準備:

1、配置IP、關閉防火牆/SELINUX;

2、時間同步;

3、配置節點名稱(不是必須的,最好配置上,方便操作)

2、nginx和keepalived相關準備說明

nginx可以參考《nginx配置:反向代理 負載均衡 後端健康檢查 快取》文章,先在配置好兩臺代理伺服器,使得它們都可以實現反向代理和負載均衡(注意。不用配置快取,影響測試),分別訪問它們的IP測試正常,如下:

Nginx根據前文配置好後,下面就不會去配置nginx了,主要是對keepalived進行配置,以及相關測試。

Keepalived相關的原理、配置說明,可以參考《keepalived 及 keepalived配置LVS高可用叢集》;首先需要在兩臺代理伺服器分別下載安裝,yum install -y keepalived就可以了。下面我們用到它裡面的一些配置,不過會重新給出並作出說明。

3、配置nginx+keepalived主備模型

我們先來說明配置的一些細節,後面再給出完整的配置檔案。一個是對nignx狀態進行監測,一個是對nginx進行管理。

3-1、配置keepalived對nignx進行監測

配置/etc/keepalived/keepalived.conf檔案使得keepalived可以對nignx進行監測,如下:

        [[email protected] ~]# cd /etc/keepalived/

        [[email protected] keepalived]# cp keepalived.conf keepalived.conf.bak

        [[email protected] keepalived]# vim keepalived.conf 

在配置文中增加vrrp_script chk_nginx_health { script "killall -0 nginx"… }塊,定義nginx服務狀態跟蹤指令碼,指令碼中可以檢查nginx的狀態,如下:

這裡我們直接用"killall -0 nginx"命令,它不會殺死nginx,只會在nginx啟動正常時返回0,停止時返回1,如下:

然後在vrrp_instance VI_1 {track_script {… }}中呼叫上面定義的服務狀態跟蹤指令碼,如下:

3-2、配置keepalived狀態轉換通知,以及轉換時對nignx進行管理

自定義keepalived狀態轉換狀態變化指令碼notify.sh,放到/etc/keepalived目錄下,如下:

該指令碼可以在keepalived狀態轉換時,發出郵件通知;還可以對nginx服務進行管理,如keepalived成功主節點時,啟動nginx,成為備節點時停止nginx(主備時)或重啟nginx(雙主時),配置到vrrp_instance VI_1 {}塊中,如下:

注意,配置的發件人使用者得是系統使用者,不存在使用者發不出郵件,得先在兩節點上新增使用者,過程如下:

[[email protected] keepalived]# useradd root_keepalived

3-3、node1上的keepalived配置

配置node1成主節點,優先順序較高(搶佔式),配置如下:

        ! Configuration File for keepalived

        global_defs { #全域性配置,這裡額外的靜態路由並未新增因為它是非必要的,除非我們在當前或特定的主機上生成特殊的靜態路由等

            notification_email { #realserver故障時通知郵件的收件人地址,可以多個

                [email protected]

            }

            notification_email_from root_keepalived #發件人資訊(可以隨意偽裝,因為郵件系統不會驗證處理髮件人資訊)

            smtp_server 127.0.0.1 #發郵件的伺服器(一定不可為外部地址)

            smtp_connect_timeout 30 #連線超時時間

            router_id LVS_DEVEL #路由器的標識(可以隨便改動)

        }

         

        vrrp_script chk_nginx_health { # 定義服務狀態跟蹤指令碼,指令碼中可以檢查高可用服務的狀態,返回狀態碼0表示服務正常;配置呼叫則在vrrp_instance中的track_script段;這裡chk_nginx是定義指令碼的名稱,可隨意取

            script "killall -0 nginx" #判斷命令/自己定義好的指令碼路徑;#這裡killall -0 nginx不會殺死nginx,只會在nginx啟動正常時返回0,停止時返回1,返回1就會在vrrp例項定義的優先順序減去下面的weight值,就表示期望這個節點為備用狀態。

            interval 1 #每隔1秒鐘執行一次

            weight -2 #上面的命令指令碼執行失敗,優先順序降低2;這個值的絕對值必須大於MASTER減BACKUP定義的優先順序

            fall 2 #命令/指令碼執行失敗多少次才算真的失敗

            rise 1 #命令/指令碼執行成功多少次才算真的成功

        }

         

        vrrp_instance VI_1 { #配置虛擬路由器的例項,VI_1是自定義的例項名稱

            state MASTER #初始狀態,MASTER|BACKUP,當state指定的instance的初始化狀態,在兩臺伺服器都啟動以後,馬上發生競選,優先順序高的成為MASTER,所以這裡的MASTER並不是表示此臺伺服器一直是MASTER

            interface eth0 #通告選舉所用埠

            virtual_router_id 51 #虛擬路由的ID號(一般不可大於255)

            priority 101 #優先順序資訊            #備必須更低

            advert_int 1 #VRRP通告間隔,秒

            authentication {

            auth_type PASS #認證機制

            auth_pass 5344 #密碼(儘量使用隨機)

            }

            virtual_ipaddress { #虛擬地址(VIP地址)

                192.168.18.240 

            }

            track_script {          #呼叫上面定義的服務狀態跟蹤指令碼

                chk_nginx_health

            }

             

            #nopreempt #設定不搶佔,這裡只能設定在state為BACKUP的節點上,而且這個節點的優先順序必須別另外的高

            #preempt delay 300 #搶佔延遲,和nopreempt一樣只能用在BACKUP上,但不能和nopreempt同時使用

             

            notify_master "/etc/keepalived/notify.sh -m mb -n master -s nginx -a 192.168.18.240" #轉換為master狀態時使用此指令碼通知

            notify_backup "/etc/keepalived/notify.sh -m mb -n backup -s nginx -a 192.168.18.240" #轉換為backup狀態時使用此指令碼通知

            notify_fault "/etc/keepalived/notify.sh -m mb -n fault -s nginx -a 192.168.18.240" #轉換為fault狀態時使用此指令碼通知,如果指令碼帶有引數也就是有空格必須使用引號

        }

3-4、node2上的keepalived配置

配置node2成為備節點,和node1h配置主要差別有兩處,一是state BACKUP,二是priority 100優先順序更低,這是在搶佔模式下的配置,後面我們再說非搶佔式配置,差別不大,本配置如下:    

    ! Configuration File for keepalived

    global_defs { #全域性配置,這裡額外的靜態路由並未新增因為它是非必要的,除非我們在當前或特定的主機上生成特殊的靜態路由等

        notification_email { #realserver故障時通知郵件的收件人地址,可以多個

            [email protected]

        }

        notification_email_from root_keepalived #發件人資訊(可以隨意偽裝,因為郵件系統不會驗證處理髮件人資訊)

        smtp_server 127.0.0.1 #發郵件的伺服器(一定不可為外部地址)

        smtp_connect_timeout 30 #連線超時時間

        router_id LVS_DEVEL #路由器的標識(可以隨便改動)

    }

     

    vrrp_script chk_nginx_health { # 定義服務狀態跟蹤指令碼,指令碼中可以檢查高可用服務的狀態,返回狀態碼0表示服務正常;配置呼叫則在vrrp_instance中的track_script段;這裡chk_nginx是定義指令碼的名稱,可隨意取

        script "killall -0 nginx" #判斷命令/自己定義好的指令碼路徑;#這裡killall -0 nginx不會殺死nginx,只會在nginx啟動正常時返回0,停止時返回1,返回1就會在vrrp例項定義的優先順序減去下面的weight值,就表示期望這個節點為備用狀態。

        interval 1 #每隔1秒鐘執行一次

        weight -2 #上面的命令指令碼執行失敗,優先順序降低2;這個值的絕對值必須大於MASTER減BACKUP定義的優先順序

        fall 2 #命令/指令碼執行失敗多少次才算真的失敗

        rise 1 #命令/指令碼執行成功多少次才算真的成功

    }

     

    vrrp_instance VI_1 { #配置虛擬路由器的例項,VI_1是自定義的例項名稱

        state BACKUP #初始狀態,MASTER|BACKUP,當state指定的instance的初始化狀態,在兩臺伺服器都啟動以後,馬上發生競選,優先順序高的成為MASTER,所以這裡的MASTER並不是表示此臺伺服器一直是MASTER

        interface eth0 #通告選舉所用埠

        virtual_router_id 51 #虛擬路由的ID號(一般不可大於255)

        priority 100 #優先順序資訊            #備必須更低

        advert_int 1 #VRRP通告間隔,秒

        authentication {

            auth_type PASS #認證機制

            auth_pass 5344 #密碼(儘量使用隨機)

        }

        virtual_ipaddress { #虛擬地址(VIP地址)

            192.168.18.240 

        }

        track_script {          #呼叫上面定義的服務狀態跟蹤指令碼

            chk_nginx_health

        }

         

        #nopreempt #設定不搶佔,這裡只能設定在state為BACKUP的節點上,而且這個節點的優先順序必須別另外的高

        #preempt delay 300 #搶佔延遲,和nopreempt一樣只能用在BACKUP上,但不能和nopreempt同時使用

         

        notify_master "/etc/keepalived/notify.sh -m mb -n master -s nginx -a 192.168.18.240" #轉換為master狀態時使用此指令碼通知

        notify_backup "/etc/keepalived/notify.sh -m mb -n backup -s nginx -a 192.168.18.240" #轉換為backup狀態時使用此指令碼通知

        notify_fault "/etc/keepalived/notify.sh -m mb -n fault -s nginx -a 192.168.18.240" #轉換為fault狀態時使用此指令碼通知,如果指令碼帶有引數也就是有空格必須使用引號

    }

3-5、狀態轉換通知指令碼notify.sh

前面我們說過,自定義keepalived狀態轉換狀態變化指令碼notify.sh,放到/etc/keepalived目錄下,如下:

        #!/bin/bash

        # description: An example of notify script

        # Usage: notify.sh -m|--mode {mm|mb} -s|--service SERVICE1,... -a|--address VIP -n|--notify {master|backup|falut} -h|--help

        contact='[email protected]'

        helpflag=0

        serviceflag=0

        modeflag=0

        addressflag=0

        notifyflag=0

        Usage() {

            echo "Usage: notify.sh [-m|--mode {mm|mb}] [-s|--service SERVICE1,...] <-a|--address VIP> <-n|--notify {master|backup|falut}>"

            echo "Usage: notify.sh -h|--help" 

        }

        ParseOptions() {

            local I=1;

            if [ $# -gt 0 ]; then

                while [ $I -le $# ]; do

                    case $1 in

                        -s|--service)

                        [ $# -lt 2 ] && return 3

                        serviceflag=1

                        services=(`echo $2|awk -F"," '{for(i=1;i<=NF;i++) print $i}'`)

                        shift 2 ;;

                        -h|--help)

                        helpflag=1

                        return 0 

                        shift 

                    ;;

                    -a|--address)

                        [ $# -lt 2 ] && return 3

                        addressflag=1

                        vip=$2

                        shift 2 

                    ;;

                    -m|--mode)

                        [ $# -lt 2 ] && return 3

                        mode=$2

                        shift 2 

                    ;;

                    -n|--notify)

                        [ $# -lt 2 ] && return 3

                        notifyflag=1

                        notify=$2

                        shift 2 

                    ;;

                    *)

                        echo "Wrong options..."

                        Usage

                        return 7 

                    ;;

                    esac 

                done

                return 0 

            fi 

        }

        #workspace=$(dirname $0)

        RestartService() {

            if [ ${#@} -gt 0 ]; then

                for I in [email protected]; do

                    if [ -x /etc/rc.d/init.d/$I ]; then

                        /etc/rc.d/init.d/$I restart 

                    else

                        echo "$I is not a valid service..." 

                    fi 

                done 

            fi 

        }

        StopService() {

            if [ ${#@} -gt 0 ]; then

                for I in [email protected]; do

                    if [ -x /etc/rc.d/init.d/$I ]; then

                        /etc/rc.d/init.d/$I stop 

                    else

                        echo "$I is not a valid service..." 

                    fi 

                done 

            fi 

        }

        Notify() {

            mailsubject="`hostname` to be $1: $vip floating"

            mailbody="`date '+%F %H:%M:%S'`, vrrp transition, `hostname` changed to be $1."

            echo $mailbody | mail -s "$mailsubject" $contact 

        }

        # Main Function

        ParseOptions [email protected]

        [ $? -ne 0 ] && Usage && exit 5

        [ $helpflag -eq 1 ] && Usage && exit 0

        if [ $addressflag -ne 1 -o $notifyflag -ne 1 ]; then

            Usage

            exit 2 

        fi

        mode=${mode:-mb}

        case $notify in

        'master')

            if [ $serviceflag -eq 1 ]; then

                RestartService ${services[*]} 

            fi

            Notify master 

        ;;

        'backup')

            if [ $serviceflag -eq 1 ]; then

                if [ "$mode" == 'mb' ]; then

                    StopService ${services[*]} 

                else

                    RestartService ${services[*]} 

                fi 

            fi

            Notify backup 

        ;;

        'fault')

            Notify fault 

        ;;

        *)

            Usage

            exit 4 

        ;;

        esac

        exit 0

4、測試主備模型

1、在node1和node2上分別啟動keepalived,可以看到VIP配置到了node1上,成為了主節點,而訪問測試也正常,如下:

2、當我們killall nginx停止node1上的nginx時,可以看到VIP流轉到node2上,即node2成為主節點,而訪問正常,如下:

3、而接著當我們killall nginx停止node2的nginx時,可以看到VIP流轉回了node1,也即node1重新成為主節點,而訪問也正常;注意,我們並沒有手動啟動node1上前面kil掉的nginx,這是由notify.sh在node1成功主節點時完成的,如下:

4、當我們killall keepalived停止node1上的keepalived時,可以VIP再次流轉到node2,也即node2再次成為主節點,而訪問也正常;注意,我們檢視node1上的日誌可以看到node1上的VIP被移除了,如下:

5、接著,我們重啟node1上的keepalived,發現VIP流轉回node1,即node1成為了主節點,而之前node2作為主節點在正常執行的,這就是搶佔式了,node1配置優先順序高,恢復正常後搶佔了node2的主節點資源,如下:

6、配置非搶佔式:在配置BACKUP的node2上配置,nopreempt並且優先順序比MASTER的node1高,而後我們重啟node2上的keepalived,然後停止node1上的keepalived再次使node2成為主節點,如下:

7、接著,如上面第5步重啟node1上的keepalived,VIP依然在node2,即node2還作為主節點在正常執行,這就是非搶佔式,如下:

8、接著,我們停止node2上的keepalived,可以看到node1成為主節點,但VIP在node1、node2上都有,即node2沒有撤除VIP,keepalived就停止了,不過這也沒關,因為node1配置VIP時會自己自動發出ARP,這樣報文就能轉到node1了,如下:

9、接著,我們重啟node2上的keepalived,可以看到node2成為備節點,node1依然還是主節點,也沒有被搶佔,如下:

5、配置nginx+keepalived雙主模型

我們在《keepalived 及 keepalived配置LVS高可用叢集》中說過,Keepalived工作模型總是一主多備的,而這個雙主是指兩個VIP分別對應兩個VRRP例項(也就是兩個主備同時執行),如果兩個VIP對應同一個服務,可以在前面再加DNS輪循,對就兩條DNS的A記錄,這樣可以做到scale out 橫向擴充套件,並且充分利用資源。

注意,雙主最好不要配置非搶佔模式,因為一臺故障時另一臺執行兩個VIP,當恢復時需要把一個VIP搶佔流轉回來,這樣就才能平分流量。

5-1、修改主備配置

我們就在上面主備模型的基礎上,增加一個VRRP例項對就VIP2(192.168.18.250),但需要稍微修改前面配置,如記錄得改回node2上的搶佔模式,還有狀態轉換通知的指令碼配置改"-m mm",如下:

5-2、node1上增加的配置

直接在配置檔案後面加上加一個VRRP例項配置,這個例項node1為備節點,如下:

        vrrp_instance VI_2 { #配置虛擬路由器的例項,VI_1是自定義的例項名稱

            state BACKUP #初始狀態,MASTER|BACKUP,當state指定的instance的初始化狀態,在兩臺伺服器都啟動以後>,馬上發生競選,優先順序高的成為MASTER,所以這裡的MASTER並不是表示此臺伺服器一直是MASTER

            interface eth0 #通告選舉所用埠

            virtual_router_id 55 #虛擬路由的ID號(一般不可大於255)

            priority 100 #優先順序資訊 #備必須更低

            advert_int 1 #VRRP通告間隔,秒

            authentication {

                auth_type PASS #認證機制

                auth_pass 6675 #密碼(儘量使用隨機)

            }

            virtual_ipaddress { #虛擬地址(VIP地址)

                192.168.18.250

            }

            track_script { #呼叫上面定義的服務狀態跟蹤指令碼

                chk_nginx_health

            }

             

            #nopreempt #設定不搶佔,這裡只能設定在state為BACKUP的節點上,而且這個節點的優先順序必須別另外的高

            #preempt delay 300 #搶佔延遲,和nopreempt一樣只能用在BACKUP上,但不能和nopreempt同時使用

             

            notify_master "/etc/keepalived/notify.sh -m mm -n master -s nginx -a 192.168.18.250" #轉換為master狀態時使用

            此指令碼通知

            notify_backup "/etc/keepalived/notify.sh -m mm -n backup -s nginx -a 192.168.18.250" #轉換為backup狀態時使用

            此指令碼通知

            notify_fault "/etc/keepalived/notify.sh -m mm -n fault -s nginx -a 192.168.18.250" #轉換為fault狀態時使用>此指令碼通知,如果指令碼帶有引數也就是有空格必須使用引號

        }

5-3、node2上增加的配置

直接在配置檔案後面加上加一個VRRP例項配置,這個例項node2為主節點,如下:

        vrrp_instance VI_2 { #配置虛擬路由器的例項,VI_1是自定義的例項名稱

            state MASTER #初始狀態,MASTER|BACKUP,當state指定的instance的初始化狀態,在兩臺伺服器都啟動以後,>馬上發生競選,優先順序高的成為MASTER,所以這裡的MASTER並不是表示此臺伺服器一直是MASTER

            interface eth0 #通告選舉所用埠

            virtual_router_id 55 #虛擬路由的ID號(一般不可大於255)

            priority 101 #優先順序資訊 #備必須更低

            advert_int 1 #VRRP通告間隔,秒

            authentication {

                auth_type PASS #認證機制

                auth_pass 6675 #密碼(儘量使用隨機)

            }

            virtual_ipaddress { #虛擬地址(VIP地址)

                192.168.18.250

            }

            track_script { #呼叫上面定義的服務狀態跟蹤指令碼

                chk_nginx_health

            }

             

            #nopreempt #設定不搶佔,這裡只能設定在state為BACKUP的節點上,而且這個節點的優先順序必須別另外的高

            #preempt delay 300 #搶佔延遲,和nopreempt一樣只能用在BACKUP上,但不能和nopreempt同時使用

             

            notify_master "/etc/keepalived/notify.sh -m mm -n master -s nginx -a 192.168.18.240" #轉換為master狀態時使用此

            指令碼通知

            notify_backup "/etc/keepalived/notify.sh -m mm -n backup -s nginx -a 192.168.18.240" #轉換為backup狀態時使用此

            指令碼通知

            notify_fault "/etc/keepalived/notify.sh -m mm -n fault -s nginx -a 192.168.18.240" #轉換為fault狀態時使用此>指令碼通知,如果指令碼帶有引數也就是有空格必須使用引號

        }

6、測試nginx+keepalived雙主模型

我們分別重啟兩個節點上keepalived,可以看到VIP1(192.168.18.240)配置到node1上,而VIP2(192.168.18.250)配置到node2上,說明node1成為VRRP例項1的主節點,node2成為VRRP例項2的主節點;而訪問VIP1和VIP2都能正常,如下

到這裡,我們完成了用keepalived分別實現主備模型和雙主模型的nginx反向代理負載均衡伺服器的高可用,後面有時間將會在本檔案的基礎上進行nginx+tomcat的動靜分離配置……

【參考資料】

相關推薦

nginx nginx+keepalived 實現+模型可用負載均衡代理服務

nginx(四) nginx+keepalived 實現主備+雙主熱備模型的高可用負載均衡代理服務        在前面《nginx配置:反向代理 負載均衡 後端健康檢查 快取》等幾篇文章中,我們配置了nginx的反向代理負載均衡WEB叢集,而在《keepalived

MySQL集群keepalived實現mysql可用

健康檢查 重連 lose 搶占 pro 資源 交換機 state nec 前面大家介紹了主從、主主復制以及他們的中間件mysql-proxy的使用,這一篇給大家介紹的是keepalived的搭建與使用! 一、keepalived簡介 1.1、keepalived介紹

Nginx------nginx 負載均衡

  在上一篇部落格我們介紹了 Nginx 一個很重要的功能——代理,包括正向代理和反向代理。這兩個代理的核心區別是:正向代理代理的是客戶端,而反向代理代理的是伺服器。其中我們又重點介紹了反向代理,以及如何通過 Nginx 來實現反向代理。那麼瞭解了Nginx的反向代理之後,我們要通過Nginx的反向代理實現另

基於HAProxy+Keepalived可用負載均衡web服務的搭建

1.2 epo cnblogs oba backup 保持 ica mysql redis 一 原理簡介 1.HAProxyHAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy特別適用於那

Nginx學習之路NginX的子程序迴圈

//呼叫傳入的回撥函式,子程序的正式主迴圈開始,回撥函式的實體是ngx_worker_process_cycle proc(cycle, data); 今天就來介紹一下這個proc的具體過程:首先,proc函式是一個隨ngx_spawn_process(

lnmp——nginx防盜鏈、訪問控制、解析php、代理服務

12.13 Nginx防盜鏈 12.14 Nginx訪問控制 12.15 Nginx解析php相關配置 12.16 Nginx代理 12.13 Nginx防盜鏈 配置如下,可以和靜態檔案不記錄日誌的配置結合起來: location ~* ^.+\.(gif|jpg|png|s

Keepalived+Nginx實現可用負載均衡集群

連接 靜態 adf -1 rip mail fff hostname dex 一 環境介紹 1.操作系統CentOS Linux release 7.2.1511 (Core) 2.服務keepalived+lvs雙主高可用負載均衡集群及LAMP應用keepalived-1

Nginx-- Nginx實際使用配置

cal ddr conn access 增加 依然 worker ref tom 1.由於在nginx中需要配置很多東西,就會使得nginx.conf配置文件過於臃腫,所以我們會將配置文件合理的切分。大體的配置依然在nginx.conf中,其他的配置會放在etc下面的目錄中

nginx+keepalived實現可用負載均衡

其中 centos7.3 9.png IT 配置文件 bsp 是我 add nginx 環境: centos7.3虛擬機A 10.0.3.46 centos7.3虛擬機B 10.0.3.110 虛擬機A和B都需要安裝nginx和keepalived(過程省略,其中keepa

Nginx------nginx.conf 配置文件

影響 name 模型 logs deny app params 路徑 localhost   上一篇博客我們將 nginx 安裝在 /usr/local/nginx 目錄下,其默認的配置文件都放在這個目錄的 conf 目錄下,而主配置文件 nginx.conf 也在其中,後

百曉生詳解nginxnginx在實際生產環境中的應用該帖連載更新

2.0 編譯環境 + - apache 80端口 ali oss keep fff 案例一:Nginx+Tomcat負載均衡集群的部署案例概述:京北點指科技有限公司發布V3版移聯建站管理系統,該項目為JAVA語言開發web站點。實驗環境:站點服務器(tomcat1)cent

Android 開發:Button圓角實現

本節學習button的圓角實現: 利用上節登入button示例: 1.效果對比: <Button android:layout_width="match_parent" android:layout_height="45dp

深入理解多執行緒—— Moniter的實現原理

在深入理解多執行緒(一)——Synchronized的實現原理中介紹過關於Synchronize的實現原理,無論是同步方法還是同步程式碼塊,無論是ACC_SYNCHRONIZED還是monitorenter、monitorexit都是基於Monitor實現的,那麼這篇來介紹下什麼是Monitor。

Java程式設計師從笨鳥到菜鳥之七十二細談Spring利用註解實現spring基本配置詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

機器學習筆記Logistic迴歸實現及正則化

 一、Logistic迴歸實現 (一)特徵值較少的情況 1. 實驗資料 吳恩達《機器學習》第二課時作業提供資料1。判斷一個學生能否被一個大學錄取,給出的資料集為學生兩門課的成績和是否被錄取,通過這些資料來預測一個學生能否被錄取。 2. 分類結果評估 橫縱軸(特徵)為學生兩門課成績,可以在圖

【第17天】Java集合---Sorted介面實現的TreeSet集合及單值型別集合總結

1 TreeSet簡介 2 基本用法與特點 3 制定單值比較規則 3.1 自然排序(compareTo(Object obj)) 3.2 定製排序(定義比較器類) 3.2.1 普通類內定義

機器學習---支援向量機實戰核函式實現

這節和上一節很像,不同的是,上一篇的是通過支援向量和待分類資料內積進行分類的,只是這裡不同的是,在計算內積時使用核函式進行代替,這裡參考的是機器學習實戰中的核函式,如果前面理解的比較深入,讀程式碼還是很簡單的,這裡的程式碼建議不要剛開始就去讀核函式定義,建議先從測試核函式的程

簡單的通訊----使用DatagramSocket實現UDP協議

功能 UDP的簡單實用 程式碼 package com.demo; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddre

從零實現Vue的元件庫- File-Reader實現

實現一個File-Reader元件用來讀取本地資源。 概述: 在使用者手動上傳一些資源的時候,需要分為兩步,第一步是將其從本地讀取出來,得到一個file物件,然後再上傳至伺服器。該元件用於第一步,然後可通過後續進一步封裝程Upload元件。 該元件的痛點在於: 新增拖拽上傳的功能;

自學nginx: nginx + gunicorn的反向代理

前言 正好一個專案是python的flask框架開發的,部署的時候就考慮用gunicorn作為應用伺服器,然後再用nginx的反向代理套在應用伺服器的外層。 架構圖 每一臺server內部,都安裝nginx,以及部署gunicorn的python