linux的数据库与web服务器
数据库:高级的Excel,键值对。
在linux中安装数据库,并完成初始化
# dnf search mysql 【查找数据库软件包】
# dnf install mysql-server.x86_64 -y 【安装】
# systemctl enable --now mysqld.service 【开火墙】
# systemctl status mysqld.service 【查看开启情况】
# mysql 【还没设置密码,可以直接访问数据库】
mysql> SHOW DATABASES; 【查看数据库】
mysql> QUIT 【退出数据库】
# mysql_secure_installation 【安全初始化命令】
再次登录就需要密码了
库名称查看
mysql> CREATE DATABASE timinglee; 【添加库名称】
Mysql> SHOW DATABASES; 【查看添加的可以】
mysql> USE timinglee 【使用库】
mysql> SHOW TABLES; 【显示库中的表】
库中的表和信息管理
mysql> CREATE TABLE userlist ( username varchar(10) not null, passwd varchar(50) not null );
【建立userlist表】
mysql> INSERT INTO userlist VALUES ('user1','123'); 【插入信息】
mysql> INSERT INTO userlist VALUES ('user3','333'),('user2','222'); 【插入多条信息】
mysql> SELECT * FROM userlist; 【查询所有数据】
mysql> SELECT username FROM userlist WHERE passwd='333';
【查询username字段中passwd字段等于333的信息】
表名称修改
mysql> ALTER TABLE userlist RENAME user_list; 【将userlist 改为 user_list】
mysql> SHOW TABLES; 【查看】
添加与删除列
mysql> ALTER TABLE user_list ADD age varchar(4) AFTER username; 【在username后添加列】
mysql> ALTER TABLE user_list DROP age; 【删除age列】
更新列
mysql> UPDATE user_list SET age='20'; 【age列数值改为20】
删除行数据
mysql> UPDATE user_list SET age='15' WHERE username='user3'; 【删除有user3的行】
#删除表 【要先备份】
mysql> DROP TABLE user_list;
#删除库
mysql> DROP DATABASE timinglee;
数据库备份
备份所有数据
# mysqldump -uroot -p12345678 -A > /mnt/all.sql
备份数据库结构,但不备份数据
# mysqldump -uroot -p12345678 -A --no-data >/mnt/all-nodata.sql
备份库
# mysqldump -uroot -p12345678 timinglee > /mnt/timinglee.sql
恢复库
# mysql -uroot -p12345678 -e "create database timinglee;"
# mysql -uroot -p12345678 timinglee < /mnt/timinglee.sql 【指定恢复的 timinglee库】
Apache
# dnf install httpd -y 【下载】
# firewall-cmd --list-all 【查看默认区域】
开启火墙
# firewall-cmd --permanent --add-service=http
# firewall-cmd --permanent --add-service=https
# systemctl enable --now httpd 【开启服务】
# echo 172.25.254.100 > /var/www/html/index.html 【生成默认测试页,放入内容】
Apache基本信息
/etc/httpd/conf # apache的配置目录
/etc/http/conf.d #子配置目录
/etc/httpd/conf/httpd.conf #主配置文件
/lib/systemd/system/htpd.service #启动文件
:80 # 默认端口
/var/www/html # 默认发布目录
index.html # 默认发布文件
基本配置信息
端口修改
# vim /etc/httpd/conf/httpd.conf 【修改主配置文件】
# systemctl reload httpd 【重启服务】
# firewall-cmd --permanent --add-port=8080/tcp 【设定火墙发行】
# firewall-cmd --reload 【火墙服务重启】
# netstat -antlupe | grep httpd 【检测端口】
# curl 172.25.254.100:8080 运行结果:
默认发布目录
# mkdir /web/html -p 【建立新的默认发布目录】
# vim /etc/httpd/conf/httpd.conf 【修改主配置文件,建立新配置】
# systemctl restart httpd 【重启】
# echo "/web/html's page" > /web/html/index.html 【放入内容】
# curl 172.25.254.100:8080 运行结果:
默认发布文件 【注意:有报错可以 # setenforce 0 暂时修改selinux值】
# echo "/web/html/lee's page" > /web/html/lee.html 【放入内容】
# curl 172.25.254.100:8080/lee.html 运行结果:
# vim /etc/httpd/conf/httpd.conf 【修改主配置文件】
# systemctl restart httpd 【重启】
# curl 172.25.254.100:8080 运行结果:
https
# dnf install mod_ssl -y 【下载https包】
# mkdir /etc/httpd/certs 【建立证书和key文件目录】
# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/httpd/certs/timinglee.org.key -x509 -days 365 -out /etc/httpd/certs/timinglee.org.crt 【生成证书】
# ls /etc/httpd/certs/ 【查看目录,证书出现】
# vim /etc/httpd/conf.d/ssl.conf 【配置文件,格式化之前的,选择新的证书文件】
# systemctl restart httpd 【重启httpd服务,reload 不行】
# netstat -antlupe | grep httpd
# curl -k https://172.25.254.100 【-k强制访问,检测浏览器访问】
apache的虚拟主机
# mkdir -p /var/www/virtual/timiniglee.org/news 【创建子网页文件】
# mkdir -p /var/www/virtual/timiniglee.org/bbs
子网页文件放入内容
# echo new.timinglee.org > /var/www/virtual/timiniglee.org/news/index.html
# echo bbs.timinglee.org > /var/www/virtual/timiniglee.org/bbs/index.html
# vim /etc/httpd/conf.d/vhosts.conf 【创建新文件,配置网页设置】
<VirtualHost _default_:80>
DocumentRoot /var/www/html #文件目录
</VirtualHost>
<VirtualHost *:80>
ServerName bbs.timinglee.org #文件名称
DocumentRoot /var/www/virtual/timinglee.org/bbs/
</VirtualHost>
<VirtualHost *:80>
ServerName news.timinglee.org
DocumentRoot /var/www/virtual/timinglee.org/news/
</VirtualHost>
# systemctl reload httpd 【刷新http】
# vim /etc/hosts 【配置浏览器文件,添加内容,加入虚拟主机解析域名】
172.25.254.100 mariadb.timinglee.org www.timinglee.org news.timinglee.org bbs.timinglee.org
# curl www.timinglee.org
# curl bbs.timinglee.org
# curl news.timinglee.org
附加内容:
缓存雪崩、缓存穿透,缓存击穿
Redis是一个完全开源免费的高性能非关系型(NOSQL)的key-value数据库。
Redis不可能把所有的数据都缓存起来(内存昂贵且有限),所以Redis需要对数据设置过期时间,并采用的是惰性删除+定期删除两种策略对过期键删除。缓存雪崩:
【Redis对过期键的策略+持久化】
如果缓存数据设置的过期时间是相同的,并且Redis恰好将这部分数据全部删光了。这就会导致在这段时间内,这些缓存同时失效,全部请求到数据库中。Redis中缓存的数据大面积同时失效,或者Redis宕机,从而会导致大量请求直接到数据库,压垮数据库缓存雪崩如果发生了,很可能就把我们的数据库搞垮,导致整个服务瘫痪!
解决方法:
在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期。对于“Redis挂掉了,请求全部走数据库”这种情况,我们可以有以下的思路:
事发前:实现Redis的高可用(主从架构+Sentinel 或者Redis Cluster),尽量避免Redis挂掉这种情况发生。
事发中:万一Redis真的挂了,我们可以设置本地缓存+限流,尽量避免我们的
数据库被干掉(起码能保证我们的服务还是能正常工作的)事发后:redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。
缓存穿透:
缓存穿透是指查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义,请求的数据在缓存大量不命中,导致请求走数据,也可能压垮数据库,导致整个服务瘫痪!
如何解决缓存穿透
由于请求的参数是不合法的(每次都请求不存在的参数),于是我们可以使用布隆过滤器(BloomFilter)提前拦截,不合法就不让这个请求到数据库层!
当我们从数据库找不到的时候,我们也将这个空对象设置到缓存里边去。下次再请求的时候,就可以从缓存里边获取了。
这种情况我们一般会将空对象设置一个较短的过期时间。缓存击穿
Redis中一个热点key在失效的同时,大量的请求过来,从而会全部到达数据库,压垮数据库。
这里要注意的是这是某一个热点key过期失效,和缓存雪崩是有区别的。比如淘宝双十一,对于某个特价热门的商品信息,缓存在Redis中,刚好0点,这个商品信息在Redis中过期查不到了,这时候大量的用户又同时正好访问这个商品,就会造成大量的请求同时到达数据库。解决办法
设置热点数据"永不过期" 或者定时更新,加上互斥锁:上面的现象是多个线程同时去查询数据库的这条数据,我们可以在第一个查询数据的请求上使用一个互斥锁来锁住它 其他的线程走到这一步拿不到锁就等着,等一个线程查询到了数据,然后将数据放到redis缓存起来。
后面的线程进来发现已经有缓存了,就直接走缓存。