Nginx#

PostgREST是构建REST风格的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 您可以将其添加到配置文件中 /etc/nginx/sites-enabled/default

HTTPS#

PostgREST的目标是做好一件事:向PostgreSQL数据库添加一个HTTP接口。为了使代码更小、更集中,我们没有实现HTTPS。使用诸如Nginx的反向代理来添加这一点, here's how

速率限制#

Nginx支持“漏桶”速率限制(请参阅 official docs )。使用标准的Nginx配置,路由可以分组为 request zones 用于速率限制。例如,我们可以为登录尝试定义一个区域:

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

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

接下来,我们将该区域应用于某些路线,比如一个名为 login

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

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

Nginx的速率限制是普遍的和不分青红皂白的。要单独对每个经过身份验证的请求进行速率限制,您需要在 Custom Validation 功能。

备用URL结构#

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

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;

}