九州最北部を占める福岡県の北部にあって、遠賀川に沿って開ける筑豊平野のほぼ中央に位置します。 市の東側は、福智山山系で、北九州市小倉南区と接し、西は、宮若市、鞍手郡鞍手町と接しています。 また、南は田川郡福智町、飯塚市、鞍手郡小竹町と、北は北九州市八幡西区、鞍手郡鞍手町と境を接しています。
本市の東部には福智山(900.8m)を主峰にその支脈(平均標高600m)が南北に走っています。 西部には六ヶ岳(339.0m)の丘陵が北西にひろがり、中央は、比較的平らな地域になっています。 この地域の中央を彦山川、犬鳴川をあつめた遠賀川が北流し、遠賀郡芦屋町で玄海灘にそそいています。