光绪九年(1883年)十一月,应越南政府之请驻在越南北方山西的清军受到侵越法军的进攻。清廷屈服于法国侵略者的讹诈,于光绪十年四月签订《中法简明条约》。签约仅1个多月,法军即袭击驻在谅山的清军,制造“北黎冲突”,借此要求清廷立即撤军,并索取巨额赔款。清政府一面下令撤回北圻清军,一面命两江总督曾国荃与法使巴德诺在上海谈判。法国在谈判的同时,命海军远东舰队司令孤拔率舰队从南海北上,企图占领中国沿海港口,踞地为质,对清廷施加压力,索取赔款。
当时负责福建军务的钦差会办福建海疆事宜大臣张佩纶等,秉承慈禧太后“无旨不得开炮”和北洋大臣李鸿章“衅不可自我开”的意旨,对入侵法舰不敢阻止。闰五月二十一日,法舰以“游历”为名要求进入闽江口。次日,闽浙总督何王景允许其开进两舰,停泊罗星塔附近。二十三日,又允许孤拔率旗舰“窝尔达”号等两舰开到马尾,给予友好款待,希图缓和局势。此后,法舰在马尾港或五六艘,或七八艘,出入无阻。它们与中国军舰首尾相接,日夜监视福建水师,前后达月余之久。
六月,孤拔率部分舰只进攻台湾基隆,战败,即将舰队主力集中于马尾,泊于罗星塔东南江面,少数舰只泊于马祖澳,控制闽江口,完成作战部署。在马尾的法舰编成两个梯队:前梯队由轻巡洋舰“窝尔达”号和炮舰“益士弼”号、“蝮蛇”号、“豺狼”号(或译“野猫”号)及四十五、四十六号鱼雷艇编成;后梯队由巡洋舰“杜居土路因”号和炮舰“维拉”号、“德斯丹”号编成。加上临战前赶来的装甲巡洋舰“凯旋”号,共10艘,总排水量近15000吨,火炮72门(一说77门),船员1790人(一说1830人)。
福建水师军舰原在港的仅有轻巡洋舰“扬武”号和炮船“福胜”号、“建胜”号3艘,后从本省各港调回炮舰“振威”号、“伏波”号、“艺新”号、“福星”号,从广东调回炮舰“飞云”号、“济安”号。在厂待修的武装运输船“永保”号、“琛航”号也驶离船槽备战。共11艘,内除“福胜”号、“建胜”号为铁壳外,其余均为木壳船。总排水量约6500吨,火炮44门(一说45门),船员1200余人。其中8艘泊于罗星塔以西,法舰前梯队上游;3艘泊于罗星塔东南,与法舰后梯队对峙。另有水师旧式兵船和武装商渔船各20余艘,散泊于港区沿岸和港汊内。江防陆军至临战前增至20余营,并有大量自动参战的群众武装。其中11个营驻守马尾船厂和附近江岸,11个营驻守琯头至长门各要点,民壮近2000人协守闽安至琯头两岸。从马尾至闽江口共有新旧炮台10余处,仅马尾附近就有7处,共有岸炮30余门。何王景、张兆栋(福建巡抚)留守福州;张佩纶、何如璋(福建船政大臣)住马尾指挥附近水陆各军;穆图善(福州将军)坐镇长门,督各炮台控制闽江口。清军总兵力虽然超过法军,但装备陈旧,弹药不足,又缺乏周密的作战准备,在总体上明显处于劣势。
六月二十七日,清政府见和谈无望,遂撤回上海谈判代表,令各省极力筹防,严行戒备。但对马尾方面,仅指示“法舰在内者应设法阻其出口,其未进口者不准再入”,并未解除不得先开炮的禁令。
七月初一日,法国驻北京代办谢满禄以基隆事件为借口,下旗离京。初二日,法海军部电令孤拔消灭福建水师。当晚8时,孤拔召开作战会议,决定于次日下午二时,利用退潮船体转向的有利时机开战。当时在港法舰从吨位、防护力、重炮数量、兵员素质上均占优势,而且“在退潮时方攻击”,使大部中国军舰舰尾(火力最弱部位)置于法舰舰首主炮之前,这对福建水师极为不利。
七月初三日(8月23日)八时,法国驻福州领事白藻太将开战时间通知各国驻福州领事馆。闽浙总督何王景于“午时接法领事照会”才知当日开战,立即向马尾、长门打电报,“长门线断不得达,马尾未接电音,而法人已先开炮”。当日下午1时56分,孤拔指挥在港所有法舰对近在咫尺、毫无准备的中国军舰突然开火。福建水师船只来不及起锚,即被敌舰第一排炮弹击沉两艘(“琛航”和“永保”号),重创多艘。水师官兵在密集炮火下,断锚转舵,浴血还击。
福建水师旗舰“扬武”号用舰尾炮准确地还击在它下游的法军旗舰“窝尔达”号,首发命中舰桥,击毙其引水和5名水手,孤拔差一点丧命。此时法军46号鱼雷艇冲过来发射鱼雷,“扬武”号中雷下沉。该鱼雷艇也被清军岸炮击中,锅炉爆炸。“扬武”号即将下沉时,舰上官兵继续坚持岗位,战斗到该舰沉没。炮舰“福星”号离法舰最近,一开始就受了重伤,但它立即断锚转向,冲向敌阵,瞄准“窝尔达”号猛烈射击,连续命中,并击退45号鱼雷艇的进攻。孤拔遂指挥3艘舰围攻“福星”号。该舰管驾陈英在舰身多处中弹、人员伤亡过半的情况下,登高传呼“有进无退!”舰上官兵喊着杀敌声,全速冲向法军旗舰,吓得“窝尔达”号急忙后退。不幸“福星”号火药舱中弹爆炸,官兵壮烈牺牲。受伤的“福胜”、“建胜”号也奋力抵抗,直至沉没。附近的“伏波”、“艺新”号受伤后突围西驶,搁浅林浦,丧失战斗力。
在罗星塔下游的“振威”、“飞云”、“济安”号遭到袭击后拼死奋战。“振威”号受到法巡洋舰“凯旋”号等围攻,舰身中弹累累,管驾许寿山带伤指挥还击,下令全速向“凯旋”号冲去,决心与敌舰同归于尽,可惜半途又被重炮击中,官兵在烈火浓烟中奋战不息,在被敌鱼雷击中沉没前瞬间,还发射最后一颗炮弹,击伤一法舰舰长和两名士兵。“飞云”、“济安”号在“振威”号沉没后继续抵抗到底。“飞云”号督带高腾云一条腿被炸断,忍着剧痛手扶望台栏杆指挥战斗,又被一颗炮弹掀落江中,英勇殉国。由于两舰都是木壳。中弹后起火,先后在烈火燃烧中下沉。
在激烈的海战中,两岸军民积极配合水师军舰作战。马限山、罗星塔等炮台主动发炮助战,马限山炮台先后击中法军两艘鱼雷艇,一艘受重伤后逃到美国“企业”号舰旁避难,另一艘逃到下游后沉没。在战区两岸的水师旧兵船(小火轮)和武装商、渔船,因船小、风大流急,无法抵近攻击,便对火力范围内的法舰进行猛烈射击。江面战斗仅约半个小时,福建水师11艘舰船9艘沉没,2艘重伤搁浅。舰上尚存官兵攀援碎木板、断桅杆沉浮江中,惨无人道的法国侵略军又向漂浮江面、已经丧失抵抗能力的中国官兵射击,江水顿时染成红色。
下午2时30分以后,法国舰队主力转攻马尾造船厂和附近的炮台,一部兵力继续炮击周围水域的水师旧兵船和武装商渔船。在失去指挥情况下,各炮台自行还击。造船厂后高地的三门克虏伯大炮集中射击法军旗舰“窝尔达”号,击伤孤拔的上尉副官赖威尔等多人。下午4时55分,炮战停止,法舰仍泊罗星塔附近。入夜沿江军民自动驾驶炮船、渔船、盐船、火攻船,携带土炮、火炮、漂雷、放火器等,从四面八方不断逼近袭击法舰,使法舰整夜不得安宁,大部分舰只“移动三四次”。尚干乡农民林狮狮带领十余名壮士,驾武装盐船,星夜暗渡马江,以江边芦苇作掩护,突然向法军旗舰“窝尔达”号进攻,击中旗舰座舱,不幸船被敌舰炮击毁,林狮狮等全部牺牲。
初四日上午,法军部分炮舰乘涨潮上驶到马尾造船厂附近,以“重二十八公斤的榴弹,对凡力能及的东西,均予摧毁”。刚建成在厂的一艘巡洋舰也被击毁。与此同时,法军派出十余艘小艇,驶进附近港汊搜索,见船就投弹炸毁,或纵火焚烧。游弋在闽江口外的两艘法舰也向长门、金牌炮台射击。
初五日,法装甲舰“拉加利桑尼亚”号从台湾驶到闽江口,炮击金牌炮台。守军猛烈还击,击伤该舰,击毙4名侵略者。港内法军在舰炮火力掩护下登陆罗星塔,劫走3门克虏伯大炮。午后,法舰沿江而下,攻击田螺炮台。孤拔乘巡洋舰“杜居土路因”号窜出闽江口,被岸炮“缺咀将军”(炮口有点缺,故称)击中驾驶台,孤拔受重伤(一说被击毙),多人丧命。
初六日,法军陆战队登岸炸毁田螺炮台,法舰遂下闽安,炮击南、北岸炮台。由于炮台炮口固定朝向下游,无法还击。法军击毁炮台后,即派兵登陆,窜入闽安镇抢劫,杀人放火。乡民陈明良率民众与敌激战,受伤被俘,不屈牺牲。当地群众纷纷集结,配合守军反击,赶走侵略者。初七日,8艘法舰由琯头江面向长门、金牌炮台攻击,亦因炮台无法向内还击,陆勇以轻武器回击。初八日,法舰掩护陆战队登陆。次日,长门、金牌炮台被炸毁。在守军和群众武装的反击下,法军全部舰只于初十日撤离闽江口,马尾战役结束。
此役,法军被击沉鱼雷艇1艘,伤军舰3艘(一说5艘),人员伤亡200余人。清军被击沉军舰7艘、武装运输船2艘,伤军舰2艘;数十艘旧兵船、炮船、鱼杆船、武装商渔船全被炸毁烧毁;阵亡官兵有名字记载者796人,伤数百人。
战后,张佩纶、何王景、张兆栋、何如璋被革职。为表彰在这次抗法战役中英勇献身的将士,在马尾马限山下建立昭忠祠。