18.使用phpmyadmin实现cookie和session

Posted 柯正

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了18.使用phpmyadmin实现cookie和session相关的知识,希望对你有一定的参考价值。

你们公司的会话保持(session共享)怎么做的?

# 开发做会话保持,将用户登录信息存储在redis,mysql,文件共享存储...中
1.记录用户的登录状态(logined=1)
2.通过用户对应的user_id跟cookie结合,记录用户的登录状态(明确知道是哪个用户登录的)
3.不安全,如果知道别人的user_id,或者尝试别人的id
4.通过session的加密,来保护cookie

# 开发没有做会话保持,我们通过运维的方式做会话保持,nginx的upstream模块中的ip_hash调度算法,保证用户的请求一直发送到同一台机器
# 不过这么做有弊端...负载不均衡,所以我们公司,先让运维做会话保持,后面开发会写

# 什么是cookie?
cookie是后端服务器,传给浏览器的一段字符串,作用是用来记录用户登录的状态,和数据库中的user id结合,可
以保证知道是哪一个用户登录的。仅存储在浏览器。

# 什么是session?
session是后端服务器,传给浏览器的一段字符串,作用也是用来记录用户的登录状态(通过加密的方式保护
cookie,防止其他用户通过user id随意登录别人账号),存储在服务器[redis,mysql,file,mongodb,es,memcache...]

使用phpmyadmin实现cookie和session

1.环境准备

角色 外网IP(NAT) 内网IP(LAN) 主机名
lb01 eth0:10.0.0.5 eth1:172.16.1.5 lb01
web01 eth0:10.0.0.7 eth1:172.16.1.7 web01
web02 eth0:10.0.0.8 eth1:172.16.1.8 web02
db01 eth0:10.0.0.51 eth1:172.16.1.51 db01

2.安装nginx和php

web01和web02都做

# 把nginx和php的包上传上来解压(或者去官网下载)
[root@web01 ~]# rz 
[root@web01 ~]# tar xf nginx_php.tgz
[root@web01 ~]# cd nginx_php/
[root@web01 ~/nginx_php]# rpm -ivh *

#### 2.统一用户
[root@web01 ~]# groupadd www -g 666
[root@web01 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M

# 2.1修改nginx的用户
[root@web01 ~]# vim /etc/nginx/nginx.conf
...
user www;
...
# 2.2修改php的用户
[root@web01 ~]# vim /etc/php-fpm.d/www.conf
...
user = www
group = www
....

# 3.启动php并加入开机自启
[root@web01 ~]# systemctl start nginx php-fpm
[root@web01 ~]# systemctl enable nginx php-fp

3.修改Nginx配置文件

[root@web01 ~]# vim /etc/nginx/conf.d/myadmin.conf 

server {
        listen 80;
        server_name admin.com;
        root /code/phpMyAdmin-4.9.0.1-all-languages;
        index index.php;
        access_log /var/log/nginx/admin_access.log;

        location ~ .php {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        }
}


# 检查语法
[root@web01 ~]# nginx -t

# 重新加载配置文件
[root@web01 ~]# nginx -s reload

# 域名解析

4.上传解压phpmyadmin

# 1.创建目录
[root@web01 ~]# mkdir /code

# 2.上传解压安装,解压开之后就是一个站点目录
[root@web01 ~]# cd /code
[root@web01 /code]# rz
[root@web01 /code]# unzip phpMyAdmin-4.9.0.1-all-languages_(1).zip
# 删除压缩包
[root@web01 /code]# rm -rf phpMyAdmin-4.9.0.1-all-languages_(1).zip 

# 3.授权站点目录
[root@web01 ~]# chown -R www.www /code/

# 4.修改代码
[root@web01 ~]# cd /code/phpMyAdmin-4.9.0.1-all-languages/
[root@web01 /code/phpMyAdmin-4.9.0.1-all-languages]# cp config.sample.inc.php config.inc.php
[root@web01 /code/phpMyAdmin-4.9.0.1-all-languages]# vim config.inc.php
...
/* Server parameters */        # 修改数据库ip
$cfg[‘Servers‘][$i][‘host‘] = ‘172.16.1.51‘;     
...

# 5.配置授权
[root@web01 ~]# chown -R www.www /var/lib/php/

5.将web01修改好的发送给web02

[root@web01 ~]# scp -r /code 172.16.1.8:/
[root@web01 ~]# scp /etc/nginx/conf.d/myadmin.conf 172.16.1.8:/etc/nginx/conf.d/

# 域名解析

6.web02操作

# 授权
[root@web02 ~]# chown www.www -R /code/
[root@web02 ~]# chown -R www.www /var/lib/php/

7.数据库操作(db01)

# 1.下载mariadb
[root@db01 ~]# yum install -y mariadb-server

# 2.启动并开机自启mariadb
[root@db01 ~]# systemctl start mariadb.service 
[root@db01 ~]# systemctl enable mariadb.service 

# 3.给数据库登入给一个密码(可做可不做)
[root@db01 ~]# mysqladmin -uroot password ‘111‘

# 4.登入数据库
[root@db01 ~]# mysql -uroot -p‘111‘

# 5.创建项目的用户名和密码
MariaDB [(none)]> grant all on *.* to php@‘%‘ identified by ‘111‘;

8.登入网站

admin.com

技术图片

技术图片

9.接入负载均衡

# 1.安装nginx(或者去官网下载,修改官网源)
[root@web01 ~]# rz 
[root@web01 ~]# tar xf nginx_php.tgz
[root@web01 ~]# cd nginx_php/
[root@web01 ~/nginx_php]# rpm -ivh nginx*


# 2.统一用户
[root@lb01 ~]# groupadd www -g 666
[root@lb01 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M

# 3.修改nginx的用户
[root@web01 ~]# vim /etc/nginx/nginx.conf
...
user www;
...
# 4.修改php的用户
[root@web01 ~]# vim /etc/php-fpm.d/www.conf
...
user = www
group = www
....

# 5.启动php并加入开机自启
[root@web01 ~]# systemctl start nginx php-fpm
[root@web01 ~]# systemctl enable nginx php-fp

# 6.写proxy模块的优化
[root@lb01 ~]# vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;              
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   

# nginx代理与后端服务器连 
proxy_connect_timeout 30;
# nginx代理等待后端服务器的响应时间
proxy_send_timeout 60;
# 后端服务器数据回传给nginx代理超时时间
proxy_read_timeout 60;

 ## 优化缓冲区
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

# 解决负载均衡常见典型故障
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;



# 7.写负载均衡的配置文件
[root@lb01 conf.d]# vim proxy_php.com.conf 
upstream admin {
        server 172.16.1.7;
        server 172.16.1.8;
}

server {
        listen 80;
        server_name admin.com;
        location / {
        proxy_pass http://admin;
        include proxy_params;
        }
}


# 检查语法
[root@lb01 conf.d]# nginx -t

# 重新加载
[root@lb01 conf.d]# nginx -s reload

# 域名解析

使用负载均衡的轮询功能之后,会发现,如果将session保存在本地文件的话,永远都登录不上去,下面使用redis解决会话登入问题

技术图片

10.使用redis解决会话登录问题

在数据库db01的主机上安装redis

# 1.安装redis
[root@db01 ~]# yum install redis -y

# 2.配置redis监听在172.16.1.0网段上                           # 修改redis的配置文件
[root@db01 ~]# sed  -i ‘/^bind/c bind 127.0.0.1 172.16.1.51‘ /etc/redis.conf

# 3.启动redis
[root@db01 ~]# systemctl start redis
[root@db01 ~]# systemctl enable redis

# 4.php配置session连接redis
# 4.1修改/etc/php.ini文件
[root@web01 ~]# vim /etc/php.ini

...
session.save_handler = redis
...
session.save_path = "tcp://172.16.1.51:6379"
;session.save_path = "tcp://172.16.1.51:6379?auth=123" #如果redis存在密码,则使用该方式
...
session.auto_start = 1
...

# 5.注释php-fpm.d/www.conf里面的两条内容,否则session内容会一直写入/var/lib/php/session目录中
...
;php_value[session.save_handler] = files
;php_value[session.save_path]    = /var/lib/php/session

# 6.重启php-fpm
[root@web01 ~]# systemctl restart php-fpm

# 7.将web01上配置好的文件推送到web02
[root@web01 ~]# scp /etc/php.ini root@172.16.1.8:/etc/php.ini  
[root@web01 ~]# scp /etc/php-fpm.d/www.conf root@172.16.1.8:/etc/php-fpm.d/

# 8.上web02上重启php-fpm
[root@web02 code]# systemctl restart php-fpm

技术图片

技术图片

session共享完成

什么是cookie和session

简单来说

1.cookie是客户端浏览网站的的时候,把客户端信息以某种形式记录在浏览器上。

2.session是客户端浏览服务端的时候,服务端把客户端信息以某种形式记录在服务器上,这种记录就是Session,用来保护cookie,不然没有session保护只要知道用户就可以随便登入(很危险)


# Cookie
是客户端保存用户信息的一种机制,用来记录用户的一些信息。如何识别特定的客户呢?cookie就可以做到。每次HTTP请求时,客户端都会发送相应的Cookie信息到服务端。它的过期时间可以任意设置,如果你不主动清除它,在很长一段时间里面都可以保留着,即便这之间你把电脑关机了。

# Session
是在无状态的HTTP协议下,服务端记录用户状态时用于标识具体用户的机制。它是在服务端保存的用来跟踪用户的状态的数据结构,可以保存在文件、数据库或者集群中。在浏览器关闭后这次的Session就消失了,下次打开就不再拥有这个Session。其实并不是Session消失了,而是Session ID变了,服务器端可能还是存着你上次的Session ID及其Session 信息,只是他们是无主状态,也许一段时间后会被删除。

实际上Cookie与Session都是会话的一种方式。它们的典型使用场景比如“购物车”,当你点击下单按钮时,服务端并不清楚具体用户的具体操作,为了标识并跟踪该用户,了解购物车中有几样物品,服务端通过为该用户创建Cookie/Session来获取这些信息。

# 如果你的站点是多节点部署,使用Nginx做负载均衡,那么有可能会出现Session丢失的情况(比如,忽然就处于未登录状态)。这时可以使用IP负载均衡(IP绑定 ip_hash,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决Session的问题),或者将Session信息存储在集群中。在大型的网站中,一般会有专门的Session服务器集群,用来保存用户会话,这时可以使用缓存服务比如Memcached或者Redis之类的来存放Session。

sessioncookie的区别

浏览器端存的是cookie每次浏览器发请求到服务端时,报文头是会自动添加cookie信息的。
服务端会查询用户的cookie作为key去存储里找对应的value(session)
同意域名下的网站的cookie都是一样的,所以无论几台服务器,无论请求分配到哪一台服务器上同一用户的cookie是不变的。也就是说cookie对应的session也是唯一的。

总结语

# 1、Cookie 在客户端(浏览器),Session 在服务器端。

# 2、Cookie的安全性一般,他人可通过分析存放在本地的Cookie并进行Cookie欺骗。在安全性第一的前提下,选择Session更优。重要交互信息比如权限等就要放在Session中,一般的信息记录放Cookie就好了。

# 3、单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。

# 4、Session 可以放在 文件、数据库或内存中,比如在使用Node时将Session保存在redis中。由于一定时间内它是保存在服务器上的,当访问增多时,会较大地占用服务器的性能。考虑到减轻服务器性能方面,应当适时使用Cookie。

# 5、Session 的运行依赖Session ID,而 Session ID 是存在 Cookie 中的,也就是说,如果浏览器禁用了 Cookie,Session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 Session ID)。

# 6、用户验证这种场合一般会用 Session。因此,维持一个会话的核心就是客户端的唯一标识,即Session ID。


以上是关于18.使用phpmyadmin实现cookie和session的主要内容,如果未能解决你的问题,请参考以下文章

phpmyadmin 未能设置会话 cookie。也许您使用的是 HTTP 而不是 HTTPS

必须在 phpmyadmin 中启用 Cookie

phpmyadmin 5.0.2 设置会话 cookie 失败

无法连接到 MAMP 中的 phpmyadmin

cookie设置的PHP头修改解决方案[重复]

如何在 phpMyAdmin 中设置默认主题?