nginx+lamp负载均衡实验

实验实现目的如下

  • 客户端通过外网地址访问 nginx 的 外网地址(假设的) 172.18.5.117
  • nginx 通过轮询的负载均衡设置分别调度到 apache服务器 192.168.5.109 和 192.168.5.111

  • php-fpm 服务器 192.168.5.113 上传 discuz源码文件到目录下, 用nfs共享此目录, 提供两个 apache 服务器挂载到站点根目录下,实现访问的资源一致性

  • apache响应站点目录下的静态文件, 动态文件使用fastcgi 交给php server 响应, php需要查询插入在与 mariadb服务交互

  • 整体实现 客户端访问 172.18.5.117 能够实现,轮询,正常发帖看帖

实验拓扑图如下

实验过程如下

编译安装httpd

在192.168.5.109 和 192.168.5.111 主机上编译安装httpd.

  • 主机操作系统: centos6.9_x86_64
  • httpd版本: httpd-2.4.47

  • apr版本: apr-1.5.2

  • aprutil版本: apr-util-1.5.4

  • 依赖软件包: gcc make expat-devel pcre-devel openssl-devel

操作步骤如下

# 下载源码包后放在 /usr/local/src
cd /usr/local/src
tar xf /usr/local/src/httpd-2.4.47.tar.gz
tar xf /usr/local/src/apr-1.5.2.tar.gz
tar xf /usr/local/src/apr-util-1.5.4.tar.gz
cp -r apr-1.5.2 httpd-2.4.47/srclib/apr
cp -r apr-util-1.5.4 httpd-2.4.47/srclib/apr-util
cd httpd-2.4.47
./configure \
--prefix=/usr/local/httpd \
--sysconfdir=/etc/httpd \
--enable-so --enable-ssl \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-included-apr \
--enable-deflate \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork
make && make install
echo 'export PATH=/usr/local/httpd/bin:$PATH' > /etc/profile.d/httpd.sh

注意事项:

  • httpd2.2 不支持 fastcgi 所以在centos6 上要编译安装
  • centos6 中的默认apr版本过低 httpd-2.4版本需要 apr-1.4以上版本

  • 这里采用的编译是将apr和apr-util的源码复制到 httpd-2.4.47/srclib 中并去掉版本号, 这样编译比较方便,不用apr和apr-util一个一个编译, 但在httpd编译选项中要加上 –with-included-apr 的选项,

  • 编译完成后,推荐导出头文件,库文件,man帮助,和PATH变量. 和制作启动脚本,复制rpm安装的脚本就行,这里没有做这些步骤

配置httpd虚拟主机

注释中心主机
--------------
#DocumentRoot "/usr/local/httpd/htdocs"
----------------
启用包含虚拟机配置文件
Include /etc/httpd/extra/httpd-vhosts.conf   # 启用虚拟机配置
mkdir /web/forum -p                          # 创建站点根目录
echo "test" > /web/forum/index.html          # 创建测试文件
vim /etc/httpd/extra/httpd-vhosts.conf       
# 编辑虚拟机配置文件如下所示
<VirtualHost *:80>
    DocumentRoot "/web/forum"
    <Directory "/web/forum">
        Options none
        DirectoryIndex index.php index.html
        Require all granted             # 注意此项,要启用不然 403
    </Directory>
</VirtualHost>
# 导入PATH 变量后启动httpd 这里就不贴命令了
apachectl      # 启动后测试访问页面

编译安装php+xcache

192.168.5.113 上编译安装php+xcache

  • 操作系统版本 centos6.9
  • php版本: php-5.6.31

  • xcache版本: xcache-3.2.0

  • 依赖软件:gcc make libxml2-devel bzip2-devel libmcrypt-devel autoconf

第一步安装php:

cd /usr/local/src
tar xf php-5.6.31.tar.bz2
cd php-5.6.31
./configure \
--prefix=/usr/local/php \
--with-mysql=mysqlnd \   # 注意以下三台如果mysql在本机上要使用mysqlnd
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl \
--enable-mbstring \      #支持多字节字符串即中文
--with-freetype-dir  \ 
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--enable-sockets \
--enable-fpm \      # 启用fpm模式
--with-mcrypt \
--with-config-file-path=/etc/ \
--with-config-file-scan-dir=/etc/php.d \
--with-bz2
make && make install

第二步: php配置

cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/src/php-5.6.31/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
cp /usr/local/src/php-5.6.31/php.ini-production /etc/php.ini
chmod +x /etc/init.d/php-fpm
chkconfig --add php-fpm

第三步: 编译安装xcache

cd /usr/local/src
tar xf xcache-3.2.0.tar.gz
cd xcache-3.2.0
/usr/local/php/bin/phpize   # xcache没有configure脚本, 这条命令php提供 依赖 autoconf 软件包
./configure  --enable-xcache --with-php-config=/usr/local/php/bin/php-config
make && make install

注意事项

  • xcache 编译完成后会输出xcache.so的目录,请复制出此目录,(每次编译是目录并不是都一样)
  • xcache 源码经过企业多方测试性能稳定,不过版本太老,貌似不支持 php7版本

第四步: 配置php支持xcache模块

mkdir /etc/php.d
cp /usr/local/src/xcache-3.2.0/xcache.ini /etc/php.d/
# 找出xcache.so模块的路径
xcache_so_path=`find /usr/local/php/lib/php/extensions/ -name "xcache.so"`
# 替换配置文件extension = < xcache.so的路径 >
sed -i  '/^extension = xcache.so/c\extension = '"${xcache_so_path}"'' /etc/php.d/xcache.ini

配置httpd, 并测试httpd连接php

在 192.168.5.111 和 192.168.5.109 上的虚拟主机上配置

# 更改虚拟机配置文件,让以php结尾的文件,通过fastcgi 交给php服务器处理,虚拟机配置文件如下
LoadModule proxy_module modules/mod_proxy.so            # 开启代理模块
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so  # 开启支持fcgi的反向代理
<VirtualHost *:80>
    DocumentRoot "/web/forum"
    ServerName forum.zxs.com
    <Directory "/web/forum">
        DirectoryIndex index.html  index.php
        Require all granted
    </Directory>
    ProxyRequests Off                                    # 关闭正向代理
    ProxyPassMatch ^(.*\.php)$ fcgi://192.168.5.113:9000/web/forum/$1   # fastcgi连接php
</VirtualHost>
# 完成后重启httpd
/usr/local/httpd/bin/apachectl stop
/usr/local/httpd/bin/apachectl

在php 192.168.5.113主机上修改如下配置: php配置监听本机端口, 并允许 192.168.5.111和 192.168.5.109 ,需要修改以下参数

vim /usr/local/php/etc/php-fpm.conf         # 编辑fpm.conf 的配置文件
listen 192.168.5.113:9000                   # 增加监听本机网卡地址 默认只监听 127.0.0.1
listen.allowed_clients = 192.168.5.109,192.168.5.111 # 允许web服务器通过fastcgi 的9000端口进来
service php-fpm restart                     # 重启php-fpm

测试连接状态

在php的主机 192.168.5.113上执行如下操作(创建一个index.php的文件)

mkdir /web/forum
vim /web/forum/index.php       
# 添加如下内容
<?php
    phpinfo();
?>

注意: php文件的路径要根 fastcgi上的路径相匹配, 例如: httpd的proxy规则是 192.168.5.113:9000/web/forum/$1 , 那就要创建在 /web/forum目录下, 可以改成别的但必须保持一致.

测试效果如下, 成功后浏览器搜索 xcache 加速器是否已经启用

通用二进制安装mariadb

mkdir /mydata
useradd -r mysql
cd /usr/local/src
tar xf mariadb-5.5.57-linux-x86_64.tar.gz -C /usr/local/
ln -s /usr/local/mariadb-5.5.57-linux-x86_64.tar.gz /usr/local/mysql
cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql --datadir=/mydata
cp support-files/my-huge.cnf /etc/my.cnf
sed -i '/^\[mysqld\]/a\datadir=/mysqdata' /etc/my.cnf
sed -i '/^\[mysqld\]/a\log-error=/var/log/mysqld.log' /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
service mysqld start
echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysqld.sh
. /etc/profile.d/mysqld.sh
mysql_secure_installation            # 安全初始化,嫌麻烦可以暂时不做

接下来我们需要安装discuz论坛系统, 在这之前先来测试下php是否能连接上mysql

# 首先连接上mysql
mysql> CREATE DATABASE forum;
mysql> GRANT ALL ON forum.* TO 'zxs'@'192.168.5.113' IDENTIFIED BY '123456';
# 创建数据库和授权完成后切换到php服务器测试是否能远程mysql服务器,没安装客户端的安装下mysql客户端
mysql -uzxs -h192.168.5.115 -p123456  
# 测试手动可以链接后在测试mysql是否可以连接, 需要编辑index.php文件添加如下代码
vim /web/forum/index.php
<?php
$mysqli=new mysqli("192.168.5.115","zxs","123456");
if(mysqli_connect_errno()){
echo "connect to database failure!";
$mysqli=null;
exit;
}
echo "connect to database success!";
$mysqli->close();
phpinfo();
?>

下载解压discuz源码到php 192.168.5.113 服务器上,并通过nfs共享出了来

unzip Discuz_X3.2_SC_UTF8.zip
rm -rf forum                # 删除原来的目录,之前做测试用的 
cp upload/ /web/forum -r    # 复制源码下 upload 目录并重命名为 forum
yum install rpcbind nfs-utils   # nfs服务依赖的包
service rpcbind start           # 启动rpcbind
chkconfig rpcbind on            
chkconfig nfs on
groupadd -g 800 apache   # 这里创建uid=800的用户和组,用于nfs共享是映射的用户,避免权限问题
useradd -g apache -u 800 -s /sbin/nologin apache   
chown -R apache.apache /web/forum  #将站点目录该为apache所有
vim /etc/exports
/web 192.168.5.109(rw,all_squash,anonuid=800,anongid=800)  #nfs配置所有用户映射为apache
/web 192.168.5.111(rw,all_squash,anonuid=800,anongid=800) 
service nfs start

httpd服务器上 192.168.5.109和192.168.5.111 上挂载php共享出来的nfs 并且写入/etc/fstab中

# 先安装nfs-utils 不然挂载不上
yum install nfs-utils -y
vim /etc/fstab
192.168.5.113:/web      /web                    nfs     defaults        0 0
mount -a

浏览器访问 192.168.5.109 和 192.168.5.111 进入discuz 向导

安装步骤到第二步可能会报如下错误, php进程可能无法写入以下文件

查看php以 nobody身份允许 ,改为apache 身份允许就能访问站点目录了

# 修改下php以apache的身份允许,这样就可以写了
vim /usr/local/php/etc/php-fpm.conf  # 修改php-fpm的配置文件
user = apache
group = apache

编译安装nginx,做负载均衡

wget http://nginx.org/download/nginx-1.13.6.tar.gz
tar xf nginx-1.13.6.tar.gz
cd nginx-1.13.6/
mkdir /var/tmp/nginx
useradd -r nginx
./configure \
--prefix=/usr/local/nginx \
--conf-path=/etc/nginx/nginx.conf \
--user=nginx \
--group=nginx \
--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 \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_flv_module \
--with-http_mp4_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/fastcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
make && make install
ln -sv /usr/local/nginx/sbin/nginx  /usr/sbin/nginx
nginx
# 启动后测试nginx是否能访问

简单设置nginx设置使用轮询负载均衡, nginx (修改的部分)配置如下:

...
  #keepalive_timeout  0;
keepalive_timeout  65;
#gzip  on;
upstream backend {
    server 192.168.5.111;
    server 192.168.5.109;
}
server {
    listen       80;
    #charset koi8-r;
    #access_log  logs/host.access.log  main;
    location  / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
    }
...

测试是否能访问:

修改php服务器上的discuz的主页文件最前面, 让其能识别前端apache服务器是那个发来的请求, 好测试负载均衡轮询是否成功

vim /web/forum/forum.php       # 修改 php服务器站点目录下的 
<?php
echo 'apache服务器地址:'. $_SERVER['SERVER_ADDR']."<br/>"; 
?>   #该代码用于输出前端访问php的apache 服务器地址 用户测试调度是否成功

修改后访问测试页面如下所示

标签:Nginx 发布于:2019-11-05 14:44:24