Для начала конфигурация 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
Настройка представляет собой сервер nginx, выполняющий обратное проксирование сервера на базе Node.js. Поскольку Express довольно медленно обслуживает статические ресурсы, location ~ "^/assets/uploads/(.*)" {
предназначен для перехвата запросов на загрузку ресурсов и их обслуживания непосредственно из nginx.
Пользовательские заголовки нужны только для отладки. Экспресс добавляет 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 не может найти файл в таком большом каталоге, но я не уверен, почему это так и как это исправить. Я уверен, что разделение файлов на более мелкие каталоги сработает, но я действительно не хочу этого делать, потому что эти местоположения файлов уже хранятся в базе данных во многих разных местах.
Убедитесь, что пользователю nginx принадлежат папки, из которых вы обслуживаете.