我的服务器在 nginx 后面运行一个 docker 容器。这个容器的大多数 API 端点需要保持对任何人都可用(尽管我可能会在以后考虑限制它们的速率),但需要限制两个端点。我当前的配置似乎按预期运行,如下所示:
server {
listen 80;
server_name sub.domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name sub.domain.com;
ssl_certificate /etc/letsencrypt/live/sub.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sub.domain.com/privkey.pem;
location / {
location = /api_endpoint {
if ($remote_addr != xxx.xxx.xxx.xxx) {
return 403; # Forbidden
}
proxy_pass http://localhost:8000;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
}
location = /another/api_endpoint {
if ($remote_addr != xxx.xxx.xxx.xxx) {
return 403; # Forbidden
}
proxy_pass http://localhost:8000;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
}
proxy_pass http://localhost:8000;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
}
}
我不喜欢在不知道具体发生了什么的情况下复制粘贴代码。每一段代码:
proxy_pass http://localhost:8000;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
是从另一组文档中复制而来,与此 docker 容器无关。因为这些文档列出了该项目的工作配置,所以我信任它,但现在我正在调整它,我有点好奇,并仔细阅读了这一页寻求解释。但如果有人对修剪这些块有任何反馈,我都愿意倾听。
我的主要问题是,我真正想知道的是,这种方法是否可行,或者是否有更好的方法来实现将 API 端点限制到发出这些请求的特定主机的相同目标?
除了主要问题外,还有另外两个次要问题:
xxx.xxx.xxx.xxx
我第一次尝试时xxx.domain.com
没有成功。nginx 不为此解析 DNS 名称吗?- 对于我的用例来说,将这两个端点限制到一个远程主机就足够了,但是我看到允许多个主机会很有用的情况。像这样是我能找到的最接近的办法,但我还是想听听其他选择。
非常感谢您的阅读!
答案1
http://nginx.org/en/docs/http/ngx_http_access_module.html#allowif
是阻止/允许 IP 地址的首选方法。由于其工作方式不直观,因此最好不惜一切代价避免使用这种方法。