Nicolo Zaniolo‘s two goals gave Roma the edge over Porto in their Champions League last-16 first leg.
The teenager, one of Roma’s few bright sparks in a poor season, controlled Edin Dzeko‘s pass before drilling a low effort past Iker Casillas.
He added a second from six yards out after Dzeko’s 20-yard shot hit the post.
But Porto got an away goal when Adrian Lopez scored after Tiquinho Soares’ mis-hit shot landed in his path.
Roma, who are sixth in Serie A, had the better chances, with Dzeko having a shot tipped on to the post by Casillas.
It is a first defeat for Porto – excluding penalty shootouts – in 27 games. They had won their last five Champions League matches to come through the group stages unbeaten.
The second leg in Porto is on Wednesday, 6 March.