Faits :
A.
Tous deux membres du Parti ouvrier et populaire vaudois (POP), B.A._ et A.B._ avaient tissé des liens d'amitié très étroits. Par contrat du 18 juin 2001, B.A._ a remis à bail à A.B._ un appartement de trois pièces et hall, au 4 ème étage de l'immeuble sis ... , à Lausanne. Conclu pour une durée initiale de cinq ans avec échéance au 30 septembre 2006, le bail était renouvelable tacitement de cinq ans en cinq ans, sauf avis de résiliation reçu au moins quatre mois à l'avance. Fixé tout d'abord à 1'620 fr. charges comprises, le loyer mensuel a passé dès le 1 er juillet 2009 à 1'624 fr., plus 125 fr. de charges. A.B._ occupe l'appartement avec son épouse, B.B._ et leur jeune fils.
B.A._ est décédé en 2007. Son fils, C.A._, est alors devenu nu-propriétaire de l'immeuble et sa veuve, A.A._, également amie de longue date de A.B._, en est actuellement usufruitière (ci-après: la bailleresse).
L'immeuble de l'avenue xxx présente un caractère familial. B.A._ et A.A._ y vivaient et celle-ci y demeure encore. C.A._ et son épouse, ainsi que la soeur de A.A._, logent également à cette adresse. C.A._ s'occupe de l'immeuble en collaboration avec une gérance.
Après le décès de B.A._, les rapports entre A.B._ et C.A._ se sont peu à peu dégradés. En avril 2011, le locataire a déposé une plainte pénale contre le fils de la bailleresse, l'accusant d'avoir saccagé son jardin sans l'avertir et ainsi détruit cultures et plantations. La gérance a alors fait observer à A.B._ que l'usage d'un jardin lui avait été octroyé à bien plaire, qu'aucune plantation n'avait été détruite et qu'il avait refusé l'autre emplacement proposé par le propriétaire. Par ordonnance du 8 février 2012, le Ministère public de l'arrondissement de Lausanne a ordonné le classement de la procédure pénale; il a constaté qu'aucune plantation n'avait été détruite et a considéré que C.A._ n'avait causé aucun dommage à la propriété en enlevant la paille déposée sur le sol par le locataire et en mettant de côté les tuteurs plantés sur la parcelle.
Par courrier du 13 juillet 2012, A.A._ a notifié à A.B._ une hausse de loyer de 178 fr. par mois, motivée par l'évolution de l'indice suisse des prix à la consommation ainsi que par la réfection de l'étanchéité de la toiture et des terrasses. Le locataire a contesté cette augmentation. Les parties ne sont pas parvenues à un accord devant la Commission de conciliation. En date du 6 décembre 2012, A.B._ a ouvert action devant le Tribunal des baux du canton de Vaud.
Parallèlement à cette procédure, le locataire a adressé plusieurs courriels au POP. Le 1 er novembre 2012, il écrit ce qui suit au président de la section de Lausanne:
" Je voulais te soumettre un problème. Merci d'en discuter au comité de section de Lausanne. Dans mon immeuble où je suis locataire, nous sommes en lutte contre le propriétaire, qui veut augmenter les loyers de 11%. Or, le propriétaire est membre du POP à ma connaissance...en tout cas il y a 2 ans encore. Il s'appelle C.A._. Je veux savoir s'il est encore membre de notre parti. Car si c'est le cas, je pense que c'est scandaleux et je vais le rendre public. "
Après avoir été relancé par A.B._, le président de la section de Lausanne a confirmé que C.A._ était bien membre du POP.
Le 20 novembre 2012, A.B._ a adressé au comité de section du POP & Gauche en mouvement section de Lausanne (GM) le courriel suivant:
" (...)
Depuis plusieurs mois, les locataires de mon immeuble sont en lutte contre les augmentations de loyer du propriétaire.
Pour ma part, j'ai reçu une hausse de 11% pour fin septembre 2012, que je conteste en ce moment devant le tribunal des baux, avec l'aide de l'ASLOCA qui veut en faire un combat modèle jusqu'au TF.
Il se trouve que le propriétaire est membre de notre parti.
La position de notre parti sur les questions de logement me paraît claire. (...)
Ma demande est simple: peut-on être membre du parti et avoir une pratique de propriétaire scandaleuse envers ses locataires?
Comme cette affaire risque bien un jour de venir sur la place publique, car dans la procédure qui suivra son cours, le POP sera concerné...
Il n'est en effet pas anodin qu'un locataire popiste soit en lutte contre son proprio popiste.
Et avant que cela fasse les choux gras d'une certaine presse, voire la nôtre, je propose que le POP prenne les devants.
Je demande au comité de section:
1. De prendre position sur des pratiques scandaleuses d'un propriétaire popiste qui augmente ses loyers de manière abusive.
2. De jouer un rôle de médiation avant que cela sorte sur la place publique.
3. Puis de prendre des mesures disciplinaires en cas de besoin: radiation, exclusion ou demande de retrait du membre pour des questions de cohérence politique (voir article 24 de nos statuts).
Quoi qu'il en soit, je demande que le comité de section prenne position. "
Ne recevant pas de réponse à ce courriel, A.B._ a fait savoir, le 3 décembre 2012, qu'il l'envoyait "à quelques élus communaux du POP & GM" en précisant qu'il s'agissait, dans un premier temps, d'"élargir le cercle de réflexion". Le même jour, il lui a été répondu qu'étant donné qu'il évoquait une mesure aussi sérieuse que l'exclusion - exceptionnelle selon l'art. 24 des statuts du parti - sa demande devait d'abord être examinée par le comité de section, lequel privilégiait une médiation avant une éventuelle procédure d'exclusion et souhaitait le rencontrer ainsi que consulter le dossier de l'ASLOCA.
Le 21 janvier 2013, A.B._ a répondu au comité en ces termes:
" Je serais heureux de prendre connaissance des démarches que vous entendez entreprendre. Et je vous prie de prendre la chose au sérieux, car il peut y avoir une expulsion au programme, car le proprio n'est pas tendre, malgré sa carte du parti. Donc, pour l'heure, je souhaite juste que vous m'indiquiez ce que la section de Lausanne, son comité me propose de faire. Ensuite, je vous dis mon avis. "
Sans réponse au 3 février 2013, A.B._ a interpellé à nouveau le comité:
" Je vois que certains ont décidé de faire les morts.
Alors mes questions sont simples:
1. Qui est membre du comité de section pour que j'envois (sic) cette lettre à chacun/e.
2. Qui sont les élus du POP & GM (tous!) pour qu'ils reçoivent cette missive.
Merci de la réponse rapide de la direction de section.
Par ailleurs, si d'ici le 11 février, je n'ai pas de réponse officielle de la section de Lausanne (la mienne) sur ma demande non pas de décision, mais ma demande de démarche que la section peut entreprendre dans ce cas précis, je ferais (sic) valoir mes droits au POP & GM cantonal selon les statuts, puis je continuerais (sic) plus loin au cas où...car je n'ai pas l'habitude de laisser tomber mon os.
Pour l'heure, j'imagine que vous avez remarqué que je n'ai pas voulu donner beaucoup de publicité à cette affaire, pour laisser du champ à une médiation possible...mais je suis en train de me demander si je n'ai pas eu tort. (...)
PS 1: je vous ai envoyé le dossier de l'ASLOCA.
(...) "
Déclarant avoir compris ce dont son parti était capable, A.B._ a renoncé, le 12 février 2013, à poursuivre ses démarches auprès du POP et a refusé la rencontre qui lui était proposée. Il démissionnera du parti en date du 16 avril 2013.
La bailleresse et son fils ont eu connaissance des courriels envoyés par A.B._ à différentes instances du POP.
Par lettre du 15 avril 2013, A.A._ a renoncé à la hausse de loyer litigieuse et, par formule officielle du même jour adressée uniquement à A.B._, elle a résilié le bail avec effet au 31 mai 2013, subsidiairement au 31 juillet 2013; principalement, le congé était motivé par le manque d'égards envers l'usufruitière et le nu-propriétaire (art. 257f CO) et, subsidiairement, il était donné pour justes motifs (art. 266g CO).
Le même jour, C.A._ a déposé une plainte pénale contre A.B._ pour dénonciation calomnieuse, en raison de la plainte pénale non fondée d'avril 2011 et des courriels envoyés au POP. L'ordonnance de non-entrée en matière a été confirmée le 12 juin 2013 par la Chambre des recours pénale du Tribunal cantonal du canton de Vaud.
Le 21 juin 2013, A.B._ a écrit à A.A._; il lui proposait notamment de "se concentrer sur l'essentiel: vivre en toute harmonie dans l'immeuble". Le 3 juillet 2013, la bailleresse a répondu que, pour vivre en bonne harmonie dans l'immeuble, ce n'était pas seulement à elle qu'il fallait écrire, mais surtout à son fils C.A._ qui, chargé de l'entretien de l'immeuble, avait des contacts réguliers avec les locataires; elle ajoutait que son défunt mari n'aurait pas apprécié le dépôt de plainte d'avril 2011, ni les démarches entreprises auprès du POP.
Le premier congé n'ayant pas été adressé à B.B._, une nouvelle résiliation a été notifiée le 30 août 2013 à chacun des époux locataires pour le 31 octobre 2013, subsidiairement pour le 30 juin 2014. Le courrier accompagnant la formule officielle mentionnait comme motifs du congé la plainte pénale déposée contre C.A._ pour "destruction de jardin" ainsi que les courriels envoyés aux instances dirigeantes du POP dénonçant le comportement prétendument scandaleux de C.A._; il était précisé que l'attitude du locataire avait profondément blessé la bailleresse et son fils et que, comme ceux-ci habitaient le même immeuble, la continuation du bail leur était intolérable.
B.
A.B._ et B.B._ ont contesté le congé. La tentative de conciliation a échoué. Par demande du 6 décembre 2013, les locataires ont conclu principalement à ce que le Tribunal des baux du canton de Vaud annule la résiliation notifiée le 30 août 2013; à titre subsidiaire, ils demandaient une prolongation du bail de quatre ans. Par la suite, ils ont encore conclu subsidiairement au versement d'une indemnité de 50'000 fr. pour le cas où la résiliation serait validée sur la base de l'art. 266g CO.
Par jugement du 19 mai 2014, le Tribunal des baux a déclaré valable la résiliation du bail, avec effet au 30 juin 2014, accordé une seule et unique prolongation au 30 juin 2015, ordonné aux locataires de quitter les locaux loués au 30 juin 2015 au plus tard et dit qu'à défaut d'une exécution volontaire, il serait procédé à l'exécution forcée de la décision. Le tribunal a rejeté toutes autres ou plus amples conclusions, en particulier la conclusion subsidiaire des demandeurs tendant au paiement d'un montant de 50'000 fr. fondé sur l'art. 266g al. 2 CO. En substance, il a jugé tout d'abord que le congé anticipé litigieux ne remplissait pas les conditions posées par l'art. 257f al. 3 CO, notamment parce que les comportements reprochés au locataire n'étaient pas en relation directe avec l'objet loué et ne pouvaient ainsi être qualifiés de manques d'égards envers les voisins, quand bien même la bailleresse et son fils habitaient l'immeuble. En revanche, le tribunal a considéré que l'attitude du locataire, révélée par les courriels adressés aux instances dirigeantes du POP lausannois, constituait un juste motif de résiliation du bail au sens de l'art. 266g al. 1 CO.
Les locataires ont interjeté appel. Par arrêt du 11 novembre 2014, la Cour d'appel civile du Tribunal cantonal du canton de Vaud a admis l'appel et, statuant à nouveau, a dit que la résiliation était nulle. Contrairement aux premiers juges, la cour cantonale a jugé que le comportement reproché au locataire, critiquable du point de vue des convenances, devait être apprécié dans le cadre du litige divisant les parties à propos de la hausse de loyer. En elles-mêmes, les démarches entreprises auprès du POP n'avaient ainsi pas rendu l'exécution du contrat intolérable au sens de l'art. 266g al. 1 CO, ce qui était confirmé par le fait que la bailleresse avait attendu plusieurs semaines pour résilier le bail après avoir pris connaissance des courriels du locataire.
C.
A.A._ exerce un recours en matière civile. Elle demande principalement au Tribunal fédéral de réformer l'arrêt attaqué en ce sens que la résiliation notifiée le 30 août 2013 est valable et qu'une seule et unique prolongation au 30 juin 2015 est accordée aux locataires; elle prend en outre des conclusions tendant à l'exécution de l'arrêt à rendre. A titre subsidiaire, la recourante conclut à l'annulation de la décision entreprise et au renvoi de la cause à l'autorité cantonale.
A.B._ et B.B._ proposent le rejet du recours.
Par la suite, des observations ont été déposées de part et d'autre par les parties.
Invitée à se prononcer, la cour cantonale se réfère aux considérants de son arrêt.

Considérant en droit :
1.
1.1. Le recours est dirigé contre un arrêt final (art. 90 LTF) rendu en matière civile (art. 72 al. 1 LTF) par un tribunal supérieur d'un canton, qui a statué sur recours (art. 75 LTF). La cause atteint la valeur litigieuse de 15'000 fr. ouvrant le recours en matière civile dans les affaires relevant du droit du bail à loyer (art. 74 al. 1 let. a LTF; cf. <ref-ruling> consid. 1.1 p. 390; <ref-ruling> consid. 196 consid. 1.1 p. 197). Au surplus, le recours est exercé par la partie qui a succombé dans sa conclusion tendant à faire constater la validité du congé et qui a donc qualité pour recourir (art. 76 al. 1 LTF). Déposé dans le délai (art. 46 al. 1 let. c et art. 100 al. 1 LTF) et la forme (art. 42 LTF) prévus par la loi, le recours est en principe recevable.
1.2. Le Tribunal fédéral conduit son raisonnement juridique sur la base des faits établis par l'autorité précédente (art. 105 al. 1 LTF). Il ne peut s'en écarter que si les faits ont été établis de façon manifestement inexacte - ce qui correspond à la notion d'arbitraire au sens de l'art. 9 Cst. (<ref-ruling> consid. 2 p. 117; <ref-ruling> consid. 4.1.2 p. 62; <ref-ruling> consid. 5.1 p. 356) - ou en violation du droit au sens de l'art. 95 LTF (art. 105 al. 2 LTF). Si l'auteur du recours se plaint d'un tel grief, encore faut-il que la correction du vice soit susceptible d'influer sur le sort de la cause (art. 97 al. 1 LTF). L'exception prévue à l'art. 105 al. 2 LTF ne permet pas aux parties de rediscuter dans leurs mémoires les faits de la cause comme si elles plaidaient devant un juge d'appel. La partie recourante qui, sur la base de l'art. 97 al. 1 LTF, entend faire rectifier ou compléter un état de fait doit expliquer de manière circonstanciée en quoi les conditions d'une telle modification seraient réalisées (<ref-ruling> consid. 1.3.1 p. 18; <ref-ruling> consid. 5.1 p. 356; <ref-ruling> consid. 1.2 p. 187), au même titre que la partie qui invoque une violation de l'interdiction constitutionnelle de l'arbitraire dans l'appréciation des preuves et l'établissement des faits (cf. art. 106 al. 2 LTF; ATF <ref-ruling> consid. 4.1.2 p. 62; <ref-ruling> consid. 2.2 p. 246; <ref-ruling> consid. 1.4.3 p. 254 s.).
La recourante demande que l'état de fait soit complété sur deux points, afin de correspondre à ce que le Tribunal des baux avait retenu. Le premier point concerne l'étendue de l'aide reçue par l'intimé de la part de son ami bailleur, époux de la recourante. A cet égard, la cour cantonale a constaté l'étroitesse des liens d'amitié entre les deux intéressés, relevant notamment que l'intimé avait officié lors de l'enterrement du mari de la bailleresse et, dans la partie "en droit", qu'il avait bénéficié de l'aide de ce dernier. La recourante ne démontre pas en quoi des précisions supplémentaires à ce sujet constitueraient des éléments déterminants pour le sort de la cause. Le second point est relatif au caractère grave, selon les statuts du POP, de la mesure d'exclusion du parti d'un membre. Là non plus, la recourante n'explique d'aucune manière en quoi la cour cantonale aurait versé dans l'arbitraire en ne retenant pas dans les faits cet élément, lequel ressort du reste de la réponse du parti du 3 décembre 2012 telle que résumée dans l'arrêt attaqué.
Il n'y a dès lors pas lieu de donner suite à la demande de complètement des faits formée par la recourante.
2.
La recourante reproche à l'autorité précédente de ne pas avoir admis que le congé anticipé du 30 août 2013 était fondé sur de justes motifs au sens de l'art. 266g CO et, partant, qu'il était valable.
A son sens, les démarches du locataire auprès du POP dépassaient largement le seuil du tolérable et ne sauraient être présentées comme une tentative de médiation, parallèle à la procédure judiciaire. Selon la recourante, les attaques du locataire, virulentes et répétées, ne se réduisaient pas à un manque de convenance et étaient de nature à la discréditer, elle et sa famille, auprès du parti auquel elle reste attachée tant par conviction personnelle qu'en souvenir de son mari. La profonde blessure provoquée par l'attitude irrespectueuse de l'intimé, qui aurait trahi l'amitié que lui portait le mari de la bailleresse, serait objectivement tout à fait compréhensible dans le contexte de l'affaire.
A cet égard, la cour cantonale aurait ignoré ou écarté des éléments pertinents pour juger de l'existence de justes motifs au sens de l'art. 266g al. 1 CO. Ainsi, elle n'aurait pas accordé assez d'importance aux relations personnelles étroites entre les différents protagonistes. En particulier, elle aurait dû prendre en compte le fait que le bail litigieux avait été conclu en raison de l'amitié liant l'intimé à l'époux de la bailleresse et le fait que celle-ci, logée dans le même immeuble, pouvait espérer à son âge vivre en harmonie avec ses voisins. L'autorité cantonale aurait également considéré à tort comme sans pertinence le fait que la bailleresse doive supporter la présence des locataires pour une longue période, compte tenu de l'échéance contractuelle et du délai de protection de l'art. 271a al. 1 let. e CO.
Enfin, la recourante conteste avoir réagi de manière tardive au comportement de l'intimé et avoir ainsi démontré que la poursuite des relations de bail ne lui était pas intolérable.
3.
3.1. Conformément à l'art. 266g al. 1 CO, une partie peut résilier le bail à n'importe quel moment, en observant le délai de congé légal, si l'exécution du contrat lui devient intolérable pour de justes motifs. Ne peuvent constituer de justes motifs au sens de l'art. 266g al. 1 CO que des circonstances d'une gravité exceptionnelle, qui n'étaient pas connues ni prévisibles lors de la conclusion du contrat et qui ne résultent pas d'une faute de la partie qui s'en prévaut (<ref-ruling> consid. 2a/aa p. 265 s.). Les circonstances invoquées doivent être si graves qu'elles rendent la poursuite du bail jusqu'à son terme objectivement insupportable; une intolérance ressentie de manière purement subjective ne suffit pas. La manière dont la situation est perçue par la partie qui donne le congé n'est toutefois pas dénuée de pertinence. Les circonstances constitutives d'un juste motif doivent rendre la continuation du bail jusqu'à son terme intolérable non seulement selon une appréciation objective, mais aussi subjectivement. Il n'y a pas de justes motifs s'il apparaît que le cocontractant s'accommode de faits objectivement graves et que ceux-ci ne lui rendent pas insupportable la poursuite de la relation contractuelle. Il a ainsi été admis, dans le cas des justes motifs au sens de l'art. 266g CO, que la partie doit résilier immédiatement le bail après la survenance du juste motif, faute de quoi elle montre par son attitude que celui-ci ne lui rend pas insupportable la continuation du contrat (arrêt 4A_142/2012 du 17 avril 2012 consid. 3.1 et les arrêts cités).
Pour dire s'il existe de justes motifs, le juge doit appliquer les règles du droit et de l'équité (art. 4 CC). Il doit donc prendre en considération tous les éléments du cas particulier, sans perdre de vue le principe de la sécurité du droit et l'intérêt de l'autre partie au maintien du contrat (arrêt précité du 17 avril 2012 consid. 3.1 et les arrêts cités). Le Tribunal fédéral ne revoit qu'avec réserve la décision d'équité prise en dernière instance cantonale. Il intervient lorsque celle-ci s'écarte sans raison des règles établies par la doctrine et la jurisprudence en matière de libre appréciation, lorsqu'elle s'appuie sur des faits qui, dans le cas particulier, ne devaient jouer aucun rôle, ou, au contraire, lorsqu'elle ignore des éléments qui auraient absolument dû être pris en considération; en outre, le Tribunal fédéral redresse les décisions rendues en vertu d'un pouvoir d'appréciation lorsqu'elles aboutissent à un résultat manifestement injuste ou à une iniquité choquante (<ref-ruling> consid. 2.2.1 p. 279; <ref-ruling> consid. 2 p. 123 s. et les arrêts cités).
3.2. Les motifs de congé litigieux résident dans les démarches entreprises par le locataire auprès du parti politique auquel tant lui-même que la bailleresse et son fils appartenaient. Contrairement à ce qu'elle indiquait dans la lettre accompagnant le congé du 30 août 2013, la recourante ne fait plus valoir comme motif de résiliation, à ce stade, la plainte pénale déposée par le locataire deux ans auparavant. Le litige lié à cette plainte fait toutefois partie des circonstances permettant d'appréhender les relations entre les parties.
Les motifs justifiant un congé anticipé au sens de l'art. 266g al. 1 CO peuvent résider dans la personne du destinataire du congé, indépendamment de la violation d'une obligation spécifiquement liée au bail. Ainsi en va-t-il par exemple d'un comportement pénalement répréhensible du locataire à l'égard du bailleur et de sa famille (David Lachat, Le bail à loyer, 2008, p. 701; Peter Higi, Zürcher Kommentar, 4e éd. 1995, n° 51 ad art. 266g CO) ou d'une attitude propre à discréditer son partenaire et à lui porter préjudice (Pierre Wessner, in Droit du bail à loyer - Commentaire pratique, Bohnet/Montini éd., 2010, n. 29 ad art. 266g CO p. 668). Un différend personnel entre les parties peut aussi constituer un juste motif de résiliation anticipée du bail (<ref-ruling> consid. 2c p. 37).
En l'espèce, il s'agit de déterminer si, dans les circonstances de l'espèce, les interventions du locataire auprès du parti commun aux intéressés et les termes utilisés à cette occasion atteignaient un degré de gravité tel que la poursuite du bail jusqu'à son terme ordinaire en devenait intolérable pour la recourante.
Sur le plan subjectif, la cour cantonale impute à la bailleresse une réaction tardive, démontrant par là-même que la poursuite du bail n'était pas insupportable pour elle; en effet, après avoir pris connaissance des courriels litigieux, la recourante aurait attendu "à tout le moins plusieurs semaines avant de résilier le contrat" une première fois en avril 2013.
La date exacte à laquelle les courriels ont été lus par la bailleresse ne ressort pas de l'état de fait de l'arrêt attaqué. Comme l'autorité précédente le relate, le beau-frère de la recourante, entendu comme témoin, a seulement déclaré que celle-ci lui avait montré les documents en question au début 2013. Pour sa part, le fils de la bailleresse a affirmé avoir eu connaissance des démarches entreprises par le locataire deux ou trois mois après leur début en novembre 2012, sans que l'on sache s'il a alors effectivement vu les courriels. Dans ces conditions, le délai de réaction de la bailleresse ne peut être fixé de manière suffisamment précise pour en tirer des conclusions sur le caractère subjectivement tolérable de la poursuite des relations de bail.
Sur le plan objectif, le comportement du locataire, sans être pénalement répréhensible, apparaît manifestement de nature à blesser profondément la bailleresse, d'autant plus que le mari de celle-ci et précédent bailleur avait été un ami très proche de l'intimé. Ce qui heurte, ce n'est pas tant le fait de s'adresser au parti comme médiateur, parallèlement à la procédure judiciaire, mais bien le ton utilisé et les actes réclamés de la part de la formation politique commune aux intéressés. S'en prenant exclusivement au fils de la bailleresse, présenté comme propriétaire, le locataire qualifie d'"abusive" et de "pratique de propriétaire scandaleuse" la hausse de loyer de 11% qui lui a été signifiée. Au seul motif que locataire et propriétaire sont membres du POP, l'intimé demande à cette formation politique de prendre d'emblée position en faveur de son propre point de vue, prétendument incontestable; certes, il propose une médiation, mais sous la menace de sortir l'affaire sur la place publique; et il va jusqu'à réclamer l'exclusion du parti du fils de la recourante "en cas de besoin".
Pour relativiser le comportement du locataire, la cour cantonale met l'accent sur le contexte dans lequel les courriels litigieux sont intervenus. A cet égard, il est vrai que l'intimé s'est adressé au POP dans le cadre d'une contestation portant sur une hausse de loyer non négligeable, laquelle a été signifiée à un moment où les relations entre les parties n'étaient déjà plus au beau fixe, comme elles avaient pu l'être du vivant de l'époux de la bailleresse. En effet, depuis que ce dernier était décédé cinq ans plus tôt, les rapports entre son fils et le locataire s'étaient peu à peu dégradés, sans que les raisons de ce délitement ne fussent clairement établies. Un épisode ressort pourtant de l'arrêt attaqué. L'année précédant la hausse de loyer, l'intimé avait mal pris le fait d'être privé de la jouissance du jardin dont il disposait jusqu'alors à bien plaire et il avait déposé une plainte pénale contre le fils de la bailleresse, ce qui a manifestement contribué à aggraver les tensions entre les intéressés.
La hausse de loyer s'est ainsi rajoutée au conflit déjà existant et le locataire n'a pas supporté que la bailleresse, appuyée par son fils, lui notifie une augmentation qu'il jugeait abusive. En dénonçant de manière très virulente auprès du POP cette hausse de loyer attribuée au fils de la bailleresse, le locataire a-t-il adopté pour autant, dans les circonstances rappelées plus haut, un comportement préjudiciable revêtant la gravité exceptionnelle exigée par l'art. 266g al. 1 CO et, partant, rendu la poursuite du bail jusqu'à son terme ordinaire objectivement intolérable pour la bailleresse?
A cette question, l'autorité précédente a répondu par la négative. Force est toutefois de constater que deux éléments pertinents n'ont pas été pris en considération dans l'arrêt attaqué.
Premièrement, la cour cantonale a écarté expressément de son appréciation le fait que la bailleresse doive supporter la présence des intimés pour une longue période, compte tenu de l'échéance du bail et du délai de protection résultant de l'art. 271a al. 1 let. e CO. Or, la durée du bail restant à courir à partir de la résiliation anticipée est un élément à prendre en considération pour apprécier les justes motifs au sens de l'art. 266g al. 1 CO (Roger Weber, in Basler Kommentar, Obligationenrecht, 5e éd. 2011, n° 4 ad art. 266g CO; Lachat, op. cit., p. 701 ; Higi, op. cit., n° 51 ad art. 266g CO; cf. également arrêt 4C.35/2006 du 30 mai 2006 consid. 2.2 in fine ). En l'espèce, le terme contractuel suivant le 30 août 2013 correspond au 30 septembre 2016. Une fin du bail à cette date suppose que la notification du congé intervienne au moins quatre mois auparavant, soit jusqu'au 31 mai 2016. En ce qui concerne l'incidence de la procédure en contestation de la majoration de loyer, il convient de relever ce qui suit. Aux termes de l'art. 271a let. e ch. 2 CO, le congé notifié par le bailleur est annulable notamment lorsqu'il est donné dans les trois ans à compter de la fin d'une procédure judiciaire si le bailleur a abandonné ses conclusions. En l'espèce, le délai de protection de trois ans doit débuter au plus tard le 31 mai 2013 pour qu'une résiliation au 30 septembre 2016 ne soit pas annulable. Sur ce point, la bailleresse a certes déclaré renoncer à l'augmentation de loyer en avril 2013, parallèlement à la notification du congé anticipé. Il n'est toutefois pas établi que la procédure judiciaire initiée par l'intimé en décembre 2012 fût terminée à fin mai 2013. Dans ce cas-là, le délai de protection précité, associé à la durée contractuelle de renouvellement du bail (cinq ans), empêche toute résiliation ordinaire avant l'échéance du 30 septembre 2021; sauf congé anticipé, le bail court ainsi pendant encore huit ans à partir d'août 2013.
En second lieu, les juges précédents ont considéré que la présence de la bailleresse dans l'immeuble abritant l'appartement loué n'autorisait pas à retenir plus facilement l'existence de justes motifs au sens de l'art. 266g CO, à tout le moins dans le contexte d'un litige relatif à une hausse de loyer. Cette affirmation est sujette à caution. Ce n'est pas la contestation à propos du loyer qui a profondément blessé la bailleresse, mais bien la manière dont le locataire est intervenu auprès des instances du POP. A cet égard, il est parfaitement compréhensible que, dans les circonstances de l'espèce, la recourante, d'un certain âge qui plus est, ne souhaite pas être amenée à rencontrer régulièrement l'intimé dans l'immeuble où elle réside. La proximité de vie entre les parties figure indéniablement parmi les éléments à prendre en compte pour juger du caractère objectivement tolérable ou non du maintien du contrat pour la bailleresse.
Quand bien même elle ne revoit qu'avec réserve la décision d'équité prononcée en dernière instance cantonale, la cour de céans ne peut en l'espèce confirmer l'appréciation de l'autorité précédente, qui a attribué à tort une réaction tardive à la bailleresse et omis de prendre en compte de deux éléments pertinents. Il apparaît en effet que les interventions très virulentes du locataire auprès du POP ont rendu intolérable, pour la bailleresse vivant dans le même immeuble, la continuation des relations contractuelles pour une durée pouvant atteindre huit ans. Même s'il est lié en partie à la hausse de loyer, le contexte déjà conflictuel dans lequel les courriels sont intervenus n'autorise pas à apprécier moins sévèrement l'attitude du locataire. De même, l'intérêt de l'intimé et de sa famille à conserver le logement litigieux ne permet pas de contrebalancer la gravité du comportement à l'origine de la résiliation anticipée.
Sur le vu de ce qui précède, le congé extraordinaire notifié le 30 août 2013 est valable. Le grief tiré d'une violation de l'art. 266g CO est fondé et le recours doit être admis.
4.
La recourante conclut à ce qu'une seule et unique prolongation du bail au 30 juin 2015 soit accordée aux intimés, comme les juges de première instance l'avaient décidé. Elle requiert également des mesures d'exécution à cette date.
Pour leur part, les intimés, dans l'hypothèse où le congé anticipé serait valable, demandent au Tribunal fédéral de renvoyer la cause à la cour cantonale afin que celle-ci se prononce sur les deux conclusions subsidiaires qu'ils avaient formulées dans leur appel du 15 septembre 2014, lesquelles portaient sur l'annulation du congé donné prétendument de mauvaise foi et sur la prolongation du bail pour une durée de quatre ans. Il est à noter qu'au stade de l'appel, les intimés ne réclamaient plus, à titre subsidiaire, une indemnité fondée sur l'art. 266g al. 2 CO, prétention rejetée par le Tribunal des baux.
4.1. S'il admet le recours, le Tribunal fédéral statue lui-même sur le fond ou renvoie l'affaire à l'autorité précédente, voire à l'autorité qui a statué en première instance, pour qu'elle prenne une nouvelle décision (art. 107 al. 2 LTF). En l'espèce, la cour de céans est en mesure de se prononcer sur les questions juridiques susmentionnées, si bien qu'un renvoi serait contraire aux principes de célérité et d'économie de procédure (cf. Bernard Corboz, in Commentaire de la LTF, 2e éd. 2014, n. 24 ad art. 107 p. 1275).
4.2. Sur le principe, le congé extraordinaire fondé sur l'art. 266g al. 1 CO est annulable sur la base des art. 271 et 271a CO; l'art. 271a al. 3 let. e CO ne prévoit une exception que dans les cas prévus à l'art. 271a al. 1 let. d et e CO. Il n'en demeure pas moins que, dans les faits, il n'est guère envisageable qu'un congé fondé sur de justes motifs au sens de l'art. 266g al. 1 CO soit contraire aux règles de la bonne foi (cf. Wessner, op. cit., n. 38 ad art. 266g CO p. 670 s.; Lachat, op. cit., p. 702) ou alors tout à fait exceptionnellement (cf. Higi, op. cit., n° 72 ad art. 266g CO).
En l'espèce, les justes motifs dont la bailleresse peut se prévaloir pour résilier le bail de manière anticipée résident dans le comportement du locataire décrit plus haut (consid. 3.2). Dans cette constellation, on ne voit pas comment les intimés pourraient invoquer à leur tour une attitude abusive de la part de la recourante. Une annulation du congé extraordinaire fondée sur les art. 271 ou 271a al. 1 CO n'entre manifestement pas en considération dans le cas particulier.
4.3. Lorsque le contrat est résilié sur la base de l'art. 266g al. 1 CO, une prolongation du bail n'est pas exclue (cf. art. 272a al. 1 CO). Cela étant, les particularités du congé pour justes motifs plaident d'emblée pour une application très restrictive de la possibilité de prolonger le bail (cf. Wessner, op. cit., n. 40 ad art. 266g CO p. 671; Lachat, op. cit., p. 767; Higi, op. cit., n° 74 ad art. 266g CO).
En l'occurrence, une prolongation du bail d'une année, telle qu'accordée par le Tribunal des baux et acceptée par la bailleresse, n'est pas critiquable au regard des intérêts en présence dans le cadre d'un congé extraordinaire pour justes motifs. Cependant, comme ils ont obtenu gain de cause en appel, les intimés n'avaient guère de raison de mettre à profit le temps écoulé depuis l'arrêt attaqué pour rechercher un nouveau logement. Dans ces circonstances, il se justifie de prolonger le bail jusqu'au 31 décembre 2015.
Par ailleurs, il sera fait droit d'ores et déjà aux mesures d'exécution requises par la recourante à l'issue de cette prolongation.
5.
Les intimés, qui succombent, prendront à leur charge les frais judiciaires (art. 66 al. 1 LTF) et verseront des dépens à la recourante (art. 68 al. 1 et 2 LTF).

Par ces motifs, le Tribunal fédéral prononce:
1.
Le recours est admis et l'arrêt attaqué est annulé.
La résiliation adressée le 30 août 2013 par A.A._ à A.B._ et B.B._, avec effet au 30 juin 2014, portant sur le bail de l'appartement de 3 pièces et hall au 4 ème étage de l'immeuble sis ..., à Lausanne, est valable.
Une seule et unique prolongation du bail est accordée aux intimés jusqu'au 31 décembre 2015.
Ordre est donné aux intimés de quitter et rendre libres les locaux le 31 décembre 2015 au plus tard.
A défaut pour les intimés de quitter volontairement les locaux, l'huissier du Tribunal des baux du canton de Vaud est chargé, sous la responsabilité de la Présidente du Tribunal des baux, de procéder à l'exécution forcée de la présente décision sur requête de la recourante, avec au besoin l'ouverture forcée des locaux.
Ordre est donné aux agents de la force publique de concourir à l'exécution forcée de la présente décision s'ils en sont requis par l'huissier du Tribunal des baux.
2.
La cause est renvoyée à la cour cantonale pour nouvelle décision sur les frais et dépens de la procédure cantonale.
3.
Les frais judiciaires, arrêtés à 2'000 fr., sont mis solidairement à la charge des intimés.
4.
Les intimés, débiteurs solidaires, verseront à la recourante une indemnité de 2'500 fr. à titre de dépens.
5.
Le présent arrêt est communiqué aux mandataires des parties et à la Cour d'appel civile du Tribunal cantonal du canton de Vaud.
Lausanne, le 13 juillet 2015
Au nom de la Ire Cour de droit civil
du Tribunal fédéral suisse
La Présidente : Kiss
La Greffière : Godat Zimmermann