Chelsea got the win they needed despite being put under sustained pressure in the second half at Selhurst Park.
Olivier Giroud, Christian Pulisic and Tammy Abraham scored as the Blues took another step towards a top-four finish.
The victory took them above Leicester into third place ahead of the Foxes’ game at Arsenal tonight.
But they were made to work for it in a lively derby in which Palace twice halved the deficit and almost equalised when Scott Dann’s header was pushed against the post by keeper Kepa Arrizabalaga in the final seconds.
A nightmare moment for Gary Cahill against his former club handed Chelsea an early lead.
Cahill went to meet Reece James’ ball down the right but fell to the ground in pain after suffering a hamstring injury.
That enabled Willian to pull the ball back for Giroud, who applied the finish.
When the in-form Pulisic doubled the lead, Chelsea seemed to be in complete control.
The American created a yard of space up against Joel Ward and blasted past keeper Vicente Guaita at his near post.
But Wilfried Zaha’s stunning strike from long range hauled Palace back into the game before the interval and they caused Chelsea major problems in the second half.
Abraham appeared to have sealed the win when he netted after being set up by fellow substitute Ruben Loftus-Cheek.
But Palace responded straightaway, with Patrick van Aanholt pulling the ball back from the left for Christian Benteke to score.
And Dann so nearly rescued a point for the Eagles after being found by Zaha’s cross.
Chelsea: Kepa, James, Christensen, Zouma, Azpilicueta, Gilmour (Jorginho 80), Mount, Barkley (Loftus-Cheek 65), Willian, Pulisic, Giroud (Abraham 65).
Subs not used: Caballero, Rudiger, Alonso, Pedro, Hudson-Odoi, Batshuayi.