Nginx

PostgREST 是一种构建 RESTful API 的快速方法。它的默认行为非常适合在开发中进行脚手架。当需要投入生产时,它也同样出色,只要你采取预防措施。PostgREST 是一款小巧而锋利的工具,专注于执行 API 到数据库的映射。我们依赖于像 Nginx 这样的反向代理来提供额外的安全保障。

第一步是创建一个 Nginx 配置文件,该文件将请求代理到底层的 PostgREST 服务器。

http {
  # ...
  # upstream configuration
  upstream postgrest {
    server localhost:3000;
  }
  # ...
  server {
    # ...
    # expose to the outside world
    location /api/ {
      default_type  application/json;
      proxy_hide_header Content-Location;
      add_header Content-Location  /api/$upstream_http_content_location;
      proxy_set_header  Connection "";
      proxy_http_version 1.1;
      proxy_pass http://postgrest/;
    }
    # ...
  }
}

注意

对于 ubuntu,如果你已经通过 apt 安装了 nginx,你可以在 /etc/nginx/sites-enabled/default 中的配置文件中添加以下内容。

HTTPS

PostgREST 的目标是做好一件事:为 PostgreSQL 数据库添加 HTTP 接口。为了保持代码精简和专注,我们没有实现 HTTPS。使用像 NGINX 这样的反向代理来添加它,方法如下.

速率限制

Nginx 支持“漏桶”速率限制(参见 官方文档)。使用标准 Nginx 配置,路由可以分组到请求区域以进行速率限制。例如,我们可以为登录尝试定义一个区域

limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;

这将创建一个名为“login”的共享内存区域,用于存储访问速率限制 URL 的 IP 地址日志。保留的空间,10 MB (10m) 将为我们提供足够的空间来存储 160k 个请求的历史记录。我们选择只允许每秒一个请求 (1r/s)。

接下来,我们将该区域应用于某些路由,例如一个名为 login 的假设函数。

location /rpc/login/ {
  # apply rate limiting
  limit_req zone=login burst=5;
}

burst 参数告诉 Nginx 如果来自特定 IP 的请求排队超过五个,就开始丢弃请求。

Nginx 速率限制是通用且不加区别的。要对每个经过身份验证的请求单独进行速率限制,您需要在 自定义验证 函数中添加逻辑。

备用 URL 结构

单数或复数 中所述,PostgREST 中没有用于单数资源的特殊 URL 形式,只有用于过滤的运算符。因此,没有像 /people/1 这样的 URL。它将改为指定为

curl "http://localhost:3000/people?id=eq.1" \
  -H "Accept: application/vnd.pgrst.object+json"

这允许复合主键,并使单数响应的意图独立于 URL 约定。

Nginx 重写规则允许您模拟熟悉的 URL 约定。以下示例为所有表端点添加了一个重写规则,但您需要将其限制为那些具有名为“id”的数字简单主键的表。

# support /endpoint/:id url style
location ~ ^/([a-z_]+)/([0-9]+) {

  # make the response singular
  proxy_set_header Accept 'application/vnd.pgrst.object+json';

  # assuming an upstream named "postgrest"
  proxy_pass http://postgrest/$1?id=eq.$2;

}