Использование NGINX для обслуживания изображений с нескольких серверов хранения

Я работаю над проектом, похожим на Imgur, но только для клиентов. Я использую NGINX в качестве своего веб-сервера и PHP-FPM / MYSQL для обработки всего остального. Одна из лежачих полицейских, с которой я в конечном итоге столкнусь, - это нехватка места на сервере. Я хотел бы иметь возможность добавлять больше серверов хранения по мере необходимости. Хотя я понимаю, что облачное хранилище может быть лучшим путем для этого, в моем случае это не вариант на данный момент.

Итак, позвольте сказать, что у меня есть 3 сервера хранения, на всех запущенных NGINX, мы назовем их storage1, storage2 и storage3. Если я обслуживаю запросы из домена, такого как i.myimagehost.com, мне нужно найти способ сообщить NGINX, где проксировать запрос из моего сценария PHP-FPM или базы данных MYSQL.

Другой пример:

i.imagehost.com/1234.jpg - hosted on storage1
i.imagehost.com/5678.jpg - hosted on storage2
i.imagehost.com/9012.jpg - hosted on storage3

Что я' m пытаюсь сделать, это получить сервер и расположение файла из моей базы данных и / или PHP-FPM и заставить NGINX передать его через proxy_pass примерно так:

location / {
proxy_pass       http://$storage_server.imagehost.com/$path_to_file;
proxy_set_header Host      $host;
proxy_set_header X-Real-IP $remote_addr;}

Это всего лишь грубый пример того, что я пытаюсь выполнить. Поскольку каждое имя изображения будет случайным, я не смогу установить диапазоны ключей для определения сервера. Это должно быть взято из базы данных. Я не уверен, что это вообще возможно, но я буду благодарен за любую помощь.

0
задан 23 June 2017 в 21:00
1 ответ

Приношу свои извинения, предлагаемое вами решение с местоположением, запрошенным из базы данных, выглядит слишком сложным. Насколько я понимаю, похоже, что вам определенно следует использовать какое-то решение для распределенного хранения.
Первое, что приходит на ум, - это S3-подобное хранилище на основе minio и nginx в качестве обратного прокси. В такой настройке minio должен работать в распределенном режиме, а nginx будет обрабатывать балансировку нагрузки. Minio прост и достаточно легок, чтобы вызвать его в течение 30 минут.

Быстрый поиск в Google дал мне именно такую ​​настройку:

На самом деле, это очень похоже на предложенный вами подход, но вся логика, связанная с хранилищем, обрабатывается minio. Надеюсь, это вам немного поможет!

1
ответ дан 4 December 2019 в 16:13

Теги

Похожие вопросы