Военные действия развернулись на двух направлениях: на Балканах и в Закавказье. Русская армия столкнулась с упорным сопротивлением турецкой армии, которая была оснащена Англией и Францией новейшим вооружением. Война продолжалась девять месяцев и стоила России 30 тысяч погибших.
В ночь на 15 июня 1877 г. русские соединения форсировали Дунай и 25 июня заняли древнюю столицу Болгарии Тырново. Северная Болгария почти вся была очищена от турок. Но дальнейшее продвижение армии было затруднено ввиду сильного сопротивления турецких войск. Разгорелись ожесточенные сражения, самыми известными из которых стали битвы за Шипку и Плевну.
Русские войска, занявшие уже в начале июля 1877 г. Шипкинский перевал, вскоре испытали сильный нажим турецких войск. Армия турецкого командующего Сулейман-паши (38 тысяч человек) решила овладеть этой важной высотой, чтобы затем вытеснить русских из Северной Болгарии. Перевал оборонял русский отряд под командованием генерала Н. Г. Столетова, в распоряжении которого находилось чуть больше 5 тысяч человек (в том числе 2 тысячи плохо обученных, но горевших желанием сражаться за свободу родины болгарских ополченцев). Эти смельчаки с 9 по 12 августа мужественно отражали непрерывные атаки противника, многократно превосходившего их в живой силе, качестве и количестве вооружения. Затем к осажденным подошли подкрепления, русская армия перешла в контратаку и отбросила противника. Героическая оборона Шипки нарушила турецкие планы; важнейший стратегический пункт остался в руках русской армии. Русские потеряли ранеными и убитыми около 4 тысяч человек.
Ещё более кровопролитные сражения разгорелись в районе болгарского города Плевна (Плевен). Они длились с небольшими перерывами с июля по ноябрь 1877 г. Плевна была одним из немногих городов Северной Болгарии, который оставался в руках турок. Он имел сильные оборонительные линии, а его выгодное географическое расположение позволяло выдерживать продолжительные осады. Русская армия предпринимала неоднократные атаки, пытаясь овладеть этим важным стратегическим пунктом. Однако серия атак окончилась неудачей. Тогда русское командование приняло решение начать осаду. Одновременно русская армия ликвидировала все турецкие укрепления вокруг Плевны, которые штурмовались одно за другим. Наконец 28 ноября 1877 г. 50-тысячная турецкая армия под командованием Осман-паши после безуспешной попытки прорвать блокаду сдалась в плен. В боях за Плевну погибло более десяти тысяч русских.
На Кавказском направлении с весны 1877 г. развернулись жесточайшие бои, и в октябре турецкая армия была разгромлена, а русские войска продвинулись вглубь турецкой территории на несколько сот километров.
В конце 1877 г. русская армия начала решительное наступление на турецкие позиции и 23 декабря освободила Софию. Ликованию болгар не было предела. 3–4 января турецкая армия потерпела сокрушительное поражение, русская армия уверенно шла вперед и остановилась на подступах к Стамбулу. В Стамбуле царила паника, султан Абдул-Гамид II и его окружение бежали, вслед устремились многие высокопоставленные турецкие сановники.
Однако западные страны не могли допустить падения Турции. Английская эскадра вошла в Мраморное море и стала на рейде Стамбула. Правительство Англии направило России дипломатическую ноту, угрожая войной. Аналогичную позицию заняла и Австро-Венгрия. В этих условиях Александр II не рискнул провоцировать новую войну и вводить войска в турецкую столицу.
19 февраля в местечке Сан-Стефано был подписан мирный договор между Россией и Турцией, по которому России возвращалась южная часть Бессарабии, потерянная в Крымской войне, и присоединялась Карская область на Кавказе. Но ещё важнее было то, что Турция признавала независимость славянских государств на Балканах.
Однако западные державы не хотели учитывать новую ситуацию и настояли на созыве особого европейского конгресса, на котором должны окончательно решиться все спорные вопросы. 1 июня 1878 г. в Берлине открылся международный конгресс, где были пересмотрены условия Сан-Стефанского мирного договора. Англия, Австро-Венгрия, Франция и Италия единым фронтом выступили против России.
Подписанное 1 июля соглашение не отвечало ни интересам России, ни чаяниям славянских народов, но зато соответствовало расчетам западных стран. Берлинский трактат отодвигал южную границу Болгарии далеко на север, в предгорья Балканского хребта и объявлял Болгарию вассальным государством, независимым от Турции, но обязанным платить Турции ежегодную дань для великих держав. Южная часть Болгарии оставалась в составе Турции.
Турция брала на себя обязательство провести реформы в стране и уравнять в правах мусульман и христиан; она признавала независимость Черногории, Сербии и Румынии.