{"type":"rich","html":"<div style=\"width: 640; height: 426; font-family: sans-serif,arial,freesans;\" ><div id=\"shared_container_1565306305\" class=\"shared_container\"><div id=\"shared_header_1565306305\" class=\"shared_header\"><a href=\"https:\/\/hub.netzgemeinde.eu\/channel\/buckaroo\"><img src=\"https:\/\/hub.netzgemeinde.eu\/photo\/profile\/s\/2\" alt=\"Mark Nowiasz\" height=\"32\" width=\"32\" loading=\"lazy\" \/><\/a><span><a href=\"https:\/\/hub.netzgemeinde.eu\/channel\/buckaroo\">Mark Nowiasz<\/a>  wrote the following  <a href=\"https:\/\/hub.netzgemeinde.eu\/articles\/buckaroo\/synapseworkers\">Artikel <\/a><span class=\"autotime\" title=\"2019-12-13T09:14:11+01:00\">Fri, 13 Dec 2019 09:14:11 +0100<\/span><\/span><\/div><div id=\"reshared-content-1565306305\" class=\"reshared-content\"><strong>Boosting matrix\/synapse by using workers<\/strong><br \/>I've been running a <a href=\"https:\/\/github.com\/matrix-org\/synapse\/\" target=\"_blank\" rel=\"nofollow noopener\">synapse homeserver<\/a> for nearly a year and it works just fine, but there's one bottleneck: Python's single-threadedness. It only utilizes one core, the other are mostly idling (or used for the database). Recently I've learned that there's a solution for that (although currently considered to be experimental): <a href=\"https:\/\/github.com\/matrix-org\/synapse\/blob\/master\/docs\/workers.md\" target=\"_blank\" rel=\"nofollow noopener\">Workers<\/a>. By splitting synapse into a collection of processes which perform different tasks it's possbile to utilize all the cores of the CPU - even running the workers on different machines, loadbalancing the task, whatever. There are two catches, though:<br \/><ul class=\"listbullet\"><li> The setup becomes more complex. This is rather normal when you make a setup more scalable<li> Since every worker is basically a synapse instance dedicated to a different task, the setup will consume more memory<\/ul><br \/>There's a (incomplete) documentation about this: <span class=\"bookmark-identifier\">#^<\/span><a class=\"bookmark\" href=\"https:\/\/github.com\/matrix-org\/synapse\/blob\/master\/docs\/workers.md\" target=\"_blank\" rel=\"nofollow noopener\">https:\/\/github.com\/matrix-org\/synapse\/blob\/master\/docs\/workers.md<\/a> . However, there a few pitfalls to avoid, therefore I'll publish my configuration.<br \/><br \/><h2>homeserver.yaml<\/h2>As stated in documentation, there need to be some changes in the main homeserver.yaml. You need to add two listeners:<br \/><pre><code># The TCP replication port<br \/>&nbsp;&nbsp;<br \/>&nbsp;&nbsp;- port: 9092<br \/>&nbsp;&nbsp;&nbsp;&nbsp;bind_addresses: ['::1', '127.0.0.1']<br \/>&nbsp;&nbsp;&nbsp;&nbsp;type: replication<br \/>&nbsp;&nbsp;<br \/>&nbsp;&nbsp;# The HTTP replication port<br \/><br \/>&nbsp;&nbsp;- port: 9093<br \/>&nbsp;&nbsp;&nbsp;&nbsp;bind_addresses: ['::1', '127.0.0.1']<br \/>&nbsp;&nbsp;&nbsp;&nbsp;type: http<br \/>&nbsp;&nbsp;&nbsp;&nbsp;resources:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - names: [replication]<\/code><\/pre>And add some configuration items (if you want to have all workers running, that is)<br \/><pre><code># Workers<br \/><br \/>start_pushers: False<br \/>notify_appservices: False <br \/>send_federation: False<br \/>enable_media_repo: False<br \/>update_user_directory: False<br \/>use_presence: False<\/code><\/pre><br \/><h2>Workers<\/h2>I've put the worker's yamls in a subdirectory called <code class=\"inline-code\">workers<\/code>:<br \/><br \/><h3>homeserver.yaml<\/h3><pre><code>worker_app: synapse.app.homeserver<br \/>daemonize: true<\/code><\/pre><h3>appservice.yaml<\/h3><pre><code>worker_app: synapse.app.appservice<br \/><br \/># The replication listener on the synapse to talk to.<br \/>worker_replication_host: 127.0.0.1<br \/>worker_replication_port: 9092<br \/>worker_replication_http_port: 9093<br \/><br \/>worker_daemonize: True<br \/>worker_pid_file: \/home\/matrix\/synapse\/appservice.pid<br \/>worker_log_config: \/home\/matrix\/synapse\/workers_log_config.yml<\/code><\/pre><br \/><h3>client_reader.yaml<\/h3><pre><code>worker_app: synapse.app.client_reader<br \/><br \/># The replication listener on the synapse to talk to.<br \/>worker_replication_host: 127.0.0.1<br \/>worker_replication_port: 9092<br \/>worker_replication_http_port: 9093<br \/><br \/>worker_listeners:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;- type: http<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_addresses: ['::1', '127.0.0.1']<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port: 8086<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resources:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- names:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- client<br \/><br \/>worker_daemonize: True<br \/>worker_pid_file: \/home\/matrix\/synapse\/client_reader.pid<br \/>worker_log_config: \/home\/matrix\/synapse\/workers_log_config.yml<\/code><\/pre><h3>event_creator.yaml<\/h3><pre><code>worker_app: synapse.app.event_creator<br \/><br \/># The replication listener on the synapse to talk to.<br \/>worker_replication_host: 127.0.0.1<br \/>worker_replication_port: 9092<br \/>worker_replication_http_port: 9093<br \/><br \/>worker_listeners:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;- type: http<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_addresses: ['::1', '127.0.0.1']<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port: 8089<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resources:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- names:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- client<br \/><br \/>worker_daemonize: True<br \/>worker_pid_file: \/home\/matrix\/synapse\/event_creator.pid<br \/>worker_log_config: \/home\/matrix\/synapse\/workers_log_config.yml<\/code><\/pre><h3>federation_reader.yaml<\/h3><pre><code>worker_app: synapse.app.federation_reader<br \/><br \/># The replication listener on the synapse to talk to.<br \/>worker_replication_host: 127.0.0.1<br \/>worker_replication_port: 9092<br \/>worker_replication_http_port: 9093<br \/><br \/>worker_listeners:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;- type: http<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_addresses: ['::1', '127.0.0.1']<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port: 8084<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resources:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- names:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- federation<br \/><br \/>worker_daemonize: True<br \/>worker_pid_file: \/home\/matrix\/synapse\/federation_reader.pid<br \/>worker_log_config: \/home\/matrix\/synapse\/workers_log_config.yml<\/code><\/pre><h3>federation_reader.yaml<\/h3><pre><code>worker_app: synapse.app.federation_reader<br \/><br \/># The replication listener on the synapse to talk to.<br \/>worker_replication_host: 127.0.0.1<br \/>worker_replication_port: 9092<br \/>worker_replication_http_port: 9093<br \/><br \/>worker_listeners:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;- type: http<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_addresses: ['::1', '127.0.0.1']<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port: 8084<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resources:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- names:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- federation<br \/><br \/>worker_daemonize: True<br \/>worker_pid_file: \/home\/matrix\/synapse\/federation_reader.pid<br \/>worker_log_config: \/home\/matrix\/synapse\/workers_log_config.yml<\/code><\/pre><h3>federation_sender.yaml<\/h3><pre><code>worker_app: synapse.app.federation_sender<br \/><br \/># The replication listener on the synapse to talk to.<br \/>worker_replication_host: 127.0.0.1<br \/>worker_replication_port: 9092<br \/>worker_replication_http_port: 9093<br \/><br \/>worker_daemonize: True<br \/>worker_pid_file: \/home\/matrix\/synapse\/federation_sender.pid<br \/>worker_log_config: \/home\/matrix\/synapse\/workers_log_config.yml<\/code><\/pre><h3>frontend_proxy.yaml<\/h3><pre><code>worker_app: synapse.app.frontend_proxy<br \/><br \/># The replication listener on the synapse to talk to.<br \/>worker_replication_host: 127.0.0.1<br \/>worker_replication_port: 9092<br \/>worker_replication_http_port: 9093<br \/>worker_main_http_uri: http:\/\/127.0.0.1:8008<br \/><br \/>worker_listeners:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;- type: http<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_addresses: ['::1', '127.0.0.1']<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port: 8088<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resources:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- names:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- client<br \/><br \/>worker_daemonize: True<br \/>worker_pid_file: \/home\/matrix\/synapse\/frontend_proxy.pid<br \/>worker_log_config: \/home\/matrix\/synapse\/workers_log_config.yml<\/code><\/pre><h3>frontend_proxy.yaml<\/h3><pre><code>worker_app: synapse.app.frontend_proxy<br \/><br \/># The replication listener on the synapse to talk to.<br \/>worker_replication_host: 127.0.0.1<br \/>worker_replication_port: 9092<br \/>worker_replication_http_port: 9093<br \/>worker_main_http_uri: http:\/\/127.0.0.1:8008<br \/><br \/>worker_listeners:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;- type: http<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_addresses: ['::1', '127.0.0.1']<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port: 8088<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resources:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- names:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- client<br \/><br \/>worker_daemonize: True<br \/>worker_pid_file: \/home\/matrix\/synapse\/frontend_proxy.pid<br \/>worker_log_config: \/home\/matrix\/synapse\/workers_log_config.yml<\/code><\/pre><h3>media_repository.yaml<\/h3><pre><code>worker_app: synapse.app.media_repository<br \/><br \/># The replication listener on the synapse to talk to.<br \/>worker_replication_host: 127.0.0.1<br \/>worker_replication_port: 9092<br \/>worker_replication_http_port: 9093<br \/><br \/>worker_listeners:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;- type: http<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_addresses: ['::1', '127.0.0.1']<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port: 8085<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resources:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - names: [media]<br \/><br \/><br \/>worker_daemonize: True<br \/>worker_pid_file: \/home\/matrix\/synapse\/media_repository.pid<br \/>worker_log_config: \/home\/matrix\/synapse\/workers_log_config.yml<\/code><\/pre><h3>pusher.yaml<\/h3><pre><code>worker_app: synapse.app.pusher<br \/><br \/># The replication listener on the synapse to talk to.<br \/>worker_replication_host: 127.0.0.1<br \/>worker_replication_port: 9092<br \/>worker_replication_http_port: 9093<br \/><br \/>worker_daemonize: True<br \/>worker_pid_file: \/home\/matrix\/synapse\/pusher.pid<br \/>worker_log_config: \/home\/matrix\/synapse\/workers_log_config.yml<\/code><\/pre><h3>synchrotron.yaml<\/h3><pre><code>worker_app: synapse.app.synchrotron<br \/><br \/># The replication listener on the synapse to talk to.<br \/>worker_replication_host: 127.0.0.1<br \/>worker_replication_port: 9092<br \/>worker_replication_http_port: 9093<br \/><br \/>worker_listeners:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;- type: http<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_addresses: ['::1', '127.0.0.1']<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port: 8083<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resources:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- names:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- client<br \/><br \/>worker_daemonize: True<br \/>worker_pid_file: \/home\/matrix\/synapse\/synchrotron.pid<br \/>worker_log_config: \/home\/matrix\/synapse\/workers_log_config.yml<\/code><\/pre><h3>user_dir<\/h3><pre><code>worker_app: synapse.app.user_dir<br \/><br \/># The replication listener on the synapse to talk to.<br \/>worker_replication_host: 127.0.0.1<br \/>worker_replication_port: 9092<br \/>worker_replication_http_port: 9093<br \/><br \/>worker_listeners:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;- type: http<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_addresses: ['::1', '127.0.0.1']<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port: 8087<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resources:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- names:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- client<br \/><br \/>worker_daemonize: True<br \/>worker_pid_file: \/home\/matrix\/synapse\/user_dir.pid<br \/>worker_log_config: \/home\/matrix\/synapse\/workers_log_config.yml<\/code><\/pre><br \/>I'm using a shared log config for all the workers (<code class=\"inline-code\">workers_log_config.yaml<\/code>) in the main directory, basically it's just a copy of the main logging config:<br \/><pre><code>version: 1<br \/><br \/>formatters:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;precise:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s'<br \/><br \/>filters:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;context:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(): synapse.util.logcontext.LoggingContextFilter<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request: &quot;&quot;<br \/><br \/>handlers:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;file:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class: logging.handlers.RotatingFileHandler<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formatter: precise<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filename: \/home\/matrix\/synapse\/workers.log<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxBytes: 104857600<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backupCount: 10<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filters: [context]<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoding: utf8<br \/>&nbsp;&nbsp;&nbsp;&nbsp;console:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class: logging.StreamHandler<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formatter: precise<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filters: [context]<br \/><br \/>loggers:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;synapse:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level: ERROR<br \/><br \/>&nbsp;&nbsp;&nbsp;&nbsp;synapse.storage.SQL:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# beware: increasing this to DEBUG will make synapse log sensitive<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# information such as access tokens.<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level: INFO<br \/><br \/>root:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;level: ERROR<br \/>&nbsp;&nbsp;&nbsp;&nbsp;handlers: [file, console]<\/code><\/pre><h2>Reverse Proxy Settings<\/h2>I'm using apache2 as a reverse proxy for synapse. Here are my <code class=\"inline-code\">ProxyPass\/ProxyPassMatch<\/code> configurations. I've put them in a single include file, so I can include them in both vhosts (443 and 884) - <code class=\"inline-code\">Include \/etc\/apache2\/vhosts.d\/proxystatements.include<\/code> - , so both synapse ports will benefit from the workers. I've merged - when possible - some of the regexps in the documentation into single ones:<br \/><h3>proxystatements.include<\/h3><pre><code>####### Workers #################################<br \/><br \/>#synapse.app.synchrotron<br \/>ProxyPassMatch ^\/_matrix\/client\/(v1_alpha|r0)\/sync$ http:\/\/127.0.0.1:8083 nocanon<br \/>ProxyPassMatch ^\/_matrix\/client\/(api\/v1|v2_alpha|r0)\/events$ http:\/\/127.0.0.1:8083 nocanon<br \/>ProxyPassMatch ^\/_matrix\/client\/(api\/v1|r0)\/initialSync$ http:\/\/127.0.0.1:8083 nocanon<br \/>ProxyPassMatch ^\/_matrix\/client\/(api\/v1|r0)\/rooms\/[^\/]+\/initialSync$ http:\/\/127.0.0.1:8083 nocanon<br \/><br \/>#synapse.app.federation_reader<br \/>ProxyPassMatch ^\/_matrix\/federation\/v1\/(event\/|state\/|state_ids\/|backfill\/|get_missing_events\/|publicRooms|query\/|make_join\/|make_leave\/|send_join\/|send_leave\/|invite\/|query_auth\/|event_auth\/|exchange_third_party_invite\/|send\/) http:\/\/127.0.0.1:8084 nocanon<br \/>ProxyPassMatch ^\/_matrix\/key\/v2\/query http:\/\/127.0.0.1:8084 nocanon<br \/><br \/>#synapse.app.media_repository<br \/>ProxyPass \/_matrix\/media\/ http:\/\/127.0.0.1:8085\/_matrix\/media\/ nocanon<br \/><br \/>#synapse.app.client_reader<br \/>ProxyPassMatch ^\/_matrix\/client\/(api\/v1|r0|unstable)\/(publicRooms|rooms\/(.*\/joined_members|.*\/context\/.*|.*\/members|.*\/state)|login|account\/3pid|keys\/(query|changes)|voip\/turnServer|pushrules\/.*|register|.*\/messages)$&nbsp;&nbsp;http:\/\/127.0.0.1:8086 nocanon<br \/>ProxyPassMatch ^\/_matrix\/client\/versions$&nbsp;&nbsp;http:\/\/127.0.0.1:8086 nocanon<br \/><br \/>#synapse.app.user_dir<br \/>ProxyPassMatch ^\/_matrix\/client\/(api\/v1|r0|unstable)\/user_directory\/search$ http:\/\/127.0.0.1:8087 nocanon<br \/><br \/>#synapse.app.frontend_proxy<br \/>ProxyPassMatch ^\/_matrix\/client\/(api\/v1|r0|unstable)\/(keys\/upload|presence\/[^\/]+\/status) http:\/\/127.0.0.1:8088 nocanon<br \/><br \/>#synapse.app.event_creator<br \/>ProxyPassMatch ^^\/_matrix\/client\/(api\/v1|r0|unstable)\/rooms\/.*\/send http:\/\/127.0.0.1:8089 nocanon<br \/>ProxyPassMatch ^^\/_matrix\/client\/(api\/v1|r0|unstable)\/rooms\/.*\/(join|invite|leave|ban|unban|kick)$ http:\/\/127.0.0.1:8089 nocanon<br \/>ProxyPassMatch ^^\/_matrix\/client\/(api\/v1|r0|unstable)\/(join|profile)\/ http:\/\/127.0.0.1:8089 nocanon<br \/><br \/>#Everything eles to the main process<br \/>ProxyPass \/_matrix http:\/\/127.0.0.1:8008\/_matrix nocanon<br \/>ProxyPassReverse \/_matrix http:\/\/127.0.0.1:8008\/_matrix<\/code><\/pre><h2>Things to consider<\/h2>As the documentation states, you have to start\/restart\/stop the whole setup now by using <code class=\"inline-code\">synctl -a .\/workers (start|stop..)<\/code> instead of synctl.<\/div><\/div><br \/><\/div>","width":640,"height":426}