guide反向代理/负载均衡

协作服务器本地可以由您选择的反向代理或负载均衡器提供服务。它需要通过 TLS 协议来确保与服务器的通信安全,并用于处理大规模环境。此外,使用反向代理处理应用程序服务器的流量是一个好习惯。除了在应用程序的多个实例之间分配负载外,它还可以用于使用 WAF 来保护连接或防止 DDOS 攻击。

# 要求

WebSocket 协议处理用户与协作服务器本地之间的大部分通信。所选的反向代理或负载均衡器必须支持 WebSocket 协议。

X-Forwarded-ProtoHost 标头需要从反向代理传递到协作服务器本地。这些标头是处理上传的图像 URL 的生成以及确保管理面板正常工作所必需的。

如果您的反向代理不支持这些标头,您可以使用 APPLICATION_EXTERNAL_ENDPOINT 变量覆盖 外部端点 来修复错误的 URL。

# NGINX

# 基本配置

server {
    listen 80;
    server_name your.domain.name;

    location / {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;

        proxy_pass http://127.0.0.1:8000;
    }
}

# 处理多个实例

upstream ckeditor-cs {
    server ckeditor-cs-1.example.com:8000 weight=1;
    server ckeditor-cs-2.example.com:8000 weight=1;
    server ckeditor-cs-3.example.com:8000 weight=1;
}

server {
    listen 80;
    server_name your.domain.name;

    location / {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;

        proxy_pass http://ckeditor-cs;
    }
}

# 使用 TLS 加密连接

server {
    server_name your.domain.name;

    listen 80;

    return 301 https://$host$request_uri;
}

server {
    server_name your.domain.name;

    listen 443;
    ssl on;
    ssl_certificate /etc/ssl/your_cert.crt;
    ssl_certificate_key /etc/ssl/your_cert_key.key;

    location / {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;

        proxy_pass http://127.0.0.1:8000;
    }
}

# HAProxy

# 基本配置

global
    daemon

defaults
    mode http
    timeout connect 5s
    timeout client 120s
    timeout server 120s

frontend http-in
    bind *:80
    http-request set-header X-Forwarded-Proto http

    default_backend servers

backend servers
    server server1 127.0.0.1:8000 check

# 处理多个实例

global
    daemon

defaults
    mode http
    timeout connect 5s
    timeout client 120s
    timeout server 120s

frontend http-in
    bind *:80
    http-request set-header X-Forwarded-Proto http

    default_backend servers

backend servers
    option httpchk

    server server1 ckeditor-cs-1.example.com:8000 check
    server server2 ckeditor-cs-2.example.com:8000 check
    server server3 ckeditor-cs-3.example.com:8000 check

# 使用 TLS 加密连接

global
    daemon
    tune.ssl.default-dh-param 2048

defaults
    mode http
    timeout connect 5s
    timeout client 120s
    timeout server 120s

frontend http-in
    bind *:80
    bind *:443 ssl crt /etc/ssl/your_certificate.pem
    http-request set-header X-Forwarded-Proto https if { ssl_fc }
    http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
    redirect scheme https if !{ ssl_fc }

    default_backend servers

backend servers
    server server1 127.0.0.1:8000

# Caddy

Caddy 处理自动 TLS 证书和证书续订。此外,它不需要为 WebSocket 连接进行任何额外配置,并且会自动传递所有必需的标头。

# 一行命令

$ caddy reverse-proxy --from your.domain.name --to 127.0.0.1:8000

# 基本配置

your.domain.com {
    reverse_proxy 127.0.0.1:8000
}

# 处理多个实例

your.domain.com {
    reverse_proxy ckeditor-cs-1.example.com:8000 ckeditor-cs-3.example.com:8000 ckeditor-cs-3.example.com:8000
}