Como a especificação HTTP (e a mensagem de erro de seu servidor HTTP) especifica, você precisa de uma linha em branco entre os cabeçalhos HTTP e o corpo, caso contrário, o servidor não sabe onde os cabeçalhos terminam e o corpo começa. De RFC 2616 (ênfase minha):
Request (section 5) and Response (section 6) messages use the generic message format of RFC 822 [9] for transferring entities (the payload of the message). Both types of message consist of a start-line, zero or more header fields (also known as "headers"), an empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields, and possibly a message-body.
Para corrigir o problema, coloque outro echo
antes de echo "<html>"
, para que os cabeçalhos fiquem claramente separados do corpo.