Marseille dropped points in the chase for second place in the French league after losing 2-0 at home to struggling Clermont on Sunday.
Second spot seals automatic entry into the Champions League next season, but Marseille's defeat leaves it just one point ahead of third-place Nice and still 13 points behind leader Paris Saint-Germain.
Striker Mohamed Bayo neatly turned a cross from the right past Marseille goalkeeper Pau Lopez in the 13th minute, and substitute Jim Allevinah headed in from a corner in the 84th as home fans left a silent Stade Velodrome in droves.
“I think we need to change something about our attitude, because it's a question of mentality,” Lopez said. “We need to change now because we're entering the most important moment of the season.”
Earlier, Justin Kluivert continued his good form by scoring the only goal as Nice beat Angers 1-0.
Kluivert latched onto Melvin Bard's long pass in the 18th minute and slotted the ball through the legs of goalkeeper Danijel Petkovic, who misjudged his rush off the line.
A few minutes earlier, Kluivert's free kick had set up Khephren Thuram for a headed goal but it was ruled out following a video review. The irrepressible Kluivert's cross set up another header midway through the second half, this time for striker Andy Delort, but that one was also chalked off by VAR.
The 22-year-old Kluivert plays on the left wing and scored two excellent goals earlier this month in the French Cup quarterfinals. He is the son of former Ajax, Barcelona and Netherlands striker Patrick Kluivert. Thuram is the son of former standout defender Lilian Thuram, who won the World Cup and the European Championship with France.
Coach Christophe Galtier's Nice has the best defense in the league — with 21 goals allowed in 25 games. Galtier's former side Lille won the title last season and had the league's best defense.
It was a fourth straight defeat for Angers.
Improving Saint-Etienne held fourth-place Strasbourg to a 2-2 home draw, with all the goals coming in a frantic first half.
An early goal from attacking midfielder Ryad Boudebouz put Pascal Dupraz's Saint-Etienne ahead.
Striker Habib Diallo equalized for Strasbourg in the 20th and defender Lucas Perrin made it 2-1, before captain Wahbi Khazri equalized in the 33rd as Saint-Etienne moved to 16th.
Rennes dispatched struggling Troyes 4-1 at home to climb into fifth place and two points behind Strasbourg for an automatic Europa League spot. Striker Serhou Guirassy made the most of a rare start with two goals inside 20 minutes. Regular scorers Martin Terrier and Gaetan Laborde added late goals to reach 12 goals each.
Midfilelder Teji Savanier scored in the second half as ninth-place Montpellier won 1-0 at Lorient.
Also, Reims drew 1-1 at home to Brest.
Last-place Bordeaux drew 1-1 with sixth-place Monaco, which had France midfielder Aurelien Tchouameni sent off in the 34th.
Forward Remi Oudin had put Bordeaux ahead midway through the first half with a crisp half-volley from Yacine Adli's pass.
Monaco equalized when Brazilian defender Marcelo scored an own-goal midway through the second half. Bordeaux has conceded a league-high 62 goals.