Nginx可以说是一个功能相当强大的Web服务器组件,其本身既可以作为web服务器直接提供服务,又可以作为一个很好的反向代理服务器,同时可以基于upstream模块作为轻量级的负载均衡调度器来实现web应用的高并发运行。


下面我们就基于Nginx的upstream模块来构建一个Linux+Nginx+Apache+PHP-fpm+MySQL的简单web负载均衡方案,并实现资源的动静态分离。网络拓扑图如下:

Nginx基于upstream模块实现LNAMP负载均衡及动静分离_第1张图片

首先客户端直接访问的是一个Nginx的反向代理服务器;反向代理服务器负责接收客户的访问请求,并根据访问的资源类型做动静态分离,将静态资源转向另外一台Nginx静态资源服务器,将动态PHP访问资源通过负载均衡调度到后端的Apache集群;后端的Apache在接收到PHP资源请求后,通过fastcgi调用php-fpm模块进行解析;如果php资源涉及到数据库的访问,则转向后端的MySQL数据库。


MySQL主机配置:

安装MariaDB
    yum install -y mariadb-server
启动服务
    systemctl start mariadb.service
登录MySQL,授权PHP主机有访问权限
    mysql> GRANT ALL ON *.* TO 'web'@'172.16.%.%' IDENTIFIED BY 'pass';

备注:这里仅做简单演示,现实生产环境,需要考虑SELinux、iptables、MySQL配置参数优化、以及最小授权等额外因素;如果数据库不在默

认路径,需要修改/etc/my.cnf或/etc/my.cnf.d/*下的配置文件,修改[mysqld]段的datadir=""指向数据库所在路径。


Apache/php-fpm主机配置:

安装httpd、php-fpm、php-mysql以及其他相关依赖包
    yum install -y httpd php-fpm php-mysql
修改/etc/php-fpm.d/www.conf配置文件
    listen = 127.0.0.1:9000     // 若web服务器和php-fpm服务不在同一台主机,则应指向apache/nginx web服务所在主机
    listen.allowd_clients = 127.0.0.1      // 若不apache和php-fpm不在同一台主机,应授权允许apache所在主机有访问权限
    user = apache        // 配置php-fpm以apache用户身份运行
    group = apache
修改/etc/httpd/conf/httpd.conf文件
    #DocumentRoot "/var/www/html"     // 将DocumentRoot配置项注释掉
在/etc/httpd/conf.d/目录下新建虚拟机配置文件vhost.conf(文件名可以自定义,需以.conf结尾)

        ServerName www.test.com
        DirectoryIndex index.html index.php
        DocumentRoot /web/test
        ProxyRequests Off
        ProxyPassMatch ^/(.*\.php(.*)?)$ fcgi://127.0.0.1:9000/web/test/$1
       
                Options None
                AllowOverride None
                Require all granted
       



Nginx代理服务器配置:


安装Nginx软件包:

    yum install -y nginx

修改配置文件,配置Nginx虚拟实现动静态资源分离,及动态资源的负载均衡调度:

upstream websrv{
    server 172.16.254.105;
    server 172.16.254.18;
    }


server {
    listen 80;
    server_name www.test.com;
    root /web/test;
    index index.html index.php;


    location ~\.php {
        proxy_pass http://websrv;
    }


    location ~\.(jpg|css|js|png|gif) {
        proxy_pass http://172.16.254.237;
    }
}

静态资源Nginx服务器配置:

server {
    listen 80;
    server_name www.test.com;
    root /web/test;
    index index.html;
}


至此一个简单的LNAMP负载均衡已经配置完成


资源部署及相关测试:


本例中,html静态页面放在Nginx调度服务器本地的/web/test目录对应路径下;图片、css、js等放置在静态资源服务器/web/test目录对应路径下;php动态页面放置在两台Apache/php-fpm服务器/web/test目录对应路径下;数据库通过php程序进行读写调用。


测试一、静态资源的分离调度

测试文件:index.html、p_w_picpaths/bike_blue.jpg、js/{jquery-1.js,jquery.js,fangdajing.js}、css/index.css

部署:

    将静态页面index.html放置于Nginx代理服务器目录下;

    将Nginx静态资源服务器网站目录下创建p_w_picpaths、css、js目录,分别存放图片、css、js文件


index.html页面代码:


静态资源服务器目录结构:

Nginx基于upstream模块实现LNAMP负载均衡及动静分离_第2张图片


在浏览器中进行访问,可以看出各资源均可进行正常加载:

Nginx基于upstream模块实现LNAMP负载均衡及动静分离_第3张图片


测试二、动态资源均衡调度及数据库连接


分别在两台Apache/php-fpm主机网站目录创建测试页面test.php,代码如下:

$conn = mysql_connect("172.16.253.176","web","pass");

if(!$conn)
echo "fail to connect mysql!";
else
echo "connect mysql successful!";
echo "
";

if('/'==DIRECTORY_SEPARATOR){
    $server_ip=$_SERVER['SERVER_ADDR'];
}else{
    $server_ip=@gethostbyname($_SERVER['SERVER_NAME']);
}
echo $server_ip;
?>

在浏览器访问,可以看出后端可以正常连接数据库;进行刷新,可以看到资源被调度到不同的后端Apache主机

关闭MySQL数据库服务器,及其中一台Apache服务器,再此刷新可以看到服务器连接失败,并且后端连接仅被调度到一台可用的Apache服务器上


Nginx基于upstream模块实现LNAMP负载均衡及动静分离_第4张图片

Nginx基于upstream模块实现LNAMP负载均衡及动静分离_第5张图片

Nginx基于upstream模块实现LNAMP负载均衡及动静分离_第6张图片

至此,整个项目实验已经成功完成,通过测试我们也可以发现,通过Nginx的upstream模块我们成功的实现了后端主机的负载均衡调度;这里我们演示的仅仅是php动态资源主机的负载均衡,实际情况可以根据自己需求进行调整,也可以实现静态资源的负载均衡。


注意:要实现真正的动静分类,需要项目后端PHP代码支持。


后续完善内容:

1、前端Nginx反向代理为单点,可使用keepalived做高可用

2、增加varnish等缓存节点,从而进一步降低服务器访问压力

3、静态资源同样可做成负载均衡集群,并可做分布式cdn优化加速

4、后端数据库可做主从复制及读写分离,增强可用性及并发能力