While blockchain.info provides a hashrate distribution, it is aggregated at the pool level while I would like to know more about how the hashrate is distributed among the pools' servers.
That is not possible to ascertain with certainty. When a Bitcoin block is mined, there is no way to determine which node/pool mined it. Block explorer sites like blockchain.info look at the coinbase data in coinbase transaction to possibly link the block to a particular pool. For example, if you look at the last mined block 594,041 the coinbase transaction has the coinbase data as:
037910091a4d696e656420627920416e74506f6f6c39331400332020d34beafabe6d6d38d664d05278d5312fc43b4a47d259012d94db2c113f41e0ee36a6711161138004000000000000006cbf008036030000
The first byte 0x03
indicates to push the next three bytes on to the stack. Then bytes 0x791009
indicate the block height (594041 in this case) in little-endian. Then if you look at the bytes 0x4d696e656420627920416e74506f6f6c
it represents "'Mined by AntPool" in ASCII. This is what the explorers use to say that the block was actually mined by Ant Pool. Nothing prevents me from mining a block tomorrow with the coinbase data that points to a particular pool when in reality it has nothing to do with them. The block explorer sites will use this false data to show on their websites that the block was actually mined by that pool name that I sneaked in.
Several aggregator websites, including blockchain.info, maintain low-latency connections to a thousands of nodes and record the IP address of the first connected node to relay each block
This data is also unreliable. I can run VPN, mine a block and relay it to the network with an IP address located thousand of kilometers away from my actual location. Moreover, you can run Bitcoin full node on tor which would completely obfuscate your identity.