基于LNMP在负载均衡集群上部署wordpress(低配版)

在讲解会话保持之前,我们先利用之前的学习内容,做一个小实验:在负载均衡集群上部署wordpress。

准备三台服务器:

第一台proxy服务器作为代理服务器,负载均衡器,ip:192.168.242.140 域名:www.zcg666.com

第二台和第三台做作为提供服务的真实服务器:

web-1 ip:192.168.242.137 域名:www.zcy666.com

web-2 ip:192.168.242.138 域名:www.hjf777.com

实验要求:将wordpress这个项目放到两台web服务器上,通过代理服务器对两台web服务器做代理,最后通过浏览器访问代理服务器能够访问wordpress项目。

实验思路:这是一个简单的基于LNMP部署wordpress,先部署好两台web服务器。web-1和web-2上边下载nginx、php、php-fpm、php-mysql、php-gd gd。在其中任意一台web服务器上安装mysql数据库(5.37版本的),在mysql中创建wordpress项目所需的数据库。通过nfs共享目录,将wordpress项目放在共享目录中,将共享目录作为nginx的网站发布目录。然后配置nginx支持php。web服务器部署好后在wordpress能够通过浏览器正常访问的前提下,在proxy服务器上部署负载均衡+代理。最后时限通过访问代理服务器能够访问wordpress。

实验过程:

(我所使用的nginx版本都是1.20.2)

实验之前在三台服务器以及windows上做一下本地域名解析:
proxy服务器:192.168.242.140 www.zcg666.com
web-1:192.168.242.137 www.zcy666.com
web-2:192.168.242.138 www.hjf777.com

首先在web-2和web-1上部署nfs共享目录,并将wordpress压缩包上传至共享目录并解压。

web-2
[root@web2-server ~]# yum -y install nfs-utils
[root@web2-server ~]# systemctl start nfs
[root@web2-server ~]# mkdir /nfs-dir
[root@web2-server ~]# vim /etc/exports
/nfs-dir 192.168.242.137(rw,no_root_squash,sync)   保存退出
[root@web2-server ~]# systemctl restart nfs
[root@web2-server ~]# exportfs -v      #确保exports配置文件生效
[root@web2-server ~]# echo "ceshi" >>/nfs-dir/a.txt    #在共享目录创建测试文件
web-1
[root@web1-server ~]# yum -y install nfs-utils
[root@web1-server ~]# mkdir /nfs-dir         #创建挂载目录
[root@web1-server ~]# vim /etc/fstab         #设置开机自动挂载
.....
192.168.242.138/nfs-dir /nfs-dir nfs       defaults 0 0
           挂载设备       挂载点  文件类型   属性            
[root@web1-server ~]# systemctl restart nfs
[root@web1-server ~]# mount -a
[root@web1-server ~]# cat /nfs-dir/a.txt
ceshi
 
将wordpress项目的压缩包上传到共享目录,可以通过rpm -ivh下载,或者从windows上上传到共享目录都可以
 
[root@web1-server ~]# cd /nfs-dir
[root@web1-server nfs-dir]# ls
a.txt   wordpress-4.9.1-zh_CN.tar.gz
[root@web1-server ~]# tar zxf wordpress-4.9.1-zh_CN.tar.gz
[root@web1-server nfs-dir]# ls
a.txt   wordpress-4.9.1-zh_CN.tar.gz  wordpress

接着在web-2上下载mysql5.7,在mysql数据库中创建wordpress库,创建对应数据库用户

[root@web2-server ~]# yum -y install nginx php php-fpm php-mysql php-gd gd
[root@web2-server ~]# rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm    #下载mysql的yum仓库
[root@web2-server ~]# cd /etc/yum.repos.d
[root@web2-server ~]# vim mysql-community.repo
[mysql57-community]         #开启mysql5.7关闭mysql8.0
...
enabled=1
....
 
[mysql80-community]
...
enabled=0
....
[root@web2-server ~]# grep password /var/log/mysqld.log    #查看数据库的初始密码
[root@web2-server ~]# mysqladmin -uroot -p'S7ydsrRT6w_r' password 'HanJing@123'  修改密码
[root@web2-server ~]# mysql -uroot -p'HanJing@123'  进入数据库
mysql> create database wordpress;    #创建wordpress项目需要的库
mysql> grant all on wordpress.* to 'wordpress'@'%' identified by 'QianFeng@123';
mysql> exit

接下来在web-2上编辑nginx和php的配置文件,使nginx支持php

[root@web2-server ~]# cd /etc/nginx/conf.d/
[root@web2-server conf.d]# mv default.conf default.conf.bak
[root@web2-server ~]# vim /etc/nginx/conf.d/wordpress.conf
server {
        listen 80;
        server_name www.hjf777.com;
        access_log /var/log/nginx/nfs-dir_access_log;
        location / {
                root /nfs-dir/wordpress;
                index index.php index.html index.htm;
        }
 
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root  html;
        }
        location ~ \.php$ {
        root               /nfs-dir/wordpress;
        fastcgi_pass       127.0.0.1:9000;
        fastcgi_index      index.php;
        fastcgi_param      SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include            fastcgi_params;
        }
}
 
然后修改php的配置文件,将/etc/php.ini文件中的short_open_tag=Off打开
[root@web2-server ~]# sed -i '/short_open_tag=Off/c short_open_tag=On' /etc/php.ini
然后重启nginx和php
[root@web2-server ~]# systemctl restart nginx php-fpm.service

web-1做相同的操作

[root@web1-server ~]# cd /etc/nginx/conf.d/
[root@web1-server conf.d]# mv default.conf default.conf.bak
[root@web1-server ~]# vim /etc/nginx/conf.d/wordpress.conf
server {
        listen 80;
        server_name www.hjf777.com;
        access_log /var/log/nginx/nfs-dir_access_log;
        location / {
                root /nfs-dir/wordpress;
                index index.php index.html index.htm;
        }
 
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root  html;
        }
        location ~ \.php$ {
        root               /nfs-dir/wordpress;
        fastcgi_pass       127.0.0.1:9000;
        fastcgi_index      index.php;
        fastcgi_param      SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include            fastcgi_params;
        }
}
 
然后修改php的配置文件,将/etc/php.ini文件中的short_open_tag=Off打开
[root@web1-server ~]# sed -i '/short_open_tag=Off/c short_open_tag=On' /etc/php.ini
然后重启nginx和php
[root@web1-server ~]# systemctl restart nginx php-fpm.service

然后通过浏览器访问web-1和web-2服务器,验证是否可以访问wordpress。在浏览器分别输入www.zcy666.com    www.hjf777.com。看到以下界面就算成功。

niginx中配置存储session_niginx中配置存储session

接下来就需要在proxy服务器上部署负载均衡+代理了。

[root@proxy-server ~]# yum -y install nginx
[root@proxy-server ~]# systemctl start nginx
[root@proxy-server ~]# vim /etc/nginx/nginx.conf
 
user  nginx;
worker_processes  auto;
 
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log  /var/log/nginx/access.log  main;
    upstream web{                  #创建一个负载均衡地址池 upstream后面跟的是地址池的名字
        server www.zcy666.com;     #web-1服务器的域名
        server www.hjf777.com;     #web-2服务器的域名
        }
    sendfile        on;
    #tcp_nopush     on;
 
    keepalive_timeout  65;
 
    #gzip  on;
 
    include /etc/nginx/conf.d/*.conf;
}
 
[root@proxy-server ~]# vim /etc/nginx/conf.d/proxy.conf
server {
        listen 80;
        server_name www.zcg666.com;   #本机域名
        location / {
        proxy_pass http://web;    #地址池
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}
 
[root@proxy-server ~]# systemctl restart nginx

好了,最后在浏览器上访问proxy服务器的域名,验证是否能够访问wordpress。

niginx中配置存储session_niginx中配置存储session_02

niginx中配置存储session_php_03

niginx中配置存储session_mysql_04

去web-2服务器上在/nfs-dir/wordpress目录中创建wp-config.php文件

[root@web2-server ~]# vim /nfs-dir/wordpress/wp-config.php
<?php
/**
 * WordPress基础配置文件。
 *
 * 这个文件被安装程序用于自动生成wp-config.php配置文件,
 * 您可以不使用网站,您需要手动复制这个文件,
 * 并重命名为“wp-config.php”,然后填入相关信息。
 *
 * 本文件包含以下配置选项:
 *
 * * MySQL设置
 * * 密钥
 * * 数据库表名前缀
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/zh-cn:%E7%BC%96%E8%BE%91_wp-config.php
 *
 * @package WordPress
 */
// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
/** WordPress数据库的名称 */
define('DB_NAME', 'wordpress');
 
/** MySQL数据库用户名 */
define('DB_USER', 'wordpress');
 
/** MySQL数据库密码 */
define('DB_PASSWORD', 'HanJing@123');
 
/** MySQL主机 */
define('DB_HOST', '192.168.242.138');
 
/** 创建数据表时默认的文字编码 */
define('DB_CHARSET', 'utf8mb4');
 
/** 数据库整理类型。如不确定请勿更改 */
define('DB_COLLATE', '');
 
/**#@+
 * 身份认证密钥与盐。
 *
 * 修改为任意独一无二的字串!
 * 或者直接访问{@link https://api.wordpress.org/secret-key/1.1/salt/
 * WordPress.org密钥生成服务}
 * 任何修改都会导致所有cookies失效,所有用户将必须重新登录。
 *
 * @since 2.6.0
 */
define('AUTH_KEY',         '>$OYl?CV>.zZ>LekR}iDn[.+&7ssW |}?9[E/,-f06IOoI8@l%0T_~c}f.|?G My');
define('SECURE_AUTH_KEY',  '7ko&V6CI:_o|fRrJSLrR:y9QB,>yrK~&(.?b_XsmGI=$3s6nFI<HDP+D|b,g8!</');
define('LOGGED_IN_KEY',    'Zbk/@w2>`gt-9nI>ws@$!;~-L;R:m;`?9kLLpGZ_:@,wwzf3Q&PMCZ8)o1#n(Iu8');
define('NONCE_KEY',        '7y`e^p8$E}{Eq;M]k.LI,qz],3Zv?,iIlO}P}Y[-La;f]j%5X}af4vFl;)1Xk%}G');
define('AUTH_SALT',        'xE7OwR!}x9FqJzw{C&pHd<1p9z_zc*MiTZ[9895KeMu.dbse?;9D3`w}GfvNbP&/');
define('SECURE_AUTH_SALT', '5rexQ,&|XfRoaG`^=x$ x@<E~V+-{1lXAKa4Fv3~26n:J&U=us6rlo(zmm.6rn22');
define('LOGGED_IN_SALT',   '#m?@!hA^5^2tQeJxFr So:&$X<!-}Kq@f#=cxD]fLkY/S;jGm ,b@V3jN{o@&{~]');
define('NONCE_SALT',       'h0Q%sNl[N <9$xPPPDnR3#33RU[!f+m5elZIB}Oag,owp=Zr~vvC0INz]D$ljk05');
 
/**#@-*/
 
/**
 * WordPress数据表前缀。
 *
 * 如果您有在同一数据库内安装多个WordPress的需求,请为每个WordPress设置
 * 不同的数据表前缀。前缀名只能为数字、字母加下划线。
 */
$table_prefix  = 'wp_';
 
/**
 * 开发者专用:WordPress调试模式。
 *
* 将这个值改为true,WordPress将显示所有用于开发的提示。
 * 强烈建议插件开发者在开发环境中启用WP_DEBUG。
 *
 * 要获取其他能用于调试的信息,请访问Codex。
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define('WP_DEBUG', false);
 
/**
 * zh_CN本地化设置:启用ICP备案号显示
 *
 * 可在设置→常规中修改。
 * 如需禁用,请移除或注释掉本行。
 */
define('WP_ZH_CN_ICP_NUM', true);
 
/* 好了!请不要再继续编辑。请保存本文件。使用愉快! */
 
/** WordPress目录的绝对路径。 */
if ( !defined('ABSPATH') )
        define('ABSPATH', dirname(__FILE__) . '/');
 
/** 设置WordPress变量和包含文件。 */
require_once(ABSPATH . 'wp-settings.php');
 
[root@web2-server ~]# systemctl restart nginx php-fpm.service

 然后在刚才浏览器的页面点击现在安装。然后按提示创建账户即可。

nginx会话保持

nginx会话保持主要有以下几种实现方式。

ip_hash

ip_hash使用源地址哈希算法,将同一客户端的请求总是发往同一个后端服务器,除非该服务器不可用。

ip_hash语法:

upstream web {
    ip_hash;
    server www.zcy666.com;
    server www.hjf777.com;
 
}

注意:
ip_hash简单易用,但有如下问题:

  • 当后端服务器宕机后,session会丢失;
  • 来自同一局域网的客户端会被转发到同一个后端服务器,可能导致负载失衡;

sticky_cookie_insert

使用sticky_cookie_insert启用会话亲缘关系,这会导致来自同一客户端的请求被传递到一组服务器的同一台服务器。与ip_hash不同之处在于,它不是基于IP来判断客户端的,而是基于cookie来判断。因此可以避免上述ip_hash中来自同一局域网的客户端和前段代理导致负载失衡的情况。(需要引入第三方模块才能实现sticky)

sticky语法:

upstream web{
        server www.zcy666.com;
        server www.hjf777.com;
        sticky expires=1h domain=3evip.cn path=/;
        }
说明:
expires:设置浏览器中保持cookie的时间 
domain:定义cookie的域 
path:为cookie定义路径

实验案例:这个实验是基于上文wordpress项目的实验环境做的。

Sticky机器:
在原有的基础上添加sticky模块,首先准备好一台yum安装好的带有nginx的服务器
下载nginx的源码包和sticky的源码包
 
[root@proxy-server ~]# wget  https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/08a395c66e42.zip
[root@proxy-server ~]# yum -y install unzip
[root@proxy-server ~]# unzip 08a395c66e42.zip
[root@proxy-server ~]# mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42/ nginx-sticky-module-ng
[root@proxy-server ~]# yum install -y pcre* openssl* gcc gcc-c++ make
[root@proxy-server ~]# wget http://nginx.org/download/nginx-1.20.2.tar.gz
[root@proxy-server ~]# tar zxf nginx-1.20.2.tar.gz
[root@proxy-server ~]# cd nginx-1.20.2/
[root@proxy-server nginx-1.20.2]# ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'  --add-module=/root/nginx-sticky-module-ng
[root@proxy-server nginx-1.20.2]# make &&make install
[root@proxy-server ~]# vim /etc/nginx/nginx.conf    在upstream块中添加sticky参数
...
    upstream web{
        server www.zcy666.com;
        server www.hjf777.com;
        sticky expires=1h domain=3evip.cn path=/;
        }
.....   
保存退出后从新加载nginx配置
[root@proxy-server ~]# nginx -s reload

浏览器访问proxy代理服务器的域名。在网址栏输入域名后,先别按回车进入,按F12打开开发者工具,然后在地址栏按回车进入页面,看到如下界面

niginx中配置存储session_服务器_05

单击之后就可以看到我们自己定义的缓存格式

niginx中配置存储session_mysql_06