"This is the best team in baseball," Keuchel said. "I knew I had to be on my 'A' game."
"There was something special today about Keuchel," catcher Carlos Corporan said. "He did everything right today from the start -- his bullpen, his body language. It was amazing. He was making all his pitches."
Gregorio Petit hit a three-run home run in the second inning to stake Keuchel to an early advantage.
The Astros' shortstop said "it was unbelievable" to play behind Keuchel with the way the lefty worked quickly and attacked hitters.
"You see a guy dominating the strike zone like he was today," Petit said, "working in and out. Even the balls he threw were so close, they were chasing. The most important thing -- he got ahead in the count."
Keuchel, who got 16 outs on ground balls, including two double plays, said: "I got ahead of some guys early on and was able to establish both sides of the plate. I just tried to get them to hit it on the ground. I didn't want to keep [my defense] out there too long [in the heat].
"Corporan called a great game -- we were on the same page all game. I want to thank him for that."
Mike Trout singled to center on a 3-1 pitch with one out in the seventh to end Keuchel's no-hit bid. Gordon Beckham led off the eighth with a double to right-center, and David Freese ended Keuchel's shutout with an RBI single on Keuchel's 114th pitch. That also brought Jose Veras on in relief.
"It was just a broken-bat, lazy fly ball that dropped in the Bermuda Triangle," Astros interim manager Tom Lawless said of Trout's hit.
Before that, Lawless said, Keuchel's pitch count was going to dictate if he had a shot at a no-hitter.
"It was 100,000 degrees out there," Lawless said. "Once we got around 125 [pitches], we [would have had to] figure out what we were going to do."
Keuchel (11-9) struck out four and walked one. He lost his perfect game in the sixth. Chris Iannetta, leading off, took a close pitch on a full count that home-plate umpire Dana DeMuth called ball four. But Iannetta was quickly erased on a double-play grounder.
"It was close," Corporan said of the last pitch to Iannetta, and also confirmed he didn't move his glove to catch it.
Keuchel, who led Major League pitchers with a 3.53 ground ball/fly ball ratio entering Sunday, was true to form from the start. Nine of the first 15 Angels outs came on grounders. Keuchel had all four of his strikeouts in that span.
First baseman Jesus Guzman made a nice play in the fifth, when he ranged far to his right and reached down to snare Freese's liner, one of just two outs recorded in the air through six innings.
"He's a competitor," Lawless said of Keuchel. "He's not giving in. His sinker is so good. Behind in the count, he can still throw the sinker."
Keuchel hadn't won since July 30 at Oakland. But he'd pitched well in the seven-start drought, and the Astros won four of them.
"He's always pitched tough against us and he pitched a great game for them this afternoon," Angels manager Mike Scioscia said.
Jake Marisnick's RBI single in the sixth off Jairo Diaz made it 6-0.
Robbie Grossman's two-out, two-run single in the fifth inning off Angels reliever Cam Bedrosian gave the Astros a 5-0 lead.
Petit hit his two-out, three-run homer in the second inning off Angels starter Hector Santiago (5-8), who exited in the third without recording an out.
In two-plus innings, Santiago allowed five hits and walked five (one intentional). A pickoff of Marisnick at second in the second inning prevented further damage.
Marisnick had three hits for the Astros, and Petit, Grossman, Dexter Fowler and Jose Altuve had two apiece.
Altuve now has a Major League-leading 206 hits as he chases Craig Biggio's 1998 single-season Astros record of 210.
Astros designated hitter Chris Carter extended his career-best hitting streak to 12 games.
Petit has hit safely in 15 of his 20 starts since being called up on July 25.