Nginx基础(04)

Nginx基础(03)

Session & cookies

  • 解决客户端重复登录服务器的冗余问题

    • ip_hash : 根据IP地址固定后端服务器 , 适合小流量网站使用

    • Session : 储存客户信息 , 交互SessionID 匹配 , 适合大流量网站使用

  • Session : 储存在服务器端 , 保存用户名 , 登录状态等信息

  • **Cookies : **

    • 由服务器下发给客户端 , 保存在客户端的一个文件里

    • 保存的主要内容为 SessionID

  • if 客户端用 Cookies 保存了 SessionID

    • 请求服务器时 , 发送SessionID给服务器
    • 服务器搜索对应的SessionID
    • 存在则给予权限 , 客户端处于登录状态
    • 不存在则认为是SessionID超时/被服务器清除了
    • 不存在时 , 服务器会分配新的SessionID给客户端
  • if 客户端没有用 Cookies 保存 SessionID

    • 客户端没有提交 SessionID 给服务器
    • 服务器认为客户端是全新的请求
    • 服务器会分配客户端新的 SessionID

PHP的本地 Session 信息

1. 部署Nginx为前台调度服务器

2. 调度算法为轮询

3. 后端为两台LNMP服务器

4. 部署测试页面 , 查看PHP本地Session 信息

1. 部署后端LNMP服务器相关软件
1) 安装基础依赖包

gcc openssl-devel pcre-devel

2)源码安装Nginx
3) 安装MariaDB数据包

mariadb mariadb-server mariadb-devel

4) 安装PHP

php php-mysqlnd php-fpm

5) 修改Nginx配置文件

修改默认首页 和 动静分离

vim /usr/local/nginx/conf/nginx.conf
location / {
            root   html;
            index  index.php  index.html   index.htm;
        }
 location  ~  \.php$  {
            root           html;
            fastcgi_pass  unix:/run/php-fpm/www.sock;
            fastcgi_index  index.php;
           # fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi.conf;
        }不同的协议:例如,一个页面通过 HTTP 协议加载了 JavaScript,然后尝试向使用 HTTPS 协议的服务器发送请求。
[root@web2 ~]# vim /etc/php-fpm.d/www.conf   #打开php-fpm配置文件
[www]
listen = /run/php-fpm/www.sock             #socket方式(使用进程通信)
listen.acl_users = apache,nginx,nobody        #添加nobody账户

[root@web2 ~]#systemctl restart php-fpm    #重启服务
2.启动LNMP服务器相关服务
1) 启动Nginx服务
2) 启动MySQL服务
3) 启动PHP-FPM服务
4) 配置LNMP后 , 书写网页文件
cd  ~/lnmp_soft/php_scripts/
tar -xf php-session-demo.tar.gz    #释放带登录功能的网页
cp -r php-session-demo/* /usr/local/nginx/html/
#拷贝页面到nginx中使用火狐浏览器访问http://192.168.99.200/index.php  可以看到有登录界面的网页

这里index.php是登录前页面 ,home.php是登录后才能看的页面

3. 在proxy部署前端Nginx调度服务器
1) 确认安装启动Nginx软件
2) 修改Nginx配置文件 , 实现代码服务器
vim /usr/local/nginx/conf/nginx.conf
.. ..
upstream webs  {
        server 192.168.99.100:80;
        server 192.168.99.200:80;
  }
 server  {
          listen       80;
          server_name  localhost;
          location  /  {
              proxy_pass http://webs;
            root   html;
            index  index.php index.html index.htm;
          }
}

/usr/local/nginx/sbin/nginx -s reload
4. 测试环境是否配置成功
  • 浏览器访问测试192.168.99.5的登录页面,但两个集群主机一样,可用修改index.php文件的内容,以区别后端两台不同的服务器.
  • 删除web1与web2的session文件,再删除火狐浏览器的历史记录(主要是cookies文件)
    rm  -rf  /var/lib/php/session/*       
 #删除web1与web2的session文件,再删除火狐浏览器的历史记录(主要是cookies文件)
    http://192.168.99.5/index.php            
 #登录2次才能成功,目前登录2次是正常现象!!
  • Session文件是所有后端服务器里都有备份
  • 所有后端服务器内的SessionID保持一致

redis

  • 数据存储对比

    • 性能
      • CPU缓存 > 内存 > 磁盘 > 数据库
    • 价格
      • CPU缓存 > 内存 > 磁盘 > 数据库
  • Redis 远程字典服务

    • Redis是用C语言编写的开源 , 高性能的 key-value 数据库
    • key-value数据库
      • key是关键字
      • value是值
      • 具备极高的并发读写性能
      • 可以实现上万并发连接下的高速主键查询
      • MySQL 只能实现几百个并发连接
      • Key-value数据库是一种以 键值储存数据 的一种数据库
      • 每个 键 都会对应 唯一值
  • 电子商务场景中Redis使用例 :

    • 商品基础信息 ( 名称 , 价格 , 厂商 ) 存放于MySQL
    • 商品附加信息 ( 描述 , 详情 , 评论 ) 存放于MongoDB
    • 图片信息 , 存放于分布式文件系统
    • 搜索关键字 , ES , Lucene , solr
    • 热点信息 , 高频 , 波段性 存放于 Redis

Redis的特点

  • 单线程 , Redis是单线程的 , 所有单个操作都是原子性的 , redis层面无需考虑并发问题
  • 性能高
  • 丰富的数据类型 : String , List , Hash , Set 及 Ordersd Set
  • 支持持久化
  • 支持横向扩展 ( redis可以集群 )
  • 丰富的特性 , redis还支持 publish/subscribe , 通知 , key过期等等特新
  • redis 的单个key和value的最大size都是 512M

构建redis服务

  • 基于LNMP的后端服务器在各自的目录 /var/lib/php/session/ 下储存着 SessionID 对应的 Session文件 , 致使客户端每次操作经常需要反复进行SessionID认证(重复登录) —在不同的后端服务器上执行相同的服务
  • 为了统一不同后端服务器上的Session文件 , 无需客户端在后端服务器变换时再次进行SessionID认证 , 需要安装专门的数据库工具.
  • 实现 Session 共享
  • 要求 :
      • [ 安装 Redis 软件 , 并启动服务 ]
      • [ 测试 Redis 服务 ]
      • [ 对 Redis 进行 增 , 删 , 改 , 查等操作 ]
1. 构建Redis服务
1) 安装/启动 Redis 软件包 [ redis ]
[root@proxy ~]# yum -y  install   redis
[root@proxy ~]# systemctl start redis
[root@proxy ~]# ss -ntulp | grep redis
2) 配置Redis配置文件
vim  /etc/redis.conf
...
#bind 127.0.0.1                    #加注释
								#关闭只允许本机访问/共享
...
protected-mode no                    #保护模式关闭
...

systemctl restart redis
2.测试redis服务
测试Redis服务器 [ redis-cli ]
redis-cli            #进入redis命令行
set abc 456         #创建变量abc,里面的值是456
get abc            #查看变量abc的值
keys  *            #查看当前库中所有key
del  abc            #删除变量abc
flushall            #删除所有数据
quit                #退出                     

Redis实现Seesion共享

  • 配置PHP使用redis服务器共享Session信息

  • 客户端访问两台不同的后端Web服务器时,Session 信息一致

  • 方案

    • 任意(Nginx)服务器除了承担调度器外
    • 可以担任 Redis 数据库角色
    • 并在后端LNMP服务器上实现PHP的Session会话共享
1. web(后端)服务器安装PHP/Redis扩展
cd ~/lnmp_soft/php_scripts/
yum -y install phpredis-5.1.0-1.x86_64.rpm
yum -y install redis
2. 在后端LNMP服务器上部署Session共享

在所有后端服务器上修改PHP-FPM配置文件,并重启服务

[ /etc/php-fpm.d/www.conf ]

vim  /etc/php-fpm.d/www.conf            #修改该配置文件的两个参数

最后一页的部分内容,修改前效果如下:
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session

修改后效果如下:
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://192.168.99.5:6379"

systemctl  restart  php-fpm

所有主机关闭防火墙和SElinux

3. 客户端测试

客户端使用浏览器访问proxy

最后清空浏览器的历史记录,

再访问http://192.168.99.5/index.php仅仅登录一次即可成功

Nginx实现跨域

同源策略
  • 定义了浏览器访问网站时 , 需要域名 , 协议 , 端口相同
  • 是重要的安全策略 , 防止了恶意数据的传递
跨域问题
  • 在代理服务中 , 前端的端口 , 域名 与 后端的端口 , 域名 经常各不相同.

  • 在前端客户端向后端服务器发送请求 域名 端口 协议 与当前页面域名等不同时

  • 就会发生跨域问题

  • 跨域请求 突破了 同源策略

  • 例 :

    • 不同的协议 :

      • **一个页面通过 HTTP 协议加载了 JavaScript **
      • 然后尝试向使用 HTTPS 协议的服务器发送请求
    • 不同的域名 :

      • 一个页面从 www.baidu.com 加载了 Java
      • 然后尝试向 api.example.com 发送请求
    • 不同的端口 :

      • 一个页面从 www.baidu.com:8080 加载了 Java

      • 然后尝试向 www.baidu.com:9090 发送请求

  • 方案 :

    • 默认情况下 , 浏览器根据同源策略 , 会拦截非本网站的 端口 , 域名 , 协议 等

    • 通过配置Nginx跨域指令即可解决

创建2个虚拟主机,一个80端口(这个用默认配置即可),一个8080端口
1) 为proxy主机添加 8080 虚拟主机
vim conf/nginx.conf
server {
	listen 8080;
	charset utf8;
	location / {
		root html;
		index index.html;
	}
}

sbin/nginx -s reload
2) 创建2个测试页面
cat html/80.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>API-test</title>
    <script>
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'http://192.168.99.5:8080/api.html',true);
        xhr.send();
        function change(){
            if(xhr.readyState==4 && xhr.status==200){
                alert(xhr.responseText);
            }
        }
    </script>
</head>
<body>
<input  id="button" type="button" value="测试" onclick="change();">
</body>

[root@proxy nginx]# cat html/api.html
8080虚拟主机测试页面
3) 在8080虚拟主机中添加即可允许从任意地址跨域访问请求8080的数据

add_header ‘Access-Control-Allow-Origin’ ‘*’;

#服务器响应数据中添加允许跨域访问

打开浏览器,访问http://192.168.99.5/80.html,点击按钮无反应,

im conf/nginx.conf
server {
listen 8080;
charset utf8;
location / {
add_header 'Access-Control-Allow-Origin' '*';  #服务器响应数据中添加允许跨域访问
root html;
index index.html;
}
}

sbin/nginx -s reload

访问http://192.168.99.5/80.html,点击按钮即可看到8080端口的页面

4) 修改具体允许请求的地址,增加安全

add_header ‘Access-Control-Allow-Origin’ ‘http://192.168.99.5’;

vim conf/nginx.conf
server {
listen 8080;
charset utf8;
location / {
add_header 'Access-Control-Allow-Origin' 'http://192.168.99.5';
root html;
index index.html;
}
}

sbin/nginx -s reload

相关推荐

  1. Nginx基础04

    2024-04-20 15:08:04       31 阅读
  2. Nginx基础02

    2024-04-20 15:08:04       43 阅读
  3. Nginx基础03

    2024-04-20 15:08:04       35 阅读
  4. Nginx基础05

    2024-04-20 15:08:04       32 阅读
  5. Nginx-04-Docker Nginx

    2024-04-20 15:08:04       35 阅读
  6. Nginx 基础应用实战 04 在公网配置配置HTTPS

    2024-04-20 15:08:04       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-20 15:08:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-20 15:08:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-20 15:08:04       82 阅读
  4. Python语言-面向对象

    2024-04-20 15:08:04       91 阅读

热门阅读

  1. 数据仓库元数据管理

    2024-04-20 15:08:04       28 阅读
  2. MySQL常见故障现象分析及解决办法

    2024-04-20 15:08:04       32 阅读
  3. 红黑树(Red-Black Tree)

    2024-04-20 15:08:04       49 阅读
  4. 由于bug发现的现象

    2024-04-20 15:08:04       38 阅读
  5. void * 指针的作用_C

    2024-04-20 15:08:04       109 阅读
  6. 若依前端分离版中使用二维码功能

    2024-04-20 15:08:04       104 阅读
  7. SpringBoot上传文件夹

    2024-04-20 15:08:04       33 阅读
  8. [学习] linux命令大全

    2024-04-20 15:08:04       34 阅读