Meanwhile, Real Madrid struggled to find their form as Kylian Mbappe made his return from a thigh injury, only appearing as a substitute. The team, who clinched their 15th European Cup triumph last season, fell short of their usual standards.
That ultimately may not matter much for Carlo Ancelotti's side, who beat Stuttgart 3-1 at home two weeks ago and who saw a 36-game unbeaten run stretching back to January come to an end here.
"I am very honest. Criticism of us for today's game is fair and correct and we have to accept it. We did not play well in this game," Ancelotti said.
The new 36-team Champions League format at least provides margin for error, especially for the continent's biggest clubs, with everyone now playing eight games instead of six previously.
Real's upcoming fixtures could be tough, with a repeat of last season's final against Borussia Dortmund next and AC Milan and Liverpool to follow.
But it is hard to imagine them failing to qualify at least for the play-off round.
Advertisement
In contrast, for many Lille players this was arguably the biggest night of their careers, and they were determined to seize the opportunity.
That was especially the case for midfielder Ayyoub Bouaddi, who started on his 17th birthday.
Bouaddi hardly put a foot wrong and outshone stars in the Madrid team like Jude Bellingham, a comparative veteran at 21.
Mbappe was appearing on French soil for the first time since his move to Spain from Paris Saint-Germain. His last game for PSG had been in this same stadium, in the French Cup final in May.
Advertisement
The France captain was only just back from a thigh injury suffered last week, and so he started on the bench.
Instead Real's attack was spearheaded by Endrick, the young Brazilian getting his first start since signing from Palmeiras.
He became, at 18 years and 73 days, the youngest player ever to start a Champions League game for Real, beating Raul's record set in 1995 by five days.
Endrick almost gave Real a 19th-minute lead when he drove into the box only to see his shot saved by Lucas Chevalier.
Vinicius had been denied by Lille's goalkeeper before that, but the hosts were the better team.
Lille almost scored on 25 minutes when David met Edon Zhegrova's cross at the back post only for Andriy Lunin -– starting in goal for Real with Thibaut Courtois sidelined -– to save and then turn the follow-up onto the post.
The opening goal came after a Zhegrova free-kick in the final minute of the first half was blocked by the hand of Eduardo Camavinga in the box. The Italian referee pointed to the spot after reviewing the images.
David had already scored a crucial penalty away to Fenerbahce in the third qualifying round in August. He sent Lunin the wrong way to make it 1-0.
Real needed to change something in order to avoid a first defeat in 11 games this season.
Mbappe entered the fray just before the hour mark, while Endrick was replaced by the 39-year-old Luka Modric.
Zhegrova had curled a shot just wide shortly before those changes, which did not have the desired effect.
Real did almost find a dramatic late leveller though, with Chevalier saving from Arda Guler and Bellingham unable to convert the rebound.
Listen to the latest songs, only on JioSaavn.com
Chevalier then produced another impressive save from Guler as Lille held on.
(This story has not been edited by staff and is auto-generated from a syndicated feed.)