CentOS 6.5上安裝MySQL-Cluster 7.3.4過程筆記

luashin發表於2016-03-13
環境說明:CentOS6.5 + MySQL-Cluster 7.3.4(最新GA版本),規劃2臺機器,一臺做控制伺服器+負載均衡伺服器+資料節點伺服器, 另一臺做負載均衡伺服器+資料節點伺服器;


一、下載,這裡為了方便安裝過程,這裡直接使用了RPM包來安裝,避開了編譯安裝的痛苦:

 首先先到下載如下的RPM安裝包 (http://dev.mysql.com/downloads/cluster/),記得選擇RedHat Enterprise Linux/Oracle Linux下面的 MySQL-Cluster-gpl-7.3.4-1.el6.x86_64.rpm-bundle.tar 這個安裝包,避免一個接一個下載的痛苦;

二、環境清理以及安裝:
1. mysql舊版本清除:
  首先使用如下命令來清理之前作業系統自帶的mysql安裝:yum -y remove mysql
然後使用如下命令:
rpm -qa | grep mysql*
對於找到的2個剩餘mysql包,請按照如下的命令格式予以刪除:
rpm -e --nodeps mysql-libs-5.1.71-1.el6.x86_64

2. mysql cluster版本安裝準備:將MySQL-Cluster-gpl-7.3.4-1.el6.x86_64.rpm-bundle.tar放到某個目錄下(譬如/package) 下面,並且執行如下命令解壓:

tar -xvf MySQL-Cluster-gpl-7.3.4-1.el6.x86_64.rpm-bundle.tar
得到如下檔案清單:
MySQL-Cluster-client-gpl-7.3.4-1.el6.x86_64.rpm
 MySQL-Cluster-devel-gpl-7.3.4-1.el6.x86_64.rpm
 MySQL-Cluster-embedded-gpl-7.3.4-1.el6.x86_64.rpm
 MySQL-Cluster-server-gpl-7.3.4-1.el6.x86_64.rpm
 MySQL-Cluster-shared-compat-gpl-7.3.4-1.el6.x86_64.rpm
 MySQL-Cluster-shared-gpl-7.3.4-1.el6.x86_64.rpm
 MySQL-Cluster-test-gpl-7.3.4-1.el6.x86_64.rpm

 3. mysql cluster版本安裝:
  建立資料夾(分如下3個類來建立對應的資料夾)
  儲存節點:mkdir /var/lib/mysql/data
    管理節點:mkdir /var/lib/mysql-cluster    SQL節點:可不用  資料夾授權
  程式DIR:    mkdir /var/run/mysqld             
 
  使用如下的命令來變更許可權保證可寫入:
  chmod -R 1777 /var/lib/mysql
    chmod -R 1777 /var/run/mysqld
    chmod -R 1777 /var/lib/mysql-cluster

    rpm -ivh MySQL-Cluster-server-gpl-7.3.4-1.el6.x86_64.rpm
    rpm -ivh MySQL-Cluster-client-gpl-7.3.4-1.el6.x86_64.rpm
特別注意,當安裝完畢server gpl包後,將出現如下提示資訊,提醒我們整個cluster安裝後的初次超級賬戶密碼存在/root/.mysql_secret這個檔案當中。
------------------------------------------------------------------------------------------------------
A RANDOM PASSWORD HAS BEEN SET FOR THE MySQL root USER !
 You will find that password in '/root/.mysql_secret'.
 You must change that password on your first connect,
 no other statement but 'SET PASSWORD' will be accepted.
 See the manual for the semantics of the 'password expired' flag.
 Also, the account for the anonymous user has been removed.
 In addition, you can run:
  /usr/bin/mysql_secure_installation
 which will also give you the option of removing the test database.
 This is strongly recommended for production servers.
 -----------------------------------------------------------


 4. 配置檔案撰寫與調整:
 cd /var/lib/mysql-cluster
 vim config.ini
 -----------------------------------------------------------------------------------------------------
 [computer]
 Id=mgr-server-01
 HostName=10.10.0.1

 [mgm default]
 datadir=/var/lib/mysql-cluster

 [mgm]
 HostName=10.10.0.1
 NodeId=60
 ExecuteOnComputer=mgr-server-01
 PortNumber=1186
 ArbitrationRank=2

 [ndbd default]
 NoOfReplicas=2
 DataMemory=8G
 IndexMemory=2G

 [ndbd]
 HostName=10.10.0.1
 DataDir=/var/lib/mysql
 NodeId=1

 [ndbd]
 HostName=10.10.0.2
 DataDir=/var/lib/mysql
 NodeId=2

 [mysqld]
 HostName=10.10.0.1
 NodeId=81

 [mysqld]
 HostName=10.10.0.2
 NodeId=82
 -----------------------------------------------------------------------------------------------------

5.  配置Mysql檔案:

vim /etc/my.cnf
 [client]
 socket=/var/lib/mysql/mysql.sock

 [mysqld]
 max_connections=100
 datadir=/var/lib/mysql
 socket=/var/lib/mysql/mysql.sock
 ndbcluster
 ndb-connectstring=10.10.0.1

 [mysqld_safe]
 log-error=/var/log/mysqld.log
 pid-file=/var/run/mysqld/mysqld.pid

 [mysql_cluster]
 ndb-connectstring=10.10.0.1
 -----------------------------------------------------------------------------------------------------


三、SQL Cluster初次啟動命令以及使用者密碼更改調整:(請嚴格按照次序啟動)

 執行初次啟動前請先確認 將兩臺機器的防火牆關閉(service iptables stop 或者 設定 防火牆埠可通,兩個埠即通訊埠1186、資料埠3306 )
初次啟動mgt console命令:ndb_mgmd -f /var/lib/mysql-cluster/config.ini
啟動均衡節點命令: ndbd --initial
啟動資料節點命令:mysqld_safe --defaults-file=/etc/my.cnf --explicit_defaults_for_timestamp &
注意在啟動過程中需要監測整個控制檯輸出,發現有錯誤資訊需要及時解決,根據錯誤日誌內容來解決。
------------------------------------------------------------------------------------------------------
如果一起正常,使用如下命令將Management console開啟:  ndb_mgm
輸入: show
 ndb_mgm> show
 Cluster Configuration
 -----------------------------------------------------------------------------------------------------
 [ndbd(NDB)]    2 node(s)
 id=1    @10.x.0.1  (mysql-5.6.15 ndb-7.3.4, Nodegroup: 0, *)
 id=2    @10.x.0.2  (mysql-5.6.15 ndb-7.3.4, Nodegroup: 0)

 [ndb_mgmd(MGM)] 1 node(s)
 id=60  @10.x.0.1  (mysql-5.6.15 ndb-7.3.4)

 [mysqld(API)]  2 node(s)
 id=81  @10.x.0.1  (mysql-5.6.15 ndb-7.3.4)
 id=82  @10.x.0.2  (mysql-5.6.15 ndb-7.3.4)
 -----------------------------------------------------------------------------------------------------
修正密碼:
 當mysqld 啟動完畢正常後(可以使用pgrep mysqld來獲取程式ID),我們可以使用如下命令修改:
mysql -u root -p;
隨機密碼(具體請參見/root/.mysql_secret檔案獲取),進入後使用如下指令修改密碼:
SET PASSWORD = PASSWORD('新密碼');
幾臺裝有SQL資料節點的伺服器皆需要執行一遍上述命令;
------------------------------------------------------------------------------------------------------


四、Cluster效果測試:

 使用mysql -u root -p 密碼;
輸入對應的密碼後登陸到系統,按照如下命令開始新建database;
 create database clustertest;
 use clustertest;
 CREATE TABLE testtable(Count INT) ENGINE=NDBCLUSTER;
特別注意,只有使用了NDBCluster引擎的表才會執行同步操作,因此特別需要在上述表加入這個字尾;


五、關閉Cluster:(需要嚴格按照次序執行)
關閉資料節點:mysqld stop  (SQL節點可以用mysqladmin shutdown或別的方式關閉。)
在管理節點上執行:shell> ndb_mgm -e shutdown
將安全的關閉管理節點和資料節點。

關閉後使用如下的程式檢測命令檢視一下是否退出來了:
pgrep mysqld
ps aux | grep nbdb
如果沒有,找到對應的pid進行kill 操作即可。

六、再次啟動Cluster方案:
啟動整個cluster的次序:
ndb_mgmd -f /var/lib/mysql-cluster/config.ini
 ndbd
 mysqld_safe --defaults-file=/etc/my.cnf --explicit_defaults_for_timestamp &
 -----------------------------------------------------------------------------------------------------
雜記:
防火牆策略調整: iptables -A INPUT -s 192.168.100.0/24 -i eth2 -p tcp -m tcp -j ACCEPT
修改密碼方法一:
mysqladmin -u root password root (更改密碼)                    (沒有新密碼前執行)
mysqladmin -u root -p 'xxxxxx' password 'NewPassword';  (安裝完畢後啟動mysqld執行)

修改密碼方法二:
UPDATE mysql.user SET Password=PASSWORD('Password01!') WHERE User='root';
FLUSH PRIVILEGES;

修改密碼方法三:
讓mysql以不帶安全控制的方式啟動:
mysqld_safe --user=mysql --skip-grant-tables --skip-networking;
然後再用前面2種方法修改密碼;

注:下文涉及到配置的,如無特別說明,主備機則一致!
一、環境介紹
1、這是我的版本,CentOS7.1,主備都為該版本
[root@localhost ~]# cat /etc/-release
CentOS Linux release 7.1.1503 (Core)
[root@localhost ~]# cat /proc/version
Linux version 3.10.0-229.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.2 20140120 ( 4.8.2-16) (GCC) ) #1 SMP Fri Mar 6 11:36:42 UTC 2015

2、修改主機名並修改host
[root@localhost ~]# hostnamectl set-hostname node-01
[root@localhost ~]# vi /etc/hosts
127.0.0.1node-01在127後面新增node-01

二、拓撲圖的規劃:
A)
|------------IP地址-----------------|----------|------軟體----------|----------|-狀態--|
|172.21.4.51(VIP:172.21.4.44 )|----------|keepalived+nginx|----------|Master |
|172.21.4.52(VIP:172.21.4.44 )|----------|keepalived+nginx|----------|Backup|
|---------172.21.4.91-------------|----------|------IIS------------|----------|-Web1-|
|---------172.21.4.91-------------|----------|------IIS------------|----------|-Web2-|
B)
Internet--
        |
    ============= 
    | ISP Router|
    =============
        |                              |
        |                              |---- Web1 (172.21.4.91)
        |-HA-|eth0--> 172.21.4.51              |
        |            \                /
        |              \              /
        |              ===VIP(172.21.4.44)===
        |              /              \
        |            /                \
        |-HA-|eth0--> 172.21.4.52              |
                                      |---- Web2 (172.21.4.92)
                                      |
注:在閘道器上已針對VIP(172.21.4.44)作了80埠對映。
此架構需考慮的問題:
1、Master執行,則Master佔有vip且Nginx能夠正常服務;
2、Master掛了,則Backup搶佔vip且Nginx能夠正常服務;
3、任何一臺前端nginx服務掛了,則vip資源轉移到另一臺伺服器上,併傳送提醒郵件;
4、nginx需要檢測後端伺服器的健康狀態(由於應用是掛在預設網站下的虛擬目錄,且無法更改,必須能夠對虛擬目錄進行健康檢查)
5、由於應用需要Session保持,但由於沒有做Session共享,實際伺服器角色轉換時,應用會受到一定的影響。

三、安裝前的準備工作
CentOS7環境下,預設是使用FireWallD服務,即使你修改了iptables,重啟又被初始化了,需要再 次手動systemctl restart  iptables.service才能使設定的iptables生效,由於FireWallD暫時還沒有熟悉使用方法且不知道他比iptables到底有 哪些優勢,保險起見,還是換回原先的iptables

1、關閉firewall:
[root@node-01 ~]# systemctl stop firewalld.service
#停止firewall
[root@node-01 ~]# systemctl disable firewalld.service 或 systemctl mask firewalld.service
#禁止firewall開機啟動

2、安裝iptables防火牆
[root@node-01 ~]# yum install iptables-services -y
[root@node-01 ~]# systemctl enable iptables

3、在進行Keepalived和nginx配置前,務必將叢集內的幾臺主機的通訊相互完全放行(並開放80的Web訪問規則),否則很有可能出現腦裂或其他問題,可直接在配置檔案內加入以下語句;
[root@node-01 ~]# vi /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -s 172.21.4.51 -j ACCEPT
-A INPUT -s 172.21.4.52 -j ACCEPT
-A INPUT -s 172.21.4.91 -j ACCEPT
-A INPUT -s 172.21.4.92 -j ACCEPT

[root@node-01 ~]# systemctl restart iptables.service

四、Keepalived與Nginx的安裝
1、安裝ipvsadm
[root@node-01 ~]# yum install ipvsadm
[root@node-01 ~]# ipvsadm -v
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
ipvs(IP Virtual Server)是整個負載均衡的基礎,如果沒有這個基礎,故障隔離與失敗切換就毫無意義了。ipvs 具體實現是由 ipvsadm 這個程式來完成的。CentOS7.1預設自帶安裝了。

2、安裝keepalived(其實7.1自帶了)
[root@node-01 ~]# yum install keepalived
[root@node-01 ~]# keepalived -v
Keepalived v1.2.13 (03/06,2015)

3、安裝當前最新穩定版1.8.0
注1:一開始是用yum安裝的nginx,結果發現後端伺服器Down機或狀態不正常時,nginx也照常轉發請求,後面yum erase nginx後,進行了手動安裝。因為需要額外新增 nginx_upstream_check_module模組。
注2:安裝過程會提示型別這樣的錯誤 ./configure: error: the HTTP rewrite module requires the PCRE library.
所以先安裝相應的支援庫來解決。pcre,正規表示式匹配支援;zlib,用於壓縮等等。
[root@node-01 ~]# yum -y install gcc-c++ pcre-devel zlib-devel

1) 為nginx建立一個www組,並建立一個不登入的賬戶nginx,放入www使用者組
[root@node-01 ~]# groupadd -f www
[root@node-01 ~]# useradd -d /var/cache/nginx -s /sbin/nologin -g www nginx
2) 建立目錄用於存放nginx日誌檔案,並賦許可權
[root@node-01 ~]# mkdir /var/log/nginx
[root@node-01 ~]# mkdir /usr/local/nginx
[root@node-01 ~]# chown -R nginx.www /var/log/nginx
[root@node-01 ~]# chown -R nginx.www /usr/local/nginx

3) 分別下載nginx、額外模板及安裝
[root@node-01 ~]# mkdir /nginx
[root@node-01 ~]# cd /nginx
[root@node-01 nginx]# wget
[root@node-01 nginx]# wget
[root@node-01 nginx]# tar -xvf nginx-1.8.0.tar.gz
[root@node-01 nginx]# unzip master.zip
#在當前目錄下解壓出nginx_upstream_check_module-master這個目錄

[root@node-01 nginx]# cd nginx-1.8.0/
[root@node-01 nginx-1.8.0]# patch -p1 < /nginx/nginx_upstream_check_module-master/check_1.7.5+.patch
#由於安裝版1.8.0穩定版,所以選check_1.7.5+.patch這個補丁包,其他版本相應選擇即可
#如果提示bash: patch: 未找到命令...應該安裝一下patch命令包yum -y install patch

[root@node-01 nginx-1.8.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=www --pid-path=/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --add-module=/nginx/nginx_upstream_check_module-master
[root@node-01 nginx-1.8.0]# make && make install

便於以後的操作,進行以下設定並製作自啟動檔案:
[root@node-01 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
[root@node-01 ~]# vi /usr/lib/systemd/system/nginx.service
#加下以下內容:
#---------Begin------------------------------------
[Unit]
Description=nginx - high performance web server
Documentation=
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
#---------end--------------------------------------

[root@node-01 /]# systemctl enable nginx.service
系統啟動時讓nginx.service自啟動。

4) keepalived和Nginx最好也設定開機啟動
[root@node-01 ~]# systemctl enable keepalived
[root@node-01 ~]# systemctl enable nginx

五、Keepalived配置
在配置keepalived之前,先關閉selinux
A、vi /etc/selinux/config
B、設定 SELINUX=disabled 儲存
C、執行  setenforce 0
如果只想臨時關閉,直接輸入:setenforce 0
[root@node-01 ~]# vi /etc/keepalived/keepalived.conf
#############keepalived配置#############################################################

! Configuration File for keepalived

global_defs {
}

vrrp_script chk_nginx {
#必須放在track程式碼的上方,否則無效,測試了幾次是這個情況

  script "killall -0 nginx"
  #用shell命令檢查nginx服務是否存在

  interval 1
  #時間間隔為1秒檢測一次

  weight -15
  #當nginx的程式不存在了,就把當前的權重-15
}

vrrp_instance VI_1 {
    state MASTER
    #主LVS是MASTER,從主機時此項要改為BACKUP,要大寫

    interface enp4s0
    #LVS監控的網路介面

    virtual_router_id 51
    #同一例項下virtual_router_id必須相同,MASTRE/BACKUP 設定值要一樣

    priority 100
    #定義優先順序,數字越大,優先順序越高,把此份Conf複製到另一臺機器上時,設定的priority值要比MASTRE權重值低

    advert_int 1
    #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒

    authentication {
        auth_type PASS
        auth_pass 376879148
        #驗證型別和密碼,有PASS和AH兩種,一般用PASS,據說AH有問題,認證密碼主備伺服器之間一定要一致,否則出錯
    }

    virtual_ipaddress {
        172.21.4.44
        #設定虛擬IP,可以有多個地址,每個地址佔一行,不需掩碼。注意:這個 ip 必須與我們在 lvs 客戶端設定的vip相一致
    }

  track_script {
        chk_nginx
        #引用上面的vrrp_script定義的指令碼名稱
        }

  notify_master "/etc/keepalived/changemail.py master"
  notify_backup "/etc/keepalived/changemail.py backup"
  notify_fault "/etc/keepalived/changemail.py fault"
  #指定當切換到主、備及故障狀態時,執行的指令碼
}

###################################################################################

六、HA狀態切換時的郵件提醒
[root@node-02 ~]# python -V
Python 2.7.5
[root@node-01 ~]# vi /etc/keepalived/changemail.py

########################changemail.py利用Python2.7程式發郵件###########################

#!/usr/bin/python 
# -*- coding: UTF-8 -*-     
import smtplib 
import socket
import time
from email.MIMEText import MIMEText 
from email.Utils import formatdate 
from email.Header import Header 
import sys

#傳送郵件的相關資訊,根據實際情況填寫 
smtpHost = 'smtp.exmail.qq.com'
smtpPort = '25'
sslPort  = '465'
fromMail = 'youki@appi.com'
toMail  = 'youki@appi.com'
username = 'youki@appi.com'
password = 'xxxxxxx'
#解決中文問題 
reload(sys) 
sys.setdefaultencoding('utf8') 
 
#郵件標題和內容 
subject  = socket.gethostname() + " HA status has changed"
body    = (time.strftime("%Y-%m-%d %H:%M:%S")) + " vrrp transition, " + socket.gethostname() + " changed to be " + sys.argv[1]
 
#初始化郵件 
encoding = 'utf-8' 
mail = MIMEText(body.encode(encoding),'plain',encoding) 
mail['Subject'] = Header(subject,encoding) 
mail['From'] = fromMail 
mail['To'] = toMail 
mail['Date'] = formatdate() 
 
try: 
    #連線smtp伺服器,明文/SSL/TLS三種方式,根據你使用的SMTP支援情況選擇一種 
    #普通方式,通訊過程不加密 
    #smtp = smtplib.SMTP(smtpHost,smtpPort)
    #smtp.ehlo() 
    #smtp.login(username,password) 
 
    #tls加密方式,通訊過程加密,郵件資料安全,使用正常的smtp埠 
    #smtp = smtplib.SMTP(smtpHost,smtpPort) 
    #smtp.ehlo() 
    #smtp.starttls() 
    #smtp.ehlo() 
    #smtp.login(username,password) 
 
    #純粹的ssl加密方式,通訊過程加密,郵件資料安全 
    smtp = smtplib.SMTP_SSL(smtpHost,sslPort) 
    smtp.ehlo() 
    smtp.login(username,password) 
 
    #傳送郵件 
    smtp.sendmail(fromMail,toMail,mail.as_string()) 
    smtp.close() 
    print 'OK' 
except Exception: 
    print 'Error: unable to send email'
[root@node-01 ~]#
#######################################################################################

1、上面的指令碼製作完成後,記得賦權,否則無法執行。
[root@node-01 ~]# chmod +x /etc/keepalived/changemail.py

[root@node-01 ~]#scp /etc/keepalived/keepalived.conf 172.21.4.52:/etc/keepalived
把主機上的配置檔案copy到Backup伺服器上,現在在兩臺主機上可以利用 ip addr show命令來檢視VIP的獲取情況

2、keeplived日誌位置指定:
在主從keeplived節點上編譯/etc/sysconfig/keepalived檔案

[root@node-01 ~]# vi /etc/sysconfig/keepalived
將最後一行KEEPALIVED_OPTIONS="-D" 修改為:KEEPALIVED_OPTIONS="-D -d -S 0"

3、修改主從節點日誌配置檔案/etc/rsyslog.conf
[root@node-01 ~]# vi /etc/rsyslog.conf
加入如下配置:
#keepalived -S 0
local0.*/var/log/keepalived.log

4、重啟日誌服務
[root@node-01 ~]# systemctl restart rsyslog.service

5、檢查/var/log/keepalived.log檔案是否存在

注意事項:
1、輸出的日誌資訊: /var/log/messages ,更具體的日誌資訊輸出需要在啟動keepalived時加 -d 引數。
2、在都為MASTER且priority一樣的情況下,後啟的節點(service vrrp start)會取代正在執行的節點變成主用的。
3、一臺為MASTER且priority較高的情況下,不受次節點down/up影響,並且其本身再從down變為up時,會搶奪控制權。
4、在都為MASTER且priority一樣的情況下,正在執行的主節點down(斷網),次節點會自動接管,主節點再起來時不會去搶奪控制權。
#keepalived會定時執行指令碼並對指令碼執行的結果進行分析,動態調整vrrp_instance的優先順序。
#如果指令碼執行結果為0,並且weight配置的值大於0,則優先順序相應的增加
#如果指令碼執行結果非0,並且weight配置的值小於0,則優先順序相應的減少
#其他情況,維持原本配置的優先順序,即配置檔案中priority對應的值。
#這裡需要注意的是:
#1) 優先順序“不會”不斷的提高或者降低,當track的物件恢復時,又是一致的
#2) 可以編寫多個檢測指令碼併為每個檢測指令碼設定不同的weight
#3) 不管提高優先順序還是降低優先順序,最終優先順序的範圍是在[1,254],不會出現優先順序小於等於0或者優先順序大於等於255的情況
#這樣可以做到利用指令碼檢測業務程式的狀態,並動態調整優先順序從而實現主備切換。

七、nginx配置

[root@node-01 nginx]# vi /usr/local/nginx/conf/nginx.conf
#############nginx配置#############################################################

user  nginx www;
worker_processes  2;
#nginx程式數,建議設定為等於CPU總核心數

#worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#為每個程式分配cpu,將N個程式分配到N個cpu,可以寫多個或者將一個程式分配到多個cpu
error_log  /var/log/nginx/error.log crit;
#pid      /run/nginx.pid;

events {
        use epoll;
        #epoll是多路複用IO(I/O Multiplexing)中的一種方式,但是僅用於linux2.6以上核心,可以 能
        worker_connections 102400;
        #最大連線數量,根據硬體調整,理論上每臺nginx伺服器的最大連線數為worker_processes*s
        }

http {
        include      /usr/local/nginx/conf/mime.types;
        default_type  application/octet-stream;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

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

    sendfile        on;
   
    #tcp_nopush    on;
   
    server_tokens off;
    #nginx隱藏版本號

    keepalive_timeout  65;

    proxy_intercept_errors on;
    #表示使nginx阻止HTTP應答程式碼為400或者更高的應答

    gzip on;
    #該指令用於開啟或關閉gzip模組(on/off)

    gzip_min_length 1k;
    #設定允許壓縮的頁面最小位元組數,頁面位元組數從header頭得content-length中進行獲取。預設值是0,不管頁面多大都壓縮。建議設定成大於1k的位元組數,小於1k可能會越壓越大。

    gzip_buffers 4 8k;
    #設定系統獲取幾個單位的快取用於儲存gzip的壓縮結果資料流。4 8k代表以8k為單位,安裝原始資料大小以16k為單位的4倍申請記憶體。

    gzip_http_version 1.1;
    #識別http的協議版本(1.0/1.1)

    gzip_comp_level 3;
    #gzip壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu)

gzip_types text/plain text/css application/json application/javascript application/x-javascript text/javascript text/xml application/xml application/xml+rss;
    #匹配mime型別進行壓縮,無論是否指定,”text/html”型別總是會被壓縮的,經實測對本網站的圖片壓縮後,積極反而增大,所以取消圖片類的壓縮。

gzip_vary on;
    #和http頭有關係,加個vary頭,給代理伺服器用的,有的瀏覽器支援壓縮,有的不支援,所以避免浪費不支援的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮

    upstream MyApp{
              ip_hash;
              #1.輪詢(預設):每個請求按時間順序逐一分配到不同的後端伺服器,如果後端 除
              #2.weight:指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不 況
              #3.ip_hash:每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後題
              #4.fair(第三方):按後端伺服器的響應時間來分配請求,響應時間短的優先分配

              server 172.21.4.91:80 max_fails=2 fail_timeout=10s;
              server 172.21.4.92:80 max_fails=2 fail_timeout=10s;
              #max_fails預設為1,fail_timeout預設為10秒,預設情況下後端伺服器在10秒內出錯1次認為伺服器異常將停止轉發
              check interval=3000 rise=2 fall=2 timeout=1000 type=http;
              #對條目中的所有節點,每3秒檢測1次,請求2次正常則標記該機狀態為UP
              check_http_send "GET /appicrm HTTP/1.0\r\n\r\n";
              #檢測網址子目錄,在這裡為
                    }
    server
        {
          listen      80;
          server_name  mail.appi.cn;
          charset utf-8;
          location ~ .*\.(ico|gif|jpg|jpeg|png|bmp|swf|js|css|htm|html)$
                  {
                    access_log image.log;
                    expires 14d;
                    root /usr/local/nginx/proxy_cache;
                    proxy_store on;
                    proxy_temp_path /usr/local/nginx/proxy_cache_image;
                    if ( !-e $request_filename)
                    #檔案和目錄不存在的時候重定向
                      {proxy_pass }
                      #rewrite ^(.*) break;
                    }
                    #last:重新將rewrite後的地址在server標籤中執行
                    #break:將rewrite後的地址在當前location標籤中執行

      location / {
              rewrite ^/(.*)$ /appicrm/$1 last;
              }
         
          location ~* ^/appicrm/.*$ {
                            proxy_set_header        Host $host;
                            proxy_set_header        REMOTE-HOST $remote_addr;
                            proxy_set_header        X-Real-IP $remote_addr;
                            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                            proxy_pass             
                            client_max_body_size    10m;
                            client_body_buffer_size 128k;
                            proxy_connect_timeout  90;
                            proxy_send_timeout      90;
                            proxy_read_timeout      90;
                            proxy_buffer_size      4k;
                            proxy_buffers          4 32k;
                            proxy_busy_buffers_size 64k;
                            proxy_temp_file_write_size 64k;
                            }
      location /webstatus {
                    check_status;
                    access_log off;
                    error_log off;
                    auth_basic "Restricted";
                    auth_basic_user_file  /usr/local/nginx/conf/htpasswd/test;
                    #allow IP;
                    #deny all;
                    }

      error_page  500 502 503 504  /50x.html;
      location = /50x.html {
      root  html;
      }
  }
}
[root@localhost ~]#
###################################################################################
 
有幾個需要注意的問題:
1、如下提示的Pid錯誤 
7月 15 18:11:24 localhost.localdomain systemd[1]: Failed to read PID from file /var/run/nginx.pid: Invalid argument
解 決:註釋掉/usr/lib/systemd/system/nginx.service檔案內的指定PID路徑那一行,後面find nginx 的PID實際存的位置後再修改回正常的,或乾脆註釋掉,因為我的修改了後面又出錯了。nginx安裝的時候指定的位置居然不正確,不知道為何!網上有很多 解決方法包括國外網站都說要安裝各種支援檔案,經測試都是錯誤答案。
2、Webstatus這個狀態查詢頁面,你肯定不希望所有人都能訪問,所以需要加密
[root@node-01 ~] mkdir /usr/local/nginx/conf/htpasswd/
[root@node-01 ~] htpasswd -c /usr/local/nginx/conf/htpasswd/test Youki
New password:
Re-type new password:
Adding password for user auth_user
[root@node-01 ~] vi /usr/local/nginx/conf/nginx.conf
auth_basic "Restricted";
auth_basic_user_file  /usr/local/nginx/conf/htpasswd/test;

將以上兩句加入/webstatus節

以上配置自行經過各種切換測試且透過,如果有博友發現問題可與我交流,感謝閱讀!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9034054/viewspace-2056725/,如需轉載,請註明出處,否則將追究法律責任。

相關文章