袁紹仍然不從,他命令部隊逐漸逼近官渡,緊靠曹軍紮營,軍營東西綿延數十里。
九月,兩軍會戰,曹軍失利,躲進營壘中堅壁不出。袁紹修築壁樓,堆起土山,從高處發箭射擊曹營。
箭如雨下,曹營中的將士只得蒙著盾牌走路。但壁樓、土山不久就被曹軍的「霹靂車」轟毀了。
袁紹又暗鑿通往曹營的地道,曹軍則在營中挖掘長溝進行防禦。袁軍的運糧車還遭到曹軍的襲擊。
兩軍相持了一百多天,河南老百姓困苦不堪,很多人背叛曹軍,響應袁軍。
相持期間,袁紹先後派劉備、韓荀襲擊許都,但是皆被曹仁擊敗,因此不再分兵復出。
然而,這種有利於袁紹的形勢卻突然急轉直下。
這時,袁紹派淳于瓊帶領萬餘人北迎運糧車,沮授特意提醒說:「可增派蔣奇領一支人馬在淳于瓊外側,以防止曹操偷襲。」
而謀士許攸則提出乘曹操傾軍而出,輕騎奔襲許都的建議。
然而,袁紹因之前韓荀和劉備襲擊許都失敗,不想再分兵冒險。
事有湊巧,在鄴城的許攸家族中有人犯法,被留守的審配抓進監獄,許攸大為不滿,於是投奔曹操。在許攸的謀劃下,曹操親自領兵赴烏巢,襲擊淳于瓊。
當曹操奔襲烏巢之時,袁軍部將張郃主張救淳于瓊,他對袁紹說:「曹操親自出馬,必然得手,那麼事情就無可挽回了。」
郭圖卻別出心裁地說:「不如乘此時發兵去進攻曹軍大營。」
袁紹認為郭圖說得對,只要攻拔曹營,曹操就無家可歸了。
於是派高覽、張郃率領重兵攻擊曹營,而只派輕騎救援烏巢。
高覽、張郃攻營不下,烏巢大敗的訊息已經傳來了,二將無心戀戰,竟自向曹軍投降。
插一句,這裡其實是郭圖作祟,害怕袁紹怪罪於自己。
於是叫來一親通道:「你去見高覽,張郃,就說主公要治他兩人敗軍之罪」。
於是便有了兩人投曹的事。
袁紹全軍大亂,一下子全垮了。慌忙之中,袁紹及長子袁譚各單騎逃遁,直奔黃河渡口,隨後又逃來一群騎兵,約有八百騎,渡河至黎陽北岸。
這一仗袁紹損失七、八萬人,武器、輜重、圖書、珍寶無數。
當他跌跌撞撞走進部下蔣義渠營帳中時,握著蔣的手,無比傷感地說:「我把自己的腦袋都交給你了。」
官渡敗後,有人對田豐說:「你必將受重用了。」
田豐平靜地回答說:「如出兵打勝了,我一定能夠安全。如今兵敗,我必死無疑。」
果然,袁紹回到鄴城,說:「我當初不聽田豐之言,今天真的要讓他笑話了。」於是下令殺了他。
官渡之戰,審配的兩個兒子被曹操活捉。
孟岱與審配有矛盾,就透過蔣奇對袁紹說:「審配在任獨攬權力,宗族大,兵力強,而且兩個兒子在南方,他必定想反叛。」
郭圖、辛評也這麼認為。袁紹於是任命孟岱為監軍,代替審配把守鄴縣。護軍逢紀同審配不和,袁紹就逭件事詢問逢紀,逢紀回答說:「審配天性剛烈率直,每次所說的話和所做的事,都仰慕古人的節操,不會因為兩個兒子在南邊而做不義的事情,您不要對他懷疑。」
袁紹說:「你不是討厭他嗎?」逢紀說:「從前所爭的屬於個人私事,現在所說的是國家大事。」袁紹說:「太對了。」於是沒有罷免審配。自此審配、逢紀的關係更融洽了。
回到冀州後,袁紹陸續平定了各處的叛亂。
不久,袁紹發病,死於公元202年(建安七年)夏天。由於袁紹平素有德政,去世之時,河北百姓沒有不悲痛的,市裡巷