您的位置:首页 > 运维架构 > Nginx

Nginx架构的企业级应用

2013-09-15 12:32 260 查看
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)nginx+heartbeat
Apache172.16.22.3httpd
php-fpm1172.16.22.4php(提供fastCGI服务器)
php-fpm2172.16.22.5php(提供fastCGI服务器)
mysql172.16.22.6mysql
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备服务器的配置:1)、编译安装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/
root@172.16.22.1's password:
ha.cf                             100%   10KB  10.3KB/s   00:00
root@172.16.22.1's password:
authkeys                          100%  653     0.6KB/s   00:00
[root@jie2 ~] scp  172.16.22.1:/etc/hosts /etc/
root@172.16.22.1'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服务器的安装配置一样):1)、安装php,编译支持fpm
[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
2)、提供php的配置文件,php-fpm的System V脚本和php-fpm的配置文件,启动php-fpm服务

[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负载均衡已经完成
此博客没有对nginx的配置文件参数做详细说明,也没有设置nginx的优化参数,有关nginx的优化以及nginx配置文件详解,以及nginx实现诸多功能的详细配置会在nginx相关博客中写出。请大家多多关注

附件:http://down.51cto.com/data/2363504
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息