mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 06:53:25 +00:00
sharding: Configure Tornado sharding with nginx map.
https://nginx.org/en/docs/http/ngx_http_map_module.html
Since Puppet doesn’t manage the contents of nginx_sharding.conf after
its initial creation, it needs to be renamed so we can give it
different default contents.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
(cherry picked from commit 7666ff603d)
This commit is contained in:
@@ -5,7 +5,7 @@ import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
from typing import Any, Dict
|
||||
from typing import Dict
|
||||
|
||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
sys.path.append(BASE_DIR)
|
||||
@@ -16,17 +16,13 @@ setup_path()
|
||||
from scripts.lib.zulip_tools import get_config_file, get_tornado_ports
|
||||
|
||||
|
||||
def write_realm_nginx_config_line(f: Any, host: str, port: str) -> None:
|
||||
f.write(
|
||||
f"""if ($host = '{host}') {{
|
||||
set $tornado_server http://tornado{port};
|
||||
}}\n"""
|
||||
)
|
||||
def nginx_quote(s: str) -> str:
|
||||
return '"' + s.replace("\\", "\\\\").replace('"', '\\"') + '"'
|
||||
|
||||
|
||||
# Basic system to do Tornado sharding. Writes two output .tmp files that need
|
||||
# to be renamed to the following files to finalize the changes:
|
||||
# * /etc/zulip/nginx_sharding.conf; nginx needs to be reloaded after changing.
|
||||
# * /etc/zulip/nginx_sharding_map.conf; nginx needs to be reloaded after changing.
|
||||
# * /etc/zulip/sharding.json; supervisor Django process needs to be reloaded
|
||||
# after changing. TODO: We can probably make this live-reload by statting the file.
|
||||
#
|
||||
@@ -40,16 +36,19 @@ def write_updated_configs() -> None:
|
||||
sorted(ports) == expected_ports
|
||||
), f"ports ({sorted(ports)}) must be contiguous, starting with 9800"
|
||||
|
||||
with open("/etc/zulip/nginx_sharding.conf.tmp", "w") as nginx_sharding_conf_f, open(
|
||||
with open("/etc/zulip/nginx_sharding_map.conf.tmp", "w") as nginx_sharding_conf_f, open(
|
||||
"/etc/zulip/sharding.json.tmp", "w"
|
||||
) as sharding_json_f:
|
||||
|
||||
if len(ports) == 1:
|
||||
nginx_sharding_conf_f.write("set $tornado_server http://tornado;\n")
|
||||
nginx_sharding_conf_f.write('map "" $tornado_server {\n')
|
||||
nginx_sharding_conf_f.write(" default http://tornado;\n")
|
||||
nginx_sharding_conf_f.write("}\n")
|
||||
sharding_json_f.write("{}\n")
|
||||
return
|
||||
|
||||
nginx_sharding_conf_f.write("set $tornado_server http://tornado9800;\n")
|
||||
nginx_sharding_conf_f.write("map $http_host $tornado_server {\n")
|
||||
nginx_sharding_conf_f.write(" default http://tornado9800;\n")
|
||||
shard_map: Dict[str, int] = {}
|
||||
external_host = subprocess.check_output(
|
||||
[os.path.join(BASE_DIR, "scripts/get-django-setting"), "EXTERNAL_HOST"],
|
||||
@@ -66,8 +65,9 @@ def write_updated_configs() -> None:
|
||||
host = f"{shard}.{external_host}"
|
||||
assert host not in shard_map, f"host {host} duplicated"
|
||||
shard_map[host] = int(port)
|
||||
write_realm_nginx_config_line(nginx_sharding_conf_f, host, port)
|
||||
nginx_sharding_conf_f.write(f" {nginx_quote(host)} http://tornado{port};\n")
|
||||
nginx_sharding_conf_f.write("\n")
|
||||
nginx_sharding_conf_f.write("}\n")
|
||||
|
||||
sharding_json_f.write(json.dumps(shard_map) + "\n")
|
||||
|
||||
@@ -83,7 +83,7 @@ parser.add_argument(
|
||||
options = parser.parse_args()
|
||||
|
||||
config_file_path = "/etc/zulip"
|
||||
base_files = ["nginx_sharding.conf", "sharding.json"]
|
||||
base_files = ["nginx_sharding_map.conf", "sharding.json"]
|
||||
full_real_paths = [f"{config_file_path}/{filename}" for filename in base_files]
|
||||
full_new_paths = [f"{filename}.tmp" for filename in full_real_paths]
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user