Ajax took a shock 2-0 half-time lead at the Amsterdam Arena as both Thulani Serero and Danny Hoesen netted their first European goals before Xavi scored a penalty after Joel Veltman was sent of.
The Dutch side withstood fierce pressure in the remainder of the second half to hold out for all three points.
With AC Milan beating Celtic 3-0 in the other Group H game, Ajax now face the Italians in their final game with the winners reaching the knockout stages.
The losers of that game will play in the Europa League, with Celtic eliminated from Europe with a game to spare.
Brazilian star Kaka put the visitors ahead at Parkhead, with Cristian Zapata and Mario Balotelli also on the scoresheet for the Italians.
Mohamed Salah's fine goal three minutes from time earned Basle a deserved 1-0 victory at St Jakob Park and completed a double over Jose Mourinho's Chelsea.
However, Schalke's 0-0 draw at Steaua Bucharest means the Blues advance to the last 16 ahead of the December 11 meeting at home to the Romanians.
The Gunners now need just a point from their final game at Napoli, after the Italian side were beaten 3-1 by Borussia Dortmund.
Beaten finalists in May, and victims to Bayern Munich once again at the weekend, Dortmund had struggled to recreate last season's swashbuckling group-stage performances and found themselves trailing Serie A runners-up Napoli by three points ahead of Tuesday night's encounter.
But an early penalty from Marco Reus gave them the upper hand before second-half goals from Jakub Blaszczykowski and substitute Pierre-Emerick Aubameyang ruled Lorenzo Insigne's response irrelevant.
Roman Kienast smashed in Vienna's first goal of the group stage so far after 11 minutes before Jackson Martinez levelled shortly after half-time.
Adrian put the Spaniards ahead in the 53rd minute before an absolute fluke goal - when highly-rated goalkeeper Thibaut Courtois completely miscalculated a straightforward tip-over from Toby Alderweireld's defensive header - saved Zenit in the 74th minute.