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;
}