
Miguel Danny turned home a cross from Andrei Arshavin for the equalizer in the 25th minute but Ruud van Nistelrooy regained the lead for the Spanish champions in the 31st.
Arshavin hit the post in the 78th and Zenit missed several more chances.
"Our opponent's class showed through," Arshavin said. "They capitalized on their chances, while we had many and did not score."
Goals by Sergei Kryvets and Igor Stasevich in the first 23 minutes threatened an upset by BATE Borisov against Juventus. But Vincenzo Iaquinta hit back with goals in the 29th and 45th minutes. Juventus has four points, BATE one and Zenit none.
Robin van Persie and Emmanuel Adebayor scored two goals each as Arsenal went above Porto to the top of Group G.
Van Persie scored the first and then Adebayor headed home Van Persie's corner in the 40th. Van Persie got the third with a low, left-foot shot in the 48th and Adebayor added the fourth with a 71st-minute penalty.
Fenerbahce and Dynamo Kiev drew 0-0, so Arsenal leads the standings with four points. Porto is next with three points, while Dynamo has two and Fenerbahce has one.
An own-goal by Martin Demichelis gave Lyon a 26th-minute lead at Bayern Munich, but the Bundesliga champions came back through Ze Roberto's header in the 52nd.
On Wednesday, it's: CFR Cluj vs. Chelsea, and Bordeaux vs. AS Roma in Group A; Anorthosis Famagusta vs. Panathinaikos, and Inter Milan vs. Werder Bremen in Group B; Sporting Lisbon vs. FC Basel, and Shakhtar Donetsk vs. FC Barcelona in Group C; and Liverpool vs. PSV Eindhoven, and Atletico Madrid vs. Marseille in Group D.