Какие установить правила для загрузки фото на сайт?
Ну это всё зависит от возможностей сервера и тд. Ну вообще сейчас обычно используют 2 мб.
Для сжатия изображений есть много библиотек и примеров. Допустим пользователь отправляет изображение весом 4 мб, необходимо определить коэффициент сжатия 4мб/2мб =  2, значит коэффициент будет равен двум и сжимаем изображение в 2 раза. А ещё лучше делать одну миниатюру ещё меньшего размера, чтобы разгрузить сервер. 
Допустим изображение 2мб и миниатюра 400кб.
Вы не указали какие технологии используете по этому примеры будут на php.Сжатие изображений на php<Библиотека для работы с изображениями
Как реализовать функцию автоматического уменьшения / оптимизации фотографии если пользователь загружает фотографию больше установленного на сайте размера?
При аплоде изображение (вместе с пометкой от кого оно пришло) ставится в очередь на обработку. В фоне (с низким приоритетом) крутится скрипт, который по одному забирает изображения из очереди конвертирует их (через ImageMagick, например) и прописывает в профиль (ну или куда там у вас) того юзера, который загрузил оригинал. После того как изображение получено, но до того как оно обработано на том месте можно показывать заглушку: "подождите (несколько секунд/часов/дней), идет обработка".