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/cextension = '"${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]/adatadir=/mysqdata' /etc/my.cnf  sed -i '/^[mysqld]/alog-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 -h492.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   # 这里创建uhttps://www.centos.bz/wp-content/uploads/2017/10/5-14.png" alt=""    />

安装步骤到第二步可能会报如下错误, 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 服务器地址 用户测试调度是否成功  

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

原文出处:zxslinux -> https://zxslinux.com/2017/10/16/lamp/

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。