Nginx架構的企業級應用
====================================================
實作HA高可用叢集
實作LB負載均衡叢集
Nginx實作反向代理
Nginx實作動靜分離
==================================================

需求:
用戶端通路靜态的請求,由nginx反向代理給後端的Apache伺服器;
用戶端通路動态的請求,由nginx反向代理給後端的php-fpm(fastCGI)伺服器,而且做負載均衡,如果需要通路資料庫,則由php-fpm連接配接mysql;
如果nginx主伺服器當機之後,nginx備伺服器馬上頂替主伺服器,提供服務;
伺服器IP規劃和所需軟體安裝:
IP位址 | 軟體 | |
nginx主 | 172.16.22.1 (VIP 172.16.22.10) | nginx+heartbeat |
nginx備 | 172.16.22.2 (VIP 172.16.22.10) | |
Apache | 172.16.22.3 | httpd |
php-fpm1 | 172.16.22.4 | php(提供fastCGI伺服器) |
php-fpm2 | 172.16.22.5 | |
mysql | 172.16.22.6 |
heartbeat軟體包,已經以附件的形式上傳了nginx、php、mysql的軟體包在網上都很好下載下傳
需解決的問題:
1)、怎麼實作HA高可用叢集
思路:安裝heartbeat軟體,把nginx主伺服器和nginx備伺服器這兩個節點都加入到heartbeat中,用heartbeat的crm管理資源,定義高可用叢集
2)、怎麼實作LB負載均衡叢集
思路:利用nginx的upstream子產品,配置實作應用層的負載均衡
3)、nginx怎麼把客戶的靜态請求送出給後端的Apache伺服器聯系
思路:利用nginx的反向代理給後端的Apache伺服器
4)、nginx怎麼把客戶的動态請求送出給後端的php-fpm伺服器聯系
思路:首先nginx支援fastCGI,然後利用nginx的反向代理給php-fpm伺服器
5)、php-fpm伺服器怎麼和mysql伺服器聯系
思路:mysql授權能讓php-fpm伺服器連接配接資料庫
一、先安裝每個伺服器所需的軟體
nginx主伺服器的配置:
1)、編譯安裝nginx
[root@jie1 ~]# ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk -F: '{print $2}' | cut -d' ' -f1 檢視ip位址
172.16.22.1
[root@jie1 ~]#tar xf nginx-1.4.2.tar.gz
[root@jie1 ~]# yum -y groupinstall "Development tools" "Server Platform Development" 安裝開發包
[root@jie1 ~]#yum -y install pcre-devel 安裝依賴性包
[root@jie1 ~]# cd nginx-1.4.2
[root@jie1 nginx-1.4.2]# groupadd nginx
[root@jie1 nginx-1.4.2]# useradd -r -g nginx nginx
[root@jie1 nginx-1.4.2]#./configure \
--prefix=/usr \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre
[root@jie1 nginx-1.4.2]# make && make install
2)、提供System V腳本
[root@jie1 nginx-1.4.2]# vim /etc/rc.d/init.d/nginx
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
[root@jie1 nginx-1.4.2]# chmod +x /etc/rc.d/init.d/nginx
[root@jie1 nginx-1.4.2]# service nginx start
Starting nginx: [ OK ]
[root@jie1 nginx-1.4.2]#
3)、編譯安裝src格式的heartbeat的源碼包
[root@jie1 ~]# useradd mockbuild 建立此使用者用于編譯src的源碼包
[root@jie1 ~]# rpm -ivh heartbeat-2.1.4-12.el6.src.rpm
1:heartbeat ################################### [100%]
[root@jie1 ~]# yum -y install rpm-build
[root@jie1 ~]#cd rpmbuild/
[root@jie1 rpmbuild]# cd SPECS/
[root@jie1 rpmbuild]# yum -y install glib2-devel libnet-devel libtool-ltdl-devel net-snmp-devel openhpi-libs gnutls-devel python-devel
[root@jie1 rpmbuild]# rpmbuild -ba heartbeat.spec
[root@jie1 x86_64# pwd
/root/rpmbuild/RPMS/x86_64
[root@jie1 x86_64#ls 生成的所有軟體包
heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm
heartbeat-debuginfo-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm
heartbeat-devel-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm
heartbeat-gui-2.1.4-12.el6.x86_64.rpm
[root@jie1 x86_64]#mv heartbeat-debuginfo-2.1.4-12.el6.x86_64.rpm heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm heartbeat-devel-2.1.4-12.el6.x86_64.rpm /root 有些軟體包不必安裝,是以移動到别的目錄下
[root@jie1 x86_64]#ls
heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm
heartbeat-gui-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm
[root@jie1 x86_64]#yum -y install PyXML 安裝依賴性包
[root@jie1 x86_64]# rpm -ivh *.rpm 直接安裝此目錄下的所有rpm包
Preparing... ################################# [100%]
1:heartbeat-pils ################################# [ 25%]
2:heartbeat-stonith ################################# [ 50%]
3:heartbeat ################################# [ 75%]
4:heartbeat-gui ################################# [100%]
[root@jie1 x86_64]#
4)、建立heartbeat的配置檔案和認證檔案,以及修改hosts檔案,使HA的節點能用主機名進行通信
[root@jie1 ~]# cd /usr/share/doc/heartbeat-2.1.4/
[root@jie1 heartbeat-2.1.4]# cp authkeys ha.cf /etc/ha.d/
[root@jie1 heartbeat-2.1.4]# vim /etc/hosts
172.16.22.1 jie1.com jie1
172.16.22.2 jie2.com jie2
5)、修改heartbeat的配置檔案和認證檔案
[root@jie1 heartbeat-2.1.4]# cd /etc/ha.d/
[root@jie1 ha.d]# openssl rand -hex 8 #生成随機數
29c59aeaf3109993
[root@jie1 ha.d]# sed -e '/^#/d' authkeys
auth 3
3 md5 29c59aeaf3109993 #把生成的随機數
[root@jie1 ha.d]# chmod 600 authkeys
[root@jie1 ha.d]# grep -v "^#" ha.cf | grep -v "^$"
logfile /var/log/ha-log #日志存放位置
keepalive 2 #心跳的時間間隔,預設時間機關為秒
deadtime 3 # 超出該時間間隔未收到對方節點的心跳,則認 為對方已經死亡
warntime 10 #超出該時間間隔未收到對方節點的心跳,則發出警告并記錄到日志中,但此時不會切換
initdead 60 #在某些系統上,系統啟動或重新開機之後需要經過一段時間網絡才能正常工作,該選項用于解決這種情況産生的時間間隔。
udpport 694 #設定廣播通信使用的端口,694為預設使用的端口号
mcast eth0 225.23.32.1 694 1 0 #多點傳播位址
auto_failback on #用于定義當主節點恢複後,是否将服務自動切回
node jie1.com #必須寫hostname顯示的主機名,節點一的主機名
node jie2.com
ping 172.16.0.1 #用ping網關,來驗證節點是否當機
crm on
[root@jie1 ha.d]#
6)、把nginx的服務腳本加入到heartbeat的資源目錄下,讓heartbeat的crm(資源管理層)來管理nginx服務。
[root@jie1 heartbeat-2.1.4]# cd /etc/ha.d/
[root@jie1 ha.d]# cd resource.d/
[root@jie1 resource.d]# cp /etc/rc.d/init.d/nginx ./
[root@jie1 resource.d]# service nginx stop 關閉nginx服務,讓heartbeat來管理
Stopping nginx: [ OK ]
[root@jie1 resource.d]#passwd hacluster 為hacluster使用者建立密碼
nginx備伺服器的配置:
[root@jie2 ~]# ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk -F: '{print $2}' | cut -d' ' -f1 檢視ip位址
172.16.22.2
[root@jie2 ~]#tar xf nginx-1.4.2.tar.gz
[root@jie2 ~]# yum -y groupinstall "Development tools" "Server Platform Development" 安裝開發包
[root@jie2 ~]#yum -y install pcre-devel 安裝依賴性包
[root@jie2 ~]# cd nginx-1.4.2
[root@jie2 nginx-1.4.2]# groupadd nginx
[root@jie2 nginx-1.4.2]# useradd -r -g nginx nginx
[root@jie2 nginx-1.4.2]#./configure \
--prefix=/usr\
--sbin-path=/usr/sbin/nginx\
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client/\
--http-proxy-temp-path=/var/tmp/nginx/proxy/\
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/\
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi\
--http-scgi-temp-path=/var/tmp/nginx/scgi\
--with-pcre
[root@jie2 nginx-1.4.2]# make && make install
2)、複制nginx主伺服器的System V腳本檔案和heartbeat所需的軟體包
[root@jie2 ~]# scp 172.16.22.1:/etc/rc.d/init.d/nginx /etc/rc.d/init.d/
[root@jie2 ~]#scp 172.16.22.1:/root/rpmbuild/RPMS/x86_64/* /root
[root@jie2 ~]# ls
anaconda-ks.cfg install.log
heartbeat-2.1.4-12.el6.x86_64.rpm install.log.syslog
heartbeat-gui-2.1.4-12.el6.x86_64.rpm
heartbeat-pils-2.1.4-12.el6.x86_64.rpm
heartbeat-stonith-2.1.4-12.el6.x86_64.rpm
[root@jie2 ~]#
3)、安裝從nginx主伺服器copy過來的heartbeat軟體
[root@jie2 ~]# yum -y install PyXML libnet-devel net-snmp-libs
[root@jie2 ~]# rpm -ivh *.rpm
Preparing... ################################### [100%]
1:heartbeat-pils ################################### [ 25%]
2:heartbeat-stonith ################################### [ 50%]
3:heartbeat ################################### [ 75%]
4:heartbeat-gui ################################### [100%]
[root@jie2 ~]#
4)、由于是HA叢集,HA叢集必須保證節點的配置檔案完全一樣,在這裡我們直接把nginx主伺服器的heartbeat的配置檔案copy過來。
[root@jie2 ~] scp 172.16.22.1:/etc/ha.d/{ha.cf,authkeys} /etc/ha.d/
[email protected]'s password:
ha.cf 100% 10KB 10.3KB/s 00:00
[email protected]'s password:
authkeys 100% 653 0.6KB/s 00:00
[root@jie2 ~] scp 172.16.22.1:/etc/hosts /etc/
[email protected]'s password:
hosts 100% 250 0.2KB/s 00:00
5)、把nginx的服務腳本加入到heartbeat的資源目錄下,讓heartbeat的crm(資源管理層)來管理nginx服務。
[root@jie2 ~]# cd /etc/ha.d/
[root@jie2 ha.d]# cd resource.d/
[root@jie2 resource.d]# cp /etc/rc.d/init.d/nginx ./
[root@jie2 resource.d]# service nginx stop 關閉nginx服務,讓heartbeat來管理
Stopping nginx: [ OK ]
[root@jie2 resource.d]#passwd hacluster 為hacluster使用者建立密碼
Apache伺服器的配置:
apache部落客采用rpm包安裝,各位博友可以采用源碼包編譯安裝
[root@jie3 ~]# ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk -F: '{print $2}' | cut -d' ' -f1 檢視ip位址
172.16.22.3
[root@jie3 ~]# yum -y install httpd
[root@jie3 ~]# service httpd start
php-fpm1伺服器的配置:
1)、安裝php,編譯支援fpm
[root@jie4 ~]# ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk -F: '{print $2}' | cut -d' ' -f1 檢視ip位址
172.16.22.4
[root@jie4 ~]# tar xf php-5.4.19.tar.bz2
[root@jie4 ~]# yum -y groupinstall "Development tools" "Server Platform Development" 安裝開發包組
[root@jie4 ~]# yum -y install libmcrypt-devel mhash-devel bzip2-devel libxml2-devel 安裝依賴性包
[root@jie4 ~]# cd php-5.4.19
[root@jie4 php-5.4.19]# ./configure --prefix=/usr/local/php --enable-fpm --with-openssl --enable-mbstring \
--with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml \
--enable-sockets --with-mcrypt --with-bz2 --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d \
--with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
[root@jie4 php-5.4.19]# make && make install
2)、提供php的配置檔案,php-fpm的System V腳本和php-fpm的配置檔案,啟動php-fpm服務
[root@jie4 php-5.4.19]# cp php.ini-production /etc/php.ini
[root@jie4 php-5.4.19]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
[root@jie4 php-5.4.19]# chmod +x /etc/rc.d/init.d/php-fpm
[root@jie4 php-5.4.19]# chkconfig --add php-fpm
[root@jie4 php-5.4.19]# chkconfig php-fpm on
[root@jie4 php-5.4.19]# cd /usr/local/php/etc/
[root@jie4 etc]# cp php-fpm.conf.default php-fpm.conf
[root@jie4 etc]# vim php-fpm.conf
listen = 172.16.22.4:9000 #把監聽的127.0.0.1改成本機網卡的IP
[root@jie4 etc]# service php-fpm start
php-fpm2伺服器的配置(和php-fpm1伺服器的安裝配置一樣):
[root@jie5 ~]# ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk -F: '{print $2}' | cut -d' ' -f1 檢視ip位址
172.16.22.5
[root@jie5 ~]# tar xf php-5.4.19.tar.bz2
[root@jie5 ~]# yum -y groupinstall "Development tools" "Server Platform Development" 安裝開發包組
[root@jie5 ~]# yum -y install libmcrypt-devel mhash-devel bzip2-devel libxml2-devel 安裝依賴性包
[root@jie5 ~]# cd php-5.4.19
[root@jie5 php-5.4.19]# ./configure --prefix=/usr/local/php --enable-fpm --with-openssl --enable-mbstring \
--with-freetype-dir--with-jpeg-dir--with-png-dir--with-zlib --with-libxml-dir=/usr--enable-xml \
--enable-sockets --with-mcrypt --with-bz2 --with-config-file-path=/etc--with-config-file-scan-dir=/etc/php.d \
--with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
[root@jie5 php-5.4.19]# make && make install
[root@jie5 php-5.4.19]# cp php.ini-production /etc/php.ini
[root@jie5 php-5.4.19]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
[root@jie5 php-5.4.19]# chmod +x /etc/rc.d/init.d/php-fpm
[root@jie5 php-5.4.19]# chkconfig --add php-fpm
[root@jie5 php-5.4.19]# chkconfig php-fpm on
[root@jie5 php-5.4.19]# cd /usr/local/php/etc/
[root@jie5 etc]# cp php-fpm.conf.default php-fpm.conf
[root@jie5 etc]# vim php-fpm.conf
listen = 172.16.22.5:9000 #把監聽的127.0.0.1改成本機網卡的IP
[root@jie5 etc]# service php-fpm start
mysql伺服器的配置:
1)、編譯安裝mysql的源碼包
[root@jie6 ~]# ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk -F: '{print $2}' | cut -d' ' -f1 檢視ip位址
172.16.22.6
[root@jie6 ~]# tar xf mysql-5.5.33.tar.gz
[root@jie6 ~]# yum -y groupinstall "Development tools" "Server Platform Development"
[root@jie6 ~]# cd mysql-5.5.33
[root@jie6 mysql-5.5.33]# yum -y install cmake
[root@jie6 mysql-5.5.33]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/mydata/data -DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_SSL=system \
-DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
[root@jie6 mysql-5.5.33]# make && make install
2)、提供mysql的配置檔案和system V腳本,初始化資料庫
[root@jie6 mysql-5.5.33]# cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf
[root@jie6 mysql-5.5.33]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@jie6 mysql-5.5.33]# cd /usr/local/mysql/
[root@jie6 mysql]# useradd -r mysql
[root@jie6 mysql]# chown -R root:mysql ./*
[root@jie6 mysql]# mkdir -pv /mydata/data 建立存放資料庫的路徑,企業一般放在做raid磁盤陣列的LVM上
mkdir: created directory `/mydata'
mkdir: created directory `/mydata/data'
[root@jie6 mysql]# chown -R mysql:mysql /mydata/data/
[root@jie6 mysql]# vim /etc/my.cnf
vim /etc/my.cnf
thread_concurrency = 4
datadir = /mydata/data 修改資料庫存放的路徑
[root@jie6 mysql]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ --basedir=/usr/local/mysql 初始化資料庫,datadir是指定資料庫的存放路徑,basedir是指定資料庫安裝的路徑
[root@jie6 mysql]# service mysqld start
Starting MySQL........ [ OK ]
3)、把源碼包安裝mysql的PATH變量、庫檔案、頭檔案,關聯到系統識别的路徑下
[root@jie6 mysql]#echo "PATH=/usr/local/mysql/bin:$PATH" >/etc/profile.d/mysqld.sh
[root@jie6 mysql]#source /etc/profile.d/mysqld.sh
[root@jie6 mysql]#echo "/usr/local/mysql/lib" >/etc/ld.so.conf.d/mysqld.conf
[root@jie6 mysql]#ldconfig -v | grep mysql
[root@jie6 mysql]#ln -sv /usr/local/mysql/include/ /usr/local/mysqld
自此所有伺服器的軟體已經安裝完成,且能成功啟動
二、配置HA高可用叢集
heartbeat的配置檔案必須存放在兩邊的節點上,且完全保持一緻
利用圖形化界面的crm配置heartbeat的資源
[root@jie1 resource.d]#hb_gui & 運作圖形化界面
自此heartbeat實作了nginx的高可用
三、配置LB負載均衡叢集
四、配置反向代理
五、配置動靜分離
由于三四五都隻需要在nginx的配置檔案中實作,部落客在此直接全部配置好
1)、讓nginx支援fastCGI,修改fastcgi_param檔案為以下内
[root@jie1 /]# cd /etc/nginx/
[root@jie1 nginx]# vim fastcgi_params
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
2)、修改nginx的配置檔案
[root@jie1 ~]# cd /etc/nginx/
[root@jie1 nginx]# grep -v "#" nginx.conf| grep -v "^$"
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream webphpfpm {
server 172.16.22.4:9000;
server 172.16.22.5:9000;
} #upstream子產品定義負載均衡,此定義php-fpm的負載均衡
server {
listen 80;
server_name localhost;
location / {
root /web;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
proxy_pass http://172.16.22.3;
} #proxy_pass定義靜态請求的反向代理
location ~ \.(php|css|jsp)$ {
root /webphp; #此處定義後端php-fpm伺服器的網頁存放路
徑,後端此伺服器必須有此目錄
fastcgi_pass webphpfpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
} #動态請求送出給後端的php-fpm伺服器,webphpfpm為此前定義負載均衡的名稱
}
}
3)、複制nginx主伺服器的配置檔案和支援fastcgi的檔案到nginx備伺服器上
[root@jie1 nginx]# scp nginx.conf 172.16.22.2:/etc/nginx/
[root@jie1 nginx]# scp fastcgi_params 172.16.22.2:/etc/nginx/
六、測試
測試檔案的準備
Apache伺服器上面建立網頁檔案
[root@jie3 html]# pwd
/var/www/html
[root@jie3 html]# ls
1.jpeg index.html 在網頁根目錄下存放一個測試檔案和一張圖檔用于測試
[root@jie3 html]# cat index.html
<h1>this is Apache server</h1>
[root@jie3 html]#
所有的php-fpm伺服器上面建立網頁檔案,在生産環境中必須保持一樣
php-fpm1伺服器的測試頁面
[root@jie4 webphp]# pwd
/webphp #此檔案夾是存放網頁檔案的根目錄,是在nginx裡面指定的目錄
[root@jie4 webphp]# ls
index.php testdb.php test.php
[root@jie4 webphp]# cat index.php 測試頁面
<h1> this is php-fpm1 server </h1>
[root@jie4 webphp]# cat test.php 測試phpinfo頁面
<h1>php-fpm1</h1>
<?php
phpinfo();
?>
[root@jie4 webphp]# cat testdb.php 測試連接配接資料庫的頁面
<h1>php-fpm1</h1>
<?php
$link=mysql_connect('172.16.22.6','root','mypass');
if ($link) echo "mysql test success!!";
else echo "mysql test failed!!!";
mysql_close();
?>
[root@jie4 webphp]#
php-fpm2伺服器的測試頁面
[root@jie5 webphp]# pwd
/webphp
[root@jie5 webphp]# ls
index.php testdb.php test.php
[root@jie5 webphp]# cat index.php
<h1> this is php-fpm2 server </h1>
[root@jie5 webphp]# cat test.php
<h1>php-fpm2</h1>
<?php
phpinfo();
?>
[root@jie5 webphp]# cat testdb.php
<h1>php-fpm2</h1>
<?php
$link=mysql_connect('172.16.22.6','root','mypass');
if ($link) echo "mysql test success!!";
else echo "mysql test failed!!!";
mysql_close();
?>
[root@jie5 webphp]#
1)測試動靜分離
通路的是vip的位址,靜态網頁檔案和圖檔都會被nginx代理到Apache伺服器上,
測試動态的網頁檔案,被nginx代理到php-fpm伺服器上
2)測試負載均衡
測試phpinfo檔案,多測試幾次看看是不是負載到不同的php-fpm伺服器上
3)測試mysql
測試是否可以連接配接mysql的測試檔案
4)測試高可用
用heartbeat宕到nginx主伺服器,看nginx備伺服器是否繼續提供服務
現在看見資源都運作nginx主伺服器上
停掉nginx主伺服器的heartbeat,看資源是否在nginx備伺服器上自動啟動
[root@jie1 nginx]# service heartbeat status
heartbeat OK [pid 4294 et al] is running on jie1.com [jie1.com]...
[root@jie1 nginx]# service heartbeat stop
Stopping High-Availability services:
Done.
[root@jie1 nginx]#
可以看見nginx主伺服器jie1.com節點當機之後nginx備伺服器自行啟動并搶占資源
自此heartbeat+nginx實作HA的高可用和LB負載均衡已經完成