Lyon dropped to the middle of the table, 18 points behind PSG.
Lyon nearly took the lead in the 27th when Alexandre Lacazette rolled away from Thiago Silva and Marco Verratti and dribbled past Gregory Van der Wiel to fire a powerful strike that rattled the bar.
Lyon coach Remi Garde used a 5-4-1 formation to prevent the defending champion from developing plays. That tactical ploy worked for half an hour until PSG coach Laurent Blanc adjusted by shifting playmaker Javier Pastore from the midfield to the left wing and moving Cavani up front from the left wing.
"By playing Cavani and Ibrahimovic up front, it allowed us to have more players on the width of the pitch and to deprive Lyon of the space it could easily find," Blanc said.
Cavani fed Pastore in the 32nd but the Argentine midfielder took too much time to shoot and had his close-range effort blocked by Lyon defender Bakary Kone.
Lyon goalkeeper Remy Vercoutre kept frustrating PSG by turning an attempt from Ibrahimovic around the post in the 35th. But Cavani finally put PSG ahead from the following corner by making a run at the near post for a downward header.
The Uruguay striker initiated the second goal in the 40th by collecting a through ball from Pastore before Vercoutre brought him down inside the area. Ibrahimovic scored from the penalty spot with an audacious chip.
PSG's dominant performance continued in the second half. Silva's header from a corner was blocked by Lyon midfielder Gueida Fofana, but the PSG captain pounced on the rebound to shoot past Vercoutre.
Ibrahimovic and Cavani showed signs of an improved understanding on the field in the 65th. The Sweden striker made a cross for Cavani, whose header looped over the bar.
Ibrahimovic made it worse for the visitors in the 81st, taking a pass from Lucas before getting tripped by Lyon center back Samuel Umtiti. He sent Vercoutre the wrong way to score the subsequent penalty.
Also Sunday, Bastia beat Evian 2-0 to move into eighth place, one point clear of Bordeaux which thrashed Ajaccio 4-0.
Serbia winger Milos Krasic capitalized on a poor clearance from Evian defender Aldo Angoula to give Bastia the lead in the 49th minute.
Wahbi Khazri beat the offside trap in the last minute of stoppage time and rounded Evian goalkeeper Jesper Hansen to score from a tight angle.
The Corsican club remains undefeated at Stade Armand Cesari this season.
Bastia goalkeeper Mickael Landreau played his 602nd league match to tie former Monaco goalkeeper Jean-Luc Ettori's record for most games in the top French division.
In Bordeaux, Brazilian forward Jussie scored the first and last goals, starting with a low strike in the ninth before Gregory Sertic beat Ajaccio goalkeeper Guillermo Ochoa to double the lead in the 50th.
Nicolas Maurice-Belay finished off a counterattack to make it 3-0 in the 55th and Jussie headed in a cross from Sertic in the 68th to round off the scoring.
Ajaccio has not won any away match this season and remained in the relegation zone.
On Saturday, it was: Valenciennes 0, Lille 1; Monaco 2, Rennes 0; Guingamp 1, Nantes 0; Saint-Etienne 4, Reims 0; Lorient 3, Nice 0; and Toulouse 5, Sochaux 1.
On Friday, Marseille beat Montpellier 2-0.