Cristiano Ronaldo saw a perfectly legitimate goal disallowed in stoppage time as Portugal dropped points for the first time this campaign.
Nikola Milenkovic was also sent off for the hosts late on for a studs-up challenge on Danilo, and moments later, Ronaldo appeared to have drilled home the winner for Portugal.
Stefan Mitrovic cleared the ball off the line, though, after the ball had crossed the line by a few centimeters. But since there was no goal-line technology to review the incident, the referee waved it off.
Portugal, despite switching off in the second-half, have the right to be frustrated, but Serbia also deserve credit for their valiant spirit.
Portugal next play Luxembourg in the group while Serbia are away to Azerbaijan on Tuesday.
Here are the player ratings for Portugal
Anthony Lopes - 6/10
Following a breezy opening stanza in which he was merely a bystander, Lopes was called into question twice after the break, and on both occasions, he was beaten by two close-range finishes. Unlucky.
Cedric Soares - 7/10
He blocked a nice shot from Kostic early on and then assisted Jota for his second goal in an impressive first-half. But the Arsenal man switched off after the break.
Jose Fonte - 6/10
Fonte was beaten soundly for both of Serbia's goals but he was impressive otherwise, using his physical strength to dominate in one-on-one duels and using his towering stature to win aerial duels.
Ruben Dias - 6/10
Dias was uncharacteristically sloppy in defense tonight and was nowhere to be seen during both of Serbia's goals. However, in a moment of salvation, he made a crucial block in the 63rd minute to deny Maksimovic.
Joao Cancelo - 6/10
The Manchester City full-back had a quiet game tonight as his deliveries were few and far between and was also beaten on the break by Serbia's pacy wingers.
Danilo Pereira - 6/10
The midfielder had a tough game physically as he was on the receiving end of some hard tackles, including from Masimovic late on which resulted in the Serb's sending off. From a defensive standpoint, he threw his weight around the back-four but fell short on both occasions the hosts scored.
Bruno Fernandes - 6/10
It was another unimpressive game for the Manchester United talisman, who simply failed to replicate his club heroics and cut an anonymous figure for most of the game.
Sergio Oliveira - 6/10
The Porto man made some good runs and always looked to find Ronaldo and Jota, though his crosses weren't always accurate.
Bernardo Silva - 7/10
Silva is an absolute baller and he demonstrated the same with an imperious attacking display for Portugal tonight, even assisting Jota's opening goal with a delightful cross. However, like many other players, he too faded after the break.
Diogo Jota - 8/10
Jota's fine 2020/21 season continued after he struck a brace, both close-range headers, as the Liverpool star put Portugal two up for the good in the first-half.
Cristiano Ronaldo - 5/10
Portugal's captain and top scorer was well and truly upstaged by the likes of Jota and Silva tonight as the Juventus ace failed to fire once again.
However, the 36-year old saw a stoppage-time effort cleared off the line, much to his already-mounting dismay.
Ronaldo should really consider giving up free-kick duties as well now - zero goals in five attempts so far in the campaign for Portugal (including two in this match).
Joao Felix - 5/10
He came on for the last few minutes of the match but couldn't add much firepower to Portugal's vanguard.
Nuno Mendes - 6/10
He laid one key pass and completed one tackle despite playing just 20 minutes. Good cameo from the teenager.
Renato Sanches - 6/10
Sanches wasn't a direct threat but made sure he kept the ball moving as Portugal upped the ante in the final quarter of the match.
Joao Palhinha - N/A
The 25-year old was subbed only in stoppage-time and barely even saw the ball.