• 第十七周练习题


    第十七周

    1、nginx负载均衡中常见的算法及原理有哪些?

    #1)轮询 (round-robin)
    	轮询为负载均衡中较为基础也较为简单的算法,它不需要配置额外参数。假设配置文件中共有 台服务器,该算法遍历服务器节点列表,并按节点次序每轮选择一台服务器处理请求。当所有节点均被调用过一次后,该算法将从第一个节点开始重新一轮遍历。
    	特点:由于该算法中每个请求按时间顺序逐一分配到不同的服务器处理,因此适用于服务器性能相近的集群情况,其中每个服务器承载相同的负载。但对于服务器性能不同的集群而言,该算法容易引发资源分配不合理等问题。
    配置样例:
    upstream backserver { 
    server 192.168.0.10; 
    server 192.168.0.20; 
    } 
    
    #2)加权轮询(weight round robin)
    	为了避免普通轮询带来的弊端,加权轮询应运而生。在加权轮询中,每个服务器会有各自的 weight。一般情况下,weight 的值越大意味着该服务器的性能越好,可以承载更多的请求。该算法中,客户端的请求按权值比例分配,当一个请求到达时,优先为其分配权值最大的服务器。
    	特点:加权轮询可以应用于服务器性能不等的集群中,使资源分配更加合理化。
    配置样例:
    upstream backserver { 
    server 192.168.0.10 weight=10; 
    server 192.168.0.20 weight=20; 
    } 
    
    #3)源地址hash(ip_hash)
    	ip_hash 依据发出请求的客户端 IP 的 hash 值来分配服务器,该算法可以保证同 IP 发出的请求映射到同一服务器,或者具有相同 hash 值的不同 IP 映射到同一服务器。
    	特点:该算法在一定程度上解决了集群部署环境下 Session 不共享的问题。实际应用中,我们可以利用 ip_hash,将一部分 IP 下的请求转发到运行新版本服务的服务器,另一部分转发到旧版本服务器上,实现灰度发布。再者,如遇到文件过大导致请求超时的情况,也可以利用 ip_hash 进行文件的分片上传,它可以保证同客户端发出的文件切片转发到同一服务器,利于其接收切片以及后续的文件合并操作。
    配置样例:
    upstream backserver { 
    ip_hash;
    server 192.168.0.10; 
    server 192.168.0.20; 
    } 
    
    #4)目的Url hash(url_hash)
    	url_hash 是根据请求的 URL 的 hash 值来分配服务器。该算法的特点是,相同 URL 的请求会分配给固定的服务器,当存在缓存的时候,效率一般较高。
    配置样例:
    upstream backserver { 
    hash $request_uri;
    hash_method crc32;
    server 192.168.0.10; 
    server 192.168.0.20; 
    } 
    
    #5)最少连接数(least_conn)
    	假设共有n台服务器,当有新的请求出现时,遍历服务器节点列表并选取其中连接数最小的一台服务器来响应当前请求。连接数可以理解为当前处理的请求数。
    配置样例:
    upstream backserver { 
    least_conn;
    server 192.168.0.10; 
    server 192.168.0.20; 
    } 
    
    #6)最快响应时间(fair)
    	按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    配置样例:
    upstream backserver { 
    fair;
    server 192.168.0.10; 
    server 192.168.0.20; 
    } 
    
    #upstream还能为每一个设备设置状态值,这些值的含义如下:
    down 表示单前的server暂时不参与负载.
    weight 默认为1.weight越大,负载的权重就越大。
    max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
    fail_timeout : max_fails次失败后,暂停的时间。
    backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
    

    2、使用rewrite规则实现将所有到a域名的访问rewrite到b域名

    [root@centos8 ~]#vim /apps/nginx/conf/conf.d/mobile.conf
    server {
     listen 80;
     server_name www.a.com;
     location / {
            root "/data/nginx/html/mobile";
            index index.html;
            rewrite / http://www.b.com redirect;
    }
    }
    
    server {
     listen 80;
     server_name www.b.com;
     location / {
            root "/nginx/html/";
            index index.html;
     }
    }
    
    [root@centos8 ~]#echo 111 > /data/nginx/html/mobile/index.html
    [root@centos8 ~]#echo 222 > /nginx/html/index.html
    [root@centos8 ~]#vim /etc/hosts
    10.0.0.150  www.a.com www.b.com
    
    [root@centos8 ~]#curl www.a.com
    <html>
    <head><title>302 Found</title></head>
    <body>
    <center><h1>302 Found</h1></center>
    <hr><center>nginx/1.18.0</center>
    </body>
    </html>
    
    [root@centos8 ~]#curl -L www.a.com
    222
    

    3、实现反向代理客户端IP透传

    #1)一级代理实现客户端IP透传
    #目标:实现客户端通过一个反向代理nginx服务器访问到web服务器,在web、nginx服务器日志记录有客户端ip地址。
    环境准备:
    client:10.0.0.160/24
    proxy(nginx):10.0.0.150/24
    web(apache):10.0.0.152/24
    
    #nginx配置
    [root@nginx ~]#vim /apps/nginx/conf/conf.d/pc.conf
    server {
      listen 80;
      server_name www.tanliang.com;
      location / {
        index index.html index.php;
        root /data/nginx/html/pc;
        proxy_pass http://10.0.0.152;
        #proxy_set_header X-Real-IP $remote_addr;                   #只添加客户端IP到
    请求报文头部,转发至后端服务器
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客户端IP和反
    向代理服务器IP到请求报文头部
      }
    }
    [root@nginx ~]#systemctl restart nginx
    
    #apache配置
    
    [root@web ~]# vim /etc/httpd/conf/httpd.conf
    LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    
    [root@web ~]# echo web > /var/www/html/index.html
    [root@web ~]#systemctl restart httpd
    
    #客户端配置
    [root@client ~]#echo 10.0.0.152 www.tanliang.com >> /etc/hosts
    [root@client ~]#curl www.tanliang.com
    web
    
    #nginx配置
    [root@nginx ~]#cat /apps/nginx/conf/nginx.conf|grep x_forwarded
        #                  '"$http_user_agent" "$http_x_forwarded_for"';#默认有此配置
        
    [root@nginx ~]#echo 10.0.0.152 www.tanliang.com >> /etc/hosts
    [root@nginx ~]#curl www.tanliang.com
    web
    
    #在apache服务器查看日志,验证。
    [root@web ~]# cat /var/log/httpd/access_log
    10.0.0.160 10.0.0.150 - - [29/Nov/2021:10:35:20 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.61.1"
    - 10.0.0.150 - - [29/Nov/2021:10:38:35 +0800] "GET / HTTP/1.1" 200 4 "-" "curl/7.61.1"
    
    
    #2)多级代理实现客户端 IP 透传
    client:10.0.0.160
    nginx1:10.0.0.150
    nginx2:10.0.0.170
    apache:10.0.0.152
    #第一个代理服务器
    [root@nginx1 ~]#echo 10.0.0.170 www.tanliang2.com >> /etc/hosts
    [root@nginx1 ~]#vim /apps/nginx/conf/nginx.conf 
    #开启日志格式,记录x_forwarded_for
    http {
       include       mime.types;
       default_type application/octet-stream;
       proxy_cache_path /data/nginx/proxycache   levels=1:1:1 
    keys_zone=proxycache:20m inactive=120s  max_size=1g;
       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 logs/access.log main;
    #定义反向代理
    [root@nginx ~]#cat /apps/nginx/conf/conf.d/pc.conf
    server {
      listen 80;
      server_name www.tanliang.com;
      location / {
        proxy_pass http://www.tanliang2.com;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
    
    }
    
    #第二个代理服务器
    [root@nginx2 ~]#vim /apps/nginx/conf/nginx.conf 
    #开启日志格式,记录x_forwarded_for
    http {
       include       mime.types;
       default_type application/octet-stream;
       proxy_cache_path /data/nginx/proxycache   levels=1:1:1 
    keys_zone=proxycache:20m inactive=120s  max_size=1g;
       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 logs/access.log main;
    #定义反向代理
    [root@nginx2 ~]# cat /etc/nginx/conf.d/pc.conf
    server {
      listen 80;
      server_name www.tanliang2.com;
      location / {
        proxy_pass http://10.0.0.152;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        root /data/html/index.html;
      }
    }
    
    #在client访问测试
    [root@client ~]#curl www.tanliang.com
    web
    hello
    
    
    #在第一个proxy上面查看日志
    [root@nginx1 ~]#tail /apps/nginx/logs/access.log -f
    10.0.0.160 - - [29/Nov/2021:13:32:54 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.61.1" "-"
    
    #在第二个proxy上面查看日志
    [root@nginx2 ~]#tail -f /var/log/nginx/access.log
    10.0.0.150 - - [29/Nov/2021:13:32:54 +0800] "GET / HTTP/1.0" 200 10 "-" "curl/7.61.1" "10.0.0.160"
    
    #在apache上面查看日志
    [root@web ~]# tail -f /etc/httpd/logs/access_log
    "10.0.0.160, 10.0.0.150" 10.0.0.170 - - [29/Nov/2021:13:32:54 +0800] "GET / HTTP/1.0" 200 10 "-" "curl/7.61.1"
    

    4、利用LNMP实现wordpress站点搭建

    #环境准备:
    nginx+php+wordpress   10.0.0.152
    mysql+redis           10.0.0.162
    
    #在10.0.0.162编写脚本实现mysqk数据库一键安装
    [root@localhost ~]# cat install_mysql.sh
    #!/bin/bash
    #
    #**********************************************************************************************
    #Author:        tanliang
    . /etc/init.d/functions
    SRC_DIR=`pwd`
    MYSQL='mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz'
    COLOR='echo -e \E[01;31m'
    END='\E[0m'
    MYSQL_ROOT_PASSWORD=123456
    
    
    check (){
    if [ $UID -ne 0 ]; then
     action "当前用户不是root,安装失败" false
     exit 1
    fi
    
    cd $SRC_DIR
    if [ ! -e $MYSQL ];then
            $COLOR"缺少${MYSQL}文件"$END
            $COLOR"请将相关软件放在${SRC_DIR}目录下"$END
            exit
    elif [ -e /usr/local/mysql ];then
            action "数据库已存在,安装失败" false
            exit
    else
     return
    fi
    }
    
    
    install_mysql(){
    $COLOR"开始安装MySQL数据库..."$END
    yum -y -q install libaio numactl-libs libaio &> /dev/null
    cd $SRC_DIR
    tar xf $MYSQL -C /usr/local/
    MYSQL_DIR=`echo $MYSQL| sed -nr 's/^(.*[0-9]).*/\1/p'`
    ln -s /usr/local/$MYSQL_DIR /usr/local/mysql
    chown -R root.root /usr/local/mysql/
    id mysql &> /dev/null || { useradd -s /sbin/nologin -r mysql ; action "创建mysql用户"; }
    
    echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
    . /etc/profile.d/mysql.sh
    ln -s /usr/local/mysql/bin/* /usr/bin/
    [ -d /data/mysql ] || mkdir -p /data/mysql
    cat > /etc/my.cnf <<EOF
    [mysqld]
    server-id=`hostname -I|cut -d. -f4`
    log-bin
    datadir=/data/mysql
    socket=/data/mysql/mysql.sock
    log-error=/data/mysql/mysql.log
    pid-file=/data/mysql/mysql.pid
    [client]
    socket=/data/mysql/mysql.sock
    EOF
    
    
    mysqld --initialize --user=mysql --datadir=/data/mysql
    cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
    chkconfig --add mysqld
    chkconfig mysqld on
    service mysqld start
    [ $? -ne 0 ] && { $COLOR"数据库启动失败,退出!"$END;exit; }
    MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
    mysqladmin -uroot -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD&>/dev/null
    action "数据库安装完成"
    }
    
    check
    install_mysql
    
    #执行脚本进行数据库安装
    [root@localhost ~]# bash install_mysql.sh
    开始安装MySQL数据库...
    创建mysql用户                                              [  OK  ]
    Starting MySQL.                                           [  OK  ]
    数据库安装完成											[  OK  ]
    
    #创建数据库和用户并授权
    [root@localhost ~]# mysql -uroot -p123456
    
    mysql> create database wordpress;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> create user wordpress@'10.0.0.%' identified by '123456';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> grant all on wordpress.* to wordpress@'10.0.0.%';
    Query OK, 0 rows affected (0.00 sec)
    
    #在10.0.0.152wordpress上连接数据库测试
    #安装mysql客户端
    [root@localhost ~]#yum install -y mysql
    [root@localhost ~]# mysql -uwordpress -h10.0.0.162 -p123456
    ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
    
    连接MySQL数据库时会出现Authentication plugin 'caching_sha2_password' cannot be loaded的错误。
    出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法是把mysql用户登录密码加密规则还原成mysql_native_password. 
    
    #返回10.0.0.162,修改密码规则
    mysql> ALTER USER wordpress@'10.0.0.%'  IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> ALTER USER wordpress@'10.0.0.%'  IDENTIFIED WITH mysql_native_password BY '123456';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql>  FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.01 sec)
    
    #返回10.0.0.152连接数据库
    [root@localhost ~]# mysql -uwordpress -h10.0.0.162 -p123456
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 31
    Server version: 8.0.19 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MySQL [(none)]>
    
    
    #10.0.0.152上编写脚本安装php-fpm
    [root@localhost]#vim install_php.sh
    yum -y install gcc openssl-devel libxml2-devel bzip2-devel libmcrypt-devel sqlite-devel oniguruma-devel &>/dev/null
    cd /usr/local/src
    wget https://www.php.net/distributions/php-7.4.11.tar.xz &>/dev/null
    tar -xf php-7.4.11.tar.xz
    cd php-7.4.11
    ./configure --prefix=/apps/php74 --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --with-zlib --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --enable-mbstring --enable-xml --enable-sockets --enable-fpm --enable-maintainer-zts --disable-fileinfo  &>/dev/null
    make&&make install &>/dev/null
    cp /usr/local/src/php-7.4.11/php.ini-production /etc/php.ini
    cp /apps/php74/etc/php-fpm.conf.default  /apps/php74/etc/php-fpm.conf
    cp /apps/php74/etc/php-fpm.d/www.conf.default /apps/php74/etc/php-fpm.d/www.conf
    cat >/apps/php74/etc/php-fpm.d/www.conf <<eof
    [www]
    user = www
    group = www
    listen = 127.0.0.1:9000
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    pm.status_path = /pm_status
    ping.path = /ping
    access.log = log/$pool.access.log
    slowlog = log/$pool.log.slow
    eof
    useradd -r -s /sbin/nologin www
    mkdir /apps/php74/log
    /apps/php74/sbin/php-fpm -t &>/dev/null
    [ $? -ne 0 ] && { echo "php-fpm启动失败,退出!";exit; }
    cp /usr/local/src/php-7.4.11/sapi/fpm/php-fpm.service /usr/lib/systemd/system/
    systemctl daemon-reload
    systemctl enable --now php-fpm  &>/dev/null
    [ $? -eq 0 ] && { echo "php-fpm is enabled"; }
    pstree -p |grep php &>/dev/null
    [ $? -eq 0 ] && { echo "php-fpm sever is running"; }
    
    [root@localhost ~]# bash install_php.sh
    php-fpm is enabled
    php-fpm sever is running
    
    
    
    #编写nginx安装脚本进行安装
    [root@localhost ~]# cat install_nginx.sh
    #!/bin/bash
    yum -y install gcc pcre-devel openssl-devel zlib-devel &>/dev/null
    [ $? -eq 0 ] && { echo "gcc pcre-devel openssl-devel zlib-devel is install"; }
    
    cd /usr/local/src/
    wget http://nginx.org/download/nginx-1.18.0.tar.gz &>/dev/null
    tar xf nginx-1.18.0.tar.gz
    cd nginx-1.18.0/
    ./configure --prefix=/apps/nginx --user=www --group=www --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module &>/dev/null
    [ $? -eq 0 ] && { echo "编译完成"; }
    make &>/dev/null
    make install &>/dev/null
    [ $? -eq 0 ] && { echo "nginx编译安装完成"; }
    cat >/usr/lib/systemd/system/nginx.service <<eof
    [Unit]
    Description=nginx - high performance web server
    Documentation=http://nginx.org/en/docs/
    After=network-online.target remote-fs.target nss-lookup.target
    Wants=network-online.target
    [Service]
    Type=forking
    PIDFile=/apps/nginx/run/nginx.pid
    ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
    ExecReload=/bin/kill -s HUP \$MAINPID
    ExecStop=/bin/kill -s TERM \$MAINPID
    [Install]
    WantedBy=multi-user.target
    eof
    
    mkdir /apps/nginx/run/ -p
    mv /apps/nginx/conf/nginx.conf{,.bak}
    cat >/apps/nginx/conf/nginx.conf <<eof
    worker_processes 1;
    pid /apps/nginx/run/nginx.pid;
    events {
        worker_connections 1024; }
    http {
        include mime.types;
        default_type application/octet-stream;
        sendfile on;
        keepalive_timeout 65;
        server {
            listen 80;
            server_name www.magedu.org;
            location / {
                root /data/nginx/wordpress;
                index index.php index.html index.htm;
            }
            error_page 500 502 503 504 /50x.html;
            location = /50x.html {
                root html;
            }
            location ~ \.php$ {
                root /data/nginx/wordpress;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
                include fastcgi_params;
            }
            location ~ ^/(ping|pm_status)$ {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param PATH_TRANSLATED \$document_root\$fastcgi_script_name;
            }
        }
    }
    eof
    ln -s  /apps/nginx/sbin/nginx /usr/sbin/nginx
    /apps/nginx/sbin/nginx -t &>/dev/null
    [ $? -eq 0 ] && { echo "configuration file /apps/nginx/conf/nginx.conf test is successful!"; }
    systemctl daemon-reload
    systemctl enable --now nginx &>/dev/null
    [ $? -eq 0 ] && { echo "nginx启动成功!"; }
    mkdir -p /data/nginx/wordpress
    cat> /data/nginx/wordpress/test.php <<eof
    <?php
    phpinfo();
    ?>
    eof
    
    [root@localhost ~]# bash install_nginx.sh
    nginx编译安装完成
    configuration file /apps/nginx/conf/nginx.conf test is successful!
    nginx启动成功!
    
    #测试访问php测试页正常
    [root@localhost ~]#curl localhost/test.php
    
    
    #在10.0.0.152上部署wordpress
    [root@www ~]# tar xf wordpress-5.4.1-zh_CN.tar.gz
    [root@www ~]# cp -r wordpress/* /data/nginx/wordpress
    [root@www ~]# chown -R www.www /data/nginx/wordpress/
    #在windows访问http://www.magedu.org
    [root@www ~]# vim /data/nginx/wordpress/wp-config.php
    #在wordpress写文章并发布
    #验证发表的文章网页访问http://www.magedu.org
    [root@www ~]# tree /data/nginx/wordpress/wp-content/uploads/
    /data/nginx/wordpress/wp-content/uploads/
    └── 2021
        └── 11
            └── timg.jpg
    
    2 directories, 1 file
    You have mail in /var/spool/mail/root
    #配置允许上传大文件
    #注意:默认只支持1M以下文件上传,要利用php程序上传大图片,还需要修改下面三项配置,最大上传由三项值的最小值决定
    #nginx上传文件大小限制
    [root@centos7 ~]#vim /apps/nginx/conf/nginx.conf
    server {
           client_max_body_size 10m; #默认值为1M
    .....
    #php上传文件大小限制
    [root@centos7 ~]#vim /etc/php.ini
    post_max_size = 30M   #默认值为8M
    upload_max_filesize = 20M  #默认值为2M
    [root@centos7 ~]#systemctl restart nginx php-fpm
    
    
    #安全加固
    [root@www ~]# vim /apps/nginx/conf/nginx.conf
    worker_processes 1;
    pid /apps/nginx/run/nginx.pid;
    events {
        worker_connections 1024; }
    http {
        include mime.types;
        default_type application/octet-stream;
        sendfile on;
        keepalive_timeout 65;
        server {
            listen 80;
            server_name www.magedu.org;
            client_max_body_size 10m;
            server_tokens off;#添加此行,隐藏nginx版本
            location / {
                root /data/nginx/wordpress;
                index index.php index.html index.htm;
            }
            error_page 500 502 503 504 /50x.html;
            location = /50x.html {
                root html;
            }
            location ~ \.php$ {
                root /data/nginx/wordpress;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
                fastcgi_hide_header X-Powered-By;#添加此行
            }
            location ~ ^/(ping|pm_status)$ {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
            }
        }
    }
    [root@www ~]# systemctl reload nginx
    
    #开启opcache加速
    [root@www ~]# vim /etc/php.ini
    [opcache]
    ; Determines if Zend OPCache is enabled
    zend_extension=opcache.so                                                       
    opcache.enable=1
    [root@www ~]# #systemctl restart php-fpm
    
    #PHP 扩展session模块支持redis
    PECL是 PHP 扩展的存储库,提供用于下载和开发 PHP 扩展的所有已知扩展和托管功能的目录
    官方链接: http://pecl.php.net/package-stats.php
    github: https://github.com/phpredis/phpredis
    github安装文档: https://github.com/phpredis/phpredis/blob/develop/INSTALL.markdown
    开始在 PHP 中使用 Redis 前, 需要确保已经安装了 redis 服务及 PHP redis 驱动,
    PHP redis 驱动下载地址为:https://github.com/phpredis/phpredis/releases
    
    #在10.0.0.152上安装PHP redis 驱动
    [root@www ~]# cd /usr/local/src/
    [root@www ~]#tar xf phpredis-5.3.3.tar.gz
    [root@www src]# cd phpredis-5.3.3/
    [root@www phpredis-5.3.3]#/apps/php74/bin/phpize
    [root@www phpredis-5.3.3]# ./configure --with-php-config=/apps/php74/bin/php-config
    [root@www phpredis-5.3.3]#make -j 2 && make install
    [root@www phpredis-5.3.3]#
    [root@www phpredis-5.3.3]# ll /apps/php74/lib/php/extensions/no-debug-zts-20190902/
    total 9588
    -rwxr-xr-x 1 root root 4647668 Nov 29 15:53 opcache.a
    -rwxr-xr-x 1 root root 2509416 Nov 29 15:53 opcache.so
    -rwxr-xr-x 1 root root 2658240 Nov 30 02:31 redis.so
    
    #编辑php配置文件支持redis
    
    [root@www phpredis-5.3.3]# vim /etc/php.ini
    extension=redis.so    #文件最后一行添加此行,路径可省略
    [root@www phpredis-5.3.3]#
    [root@www phpredis-5.3.3]# systemctl restart php-fpm
    #windows网页访问http://www.magedu.org/test.php验证redis模块价值成功
    
    #在10.0.0.162上安装和配置 redis 服务
    [root@localhost ~]# yum install -y redis
    [root@localhost ~]# vim /etc/redis.conf
    bind 0.0.0.0
    requirepass 123456
    [root@localhost ~]#systemctl enable --now redis
    [root@localhost ~]#ss -tnlp
    
    #在10.0.0.152主机配置php的session保存在redis服务
    [root@localhost ~]#vim /etc/php.ini
    [Session]
    ; Handler used to store/retrieve data.
    ; http://php.net/session.save-handler
    session.save_handler = redis
    session.save_path = "tcp://10.0.0.162:6379?auth=123456"  
    [root@localhost ~]#systemctl restart php-fpm
    #验证
    [root@www phpredis-5.3.3]# curl localhost/test.php|grep -i 'session.save_handler'
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0<tr><td class="e">session.save_handler</td><td class="v">redis</td><td class="v">redis</td></tr>
    100 71733    0 71733    0     0  9305k      0 --:--:-- --:--:-- --:--:--  9.7M
    
    
    #10.0.0.152准备 php实现 session 的测试页面
    [root@www phpredis-5.3.3]# cat /data/nginx/wordpress/session.php
    <?php
    session_start();
    //redis用session_id作为key 并且是以string的形式存储
    $redisKey = 'PHPREDIS_SESSION:' . session_id();
    // SESSION 赋值测试
    $_SESSION['message'] = "Hello, I'm in redis";
    $_SESSION['arr'] = [1, 2, 3, 4, 5, 6];
    echo $_SESSION["message"] , "<br/>";
    echo "Redis key =   " . $redisKey . "<br/>";
    echo "以下是从Redis获取的数据", "<br/>";
    // 取数据'
    $redis = new Redis();
    $redis->connect('10.0.0.162', 6379);
    $redis->auth('123456');
    echo $redis->get($redisKey);
    ?>
    
    #网页访问http://www.magedu.org/session.php
    [root@localhost ~]# redis-cli -h 10.0.0.162 -a 123456
    10.0.0.162:6379> keys *
    (empty list or set)
    10.0.0.162:6379> keys *
    1) "PHPREDIS_SESSION:mgmr764old1jghlgqf6q5om8hj"
    10.0.0.162:6379> get PHPREDIS_SESSION:mgmr764old1jghlgqf6q5om8hj
    "message|s:19:\"Hello, I'm in redis\";arr|a:6:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;}"
    10.0.0.162:6379>
  • 相关阅读:
    [bzoj 4199][NOI 2015]品酒大会
    [bzoj 5332][SDOI2018]旧试题
    「PKUWC2018」猎人杀
    「PKUWC2018」Minimax
    正规消息发送器-- ESFramework 4.0 进阶(06)
    在线用户管理--ESFramework 4.0 进阶(05)
    ESFramework 4.0 进阶(04)-- 驱动力:通信引擎(下)
    驱动力—— 通信引擎(上)—— ESFramework 4.0 进阶(03)
    核心梳理——消息处理的骨架流程——ESFramework 4.0 进阶(02)
    重登陆模式 --ESFramework 4.0 快速上手(07)
  • 原文地址:https://www.cnblogs.com/tanll/p/15620782.html
Copyright © 2020-2023  润新知