早晨上班,发现系统挂了,一看报错,嗯,redis数据丢了。老问题了,前两天刚丢过,但是一直没认真解决,都是恢复数据就完事儿。
连接redis客户端 redis-cli
keys *
一看果然key都没了,应该有一千多个key,现在只剩下几个bakeup1,back2,back3,back4
去阿里云看了看,果然提示系统redis被攻击了
然后看了看安全组,redis的授权对象是0.0.0.0 难怪被攻击
然后加上了几个常用内网的ip,除了redis,mysql也给配置上了
然后重新访问系统,一直出现nginx那个502页面.
头疼,妈的,又哪里出问题了。研究了一下nginx的配置文件,没有问题。
看了看nginx的报错日志:提示访问的ip连接超时:110: Connection timed out
难道是我的java程序挂了,ps -ef|grep java
看了看java活得好好的,那是啥问题呢,然后又去看了看java的报错日志,妈的,数据库连接不上,让我蠢死吧,安全组忘记配上服务器自己的ip了。
配上之后重启果然好了。
总结:
因为对安全组的配置不了解,所以没有配置安全组,结果redis多次被攻击,丢失数据
因为对nginx,redis,mysql等在linux上的配置文件呀,错误日志的位置呀不了解,所以花了一些时间来找,这些配置文件的地址,还有配上文件上的配置项的意义应该非常熟悉才对
不知道是不是配置上安全组的原因,前几天mysql运行查看所有正在运行的线程时,总数一度达到几百条,今天这个数值一直保持在十几条,开心。
SHOW full PROCESSLIST;
记录一下最近解决这个系统各种问题时用到的命令
一:mysql相关
mysql相关的一些命令
查看最大连接数
show variables like '%max_connections%'
查看所有连接
SHOW PROCESSLIST;
mysql状态
service mysql status
mysql 启动
service mysql start
mysql关闭
service mysql stop
mysql重启
service mysql restart
mysql 缓存是否生效
show variables like 'have_query_cache';
mysql配置文件的地址
/ect/my.cnf
mysql配置文件my.cnf详解
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /mydata/mysql/data
port=3306
server-id = 1
socket=/var/run/mysql/mysql.sock
max_connections=1000
上述参数说明如下:
user:mysqld 程序在启动后将在给定 UNIX/Linux 账户下执行。mysqld 必须从 root 账户启动才能在启动后切换到另一个账户下执行。mysqld_safe 脚本将默认使用 user=mysql 选项来启动 mysqld 程序。
basedir:指定 MySQL 安装的绝对路径;
datadir:指定 MySQL 数据存放的绝对路径;
port:服务端口号,默认为 3306
server-id:MySQL 服务的唯一编号,每个 MySQL 服务的 id 需唯一。
socket:socket 文件所在目录
max_connections:myql最大连接数(不要配错了位置,在[mysqld]下)
[mysqld_safe]
log-error=/usr/local/mysql/data/mysql.log
pid-file=/usr/local/mysql/data/mysql.pid
log-error:报错日志地址
pid-file:进程文件地址
[client]
port=3306
socket=/var/run/mysql/mysql.sock
[mysqldump]
quick
max_allowed_packet = 16M
query_cache_type=1
query_cache_size=16M
以上参数会被 MySQL 客户端应用读取,参数说明如下:
port:MySQL 客户端连接服务器端时使用的端口号,默认为 3306
socket:套接字文件所在目录
quick:支持较大的数据库转储,导出非常巨大的表时需要此项 。
max_allowed_packet:服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要),每个连接独立的大小,大小动态增加。
query_cache_type:表示开启mysql缓存。
0代表关闭查询缓存OFF,
1代表开启ON
2(DEMAND)代表当sql语句中有SQL_CACHE关键词时才缓存
query_cache_size:设置了缓存的大小
注意:只有 MySQL 附带的客户端应用程序保证可以读取这段内容。如果想要自己的 MySQL 应用程序获取这些值,需要在 MySQL 客户端库初始化的时候指定这些选项。
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
lower_case_table_names = 1
key_buffer_size=16M
max_allowed_packet=8M
no-auto-rehash
sql_mode=TRADITIONAL
character-set-server:数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用 4 个字节)
collation-server:数据库字符集对应一些排序等规则,注意要和 character-set-server 对应
init_connect:设置 client 连接 mysql 时的字符集,防止乱码
lower_case_table_names:是否对 sql 语句大小写敏感,1 表示不敏感
key_buffer_size:用于指定索引缓冲区的大小
max_allowed_packet:设置一次消息传输的最大值
no-auto-rehash:仅仅允许使用键值的 UPDATES 和 DELETES
sql_mode:表示 SQL 模式的参数,通过这个参数可以设置检验 SQL 语句的严格程度
二.redis相关
1.如何找到redis的安装地址
先查看redis的进程号:ps -ef | grep redis
[root@izm5e1ja8b4ci0wggj4gunz etc]# ps -ef|grep redis
root 20923 5407 0 14:01 pts/4 00:00:00 grep --color=auto redis
root 25713 1 0 08:37 ? 00:00:11 ./redis-server *:6379
拿到进程号25713,然后查询:
[root@izm5e1ja8b4ci0wggj4gunz etc]# ll -l /proc/25713/cwd
lrwxrwxrwx 1 root root 0 Feb 23 08:37 /proc/25713/cwd -> /usr/local/bin
这样我们就拿到了redis的安装路径:/usr/local/bin
小知识:cwd:是当前工作目录的意思。current working directory。
/proc/pid/cwd包含了当前进程工作目录的一个链接 ;
2.redis启动命令
在安装目录下执行:
./redis-server ./redis.conf
3.redis配置文件
daemonize no 开启守护进程
pidfile /var/run/redis_6379.pid 当redis以守护进程运行时,redis_6379.pid中会写入进程号
port 6379 端口号
bind 127.0.0.1 绑定的主机地址
timeout 300 当客户端闲置多长秒后关闭连接,如果指定为 0 ,表示关闭该功能
loglevel notice 指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning
logfile "rsb.log" 日志文件
databases 16 设置数据库的数量,默认数据库为0
save <seconds> <changes> 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save 900 1 900 秒(15 分钟)内有 1 个更改
save 300 10 300 秒(5 分钟)内有 10 个更改
save 60 10000 60 秒内有 10000 个更改
rdbcompression yes 指定存储至本地数据库时是否压缩数据,默认为 yes
dbfilename dump.rdb 指定本地数据库文件名,默认值为 dump.rdb
dir ./ 指定本地数据库存放目录
slaveof <masterip> <masterport> 设置当本机为 slave 服务时,设置 master 服务的 IP 地址及端口,在 redis启动时,它会自动从 master 进行数据同步
masterauth <master-password> 当 master 服务设置了密码保护时,slave 服务连接 master 的密码
requirepass foobared 设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需
要通过AUTH <password> 命令提供密码,默认关闭
maxclients 128 设置同一时间最大客户端连接数,默认无限制
maxmemory <bytes> 指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中
appendonly no 指定是否在每次更新操作后进行日志记录
appendfilename appendonly.aof 指定更新日志文件名,默认为 appendonly.aof
appendfsync everysec 指定更新日志条件,共有 3 个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用 fsync() 将数据写到磁盘(慢)
everysec:表示每秒同步一次(折中,默认值)
vm-enabled no 指定是否启用虚拟内存机制,默认值为 no
include /path/to/local.conf 指定包含其它的配置文件
4.redis数据备份与恢复
进入redis客户端,执行save命令。该命令将在 redis 安装目录中创建dump.rdb文件。
[root@izm5e1ja8b4ci0wggj4gunz sbin]# redis-cli
127.0.0.1:6379> save
OK
(1.15s)
127.0.0.1:6379>
恢复数据
如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,如下所示:
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/bin"
三 .nginx相关
启动nginx
cd /var/nginx/sbin;
./nginx;
或者制定配置文件启动
/var/nginx/sbin/nginx -c /var/nginx/conf/nginx.conf
2.nginx配置文件地址
/var/nginx/conf/nginx.conf
配置文件中配置了错误日志地址,从错误日志中可以看到nginx的报错信息
error_log /var/log/nginx/error.log;