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