Nginx会话保持-第四天

目录

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

 nginx会话保持

ip_hash

ip_hash语法:

sticky语法:


基于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。看到以下界面就算成功。

Nginx会话保持-第四天_第1张图片

接下来就需要在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。

Nginx会话保持-第四天_第2张图片

 Nginx会话保持-第四天_第3张图片

Nginx会话保持-第四天_第4张图片

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

[root@web2-server ~]# vim /nfs-dir/wordpress/wp-config.php
$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`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@

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

 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启用会话亲缘关系,这会导致来自同一客户端的请求被传递到一组服务器的同一台服务器。与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打开开发者工具,然后在地址栏按回车进入页面,看到如下界面

Nginx会话保持-第四天_第5张图片

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

Nginx会话保持-第四天_第6张图片

 

你可能感兴趣的:(nginx)