1. 程式人生 > >redis安全設置及主從配置

redis安全設置及主從配置

毫秒 pri tcp sha inf 自己 ise error_log form

redis安全設置

編輯/etc/redisc.conf配置文件

#設置監聽ip
bind 127.0.0.1 2.2.2.2 ? #可以是多個ip,使用空格分隔
#設置監聽端口
prot 63634
#配置文件中設置登錄密碼,設置後使用redis-cli -a ‘password‘ 指定密碼來登錄redis、
requitepass  newpasswd
#將config命令改名為其他字符
rename-command CONFIG linux
#禁用config命令,找到配置行將其命令的參數改為空,如:
rename-command CONFIG ""

redis慢查詢日誌

編輯配置文件/etc/redis.conf

針對慢查詢日誌,可以設置兩個參數。一個是執行時長,另一個參數是記錄慢日誌長度,當一個新的命令被寫入日誌是,最老的一條命令會從命令日誌隊列中被移除
慢日誌配置項:

slowlog-log-slower-then 10000 ? ? #單位ms(毫秒),表示慢於10000ms的執行時間則記錄日誌
slowlog-max-len 128 ? ? ? ? ? ? ? ? ? ? #定義日誌長度,表示最多存儲128條日誌

redis的慢日誌是存儲在內存當中的,要查看慢日誌必須要登入redis的命令終端來使用命令來查看慢日誌記錄

slowlog get ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#列出所有慢查詢日誌
slowlog get 2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #只列出兩條查詢日誌
slowlog len ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#查看慢查詢日誌條數

在php中安裝redis模塊

首先在下載好php的redis模塊,需要解壓並編譯到php當中
下載redis模塊可以在google或者redis支持中查找(自行尋找)
這裏可以在php官網找到github上的下載地址,下載下來的包為zip壓縮格式
將下載後的包解壓

[root@nfs1 src]# unzip phpredis.zip 
Archive: phpredis.zip
837b1ae51fb2e79849f35cc21f373a4c3187f828
 ? creating: phpredis-develop/
  inflating: phpredis-develop/.gitignore 
--------------------省略

進入到解壓目錄下,使用phpize來生成編譯文件,並執行./configure編譯安裝模塊

[root@nfs1 src]# cd phpredis-develop/
[root@nfs1 phpredis-develop]# /usr/local/php-fpm/bin/phpize 
Configuring for:
PHP Api Version: 20160303
Zend Module Api No: 20160303
Zend Extension Api No: 320160303
[root@nfs1 phpredis-develop]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config 
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
-----------------------省略
[root@nfs1 phpredis-develop]# make
-----------------------省略
Build complete.
Don‘t forget to run ‘make test‘.

[root@nfs1 phpredis-develop]# make install
Installing shared extensions: /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20160303/

php需要註意一個地方,在安裝php服務時,使用的編譯參數中指定的php.ini路徑不能錯誤,否則在修改php.ini添加模塊時,模塊不會被加載上。造成編譯好模塊也不會被php加載使用
圖中是php的配置文件php.ini的路徑,這個路徑是在php編譯時指定的
技術分享圖片

編輯php.ini文件,在配置文件中增加redis的模塊配置項

[root@nfs1 phpredis-develop]# vim /usr/local/php-fpm/etc/php.ini
----------------------省略配置文件內容
extension=redis.so

重啟php-fpm,然後執行php -m查看所有模塊,並過濾顯示出redis模塊

[root@nfs1 phpredis-develop]# /usr/local/php-fpm/bin/php -m |grep redis
redis

redis存儲session

修改/usr/local/php-fpm/etc/php-fpm.conf配置文件,在配置文件中指定redis的服務地址及端口,如:

[root@nfs1 etc]# cat php-fpm.conf
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
?
[www]
listen = 192.168.1.234:9000
listen.mode = 666
user = php-fpm
group = php-fpm ?
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5 ? ? ? ? 
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://127.0.0.1:6379"

測試php使用redis存儲session數據
在nginx虛擬主機指定的網站頁面路徑下創建一個測試頁面,這裏創建的名稱為index.php,能夠直接訪問域名就能得出測試session信息

[root@nfs1 aaa.com]# cat index.php ? ? ? ? ? ? ? 查看測試頁的語句
<?php
session_start();
if (!isset($_SESSION[‘TEST‘])) {
$_SESSION[‘TEST‘] = time();
}
$_SESSION[‘TEST3‘] = time();
print $_SESSION[‘TEST‘];
print "<br><br>";
print $_SESSION[‘TEST3‘];
print "<br><br>";
print session_id();
?>
[root@nfs1 b.com]# curl localhost/1.php
1542173659<br><br>1542173659<br><br>1t8v3k3io2j707ah15qr1hskse
[root@nfs1 b.com]# curl localhost/1.php
1542173661<br><br>1542173661<br><br>iprg7uugki44g78dfh2kvpcsk0
[root@nfs1 b.com]# curl localhost/1.php
1542173662<br><br>1542173662<br><br>o5tgkueq5o2h5j0egj8sia14jt
[root@nfs1 b.com]# curl localhost/1.php
1542173667<br><br>1542173667<br><br>uq0cq2n6ab2sks5bphs4cse0un

登入redis查看存儲的session數據

[root@nfs1 b.com]# redis-cli
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:iprg7uugki44g78dfh2kvpcsk0"
2) "PHPREDIS_SESSION:uq0cq2n6ab2sks5bphs4cse0un"
3) "PHPREDIS_SESSION:o5tgkueq5o2h5j0egj8sia14jt"
4) "PHPREDIS_SESSION:1t8v3k3io2j707ah15qr1hskse"

配置php-fpm.conf需要註意在配置redis服務ip的時候,要以"tcp://ip+prot"的格式。否則在測試寫入session是不成功的,redis存儲不了session數據的

redis主從配置

這裏我在兩臺機器上安裝了redis,其中192.168.1.234為主redis,192.168.1.200為從redis。
我需要在主redis上開啟監聽本機可與其他主機通信的監聽ip。根據需要,可以在主redis上設置redis的登入密碼,確保redis安全
修改redis的配置文件,讓其監聽兩個ip,其中127.0.0.1我在php中配置了session數據寫入,監聽localhost的ip暫不更改
監聽多個ip使用空格來分割。配置如下:

[root@nfs1 b.com]# vim /etc/init.d/redis.conf
----------------------省略
bind 127.0.0.1 192.168.1.234

找到bind配置監聽ip並保存退出
kill掉redis服務。然後重新啟動redis

[root@nfs1 b.com]# killall redis-server
[root@nfs1 b.com]# /usr/local/bin/redis-server /etc/init.d/redis.conf 

查看redis服務新的監聽信息

[root@nfs1 b.com]# netstat -ntlp |grep 6379
tcp ? ? ? ?0 ? ? ?0 192.168.1.234:6379 ? ? ?0.0.0.0:* ? ? ? ? ? ? ? LISTEN ? ? ?91823/redis-server ?
tcp ? ? ? ?0 ? ? ?0 127.0.0.1:6379 ? ? ? ? ?0.0.0.0:* ? ? ? ? ? ? ? LISTEN ? ? ?91823/redis-server 

接下來在從上操作
指定主的redis監聽ip和端口信息,同樣編輯redis.conf配置文件
如果是在一臺服務器上安裝兩個redis,則需要修改其port、dir、pidfile和logfile的信息和文件存儲路徑
在配置文件中找到slaveof這行(新版本的redis在配置文件中則是replicaof的配置項),配置文件說明如下:

# +------------------+ +---------------+
# | Master | ---> | Replica |
# | (receive writes) | | (exact copy) |
# +------------------+ +---------------+
#
# 1) Redis replication is asynchronous, but you can configure a master to
# stop accepting writes if it appears to be not connected with at least
# a given number of replicas.
# 2) Redis replicas are able to perform a partial resynchronization with the
# master if the replication link is lost for a relatively small amount of
# time. You may want to configure the replication backlog size (see the next
# sections of this file) with a sensible value depending on your needs.
# 3) Replication is automatic and does not need user intervention. After a
# network partition replicas automatically try to reconnect to masters
# and resynchronize with them.
#
# replicaof <masterip> <masterport>
添加一行master端監聽的ip和端口配置
replicaof 192.168.1.234 6379
# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the replica to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the replica request.
#
# masterauth <master-password>
配置密碼:如果主redis存在登入密碼。那麽就需要在這裏設定master上的登入密碼,如:
masterauth 123456
# Note: read only replicas are not designed to be exposed to untrusted clients
# on the internet. It‘s just a protection layer against misuse of the instance.
# Still a read only replica exports by default all the administrative commands
# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve
# security of read only replicas using ‘rename-command‘ to shadow all the
# administrative / dangerous commands.
replica-read-only yes
配置從是否為只讀,開啟後從則不能寫入數據,舊版本配置項則是:slave-read-only yes

在slave端重啟redis,並在從redis查看是否有數據同步過來
在主上創建新的key,並且切換到從上查看是否同步

[root@nfs1 b.com]# redis-cli
127.0.0.1:6379> zadd zset1 1 abc
(integer) 1
127.0.0.1:6379> zadd linux1 1 123
(integer) 1
127.0.0.1:6379> zadd centos 1 123
(integer) 1
127.0.0.1:6379> keys *
1) "linux1"
2) "centos"
3) "zset1"

在從redis上查看這些數據是否存在

[root@localhost data]# redis-cli
127.0.0.1:6379> keys *
1) "centos"
2) "linux1"
3) "zset1"

開啟只讀後,從redis是無法寫入的,比如如下操作

127.0.0.1:6379> set ksy10 123
(error) READONLY You can‘t write against a read only replica.

操作的結果不太好區分,但以上操作都是通過驗證過的,沒有出現不能同步問題,redis是自己實現自動同步數據的,只需要指定master的監聽ip即可,可以在從服務器上使用redis-cli ?-h ?ip -p ?port ?來登錄主redis驗證連通的可用性

文筆不佳,請多指教

redis安全設置及主從配置