Что нужно знать чтобы написать свой http-сервер по типу apache?
В первую очередь изучить собственно сам протокол HTTP и любой язык программирования, где вы можете работать с сокетами.
В целях тренировки - язык практически не важен.
1. Сначала определяемся с требованиями к этому http-серверу, и чем не устраивают существующие решения
2. Выбираем из какого-нибудь компилируемого, более-менее производительного языка, с поддержкой асинхронности и удобной работой с сетью:
Erlang, C#, Go, Rust