设为首页 收藏本站
查看: 988|回复: 0

[经验分享] Nginx基于upstream模块实现LNAMP负载均衡及动静分离

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-2-27 09:47:39 | 显示全部楼层 |阅读模式
Nginx可以说是一个功能相当强大的Web服务器组件,其本身既可以作为web服务器直接提供服务,又可以作为一个很好的反向代理服务器,同时可以基于upstream模块作为轻量级的负载均衡调度器来实现web应用的高并发运行。

下面我们就基于Nginx的upstream模块来构建一个Linux+Nginx+Apache+PHP-fpm+MySQL的简单web负载均衡方案,并实现资源的动静态分离。网络拓扑图如下:
wKioL1itnf7w_A0MAAGNhvzk5DM427.jpg
首先客户端直接访问的是一个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结尾)
<VirtualHost *:80>
        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
        <Directory /web/test>
                Options None
                AllowOverride None
                Require all granted
        </Directory>
</VirtualHost>

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、images/bike_blue.jpg、js/{jquery-1.js,jquery.js,fangdajing.js}、css/index.css


部署:
    将静态页面index.html放置于Nginx代理服务器目录下;
    将Nginx静态资源服务器网站目录下创建images、css、js目录,分别存放图片、css、js文件

index.html页面代码:

wKiom1iwxdfimjYbAACoWUKttok718.jpg

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

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

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

分别在两台Apache/php-fpm主机网站目录创建测试页面test.php,代码如下:
<?php
$conn = mysql_connect("172.16.253.176","web","pass");

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

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

在浏览器访问,可以看出后端可以正常连接数据库;进行刷新,可以看到资源被调度到不同的后端Apache主机
关闭MySQL数据库服务器,及其中一台Apache服务器,再此刷新可以看到服务器连接失败,并且后端连接仅被调度到一台可用的Apache服务器上

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

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

后续完善内容:
1、前端Nginx反向代理为单点,可使用keepalived做高可用
2、增加varnish等缓存节点,从而进一步降低服务器访问压力
3、静态资源同样可做成负载均衡集群,并可做分布式cdn优化加速
4、后端数据库可做主从复制及读写分离,增强可用性及并发能力

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-347759-1-1.html 上篇帖子: Bind+Nginx实现负载均衡 下篇帖子: flask uwsgi nginx
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表