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

Nginx基于upstream模块实现LNAMP负载均衡及动静分离

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

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



首先客户端直接访问的是一个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页面代码:





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




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




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

分别在两台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服务器上










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

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

后续完善内容:
1、前端Nginx反向代理为单点,可使用keepalived做高可用
2、增加varnish等缓存节点,从而进一步降低服务器访问压力
3、静态资源同样可做成负载均衡集群,并可做分布式cdn优化加速
4、后端数据库可做主从复制及读写分离,增强可用性及并发能力
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  负载均衡 Nginx LNAMP