安裝並設定 Redis 讓 WordPress 速度起飛 | WordPress

安裝並設定 Redis 讓 Wordpress 速度起飛 | Wordpress

我們安裝完 WordPress 之後,接著來安裝 Redis。

Redis 是一個開源,在快取資料庫方面有良好性能的軟體,可以減少你讀取資料庫的時間進而提升網站的瀏覽速度,在 WordPress 的話可以快取「object cache」。也就是說 WordPress 再被使用時會出現的快取,原本是存在 MariaDB,現在換由 Redis 幫忙。

關於 Redis 和 phpredis

因為 Ubuntu 官方套件庫當中的 Redis 還停留在第三版,但其實已經更新到第四版了。所以如我要安裝最新版的 Redis 的話,需要透過新增套件庫或是自己下載壓縮檔案編譯安裝。

另外延續前一篇的主題,我們的 Redis 是安裝在 Ubuntu 18.04 和 php 7.2 的環境下。為了考量安全性,我們設定成如果不是 root 權限的話就無法存取 Redis,並且不對伺服器已的機器溝通,只對本機(127.0.0.1)進行作用。

如果要讓 WordPress 使用 Redis 的話,需要安裝 phpredis 讓 PHP 和 Redis 可以進行溝通。不過按照本篇的介紹之後還不會讓 Redis 啟用,要到下一章節才會教你讓 WordPress 使用 Redis。

Redis 和 Varnish 會互相衝突嗎

不會,Redis 是快取資料庫後端的部分,而 Varnish 是快取前端的部分。

以下會介紹兩種安裝 Redis 的方式,可以自行選擇其中一種方式來安裝。

使用套件庫安裝 Redis

雖然方便,但是我認為套件庫的更新速度沒有那麼快。

STEP 1

輸入以下指令加入套件庫來源。

sudo add-apt-repository ppa:chris-lea/redis-server
sudo apt-get update

STEP 2

直接下指令安裝 Redis 和 phpredis。

sudo apt-get install redis-server php-redis -y

其實在 Launchpad 也有顯示 Redisphpredis 套件的資訊,這隻軟體目前的最新版本是多少。但為了以防安裝不到最新版的 Redis,我推薦自行用下面的自行編譯安裝安裝最新版的 Redis。

使用自行編譯安裝

STEP 1

先更新套件庫。

sudo apt-get update -y
sudo apt-get upgrade -y

STEP 2

安裝自行編譯需要的軟體 build-essential。而 tcl 是測試編譯軟體的結果是否正確。

sudo apt-get install build-essential tcl -y

STEP 3

接著我們下載 Redis 官方的安裝檔案。

cd && sudo wget http://download.redis.io/releases/redis-stable.tar.gz && sudo tar xzf redis-stable.tar.gz

或是

cd && curl -O http://download.redis.io/redis-stable.tar.gz && tar xzf redis-stable.tar.gz

會顯示。

--2018-06-05 19:28:12--  http://download.redis.io/releases/redis-stable.tar.gz
Resolving download.redis.io (download.redis.io)... 109.74.203.151
Connecting to download.redis.io (download.redis.io)|109.74.203.151|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1769936 (1.7M) [application/x-gzip]
Saving to: ‘redis-stable.tar.gz’

redis-stable.tar.gz 100%[===================>]   1.69M  2.81MB/s    in 0.6s    

2018-06-05 19:28:13 (2.81 MB/s) - ‘redis-stable.tar.gz’ saved [1769936/1769936]

STEP 4

為 Redis 新增 Redis 專用帳戶

sudo adduser --system --group --disabled-login redis --no-create-home --shell /bin/nologin --quiet

確定此帳戶有新增成功。

cat /etc/passwd | grep redis

會顯示。

redis:x:116:119::/home/redis:/bin/nologin

沒有的話就再建立一次。

把「redis」帳戶加入「www-data」群組中,讓他可以存取「www-data」權限的檔案。

sudo usermod -g www-data redis

STEP 5

編譯 redis。

sudo mv redis-stable redis && cd redis && sudo make

要等待一些時間。大約 3 分鐘多。

...
echo REDIS_CFLAGS= >> .make-settings
echo REDIS_LDFLAGS= >> .make-settings
...
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC=''    -c -o lmem.o lmem.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC=''    -c -o lobject.o lobject.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC=''    -c -o lopcodes.o lopcodes.c
...
checking for strings.h... yes
checking for inttypes.h... yes
...
INCLUDEDIR         : /usr/local/include
LIBDIR             : /usr/local/lib
MANDIR             : /usr/local/share/man
...
gcc -std=gnu99 -Wall -pipe -g3 -O3 -funroll-loops  -c -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -o src/mb.o src/mb.c
...
    CC zmalloc.o
...                                                                  ^~~~
lzf_d.c:93:102: warning: this statement may fall through [-Wimplicit-fallthrough=]
  *ip++; case 23: *op++ = *ip++; case 22: *op++ = *ip++; case 21: *op++ = *ip++;
                                                                  ~~~~~~^~~~~~~
lzf_d.c:94:15: note: here
               case 20: *op++ = *ip++; case 19: *op++ = *ip++; case 18: *op++ = *ip++; case 17: *op++ = *ip++;
...
    CC t_hash.o
    CC config.o
    CC aof.o
...

STEP 6

再安裝。

sudo make install

應該一下子就安裝好了。

我們可以測試一下,看 redis-server 是否有安裝成功。

/usr/local/bin/redis-server -v

應該會顯示這個內容。

Redis server v=5.0.0 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=777ea84487eec932

設定 Redis

接著我們要設定一下 Redis 設定檔。

STEP 1

先備份一份原始檔案。

sudo cp redis.conf redis.confbak

然後下指令編輯「redis.conf」檔案。

sudo nano redis.conf

找到「daemonize no」,改成。

daemonize yes

代表要啟用 pid 檔案。

找到「pidfile /var/run/redis_6379.pid」,改成。

pidfile /var/run/redis/redis.pid

找到「supervised no」,改成。

supervised systemd

代表要在系統開機時同時開啟 Redis。

找到「dir ./」,改成。

dir /var/lib/redis

代表資料庫快取要寫在這邊。

找到「# maxmemory 」,改成。

maxmemory 60M

在 WordPress 當中,如果你使用了 20 到 30 個外掛的話,其實快取也不太可能超過 60MB 的大小。

接著找到「# maxmemory-policy noeviction」,改成。

maxmemory-policy allkeys-lru

Change the policy to allkeys-lru which forces redis-server to delete old cache (least recently used objects) when the Redis server starts to run out of memory

然後找到「stop-writes-on-bgsave-error yes」,改成。

stop-writes-on-bgsave-error no

最後請為 Redis 設定一個密碼。避免 Redis 被不知道的人使用,需要透過密碼這關才能夠使用。找到「# requirepass foobared」之後,改成。

requirepass [一組 Redis 專用的密碼]

另外在 Redis 當中,有一些指令可能會損壞你的資料庫,甚至是讓你的資料庫消失。所以我們要透過設定檔案把這些指令給關閉。
找到「# save “”」的下方,輸入以下內容。

rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command CONFIG ""

編輯完成後請按「Control」+「X」,按「Y」,再按「Enter」完成編輯。

STEP 2

然後把設定檔案移動到我們需要的地方。

sudo mkdir /etc/redis && sudo cp redis.conf /etc/redis && sudo cp redis.confbak /etc/redis

記得為檔案設定權限。

sudo chown -R redis:root /etc/redis/redis.conf
sudo chmod -R 600 /etc/redis/redis.conf
sudo chown -R redis:root /etc/redis/redis.confbak
sudo chmod -R 600 /etc/redis/redis.confbak

接著我們要開一個資料夾,為了執行 Redis 時能建立 pid 檔案而使用的。

sudo mkdir -p /var/run/redis/

如果你會使用到「unix sockets」的話,需要把「www-data」賦予這個資料料夾以方便存取。

sudo chown -R redis:www-data /var/run/redis/

STEP 3

接著我們要讓系統知道開啟 Redis 的位置,因此我們需要建立一個叫做「redis.service」的檔案。
請輸入以下指令。

sudo tee /etc/systemd/system/redis.service <<EOF
[Unit]
Description=Redis Datastore Server
After=network.target

[Service]
Type=forking
PIDFile=/var/run/redis/redis.pid
User=redis
Group=redis
ExecStartPre=/bin/mkdir -p /var/run/redis
ExecStartPre=/bin/chown redis:www-data /var/run/redis
ExecStart=/sbin/start-stop-daemon --start --pidfile /var/run/redis/redis.pid --umask 007 --exec /usr/local/bin/redis-server -- /etc/redis/redis.conf
ExecReload=/bin/kill -USR2 
ExecStop=/usr/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target
EOF

「Unit」的部分表示此程式的描述。

「Service」的部分,我們在設定要怎麼讓 Redis 運作。為了安全起見,我們不使用「root」來運行 Redis,而是另外使用「redis」群組和帳號來運作。這裡另外也寫到,Redis 在開啟、重新啟動、關閉、遇到錯誤的各種行為模式,就是如果 Redis 遇到錯誤,會總是自動重新啟動。

在最後「Install」的部分,設定表示要在系統啟動時啟用 Redis。

STEP 4

接著建立 pid 檔案。

sudo touch /var/run/redis/redis.pid
sudo chown redis:redis /var/run/redis/redis.pid
sudo chmod 775 /var/run/redis/redis.pid

因為我們剛剛在「redis.conf」檔案裡面設定 dictionary 的位置,所以我們需要另外新增一個資料夾。

sudo mkdir /var/lib/redis

並且設定資料夾的權限,讓 Redis 可以存取。

sudo chown redis:redis /var/lib/redis
sudo chmod -R 770 /var/lib/redis

STEP 5

最後就可以用這兩行指令,啟動 Redis。

sudo systemctl daemon-reload
sudo service redis start

另外不要忘記,每次重新啟動之後,也需要自動啟動 Redis。

sudo systemctl enable redis

刪除 Redis

如果你發現安裝過程當中有錯誤,並使用編譯安裝 Redis 的話,請輸入以下指令完全移除 Redis。

sudo service redis stop
sudo apt-get purge --auto-remove redis-server -y
sudo rm /usr/local/bin/redis-*
sudo rm -r /etc/redis/
sudo rm /var/log/redis_*
sudo rm -r /var/lib/redis/
sudo rm /etc/init.d/redis_*
sudo rm /var/run/redis_*

安裝 Redis PHP PECL extension

STEP 1

請下以下指令安裝相關套件。

sudo apt-get install git php7.2-fpm php7.2-cli php7.2-common php7.2-json php7.2-opcache php7.2-mysql php7.2-phpdbg php7.2-mbstring php7.2-gd php7.2-imap php7.2-ldap php7.2-pgsql php7.2-pspell php7.2-recode php7.2-snmp php7.2-tidy php7.2-dev php7.2-intl php7.2-gd php7.2-curl php7.2-zip php7.2-xml -y

STEP 2

接著從 git 這邊下載安裝檔案。

git clone https://github.com/phpredis/phpredis.git && sudo mv phpredis/ /tmp/ && cd /tmp/phpredis

或是你也可以用這個方式,挑一種方式下載即可。

sudo wget https://github.com/phpredis/phpredis/archive/master.zip -O phpredis.zip && sudo unzip -o phpredis.zip -d /tmp && sudo mv /tmp/phpredis-* /tmp/phpredis && cd /tmp/phpredis

STEP 3

之後編譯並進行安裝。

sudo phpize && sudo ./configure && sudo make
sudo make install

稍微等一下下。

Configuring for:
...
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
checking for gawk... gawk
...
/bin/bash /etc/phpredis/libtool --mode=compile cc  -I. -I/etc/phpredis -DPHP_ATOM_INC -I/etc/phpredis/include -I/etc/phpredis/main -I/etc/phpredis -I/usr/include/php/20170718 -I/usr/include/php/20170718/main -I/usr/include/php/20170718/TSRM -I/usr/include/...
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
...

接著進行一些最後的設定,要讓 Apache 和 Nginx 都可以使用 Redis。

STEP 4

建立 Redis php 設定檔案。

sudo tee /etc/php/7.2/mods-available/redis.ini <<EOF
extension=redis.so
EOF

然後啟用這個設定檔案。

sudo ln -sf /etc/php/7.2/mods-available/redis.ini /etc/php/7.2/apache2/conf.d/redis.ini
sudo ln -sf /etc/php/7.2/mods-available/redis.ini /etc/php/7.2/fpm/conf.d/redis.ini
sudo ln -sf /etc/php/7.2/mods-available/redis.ini /etc/php/7.2/cli/conf.d/redis.ini

STEP 5

另外在之前的安裝測試當中,因為系統設定的關係,可能會導致 Redis 無法正常使用,這裡我們調整一下設定。

echo "net.core.somaxconn= 1024" > /etc/sysctl.conf
echo "vm.overcommit_memory=1" > /etc/sysctl.conf
echo never > /sys/kernel/mm/transparent_hugepage/enabled
sysctl -p

STEP 6

然後重新啟動 php7.2-fpm 和 Apache,重新載入設定。

sudo service php7.2-fpm restart
sudo phpenmod redis && sudo service apache2 restart

安裝完的關係,我們就把下載來的安裝檔案刪除即可。

cd .. && sudo rm -rf phpredis && cd && sudo rm -R redis* phpredis*

不過 Redis 的使用要等安裝 Worpress 之後才會看得比較明顯,下一章節和下下章節將會教你在 WordPress 安裝設定 W3 Total Cache 外掛,並測試 Redis、Varnish 等狀況。

安裝 Redis
1. How To Install Redis in Ubuntu - Grainier Perera
2. Install and Configure Latest Redis Cache for WordPress
3. i-vagrant/install-redis.sh at master · bogdanvlviv/i-vagrant
4. How to install Redis 4 on Centos 6 / 7, Ubuntu 16 and Debian 8 (Updated)
5. Install Redis Cache on Ubuntu Server with PHP 7 and Nextcloud – Tech and Me

如何移除 Redis
6. How to uninstall Redis server from Ubuntu - Grainier Perera
7. how to delete redis from my ubuntu-16.04 server - Stack Overflow

安裝 phpredis
8. Installing php7-fpm with phpredis and xdebug extension on Ubuntu 14.04

快速安裝 Redis 和 phpredis
9. Script for building Ubuntu 16.04 server + LAMP + Redis, Memcached, Lets Encrypt, Git, Composer + Optimisations
10. Setup WordPress to Use Redis Caching on Ubuntu 17.04 / 17.10 – Website for Students
11. How to Speed Up WordPress with Redis Caching | RoseHosting Blog

詳細說明安裝 Redis 和 phpredis
12. How to install redis extension for php 7 - Stack Overflow
13. How to install Redis and Redis php client (Updated: Feb 23, 2018) - Anton Logvinenko

簡單說明並使用內建套件庫安裝並進行功能測試
14. Installing Redis 4.x onto Ubuntu 16.04
15. Ubuntu如何架設Redis Server並且與PHP一同使用?  |  MagicLen
16. Setup WordPress to Use Redis Caching on Ubuntu 17.04 / 17.10 – Website for Students

使用內建套件庫安裝
17. Installing Redis 4.x onto Ubuntu 16.04

關於套件庫新增
18. ubuntu 17.04 安装最新版本redis(原来的ppa源失效了,需要修改,包含自动重启) - CSDN博客
19. 使用Ubuntu 16.04 安裝 Redis – Natas Note

手動安裝
20. (记录)Ubuntu下安装Redis | Sky's Blog
21. How to install Redis 4 on Centos 6 / 7, Ubuntu 16 and Debian 8 (Updated)

安裝後的安全設定
22. 在Ubuntu中安装Redis | 粉丝日志
23. How to Set Up a Redis Server as a Session Handler for PHP on Ubuntu 14.04 | DigitalOcean
24. How To Secure Your Redis Installation on Ubuntu 14.04 | DigitalOcean
25. How to Install and configure Redis on Ubuntu 14.04

Redis 無法啟動的錯誤
26. Ubuntu systemd service file for Redis. The server was updated to a Ubuntu 15.04 (Vivid Vervet) distribution. Redis was installed from the PPA from Roman Wookey (https://launchpad.net/~rwky/+archive/ubuntu/redis). After the switch to systemd instead of Upstart, Redis was not started by default. So I've hacked the following systemd config file. It has to be placed in /lib/systemd/system/ with the filename redis-server.service. After that, it has to be enabled with  "sudo systemctl enable redis-server". You can check the status by "sudo systemctl status redis-server.service". Maybe this could help you with similar migrating issues. 
27. services - Failed to start Redis Datastore Server (Ubuntu 16.04.1 LTS) - Ask Ubuntu
28. Debian 8.4 jessie systemd issue: service redis-server restart fails · Issue #3165 · antirez/redis
29. cannot install redis-server on ubuntu 18.04 - Stack Overflow
30. redis-server.service: Failed with result 'timeout'. - More errors listed inside - Ask Ubuntu
31. rhel6 - Redis Daemon not creating a PID file - Stack Overflow

修正 Redis 無法啟動的錯誤
32. Redis 3.0.7版本启动时出现警告的解决办法 - 菠萝大数据梦工厂(Free World) - CSDN博客
33. redis overcommit memory (oom) 问题解决«海底苍鹰(tank)博客
34. redis运行后的一些警告 - 常城的专栏 - CSDN博客

測試 Redis
35. PHP 使用 Redis | 菜鸟教程

圖示來源
36. redis-io/redis-logo.svg at master · antirez/redis-io