Правильное хранение изображений на сервере
Можно хранить имя файла (good.jpg) и тип картинки (goods), например картинка товара, на основе этой информации строить путь, так, как вам угодно, например:
/media/origin/goods/g/go/good.jpg
/media/origin/goods/t/to/tovar.jpg
Если нужно сохранить картинку с таким же именем, то в конец дописываем индекс, например:
/media/origin/goods/g/go/good.jpg
/media/origin/goods/g/go/good__1.jpg
/media/origin/goods/g/go/good__2.jpg
Подпапки после типа картинки /g/go/ нужны, чтобы в одну директорию не сваливалось слишком много файлов.
Если в качестве имени файла используются цифры (напрмер - это индексы записей в базе), то подпапки лучше формировать с конца имени файла, например:
125.jpg -> /5/2/125.jpg
126.jpg -> /6/2/126.jpg
это позволит более равномерно распределять файлы по папкам.
Такой вариант позволит в будущем изменить место хранения картинок, поменять логику формирования пути к картинке, и т.д.
Закешированые картинки соответственно будут храниться, например, по такому пути /media/cached/goods/<название пресета (200x120r)>/go/g/good.jpg
Пресет можно формировать, например, на основе ширины, высоты, способа масштабирования, и названия фильтра
У вас есть множество серверов для хранения картинок. Возможно. тех же самых, на которых работают и скрипты, не важно. Вы на этих серверах держите специальную приложеньку для заливки картинок. Когда приходит картинка, выбираете случайным образом один из серверов (держите список в MySQL/Redis/неважно), заливаете картинку, получаете обратно ссылку. В базу пишите ссылку img123.myproject.com/123/45/38475.jpg.
Если сервер дохнет, поднимаете новый, присваиваете ему имя img123.myproject.com, восстанавливаетесь из бэкапа, снова все работает. Раздавать картинки, разумеется, нужно не через приложеньку, а напрямую через nginx.
А еще для хранения картинок неплохо подходит Riak. Плюс в том, что вы получите шардинг, решардинг и репликацию из коробки и особо думать ни о чем не надо.