Porto hosted Juventus, the beaten 2015 finalists, looking for their first win in four meetings between the sides, and confident in their chances after a recent six-game winning run.
But the hosts endured a disastrous opening half at the Estadio do Dragao, former Inter Milan midfielder Alex Telles sent off for a second bookable offence in the 27th minute.
After seeing both Gonzalo Higuain and Paulo Dybala come close, Higuain notably denied on 39 minutes by an alert Iker Casillas, Massimiliano Allegri replaced Juan Cuadrado with Pjaca on 67 minutes.
The 21-year-old capitalised only six minutes later, starting a great move before firing past Casillas from 15 yards out.
Allegri drops Bonucci for last-16 first leg tie against Porto
Allegri replaced right-back Stephan Lichtsteiner with Alves immediately afterwards and the former Barcelona star scored with practically his first touch of the game to wrap up a precious win for the Turin giants.
“This team still has plenty of room for improvement but the lads showed great maturity tonight,” said Allegri.
“We’re entering a crucial period of the season and we need to approach it with enthusiasm, determination and be as clinical as possible.
“But we can’t believe 2-0 is enough to see us through. We have to broach the return as if it's still nil-nil.”
Deploying an attack-minded 4-2-3-1 formation designed to squeeze goals out of Higuain, Juve were forced to defend deep as Porto took control in the opening stages.
Dybala sparks 10-point lead for Juventus
But early promise failed to threaten Gianluigi Buffon in the Juve goal, Yacine Brahimi's free kick curling over after Giorgio Chiellini, who passed a late fitness test with fellow defender Andrea Barzagli, fouled striker Andre Silva.
Juve eventually settled and Higuain looked on his way to breaking the deadlock on 18 minutes until Marcano slid in to dispossess the Argentine yards from goal.
When Miralem Pjanic fired an enticing ball into the area for Mandzukic, Casillas was out quickly to sweep the ball away with his feet.
Juventus were gaining momentum but Dybala fired a great chance over Casillas's crossbar after Sami Khedira’s smart overhead flick.
Telles earned his first caution on 25 minutes for a foul on Cuadrado and saw red barely two minutes later for a foul on Lichtsteiner.
“With 10 players it's always more difficult and although it's complicated for us, it's not over,” said Santo.
Santo replaced Silva with Miguel Layun three minutes later but it took a superb reflex save from Casillas to stop Higuain's deflected effort from squeezing in at the base of the post on 39 minutes.
Higuain's brace helps Juve strengthen position on top
Casillas was beaten on the stroke of half-time but Dybala's shot from the edge of the area came off the base of the 'keeper's upright.
The players left the pitch at half-time to a chorus of whistles, although they were aimed mostly at German referee Felix Brych after a controversial opening period capped by Maxi Pereira being cautioned for a foul on Mandzukic.
A reminder that Porto had no intention of sitting back to defend came just three minutes after the restart, Hector Herrera heading Layun's great cross to the back post into Buffon's side-netting.
Porto remained resolute, but eventually buckled under Juve's persistence.
Khedira came close after pouncing on a poor headed clearance by Ruben Neves and then Higuain bamboozled his two markers before unleashing a right-footed drive that curled just wide of Casillas's far post.
Allegri was looking increasingly frustrated and replaced the ineffective Cuadrado with Pjaca on 67 minutes.
The Croat seized the day minutes later, winning possession from a Marcano blunder inside the area to beat Casillas with his maiden Juventus goal.
Alves capped a forgettable night for the hosts when he chested down Alex Sandro's delivery to fire off an angled shot that beat Casillas at his far post on 74 minutes.
COMMENTS
Comments are moderated and generally will be posted if they are on-topic and not abusive.
For more information, please see our Comments FAQ