Luciano Spalletti's team, backed by Russian energy giant Gazprom, need to win at Kuban Krasnodar next Saturday to clinch their third domestic title since 2007 after stretching their lead over second-placed CSKA to 14 points.
Zenit winger Vladimir Bystrov put the home team ahead with his first goal of the season midway through the second half with a diving header.
Russia captain Andrei Arshavin sealed the win a minute from time with his first for Zenit since rejoining his former club on a three-month loan from Arsenal in February.
"We beat CSKA - our most serious rival and thus fully deserved to win the championship," Spalletti told reporters.
"We still need to mathematically secure the title but I think this is almost academic now," said the Italian. "I would like to congratulate all our fans, but most of all [Zenit president Alexander] Dyukov and [Gazprom chief Alexei] Miller."
CSKA are now in danger of losing the second Champions League spot to arch-rivals Spartak Moscow.
Zenit's victory also spoiled the return of CSKA and Russia goalkeeper Igor Akinfeyev, who played his first competitive game in more than seven months following a serious knee injury.
Akinfeyev, who turned 26 last Sunday, hopes to regain his place as Russia's first-choice keeper after overcoming damaged meniscus and torn cruciate ligaments in his left knee.
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.