文档部署

Rust · 0.1.0

反向代理与 TLS

通过公开域名访问应用,后端端口保持在受保护网络中。

域名与请求转发

在你选择的代理中终止 TLS,并把应用请求路径转发到私有监听端口。将 MEMOS_INSTANCE_URL 设置为外部访问地址,例如 https://notes.example.com。后端端口不要直接暴露公网。代理应保留主机名及转发协议,并允许流式响应和所需大小的授权上传。

只信任自己的代理

MEMOS_TRUSTED_PROXIES 控制哪些上游节点可提供客户端地址信息,默认信任私有网络。条件允许时应限定为实际代理网络,并确认不受信任的客户端不能伪造转发地址。限流依赖正确的客户端身份。代理缓冲事件流或过早关闭空闲连接时,即使普通页面正常,实时更新也可能受影响。

从外部验证

通过代理验证外部健康检查、登录和退出、附件上传下载,以及事件流。在浏览器中检查 TLS 与 Cookie 行为。可参考故障排查区分代理和应用问题。

同机原生后端的 Nginx 示例

前提:域名已指向主机,Nginx 已安装,证书和私钥已签发,原生 Memos 进程仅通过 127.0.0.1:5230 可达。为应用设置 MEMOS_INSTANCE_URL=https://notes.example.com 与 MEMOS_TRUSTED_PROXIES=127.0.0.1/32,并替换下面的域名及证书路径。此例假设 Nginx 直接运行在主机上;代理位于容器中或后端使用 Docker 端口发布时,桥接/NAT 可能改变 Memos 看到的节点,应使用实际可达后端与观察到的代理网段,不要照抄 127.0.0.1/32。示例不会自动签发证书。

server {
    listen 80;
    server_name notes.example.com;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    server_name notes.example.com;
    ssl_certificate /etc/ssl/memos/fullchain.pem;
    ssl_certificate_key /etc/ssl/memos/privkey.pem;
    client_max_body_size 50m;

    location / {
        proxy_pass http://127.0.0.1:5230;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_buffering off;
        proxy_read_timeout 300s;
        proxy_cache off;
    }
}

放行流量前验证

把 server 配置放进当前 Nginx 安装实际使用的 include 目录,先运行 nginx -t,再重载对应服务。此单层代理示例会覆盖来自互联网客户端的不可信转发地址。50 MiB 只是示例传输上限,不会修改应用的附件大小设置。调整缓冲与超时前参考 Nginx 代理指令。

nginx -t
curl --fail --show-error http://127.0.0.1:5230/healthz
curl --fail --show-error https://notes.example.com/healthz

解释验证结果

直连检查失败时先修应用监听;只有 HTTPS 失败时检查 DNS、证书有效性、代理到后端的连接及 Nginx 日志。413 表示请求超过某层大小限制,只调整其中一层未必有效;502/504 通常需要检查后端连接或超时。最后用普通账号在浏览器验证登录、上传下载和实时更新,不要通过关闭证书验证让检查表面通过。