首先,nginx 配置:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /example/fullchain.pem;
ssl_certificate_key /example/privkey.pem;
client_max_body_size 5M;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
location @example {
add_header X-Orig-Url $uri;
proxy_pass http://example; # the nodes
}
location ~ "^/assets/uploads/(.*)" {
add_header X-Static-Asset $1 always;
root /usr/share/nginx/html/;
try_files /uploads/$1 @example;
}
location / {
# Offline handling
proxy_pass http://example;
proxy_redirect off;
# Socket.io Support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
以下是目录结构
/usr/share/nginx/html
uploads
system
site-logo.png
~ 100 files
_foo_bar
site-logo.png
~ 86k files
该设置是一个反向代理 Node.js express 驱动服务器的 nginx 服务器。由于 Express 在提供静态资产方面相当慢,因此旨在location ~ "^/assets/uploads/(.*)" {
拦截上传资产的请求并直接从 nginx 提供这些资产。
自定义标头仅用于调试目的。 Express 会X-Powered-By: express
为其处理的请求添加标头。
奇怪的事情就发生在这儿。我将文件site-logo.png
从复制/usr/share/nginx/html/uploads/system
到/usr/share/nginx/html/uploads/_foo_bar
。请求到 会example.com/assets/uploads/system/site-logo.png
显示X-Static-Asset
标题,但不显示X-Powered-By: express
标题。请求到example.com/assets/uploads/_foo_bar/site-logo.png
会显示X-Orig-Url
标题和标题X-Powered-By: express
,但不显示X-Static-Asset
标题。
这告诉我所有请求都被位置块拾取,但是 nginx_foo_bar
由于某种原因无法找到其中的文件。
目录/usr/share/nginx/html/uploads
是 NFS 共享,我不确定这有多大关系。我的假设是 nginx 很难在如此大的目录中找到文件,但我不确定为什么会这样或如何修复它。我确信将文件拆分成较小的目录是可行的,但我真的不想这样做,因为这些文件位置已经存储在数据库中的许多不同位置。
答案1
确保 nginx 用户拥有您提供服务的文件夹。