From 9169d999936d310f4eeeac541b45c878afffa922 Mon Sep 17 00:00:00 2001
From: Jelle van der Waa <jelle@archlinux.org>
Date: Tue, 24 Sep 2019 12:39:24 +0200
Subject: [PATCH] archwiki: use memcached for caching

Switch from apcu caching to memcached with 512 MiB so that we have a
sustained cached instead of a php-fpm worker based cache which has a
shorter lifetime of 2000 requests before the worker get's killed and
respawned.
---
 playbooks/apollo.yml                          |  2 +-
 roles/archweb/tasks/main.yml                  |  2 +-
 roles/archwiki/defaults/main.yml              |  1 +
 roles/archwiki/files/20-apcu.ini              |  1 -
 roles/archwiki/tasks/main.yml                 | 10 ++++++---
 roles/archwiki/templates/LocalSettings.php.j2 |  6 ++++++
 .../templates/archwiki-memcached.service.j2   | 21 +++++++++++++++++++
 7 files changed, 37 insertions(+), 6 deletions(-)
 delete mode 100644 roles/archwiki/files/20-apcu.ini
 create mode 100644 roles/archwiki/templates/archwiki-memcached.service.j2

diff --git a/playbooks/apollo.yml b/playbooks/apollo.yml
index 78da26092..132fea00b 100644
--- a/playbooks/apollo.yml
+++ b/playbooks/apollo.yml
@@ -41,7 +41,7 @@
               mariadb_innodb_file_per_table: True, tags: ["mariadb"] }
     - { role: sudo, tags: ['sudo'] }
     - { role: uwsgi, tags: ['uwsgi'] }
-    - { role: php-fpm, php_extensions: ['apcu', 'bcmath', 'curl', 'gd', 'iconv', 'intl', 'mysqli', 'pdo_pgsql', 'pgsql', 'sockets', 'zip'], zend_extensions: ['opcache'], tags: ["php-fpm"] }
+    - { role: php-fpm, php_extensions: ['bcmath', 'curl', 'gd', 'iconv', 'intl', 'mysqli', 'pdo_pgsql', 'pgsql', 'sockets', 'zip'], zend_extensions: ['opcache'], tags: ["php-fpm"] }
     - { role: memcached, tags: ['memcached'] }
     - { role: archweb, tags: ["archweb"] }
     - { role: security_tracker, security_tracker_domain: "security.archlinux.org", security_tracker_dir: "/srv/http/security-tracker", tags: ["security_tracker"] }
diff --git a/roles/archweb/tasks/main.yml b/roles/archweb/tasks/main.yml
index d6a0d150d..32c97e48c 100644
--- a/roles/archweb/tasks/main.yml
+++ b/roles/archweb/tasks/main.yml
@@ -168,7 +168,7 @@
   when: archweb_services or archweb_pgp_import
 
 - name: install archweb memcached service
-  template: src="archweb-memcached.service.j2" dest="/etc/systemd/system/archweb-memcached.service" owner=root group=root mode=0644
+  template: src="archweb-memcached.service.j2" dest="/etc/systemd/system/archwiki-memcached.service" owner=root group=root mode=0644
   notify:
     - daemon reload
   when: archweb_site|bool
diff --git a/roles/archwiki/defaults/main.yml b/roles/archwiki/defaults/main.yml
index 3cb118d1a..64ce712e2 100644
--- a/roles/archwiki/defaults/main.yml
+++ b/roles/archwiki/defaults/main.yml
@@ -7,6 +7,7 @@ archwiki_version: 'b8e35046ae4bb5e7a7bddf7f0f0f2f79f327f162'
 archwiki_question_answer_file: '/srv/http/archwiki/registration-question-answer.txt'
 
 archwiki_socket: '/run/php-fpm/archwiki.socket'
+archwiki_memcached_socket: '/run/memcached/archwiki.sock'
 
 archwiki_db: 'archwiki'
 archwiki_db_host: 'localhost'
diff --git a/roles/archwiki/files/20-apcu.ini b/roles/archwiki/files/20-apcu.ini
deleted file mode 100644
index aebbd51d0..000000000
--- a/roles/archwiki/files/20-apcu.ini
+++ /dev/null
@@ -1 +0,0 @@
-apc.shm_size = 512M
diff --git a/roles/archwiki/tasks/main.yml b/roles/archwiki/tasks/main.yml
index 47e361cc7..c5fe82715 100644
--- a/roles/archwiki/tasks/main.yml
+++ b/roles/archwiki/tasks/main.yml
@@ -5,7 +5,7 @@
   when: 'archwiki_domain is defined'
 
 - name: install packages
-  pacman: name=git,php-intl,php-apcu state=present
+  pacman: name=git,php-intl state=present
 
 - name: make archwiki user
   user: name="{{ archwiki_user }}" shell=/bin/false home="{{ archwiki_dir }}" createhome=no
@@ -70,8 +70,8 @@
   notify:
     - restart php-fpm@{{ archwiki_user }}
 
-- name: set php-apcu value
-  copy: src=20-apcu.ini dest=/etc/php/conf.d/20-apcu.ini
+- name: install archwiki memcached service
+  template: src="archwiki-memcached.service.j2" dest="/etc/systemd/system/archwiki-memcached.service" owner=root group=root mode=0644
 
 - name: start and enable systemd socket
   service: name=php-fpm@{{ archwiki_user }}.socket state=started enabled=true
@@ -87,6 +87,7 @@
     - archwiki-prune-cache.service
     - archwiki-prune-cache.timer
     - archwiki-question-updater.service
+    - archwiki-memcached.service
 
 - name: start and enable archwiki runjobs timer
   service: name="archwiki-runjobs.timer" enabled=yes state=started
@@ -100,5 +101,8 @@
 - name: create question answer file
   service: name=archwiki-question-updater.service state=started
 
+- name: start and enable archwiki memcached
+  service: name=archwiki-memcached.service state=started
+
 - name: ensure question answer file exists and set permissions
   file: state=file path="{{archwiki_question_answer_file}}" owner=root group=root mode=0644
diff --git a/roles/archwiki/templates/LocalSettings.php.j2 b/roles/archwiki/templates/LocalSettings.php.j2
index 4ccb1d611..c7080e87f 100644
--- a/roles/archwiki/templates/LocalSettings.php.j2
+++ b/roles/archwiki/templates/LocalSettings.php.j2
@@ -51,3 +51,9 @@ $wgDebugLogFile = "/dev/null";
 $wgDebugLogGroups = array(
 	'BounceHandler' => '/var/log/archwiki/bouncehandler.log',
 	);
+
+# memcached settings
+$wgMainCacheType = CACHE_MEMCACHED;
+$wgParserCacheType = CACHE_MEMCACHED;
+$wgMessageCacheType = CACHE_MEMCACHED;
+$wgMemCachedServers = [ "unix://{{ archwiki_memcached_socket }}:0" ];
diff --git a/roles/archwiki/templates/archwiki-memcached.service.j2 b/roles/archwiki/templates/archwiki-memcached.service.j2
new file mode 100644
index 000000000..975825612
--- /dev/null
+++ b/roles/archwiki/templates/archwiki-memcached.service.j2
@@ -0,0 +1,21 @@
+[Unit]
+Description=Archwiki Memcached Daemon
+After=network.target
+
+[Service]
+User={{ archwiki_user }}
+Group=memcached
+ExecStart=/usr/bin/memcached -s {{ archwiki_memcached_socket }} -m 512 -o modern
+Restart=always
+NoNewPrivileges=yes
+PrivateTmp=yes
+ProtectHome=true
+PrivateDevices=yes
+ProtectSystem=full
+ProtectKernelTunables=true
+ProtectKernelModules=true
+ProtectControlGroups=true
+MemoryDenyWriteExecute=yes
+
+[Install]
+WantedBy=multi-user.target
-- 
GitLab