我正在构建一个基于 Web 的公司目录,其中大约有 450 名员工。使用的数据源是 Microsoft Graph API (Azure AD)。此 API 要求您向每位员工发出请求以接收他们的照片,因为它们是以 JPEG 图像(二进制数据)的形式发送的。
我的应用程序是一个由 ExpressJS 托管的 ReactJS 应用程序,并使用 NGINX 进行反向代理。我希望可以通过使用 NGINX 缓存员工图像来加快图像获取速度。
每个员工的 API 调用是:https://graph.microsoft.com/v1.0/users/${ID}/photo/$value
这是我目前所拥有的,但我对 NGINX 还很陌生,所以我需要一些指导:
我的nginx.conf:
proxy_cache_path /etc/nginx/msgraph levels=1:2 keys_zone=MSGRAPH:10m inactive=48h max_size=1g;
我的/sites-enabled/default:
# The endpoint for the JPEG image requires "$value", this prevents NGINX from expecting a variable.
geo $value {
default "$value";
}
server {
listen 443 ssl default_server;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
server_name <omit_server_name>;
location /team {
# Proxy express server to use the <server_name>/team URL.
proxy_pass http://localhost:5003;
}
location ~* /team/photo/(.*) {
# Use <server_name>/team/photo/<id> as endpoint for fetching Graph API images.
proxy_cache MSGRAPH;
proxy_cache_valid 200 1d;
proxy_cache_lock on;
proxy_buffering on;
# Use below return to confirm URL is being generated correctly:
# return 200 https://graph.microsoft.com/v1.0/users/$1/photo/$value;
proxy_pass https://graph.microsoft.com/v1.0/users/$1/photo/$value;
}
}
尽管存在上述情况,但每次我尝试使用端点获取时,https://<myservername>.com/team/photo/ff036b33-e41f-4a9d-9530-d6fd8ed97b1d
都会出现 502 网关错误。
我的 NGINX 错误日志输出:[error] 1303417#1303417: *34 no resolver defined to resolve graph.microsoft.com, client: 192.168.91.224, server: <myservername>, request: "GET /team/photo/27fbd9bf-a05e-4a26-b019-544135793cdb HTTP/1.1", host: "<myservername>", referrer: "https://<myservername>/team/"
,但是我不确定需要做什么来解决这个问题。
提前致谢!
答案1
对于遇到类似问题的人,我需要添加一个解析器来修复我在日志中看到的错误。之后,没有错误,但我也没有缓存任何内容。我需要向我的位置块添加一些指令,现在看起来像:
location ~* /team/photo/(.*) {
proxy_cache MSGRAPH;
proxy_cache_valid 200 1d;
proxy_cache_lock on;
proxy_buffering on;
resolver 8.8.8.8; # use google dns to handle resolver issue...
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $host;
proxy_ignore-headers Cache-Control; # overwrite API cache control headers
add_header X-Cache $upstream_cache_status; # can see if cache HIT or MISS
proxy_pass https://graph.microsoft.com/v1.0/users/$1/photo/$value;
}