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。
session和
cookie的区别
浏览器端存的是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