diff --git a/roles/noblogs/tasks/main.yml b/roles/noblogs/tasks/main.yml
index ef2d9089db8a1de3f18c55acb00f2b3b41005600..e34e6cbe80648403cf207e5df99305c7fb097336 100644
--- a/roles/noblogs/tasks/main.yml
+++ b/roles/noblogs/tasks/main.yml
@@ -8,10 +8,13 @@
 
 - name: Install noblogs config
   template:
-    src: config.json.j2
-    dest: /etc/noblogs/config.json
+    src: "{{ item }}.j2"
+    dest: "/etc/noblogs/{{ item }}"
     group: docker-noblogs
     mode: 0640
+  loop:
+    - config.json
+    - 99-noblogs.ini
 
 - name: Create noblogs data directory
   file:
diff --git a/roles/noblogs/templates/99-noblogs.ini.j2 b/roles/noblogs/templates/99-noblogs.ini.j2
new file mode 100644
index 0000000000000000000000000000000000000000..e5d7344c3f6d4c23c00b27cfe316b97bbbdabad2
--- /dev/null
+++ b/roles/noblogs/templates/99-noblogs.ini.j2
@@ -0,0 +1,21 @@
+[PHP]
+; Set generous memory limits.
+memory_limit = 256M
+
+; Set upload size limits.
+upload_max_filesize = 50M
+post_max_size = 50M
+
+; Configure the session layer to use all our memcache-session
+; instances, with consistent hashing. We use two copies to allow us to
+; restart a memcache instance without killing all sessions.
+session.cookie_secure = 1
+session.cookie_httponly = 1
+session.save_handler = memcached
+session.save_path = "{% set comma = joiner(',') %}{% for h in services['noblogs'].hosts %}{{ comma() }}{{ h }}.noblogs.{{ domain }}:7208{% endfor %}"
+memcached.sess_consistent_hash = 1
+memcached.sess_binary = 1
+memcached.sess_number_of_replicas = {{ [services['noblogs'].hosts | length, 2] | min }}
+
+; Enable the PHP opcache.
+opcache.enable = 1
diff --git a/services.noblogs.yml b/services.noblogs.yml
index 73d4f146bd6df4385149d9f2929a29ad335d1415..b513343112e6d5c76ce552679dad35112d1eb79a 100644
--- a/services.noblogs.yml
+++ b/services.noblogs.yml
@@ -9,6 +9,7 @@ noblogs:
       port: 8082
       volumes:
         - /etc/noblogs: /etc/noblogs
+        - /etc/noblogs/99-noblogs.ini: /etc/php/7.4/fpm/conf.d/99-nooblogs.ini
         - /opt/noblogs/data: /opt/noblogs/www/wp-content/blogs.dir
         - /opt/noblogs/cache: /opt/noblogs/www/wp-content/cache
         - /opt/noblogs/uploads: /opt/noblogs/www/wp-content/uploads
@@ -27,6 +28,14 @@ noblogs:
       env:
         MEM: 1024
         PORT: 7108
+    - name: memcache-sessions
+      image: registry.git.autistici.org/ai3/docker/memcached:master
+      ports:
+        - 7208
+        - 7209
+      env:
+        MEM: 128
+        PORT: 7208
     - name: poster
       image: registry.git.autistici.org/noblogs/noblogs-poster:master
       port: 7107