首先,nginxconfiguration:
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
该设置是一个nginx服务器反向代理一个Node.js快递服务器。 由于Express在提供静态资产方面速度相当慢, location ~ "^/assets/uploads/(.*)" {是为了拦截请求来上传资源并直接从nginx提供服务。
自定义标题仅用于debugging目的。 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_barfind这些文件。
/usr/share/nginx/html/uploads是一个NFS共享,我不确定这是多么相关。 我的假设是,nginx无法find这个文件是一个如此大的目录,但我不知道为什么这将是或如何解决它。 我确信把文件分割成更小的目录是可行的,但是我真的不想这样做,因为这些文件位置已经存储在数据库的许多不同的位置。
确保nginx用户拥有你所服务的文件夹。