From 418d1991e5d592a31329546deb311a8eba629ed9 Mon Sep 17 00:00:00 2001 From: Nathan Melehan Date: Fri, 6 Feb 2026 18:19:50 +0000 Subject: [PATCH 01/22] [Update] Deploy a RAG-Powered Chatbot with LangChain on an Akamai Compute Instance Add missing chatbot stories zip file --- .gitignore | 1 - .../chatbot-short-stories.zip | Bin 0 -> 41973 bytes 2 files changed, 1 deletion(-) create mode 100644 docs/guides/akamai/solutions/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/chatbot-short-stories.zip diff --git a/.gitignore b/.gitignore index 52bce1a639a..7381324ecf0 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,6 @@ Thumbs.dbi *.jar *.rar *.tar -*.zip *.log *.sql diff --git a/docs/guides/akamai/solutions/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/chatbot-short-stories.zip b/docs/guides/akamai/solutions/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/chatbot-short-stories.zip new file mode 100644 index 0000000000000000000000000000000000000000..a353727f373158ea89e458eb885cc2f88ffff200 GIT binary patch literal 41973 zcmY(qQ;;T1v~63qZQHhO+qP}nw#_cvwryKqnO%MVb57jYv0w9b#fr=^=1e77P%tzg zARs6pj4XFu=v73~P+I_RJ{M5py6LN-usVw9$8TdIpZ5bXy1s5VZMO!FYqks3d4 z724*ZoWI`>T?BFo3n(>Zmbl9HJv>^Av0~vK!wrB&$@?s8czRA#fB3c00*6wIXLe~7 z>3)H2Qs((8sXu2MT%;NFreE#${r7G8=et%Hoer;F6q@I}2)wurgoFCOsdJVxL}m@x zk)^Uk|7LQXm@N#9S*GAu&>;m;l5NV5V@e~La1V$+uDd+ypW#@Npvy}1qKFgtJw10? z^nD-~{l%b$eiZ&;-7$qb%Zb1HwD@yviL`=1$qfPo@daI7*1FM9-diSag*rDvG54C| z5BXtXXfmB%R*#QEQtFJTBJnDS4YSAbB@GTdWe$h}Eop%z zP4pTNx8UV>6VdSpKISQ`M(22ZP0=SSW@^St;92TiG&n;KzHB}kR+VKNI_i~QJsFh* zvLY_bpF;K8n9}I0n4{d82PJdcL&pXO5i@bpS&3C60~&rk{HY9KG0!`*>sNfcf4cH= zVb#avJF{PWmPSdMhE!M{>!PO3m8b%>j#8xzoao@nW-qkN9AYX*=!)Ex636wehFKq9 z>_!8GeTTH1-kJgl2fQTx5GD;nY5}7#``qvfEv2&ndIf-tWp>#{TVbogd6M8@5tz$0 zT-HDP-zQ z2U9M2%|T^wF-9ZE98iLpVAVF=D{Igoc8ZL)ah}i|6{HJyFUKQF$g3d$o#v4OO(5XB z7c@{vLC{6nHzuc}bW(yC`&*P{*(@ssi(XuwrYvdHgR}c6Hi%#_G=w``-7$_0!kg{j zU*wR2%%C3;@j$|+*2$dG-ndePBx>6!oU^i4e+Ne$7E>FBko_X&%Z#_ax4+qoFP^c* z!31Llw4AXAI^Eh*8*}L`j5xf{tsRO)f@~kAT>?CdFm~9J6V#I==q$q@mO2zxXQI~$Gx%C_~qyiG$LToJLOWjJ<<{rPiM?}b|uheUPy#?jVQ zH|BCw;(0bs8qxDgt=Ne9`I-Q<^wH^|*E1vWX8PLjTCNG{9_|A;Fb?tK=AF4L9w0I; zu;onj6%W8bPlCSbUxiXaqsFi-aoh)8`ak65v}Wz&W#Q5#n=e5`SbFGn3uN|rHvG#~ zM}ou7Ua?|{)$vo@M-E^vhd`rm^gyOW5>Psy2SZ*<(bCQ9D8;EGA}8SEOGDObMU{xL zT}i>)m|Ol-f19+51ptJH@sG@ToUO}=s$stzMtV--yIo8}m53tS*NKEoz3eY!FtrUC z5U4|RS9O3I^1`bF&y{9%WE|`oDZFLa**b`IgE~ZCe8y1ln5-}|lQZdC1399pNR6R7 z(O6(8vOXfln)1{SMS|}3l|4{haT7Zh-}!t7&4pOfE)5lU6kFX|0c&wZ_jS}dqcZCB zzsb+QcFk#WxegiHVY(ruV(u$r?tx}1kJC=V7Fz7>$=fr&??j$WB`9yh(o-tG(3yJY z4%*_+gw8|3f{v2^&^D>gU9#jCZx*M(zju+;L3mq=j1{HeIwJ$bIh)N7V(;NOxOqx>)2#MsI#l7iCc9bUv2 z!sZb&Pk;GE?RrzUmp@oc&aPxc*|*b&kBb~^$ZZ&@Dz`c97pj-^EPbG~I{9Md!{3Gz zW<$?*ojpOx!X!(trzTJPwdQkZYM>yT+B4e{*_w2NoTq(UQ1z!J4(S}Sfy#hzBpXCL zndux$A*vjmdD_qVj-W|3FOom~YTXSFotgp>-L*Av6aOl8JFcalq}PQ;F$R$?Y0!`u z;ipl!ndK;OZI=Xvo%L_$W+sVv`jls6Js&pUB9z!5Qk4IdjZDNC=}^5w-V1$u3GbGX zHu~)wEO4(M*WLqCBie#g74p%;aGwQySGzMt=)aX7e~TM7j@W}velaxRK{1LnIl+COr{GO&|jCidGh$NRoUHfQMFQl!Y^IRwA)uRbR z;@qB~kr_LMC z)#C+3R#G+K%5TpzYPekakTdj%ZpsamE-jl|f-a4Yv>!I-SyuUb23(d|T=0R5cXfi< ztLs!Q9*~HhGOttUaq93bIy^iDuv_qdEy(J%5l*SIKhGMR9%e3O>)G=8_|0POlH5D_k;dw#~T)%(7uziy+rrP zARKA_bur|7z-Pj5?y==o#5KPBw^)vx7mBNh@r!Ih?A;0fT3qlsSTRfH_~=3Uk&_Om ze9Q&7_dY>aY>aQFEEeG4ztdNBgg^qNfO-m5O~auQx0Y8BkYV#BeWGdkt}$Q!^6RfZ z*73b5h8)-mts_$TV=h#c*b6EQyb|$dbsMMQ)>_bO5OECqLM4nuFDLRxMzALt(bZfA za!q@k!>#5y%U+zqz));vqwF}AZW^|BNyGbBbj!+KqfovN7@vENA=>z9&(jb|56`cPj@OyZErY_JPu(z1X_v!kAVMQZxI# zs2wmU1YkvBE+33yqC86P^6zbV~iZn9)Ba?ja!UDE9R&9O3 zyy&e&^9V`;$_op;)6+0UIu0@PJJujm6jyS{&;M5rW%rCDS{e=R?`{UwGn&uDV`P42 zOwl5A*?G$mh!{_9A!4a@y;ac|_pgfkB@~aURO!4Zz319RZ&IumMCm7nik+w!0w=Y#_-RxrMU?j|2blulB@=DtC>l zv7fptnZW*_lTjEy7uGSKj{?%GLWgI#r>P?zu7;DAqrzi}Wwgq5Frvfx(OMWuL@m zUaD4T`WzVli4lg|yxQ7|O8XAtQtnKZTPg!F1HoeQtR*~`W2Q6=e~nik_MUg-<1d*$ zp1TSm@|lHX9CcvFc(eA}TEv|hLJ5n>u7RUh!KXRe`#+`s#c;Vn89Ot`KtQ#WKtNRg z!*DGBm*MQq?f(za*_xX>nY*|eni;!WTDko{kn`91|3Qwa02B4d>J`|cG>Pq(PuFyY zfE&%AL^=tcAE^kq*_Vr!a5%DYzBu=TY`zXe>g}T?8!;CQR$W_L8~nHA^VcT#-6PK0 zKEUzLY$bQMmvzP|-`>aP>&)D~ABMTkRPTxLKiv5^j;*ZBT%7f)aev+(?f-1)+G5%^ zQ|!&NGZpOS+xf#hmuBMV>XEFN)rDG|sHl(IcOt>GQT_qMfVF3d!--YHqx$i&V!&c|U()Wv zAJb9os=?me`SZ$3hb;?0Sx)Q6hG#d*iz@;oaO4vXu>ea?kW~X&+2Kk3;qG&wi#gO8 zSlEU2PnktqM8H2Khwj|LwL|S&@T0N5ps8rgZL>K!+c}T}$`Q{cb3kP<=Lr!FKt1X*V#wz>m?RW6`~SS811Q6!a-E z3=wI&2?6r%Pv>A8=1vYc;|HJ4AR30Nz3J2Gp^zDTsEll~B>fZA_aqbzlBniN8F{O- zSdoS6<6E6<4f)oi{FeJ$kf((*+`q4H!Hl@kM|7FNJ@$k_r}4s3(?3`}5}P4_{G849 zh-f{+++OQ!C5WtY>r_doBN;jd?Xf~~gdm|vsSV6IkI{N?RU4Zd({WU9!ugRXC_TLq!-k?Mm76eI^6% z=K34t5E-l(X6cEAzR9ownq8W3Dmk57E-k}Puz}d{6R=kNE^*ZbpYv+FgX@zOY8gwk<2KtIxc2odCRde$qZQv!*uFYC)lGXJ!|08_2M8f5b#{~7iF^53#ea2 z6dV&G+os7NHNjYD%pLL#<`HShd~IYDgT(j7hk~q_!vIJt3oT{6#-uL#_+C`j7a9Wf zpsDoOS7tbz5lDjn7Oqqa`zY%j0!)?>%V`yR2fuXHp$H9i6von^St(a0Tw9f z%|tb8+YN~66QnEN2Q&v*Dfvx0a~a-~8Dk<>=8I$3=#uPIhX#3*lw!MGg2m?+SVzQ$ z?do;67i`McA*=n@zA4)qTPS;XHLC0q5U8PdDwFhAP)Qy7P2;TcGziUnu2(OBjI8U6 zvyA5Ba05DA-xa)5TnXtmB0%)3eRDugKGO7C*wdn_`n*M`7hm^JM#AVF(d@$WGO`&H7R^%Ds zxEobQ0AiiKFKmNOW1c;uQzfGuCR1d(gMplUNtGoe2?doDG6Pm$g0*D0?JfOL{eIq$ zTz?NN+@4uq%Dj>rgsns}?K>NO&Qp)12W8mu!Du&WH_g?P$tlQHgfa*M{ z)}_q`(=oM}@NpKV!$TVIjtXnu?qP{ifammJkXj-S%cIoO|Tb zCT2}VG)AHX{Kr`zY!vL?`?N;~850LI>l7SAiyJP)BW7EQh6oshlocq~I4Uw6@eot; z`OY>hwC06)B$WvI9rg3g=07K+r)U$k5B1W!XMiiATPK2%PlqSGt}_ z_~7J<|ILw9yg{rcY0#(z^x!ggH_p14Zc( z0~^bTtZP zgMk%O|G>C6ei48gXq2Som}B;lrzg(7SI&5H&!tLlCo1vj7zS+=l2TeuxQl(&L2o-P z3CRWWslKI%RI6 z+fsyK!wk?$=71-&rsl^9{Az}wjD2xwqNRT+Px{$sc6BN^IK~hyEXMn((g^ip6`cpu z7dywhOT8L*+IVWlo^9vtPYYlLHzqxCqZzc)=$ea}tru*$Fz0h=rCz*{JX`3k;3pJrt-}I@-=ts0-!_yl%vP&ZI~iLl{(= z`?d&-5pqy_6u;&`WKI z@*YMF(gsne%2mG-vvyg7Lke$sH6(Cz0#K~Qsg+wKgl!Aep5H{E*6e@k{W-cI5I){v7)uwBw7)p9>xFkjdaNT4mr}ZnQyZ5pQi0Ijf=Q&%gsCUPyvC*s!A$)k{oJV$GIr*r#WVWzvR(n5 z<3Z`s;z%ap&y2$fhR7}visB0oYwpP*>R21xw$x;Tj!&v{U=$A(0W~!>1}_XQ)DEvr z><8AaF1DI<=?aGMHWTx)a3A!&*^g_~7sp{HeYbvU;aiuHuecal`c11(zoZS->emm3 zgbyIssW(V*v{%$R)2=qW9BwBwdW}4jdmEg)_`TSaQeCs1C1>heOA(d?wcg6z1`od_ zUyyee>2e>BSHYfgaou7iMd1i`uo|;EXDSL$0@SX>je(&xAi0i*;{pAZ1(nF#x)LNe zt*nt};#XJE&aGnCS%_of3JY0Jb{?sC@lt`~_Jd!@Z_fM&oI2nVbN>z?aF}wA{%c}`=GF>aczVprQB^e-!Dj$mv$w51RMCk&@!TJbe^Q! z91mD$bX)e4n=1K9zdEa!$dOmUQG6fu^m3wYqhDuXT*&Q5x+azhdddV6zTBtP$ye>K z$m;^MfQ}1xvKh5sKF+Q&Z(2CuhE$c!U_6KJ6$oh4pMH~ zD>IZD_4*JDnyJi7^DI<%39cch{QE|qmL4gI&(fXZ5-G0S$rqxlPbfgosTKoWsqRY# zC?|OWjcTE7trE*oPBGaR7!NCvJaY*+@NGOkk?MrmI1xgGhT%tyL3~Xw$(6>nwPm!M zYSFCx;=PA&-6!gTk$ z0}Sdjv}!Q3W3u@z6rI=Xt99vbyQpeJVSZQSN`PvCbghkUeIryx72Xc_aZ19cLBt55 za2-{crV;avaIp>2()(94I#Y zUGNe)K`CJ#eY1)2*Em#$c)VdN-N1aL4vTlQQEI2ZI6Q1cI|_}T8p#DyPSdZO#gZSS z5e%K%a3U7uP`d)0xZ}3KY@#9KkpkSD`|NBt)wD3OggR|3)S8~m-AEp_UIa{$0=>!n z*H=vlZ8Y%+1ZvQ@Cv} zI7VkU|N1Fw86-q>{dN&23&;g%p&P2xkMc&wln&C6)I(s#dYuDz!$CLK*Y=FBz8EAp zO#)d)G<-zd!f)3EUG8;~G(8l)z$DcJmw(nF@OSFp&jM`hFX!ub0vLlc59RKBF)6`ey!iXAsd=KjG;V>Qpm1hJ>Cv{F}L7;NkjUCjFnB8(3&iP zo2J7*gffUi0@@;)HRaeq8pv4_=we067IQKo;C9}E?oB6S0bi$_;s=a*d<3I>f1SAA zxL1AnN0(O#>BWbC%fsa)T4uug$#15ym!t*QgyIi*CEbMa8g*VuToi~@Hypl8#Glhg z20<>U+Z!^#O$kY-1>*4bh;=VdcXOr?iv0NXs7R@EASI8`i%J{k;ugD3tRJR}kO=~~ zc!LYnj#O6zsAcssAp^gWweWw4-No3I3R!Kz_e&bV-Zw@TEd*=!zy>Kc)}BLU3rv-y zdU{^dg4KCs2+2V+Ocxj`Cp?xx*RKN@&fjrkiM$AF=nMva0JUGf-zb)aP=G8S-mZA{QN*V>(H2?eU#tdsWR!7xMeFpzsi(s={>nb@zIduj*k9a;Q^X^~Wg4 z<5$Q3Eri(i_6i;lfq-(!fPjepM+mY0Um;{??CNG{XZ@cAvT}5HHUB?}zP-*;!Y&7j z-$4VBA0kA^)@M*JmO_%~JrX5wo@kO}!f0|4~hoj9v3!29=|MkzC!pU)CjmV#sM!g0#Q}cf z*Vq(&j}$491JAz)!GC?7bl9M-9}g5U+Cyq;L0>8@LUv>4edIwwpZy3XxSrWxGYK#B#OZa z%hPr=UL(g3n1B5DSk=5+aiOQ^i29&}!Qy|S)?Dw`t&iR?@VI4{C3C-U3!;WW;v&sl zJ+zf*xLYX}fU3F0@1ewxkvfOM=QqCVySlA?B=ovr3FAyj(0ZR_geWEG=Cng3e>#P@ z2-~ExgM*#$l+saF4>U4;#RegtWi^kd%1vuU_Tv-JT0IPq{&5j1#m>t#ne!6!%MQ<3 zo{IfBDLz3TgL48W;SwVQ-kEiV*!I%B{Vr9S*~uZ2--Q00oW@Y`0{Vz=JMtOS6H3Rw zzX4ZE2?ssu_}AKT6%s$5#4m%KWV#Dz-1i&&aZr{~K$|=jEZg6=SDG znFcGRQbXw5{ShvGbVvG!G0H^PCD2U&VjlX-hMa5lo8|duHV+Kg7S`s29YIqi562LH z4)Ih)K1CmcZ}(9T+G#b+9*%Pin2&F~R?i5}Xd(V&V!zL8%3MRPNGlki9eszW$)U$4 zA-HwF{MHjJ*S<~S{z_#jtH$`WbYyRrB~pA-`pFC2ET$GR{=%-|1TOgdg+3Zz!J7$x1qfaQ?^rl(e5ya&E+yPfPvog-bzN+w-x zpNYx1Rl2JS#^wha%Hz96zI(C~D3wmTppH1=ex4}(wEq4)I^jQL7}8%-P_el8siY=$ zX>PG>1_Y5FKyfc)P-pIi{SZEdu^oT2H^!CymFKL-y{g~ox3!#vm4f!J{kS4oK{gXa zfHtAcH+2CyIeCoIIBh;W4gF*fb_cvmHqL#zb0+Z)aY<86fRGw%36H(6r|pJ>YRZAu zTH0xEmX%z8Pqz|k@})Q})g99oIz8iUq4eQ{h}`$+nFg252>+o*>3$H9O%AHtJ~@+J zh_#6)dKT&yeQJqDv56%ho%_i%o;Mk-yg`2$TQGD|dxte(8NBFwPiB*9nB(&3} zb~i|>(NXLCBkl+MfMQ#W|8_b^b|3ngJQi!)=EO0iK7&UVGaAxd*+y&YUl-&E(a_;a zc)-u^@3~)N7u*J41a-nfiZ}s5-%cUMQRh%24d5M6rAMkVo`R2 zb^>k)|EJ(cJsA!<_pvy1oETn_lel8aKNy8L2ESGvsY#qAX0Zu4GMlgG&e8Ks9hy&e zJ6ZmX^F>9y2vQze#k@+hA&P~=pwYP2iaZ7yNg%12dR@m7*at>=efd@v^fJ^gs9)%f zNVe^-xgZ!X{{7JiaV5GtEPo_BcK58pmVL>588SGhX4OJjd68cBc`o#_ffE@Xl=2t$ zCg{bnT+eSnJSJt0bESAwuyu@Py{R2joyy-xeN@Qr6w9$){b>plYJW>-B zvvzDOm6WgS{H96FH2rp2=8Nrk4KH97yBi4IG6WLZ)8G7aqM$HTnYEZBT6sio5PE1+ zb@l!>`s%IDBt!mZb!lVRkgBE?GB$6^-1QEFjylk;?-D$B7qK?)$3bcr5A$ZM8)cZ5 zVRH6VV&srK&^*TF`7#Bgd*fBvR@(*8KEF;6Q1%RC048?zN{3dMm2T^@M9b6+hO1@ghe5di$c%|WK zve(0u7IsYriM%qk6HZE=&_t5D_^X?VP^aE?C-`2vJh-kJ+^~ZNlB-K-x@w*^pMLF7 zX{PGEWpmzl*_?4GU%BzCKYV;g_!BUwgCzT#jh^`9W zvFia=0ULeQjmFU0yM%VHeFyijrIN7z;|^^s##gZK>d2o#x0HAHzMvr4D|5}RQl8s>`6nyA5FMu=*#@Qb6yOK5s@5sAt(e7q&)$z zeae`g4c^qxANHc>4w+49_!` z;6Q-s^(fNU0(zbc`SLxzeC?7|(k0FKLii5&C%j3a4TO*eZ5|sDYlKsKQf&u>2cqq2 z)8NoWOZ+CHnViJhGr3zU0pVC-m-|l?p#vkLc$JiB2?R!x7SSt6g*D;xNcYl6dYj`R z;BZYduN;jIc9`l3`%564tmJu)C?L8P3K7_C2=v_@8I!;FH2y$XJ6Ve?P;YNm1?CQG z@yV8Cnla;P&7G{s|F+_egjc=0*RTNzxM#Vj?JXU*R#t7yD;*c|Nbg#fBA!>~o1Gz$ zNI`^jUt;xE>oI7W!5X$kj!xvoeW?W>3O%C++(>eWR$eQFTZZ{jUlxW^{mX{YWi>zz zI5bz3^{Zp>6l&tQmV1~qAd=964v3x}n}0kFxkyusDa%+mlr5298i7dOt z`Dby5DuS1WlwV6EF4xwECWMWCiYk1e7@wfmUEhyTy=AQnD@wUX>g#3fIAJVSPohW6 zUYpgFqxI-`K5fp9mW{b67Q1kNwR!o82_YF15-@nwxk=R~MB|&*?e7vj65({=ohK`y1?^$wLKqy)JAL)ElO$1M%PLs z2~GEF(n6KNH$tmST2O!1lJR9J#D>qUQlk5V_pY~irr}n?tm=>oeLVf z@`oPJ!Co_x)odOYiVC^<(vQt4M>(MXcz6oA)!?Lgs_mo|d0O4E36^un7kYTrp!Yux zDAcl3)TAi$u+;vegr;OS9f*eRsmL98K3q|+~A>T;7>zuzFekZ6t3~e_#;nC{`OKk9_{~{ zR?}DYl?@iHp0q*drZ{JObJ~tw@9U7F8IIDxqUy!2w29&fJ?oB;V#(HPS%B_gVcFNZ z>=cS{|A1IGT&8d?DeZ?3vgkW@&ST%rTF^hAQoXnpXdK`A7wt2YagdFTQgzF~F;VgcRUpFSq4(yM~k#)6?)$Fy)E z3$l#Uq|lHky*!}Gq>~a~tSL~IAMjpH6!x+=IQ8FR*>Apdc?vJj>Rs?R_z3BGM?3P% zd##rLS8c-Oe4Q1W7Py4uR_Jf!b1scsJUuU6t>*c!fH1eS@Z!~}0v6(ikz-*ZGN6P?X5Jp* zpr);CNjgl`qTjk%gs#CMc4Z_a(0L>LM+$y*%GC+)d|kLVjRbPft_&sfn)V?A#doLe z$AUghxHVGWvvhR3>fue_9@2B^W>Nd3mXzgsSu_`je8QwU@`5(@>&^U~M^CeaE@|V# z{LXRtleY(H>4_C150LkEFA^!Mj-6Bv?(Vx$cq6!?gRAFGtfI;J%KU`E4YslNA4@vMnu7ysqPC=Xx_JErP6ACvcmw-Iofd3otE!yuGofl4XL+pGOVa{uRRqW znnGnwiM`dTEv+JkU_w=Z0jv~hKI_6})(?+XJ7rwdJ22!u{inR8b8;+cGzNa~hB2#; zIZzOhLY_QsHl{HYu|7;H?lD_m->}%eF*lm~gQWDA{8hhMW351ZX{<`bp_58Y#Vjcp z8b;{|zk2uk(%Oe}S*R{VYx867ihmNG2Pa+>ppFTL$y1-uS*?b1(t@MbSXTk@ z*DoG&V$mNv|N0f|J@VykTEYb0LQ*>G!JN1HbO?t6*{m|iR}nqo3{7*scw%(80_MML z@p4nuF?dE;cf)5BO|~9#mx?eXVgZi9kq^5 zldh>rR~H~L%wnA4eoslMscZps_Q;ShKAhyaGJZ48W$tqb=46eK=Tvt*QnM3QQ0o-x z+Y%D=^ZpkN5dN@4aQnXl0QY-6k&%i0Q(kwL7mWH?xlRrNtf8;O1UXA`)m>Xwxy*-! zySN8luI`wr`h&K_a90EWei01}Uz&#Wo8(r)JqVhtk7>K4`?Bpe#B3olGsn-&BA=T+ z`#SoW=LAPgB6w?a8Mblzqwix38s= z(ao82G_~v%XUoZKR>E>R;E(uS<;K2p#3Z8pg-$()Ki`tzYC)7wXoP6U168omUD;aA zyUivL(C%iO;5O%Ta_yP`{>|HCntWqpk=OV+{AuYn9tHUsUvfN;08i=s`Tzi0Vkt&FNBg%JNKGUM^?@!ae|uLLzKKt!n+cQZT+pvK<} zX&{}(38#cgzSKJ1R#)H(8%%dXfp3{GzKNCc>?fZPpN`1{B&#j8K$5NPF0%BEB4r7D z1T~a(**ixd1xMY}EhsSSVV42vX(JI1yS7uCdZ)n$!zX0k1vjMBaE^^4!)h0)?+!{E zKWVaNVPIo;x5gm#XP<;uiay0LEPYBAgDk|8{{S16V~0)O>E)c;$vy$NZy5Lsiotma zK9(izBJd=pMx#i&OHk-&YV%2n!OEGxmqsnMNT~XHL$2mD?~L&L!9jSyZ?Dnup|^%m z#vl1yr8Y)xV=w~C9{-T3F+jAFRCgdQ(D94oWW8jRmjUsCSbq+F=;q9<6aN0tL&!!Y` zg}KIMEJp9fd5l79uYIKSig`MywabPN6+9Q~q(Y@)=+)s$&%e<*70kJn&I}WUwXGQ# zp-qAo1~ybAJ)CL@MF_`)F#L^qdIUsv%bz3-8OZm8^GBmWUp8=Q*-95Yqs*|Ct~X!| zg^?2egL+0Ss+%ZY(PI8vbI+OoLw#5&hF)>`J zY^_$uu&}KA4@lEvEh{PfHi>m2;&Ieg5ekv0LRYB_h4xcC9sd1T1ZJC8ZKSF0FkN;+ zk^sZj!B@6*BR1K=@F+6?j;dVDP~;1e0Juib%Ni<197X<8$GlFx!D|Zx^31)=vuKd(b-u zm9gsz4k^g5?2}d40GcCq>P=CJ;*!pSMfj!}zt$rp8M(Zzx#N5~4<>X|`LX~j=%kv! z1p6=xTweSV2v^^Pr{8cubxbQQ5$}gD3%6}+nxaKhU|%|1pJ|&3?vU++JH>eZvky(A z)fz;iD;0H%rUXb__|DG{6j!Vb+8x=Nw)GDVgsql3zEMa44gu>H};f(ms%S>fKFs4WyLu z@fn$=8eiXv40A9n6eA@DpBppf9Rvy5L14?cs&-NGr3|iwiKloQJZ-bedP!h+xindF z5PEXbf*}i2RLh699+BE$iW=e$E%6^@CJcv=S#jk?QWBIypmk+%p<&Nd50H_Ur$~O=P=FVxQEtslIBSEQXder1|5s7fpSd{Ol~^^?a;D zjdaT<+ZMx@pz=nL9k27Afdh*Vx^JP~>5C757e9?$W*48n& zQa&V0$8MC%k$%iTqsxSx$f&IHItmUQ-Cy*C-@ZSM-S#7+`5HRe!B&Vulm~f?awZLF zi^;*g2_vH7P7^Z-H(l^H)@1mf3^pw&+iuFp4FmqtzINSgbF8ciw+2d4KGMb!rDpl{ z*?isUr~*kgQaKghXHvx!Uy){y@ITAq`vl9Zl`1X73x+`VhTOl@rfD)!q#0o$|RP^XQssO?j`<_Oo_Z8b$}rBc#=O_?YtMsPQcb ztra8_XIqMe{Or0`u92PR68iz#21BqRRBlmP&fO+xjvW6ldp8rliscbxX!~bsaijb( zg|ndoq13{IVuaM~kV^MD>5 zgblNDJUvw8WQ||FUq35Z51ms?RJJPC(>RxNXkh3Ct_B2k9`yhlFy5b^NfRK2=@ux6?(#UQ6sXTv5ikC+4`-)Mzt+qE4h1LgZw_e z86!8;(_=&sR}V~aKl>@b9#?2Q;9ncHn3h1`i7Y|qJdQyz$I9C=S1?+=rnE(8Hn}p} z3q|qRgMnv?a0Hp0Em*(3rIXs{qL6o$hW`)1=3^&vo2#PU6)l);uqh9OJRswmUA{BW z@N^rd_4a^CG1>8(W>wiM_GZ3w6g?sg_{Vv#riXEyo$ltD|GkjGR23{I^9(z$zY#SHMNenE}*%CxU*tGK#26G^zGY)YI5#1y< z2%ulGXNE%pJtt4&p_4EsDn}6=U^SS4RvfSFBN$n9IY)tp!byU&`QW<(!BW_{Z#x4? zRjUTV89Wh2V>1|IjA9V^kJveux5e=?CYqi({{f=o^utJ=j7wNF^qs-jBDbd;H^)sw z$EmVVGuI||e1qZF5g%*vDxICGdUBj<*$*7e!N5DdG79v7z`Cb1DOEc}(m;>VNx_T?1$&zZWwG_gR^$jWkrDFg+cyOH%R zoA9vQUD}^Y?K*^qd0=3Z$)YUottv-a5}Dv6$k`eO5SKn8zQv;7%RNJ4@_jt%?ib?X zQeCyDp_t?Gs&(!@6UU}6ww}@wG}hpc>K0i#Mm?MNOb(E<65O|s8z9D9V+|S&pk^U* zQzRin%E(^DAAC`h)B0yK9911*NvZDf} zPwu&b-IMXJ4>geBiBJ!@IX-;1&AK5Hd_b%jm`!hu%u%#P!ILz?u zn(ZTt33aj*m!9nUU0zZk55A^{jSfA_c%plSoY>8p#-F({?rq;&)0sKPg~!||Um}+d zgjnw@P5t;1Z<^pV0dZYgzSUu}R(D8)v6o(s%o`g&enji|mdO@+rM_GZlof9yBs~#^ zgfNM0s)^+xaoQ1AYb>E)*X83S*?%pw)ZEBOFU^dT3<+>-FrH6J+~|@@;aX*g2WFQY z5>`DD;9A7%?qJzoa>>CR@Um^M)bi_7EQbG*zI$;Ll19X*asAN$=)L@Tal7|I_<4pc zrjOvBB2nB~)2|{`QC;mSxlT4M>iPcvxH`x7OaSOi$F^;Al1yydwr$(S#I|kQw(Y#J zF~LNewtH>c{dWGsd2l~HarvqlYs83Z@ST5*O!q1u$pu$w8PBoW`2CQ*O2pSjG0+{^ zG3*vFq<5^lyns1J4Hac6Ljtm8!2P#&yZFryMoa%>f^ z>EfxEgh%;VRQJ-;Ra+M;8bB}r^XevbyOyDqZp+FG&veX{$8g3M$%vFH zAM@Psx=kc&g1^$o4nwPDBwDpONII}lS~DQus_;a3VZ-d|mAYfs&tt*)4EX9#l~*00^&sB-wVWiuXk;t~`j$(SAQYPCTbUcDR#exGft{!1FlLK>VWZtzd&-odIA zsyH81F&1;h>TCwyv_Foms3-j3xX2635K^HXtmYlU(TsfE!3r*VC}x4a=8{UGo?J2D z)Psik6`gu5+*rj>wpyQw52i|{cIjsMwhKHU9;-vrAOxU2` zuHTrU3Y5jNI)D&41F4XblA$`kH+>t-(l^5D@|xuSxwGSbI>Qr&)kg zvf*|&kTX5zHFSoVcEw?5)-WfxyO8dQFaA~(d1+)c$B%oN)Syv=DE&Kl?gX!^hN-BD zkxys(O6hiU#Du?dp3B+oRmq)M{d-}O(o z^3huWdk*h&@5CY3+IxTi5sZ2GnQQo1ecRFw{$XgGYoq;!M6T_iyho6|?fpH0;FjD8 zGE-lAlk8j!jM}67#vk72uz(5YOs%}8 zyz9Y;QcD-k$48Nsm46AELzOZ3_r`XB99@!Mcc36!S&vwC>qTG5TL2yIyD?`FB<8?k zqF=;bqnxovov&CPb7;u9KzC2B+UDi~q+#PPIXTP%BjDoEiS6 zc4)hh;cf8!eY-4RKdOtsgu{r+FRbf;mH9pnS+P&8?tHHtAsj258$`GHBC7 zslL&ToOSOl{AwoKGX40q+&;79A$8pq!+W{TGUkB>0MKieRKEsBxz%*@YR?3Ej;(@b z9lmRH??30*h%m)}O>?HcP;{7mhyDFbv}%LL#;#QQStU(RGDiCAUEGARP~E5v2Bj%* zc_y25G`I=hViRC5b|Fv`=KL}nOpf8==zNB6>6Ol}OkF#S>Q+nMH#;*F%_Qgs0)s%I zkZIy%`zm1$1=uMPa&5{K?+->|t9aw`Gs<>{1?&t(`5@gzeIn)=@2llog5fc3b^_sA zP4}&}xq*wzogX(`$H|QHr})NVz<+vz3vBK1S!a`&n&eP6SKe`pN>^ZX?lZJ*iQ9zh zv~2$08@vX%m<|*kW=~Mg#;>N`C(PYh$|72LO(?PswMpB+K?HTIujt-Ft4FVgToujN z#P`-mRI0c$HtZn|l6EA+b#{2Tg4y~659cm}L7P~5cdC(h=er-Hi@3hx+oQ+>q7}td z`>w-NEUO>f$~2m=J@dt5MKM3u3iM#@iodh;dX>0`TvyQA)n&Aa3Jj?_FJG z^<;=>R2xRvKp<(hs1`l>8c18{I8epcOeg5K&6r3K(WffRgWe!+{BamCOTLUU#Y_w! zNZV08EqZ5+9dH4_?>)BYHJ+MXvZ?2w;~w(vh7s|f!>-)wxZtjFg<53D*}z!tM2YEMGn?I4Eb;g3M}K@ycu&M zNGMEr-CJnrS_3|sk51Y{1PL$xzST~=XgWT4t65~oBU3$6TY%uyJ|yTD@0P81t4%B_ z^5X$s7pOg0Y%5|1%pf=|RT~UHXrfn-W2J6B-r(`>aRG2+RoqTEN)WYxhGKMR{B4dk z!0&DufAQxj=|Y+E$3ibX9SzNbG%W5KN=;OKO}K3Uou^a{uAAd}YlFR1krGk|@Pc&m z(jyF}7GCzUkh|jwbX)ri+4c-0Cf2h?7G^6E2g8KjEwiE=>MxbsD>iivSZ{PSC+H{! zymJdGL!AgPuq2(t)7L9EhSjG*E3%nyq5ZYFJ`pN?^ymRhxID7S#v2@rVT2r4EY z-AfA)T=?INFMaAJtS_Blm(k8A>H#7VM$(Yn^B19M9JRj`ps)+w<#Uw1&7uqciQ08H zUMkSjjWWQ;zehH9#&)>DDpl~KwFdLT8OXvA&~a#yn=Hsjh4Uzze--0i+KUgY9OALCez)XjIuTnO`KfoFwjMdHwJ4Gyv|HA1D$`q8v zxB*I+XSl8zug!~Cy$^?iThZgJOHX0eFw1FFxdbiA=GU=$tRexIq%5)%U=3u*ewrSZ zXi~qUS!Pl?LfZ1XZO>29mIGb?M&Vjs2o~zJR)bk9D=dI=o;PEQ(n7_dZ$g6Bn(1*s zxW~8INu{prOG;IwS<(_H4V|aB3XH;q>-_L!FxpnXk#)`t$4V}e%;KU*jvwBE$v69b zrMbz4o5ZU2y&kabkBx@wD)J6{Y}hc`!IRj#%{Mi9`!{ZMD2E<2FjuHb?8oS0Xrtrgs0w1M2OGxb;+W?jHe_U}#RErZbcW~hcUY@Vg+Zy9! z;>CKUpt?Txe2XPZVgItEJ^ZWN7W+2?yrjpLBl9JVfvQ|Ou8iZ*v?mg9w!*izue4b; zM(tgFG$B#_O*yfVF@ObCN}MW4+7@}AOt^^uiqK8TY=-M);-0Oee+g{-;SB^79#p96N0_wd$1Lf>H@m z@@5o3lwhbOX&VuNGtr*&gBSaD#G;N&7QEjaj4j>|b4& zVk3{&1;ii{_I0f1d7u*V22D-mAd(yhD@al*>!E7>y&7ZJ{@T^XzTc{fyi6Fo1TZ{JPG7+Z}< zlvl{vBlFd)+4g$%(_H7Kv_tDk+8|ia29%}n1;m$M0pWAdB{id6a;ve%HDdMMK3nOx z!z&E|9?^Nv8B;qu=DE;jHm=RQZ-4?1rt;IQ$`J+ z?p;9DKlw|w`>i-De3*A>)rDSpaax#WSFl^}C(|H0>19?x(a6C7mvDC4kTh*JHg`L9 z&yiH*HswMuRtXFnnJyj;0;9Mx6qsl*Hfr2y;zKKx=ittm{w1|kCaE7E|KyOHdmc$y zD$*8i$s?Rt*pTl(D;-k{SK@}lj|(?;A`7$&7WV35kJG@w2{dE}3x1-@Q>Ym7`#>+U zi0uY?%>X9!w|I3&3AR7Mvp1*Zy`vH4F;PRLrg6W6nn_5X96NuSE9xsJXB<+{r&ePp zKkhz}GPX(b?TWSPuup2h9s!S_d3|=1DkS#!9K}B7URW7g+8OKP8;K9Re;$p+bB;dI zrwCw{b4y3V1Dp%fEg@!r zT@TX)a&wL7h&WVIPC2>kUA{U{L+7l4eeQSb;Zy5xtML51IPo3S>094SAu-ASi~`ol z&Y8?}D$h97N~vH4AMv-9!z34N=7^ysVu&H-&r(Yu-WP}1-3AvR}iCcUl{%@%vgUP4u z6#)o{@P``tKfsY}|0y*%IN2K+8d=&{x_JIybmV_14!&9gwLjpvtf1 z4C}E7LXa)stN!r>Qb(~T2|#*rE)U-^=|kvSqKa!$;>k5h+D;C3q|JZSOxRx-Ptq1L z{EIyrDf!==*!`O<9S(N7>g3!XsfQi%juQL4UT%iM5pQ>Uz?APkCd}Bo6l8d&P6_G0 zvTg5u+5BDEv!Xt%qTiCooMnRF%BIgdEX(5b<@L}_O zZ?8>em18EhDR6TwPd1KY=JsU2p{aiv$udlYMY9Muo+{bm`1VdXnaVhJ#CTN8xAx)G#hw|T zCDHQC{N~NF-##1a54UkTHO;(f?jCzD!>aRiS?b93?yum=M(aD{ZY1nWfpp4t63Lxzre3=D5I@O-u$fI~+#pse4&)w^JXG*<38W>jh=pO^JH^Xf7Hk-Bv6B^d@ zy8sYMr+=8zJs7rt_f9%W^6Gg&cW`h^T*>qvNa(a_5Dv2oK*c6Phw}`fo-l93C~vpR z-^4V1j*C)eF=(Kh3nkCkpd!p0>T__yX+$#IowDc&jf;sJGY_2&Ri!PF7}Qfn3qn;h zRB!dO5f1MGGwLR4f4|>;4;R-yHBD)F0S)HP%)ORwJUhey^v@qQAnm6>5IguzxaIha z$MT@I;Hr=!R$#**N&6(RAlt`e5RfNrA;a+o8j-P{KhaMi4AjLKF*z{p8c-9B{I^g( zc@cuzUz;?8jwA2C_9Ki6k;_*4t!oe4_-0w^^+*Q$%tM20b{7|i4jhzFK1yO^NsqvLO62QzC3`|xP{8Dy?-4~F16Kp_yA!Iy@^@x z3l&L+9=v2K(4;=o&uNC@4O}#y=sessma{LY)P0Kyc+B;^UYO9wm%9#KL@zXg(8JBi znbb&n+VGLKlG<2Em~pTJFcQO@)6gcj50X!Vc-wCb=69bVWYU|svCb!60x$)J$)z!F zt`m=6A*bu6Ra@*cujsiuKWy{|umuEf6R~!J-sAPw_SIyO$<2ruOG((8QC!L%eK5Ea zz5gtcpk?0xaa1E^Z{TM&T?$53=OKfSVZevJEm$Ko<@@xZA5wcl5&5S zaR*?AF;F9c@bwRrhx7f7UWPO)m;KbhHX?S>I_Blq|%}(O2#_r8zGl zqMhRMjsIcr2^L#+gr3-m%wMM=2ScoHT5yXXTIps6nYsSbvUwUEwx5rIYkp z@ZWAIgirhdn{a78^Ts$&&@PVNELlT6cXz$F;>85{k#&^k*wh!mFQ zouU*fK1!F>nQvjP98oyEl0L5NP zrG-jbG)V|Db)sBZfrnSId% zhOD2t+S-`h#zb-j7smM?8;2N4gmg!MnZ0flWM%X7#0LZzx(yy(&s{LO*Vjsp+@g2^ z(0cKc6TBn1V0OTE5f|~|hLGu~G~7sFI^M>&Vt0i0G8fhGkD zx&8T5nx332GvNXs2vc4@U%5uw{CeNP$MU7~Wu|E3-#-jC4uRJV2TeAwP$?-|Xx!c^ zPtVFf1bvSCF}D1zj<8EDEPeDDnS`@FhceRW&N1kK*O3)9NPkY=e^ z((sh$IRqP~eEArX8mhas25e0*m{)&j6u?Z;tZqquED-AgdKaHm63g^3t4~<9+#MgQ z2I<;W338!BKk2F^R62cW6zo$UVLwU3Y7{oej;^6UDVbR#J2V2@DuKtV@nT-o#2 zk5It^;Z?5f@s_KyXh_;e(6N+whM6P|+&FKB-CbHmX|Fn-uV(X5a}4D+ouI6N@$#e`hUB zm0HrM_iMIMN#&Z`&HGX*NBbO~P?>Ih=qx=q49YjSO%*F3gr$Os7UalJ+y4bpYHaoF zAsvAj=YT?16lw9@i@~f|T2!9m#NqJIY873=)eRUYPE6u%<>$LrRkfO(fYoc@Dow_cpfTD$$jTQSwRwUQD zIy#aF)=@U@iQ?hC(7Y8z+g4Om{#HaGRREfPn};olAm8F){Msz)J5S$lopID&Q#qOk z-pi!WPmNP8qj)LRM3peX#w0i%qPC>L$4mSO-4U;TlM-AcCMG^Rk~QRKFZDT-aYc^Kw#N+YGIS6L2|S#Y&E@6tHKrb38YH8n0zcu?z>lh z-lxblQGLD!%mx^9sU{3RjAeM^L#`BbIS;9T_RgGR^y7UTwqSK9>;cWq=q)2OcS>Bu zMk?}B(znB*p1uDmIwSVSiojPK^st$b#8`;!5yPS?!#mvU+Dioz4bdXz1qbKeYJP-_ z^%UW^*~iBfERX(me_{a1U_<_~F31V)x@db- zmYhn6GiEM`ocZvcB5`(LD{LAOVfDZxwsbWQxiX3G+5OmeaAriFEH#U3BGrXTt=@fEErEgDDNk<^~(#57OC zY{LxZdQ0G}H9?rvMnr~}_S}q2qiD2ovOq~XyR%dhz_z{8<}GlNLOOqAvOG8%6nvFc z5h+hvoa@jwk4V|4E_uo7a8BG+_qGub-b+#pM@XL6Q$1VJ4rCj$wy6si+!e%6@*_O{ z*Kf5BLATO(6`F!X>2^yuttjPF69^S%GH6a3Ut2RT{6g|ts0ZE8cDOfE>8M%~cJLho z;)~DBxw|u+QIsqhwQnr6$p#d&`QG}rmYZSAx4|3XMMH*+kupOQek-j08lnpEAiMKP!VEwLFB~xeSn~ z)w9$1jWjPu+n_`FP{yb}Uxd@EX$cr1lzL^(^M`Gn^^vy!y6|a(w=Zs1GG197ZC&OV zrwuHXaRKu}%+N6+jf~O;MO@W#-y zn1~rU^%@cB1$%<%>3B~}EPhIGkSY=QT;fyc#JcdRxF{mLXj;Cia7?Y4P*L>A#mE7H z%z<5fO0c$N_UUQ$Y%hi$+L~m;J6nP*3ad{%JyxMubJE%a1W!U#EcvMs$jC)gNStoZ-y zZO&E}eSVS(__LF9P7&?O=_;q_&-9&}{dQ=M31RN%WSMS5#mMN-YyU%MFw{1h@%Qz7 zyE_<~nmRRr$tCdFkm*j(+ZpnaVnAd_PV$st;8afR(fKe4>gqCaioCoKGaj-C!*Y^z zrQ!>F{%d9JX6(=U4iI8Pgf+gCVsgu!L9?EG;L~%fP49v=9u^nYQB%J&$WW?Yo7g_m z!E`SS)v$SXXD}jgY*?RVc)c`!SpAqfhQ<|3I*JkfyI*&5su9y(zbulIfmUi@?2Gk_}%)~Gv2M75w92r z>AUHO5>L9PIArf!nfuAX6j;^6Ajh#S=NPscxcPkpqnAkSpB;05XAhT(4MYb*r_%1s zIpTLk(6FId7NNQXSPx+g^;@%(%&UWM7pHndBR2F)(AX#<^pMl2v;Jih?C+&}?^^pg zO%y!Z<8}_ugOv{@)Mvs3*V^!9I5+xN4dKo~rL=g-2>6_)QjT^y2w99g^HE#>6yzq$ z>hg4T*;est3FhVDof#Ka*#w6p*{0cXFbLeNNoPz#v1}t3yHITR+?8BIF|_b?fC3!0 zy$8K8kFFvb0Rld+Kej?>1nKH-o}d&9q!Eg|1yc?_A+vd&*q5WIZ+|l#!P}rl1QT|P znmVXC4rG#g=^CP0>-ojBYpVkY+;ps>arwgqgcgW4KhKrfjaw=xAS$~i&=Wyq;^Xg- zg<_}CycMWg{4nex)DA9EK#@fLM-b?cUdyM66_sCV5q=K?gL5E9zt6+a^_%(?u_&DX zF`tiTq!NP<``cy64#ItuwYL=F!eyatSwW_vfKuv%&SOaN+YrWUb;{K(+X4|V71>O` zaC>e;`4&1bNtmdHi~EJYY}jG^J>upM89AaQEh_Fnk{U;RsiT&0Jj?DNghm%BKglE6 zpO_bdE-ylECY|M3)T|oFrwzkDx8ZH97rCmKFwMJPh=*eX{mr&^f?=8pm`MXOMqBMS znD5KVM^EeK8szm^u?M)!$1w;kR68Rh|DZG|3RZ$d&C@NL=Q7Ub{8==8$Qw%yJ-i7H zK{ihH^Wjaa)vWhZ3Rw2@t4KfFQqMHfS|21wy*V)Ld^8Z~oha42o`+dNGw^N!B#}sP z@K%DNd!CU7K(iEpWNv~ZXE&E?`G9&bqy6-&l~uP49d|oC&q8zt&o1uq5!ob`Y-5b5 zE@ZWTn0V3FoRPcHyd`!4QHE43%T5Ej)$F%M@j(2?VX!Ed*{R(jsfl`z4w6O%KgB3a zFnIRX3u=72onWHLJq&@Cu8z6eQw?v3oW1&0=Al!)PJq%U4q?Hu`b16Efon)I_8huj z-BF6BAJxu24G5EUBgV4{9wDv1-b`G1gW2$}k?Fc~O*Tx+*v3fCUy z6)dP?3Fe3>NsP>VEZ(DqfhQ;IXao<9RC|(kKjiQ?eAWRK0=h1g%HS+0U8@DkGqOae zuB?^KCDPKYcC%6LM+ii}yNh~KGKadSZAz+e7g1q^a0wwwo%90{P^t$MoYW})S zVuF0S8|a&Ie$SKy#u|6Ok}5V_pFkJcjYjFo;cYCG^9m1h zer5iki$RYQ?8aRo9oxzo^M>3Nx2>csEh@YCy^QclC*vb64--L?DaSS!8<6J7T)Adfy?nk z8Tf5=ngF3b%?+(~yTMFEXGSx1(#If#pqA}4{q_eHA?_?L3R7njeP)u}Y*$j>=o(En z(>;WAvl0|_18$|{(c|s85qA+MISON#jnG%(cy--_@x4OM0 zSf)SfX_6TE@9A<@>J>S!faWZCeOG5sJpE^8OO3K}=>1>$Cy zqCqMKT#uvU{c0-M{%K9@RgC@a=hTZ`xuKF_cbm@d3rr}UqR3=9z>!k+1l0m{8Z2#@ zYpYH;ushi0WI$M}MBcxOd2qUD4Z54Sx?k`^jo-+M8?2DB3Fv=OQ>UOOM^6oq(Z~qY zfG}PwRE(s zZAds`hgx8l!u{(i#@^xEFQzh~&fIlZ^Ka`~WKFLjqlZf^c^I4K1SHAOe$+pJqePH! zfxw&T+LB~{j$=)MrGzm(O$r!@*boJSBD}@}3>^Pe2uBXTpn5r)1#Rx8R4j5_*XjaK z4zY?$hbw=ajOK<#p*hu_3{UDn#NWHY-8)Vo3QNvFe=5aJuE>?|(Bh$+YVT7uW)8ze%VP~N>)@D#TQZm(<%o}hI_8D~ zeeYsiUJ-^}-e?OH6k0r}3f3e9sH@@RfZW7L3AaG~!`pTC(q6X#5wCrpi%OX0^<>p5Hs^{XGOowgg zOf5zui9}P1h%za{nIlAds-H0FR&{x`xl!cirdPDx;(3;Y$v1jkDDyzJKM9q5K`X5^ z2c__x?I0z%@Vk!LOZK9qgEGmAE?5=eGtq`1@X?Na!vz&|d>%HmM0{V*ksRBeh)p4M z!{AG-IR7&V$R+sEWh4^GzEN?1+o`4#GG8k@JjsMo98o_jEYIz!KyHxN0OIRie8}P& z!i+8!9&_WB!6PkNX(B>zm`X_Eke6_d?~|U*TVz4jaf+94zgJb)fi?o8reAk<|45~jP9-TVbUhjJs2J~86*b4 z?f!%yLi04sx==|bF>dK#vu>Z=RR~W#`O9ZYp#~M!a^Y+#sw}`70sQ3PbSk752+P^MJ0t?QBTv5OJ)TCcG`mi}%kanTO21QaH*qEKU z{}zfudP0eZox`F^#YPUT5R|h&3Z~iCmDC8aT4hXZk&Uas zSk;Ro*_2&{!8ndXQq+b`^vGz?`6&5?y)M9Y6>-N)xzij*aSZ?y%F3O2ulVF=y2(S5 z0Koms9Pt-~k{aY~S;8V&xI z;oYj2&ujAKR#E0L^hRxPMk2t%Np;(3r!oNq0k_uh^*=1LAdf)8XpX|DmUhFF+Ltvngj;zSz>x+&DWCvQW)!om}EeTOvx8*T91yP#I zU9(V~JC7JP8-FW1nkNNx;8TS+VS{c{W_O|m^_EotjV#Rq6j9c0VMUhLY&B9J3UKdO zFz*XNBb4x>iJO+eO44vapNvTbeMk_wUzntsS`hn-bzw8x5QOg6^qCG( z86>f|WT3^J)%gsXYTW=GS6t2>+inifl&>5qe}#gCw+DNx8>QVknHWpzdy$Uvz15rUjaHMlSuG?SCPbWUo0{tPe z>^8W8{M#80JC^q>v{Uio2MXP2F)u{Bw$sVjxQr)MJ8`xTk0s;ZYzsj+*OnBItw)P0 z1DDFe5s$k|E9dPxYUrk5>F@?H%+XmD^_H0|J^>T@IAa&n_rwuBk}5r4!8TZywO&`M-`j)=L<^p3$~u@)ZtJfLc435; zbs+IX%sYAbl}3V|#a+6i{`6LHc|2DnPtJTV7WUscBgYal-6{g^$5vAa&+*>&Z>EMg^s^EH zKZUXO7jo+m?BnCF!p42-Ik)PJB4`7sq7dUFcv;D6lcx%L-{d zYz{@$`{W3TsAng2YJcn7y-Y}j(oRu!FXU&RtwGl?7Q~N*-5{z!;x6-9Q7(-iS-76wA2sBh2Q{|Q`qs{Ia^ zsI7rMCuh(I@P(<;Egq%$9rS&2{B(i~LUPKKJi4hQzc-yQCmWQL`yDGVltH=s?|BP- z>xOt5-6WlM;4q~}rhKTv*Xcl|9iI2y{GC2FB@0q7m2h9tbL{`8Gz`j>56S$f239|+ z!T+E%aQvrgVB}Lp=!nQ4fAhci+4^qU><+nA|s@KCDX} z1JZHu36Ma-4JFrTJ4u@)m6z7M2jsUwAIaGY67s(uNkD9FrP_t#mCkZGG&A**Tp80IjqK8Sw&l!v{! z$kCU|uD_g(I~qzklR6{6#CN~<(DQQUM`M58MfXqGNa>nBJ|H+$KKVOF9@C?@H=?u6 z6l2_PjPP36u5c^kH(QoY!4ofjCbYof;+R{q6rbYlvPRYxkZwe(Sn>W~vMo=ToWNvePeS93p*UtYQ zotJ8IzR<<$J^qGHeKEKa$2#mOyE8yO5n+J<)jl*4KmH5zqt1MQr1zi%;$!+_hC`le zL)K9UNnhHhCC`fMl~lg-CQv(*A1w`*1uU5;7Zt;(+T4c&GlXVZV4@+W`(MJ=tk;f& z%ge79NOK7X-*IwqG6?L!@UJjmw`W+?vz-7ail9G{?(9J7$bV0esK89z%Na&P%q^l| zP~sZ`NZ6;cjhVp=??=)s1UdqwaB!{+2QVY~9X)$~zb6q92jDEt=ljN;8%Y?I%4Hf1 z=Z`6YK^G>W%El|pVH5O)@IEVvZusXQwcNUaXk9LpF9aEFQiACAn zO@CxK-hz^brTfHz>SXi~o2-#OkI&#a=;&!ka*nbPc!F5yO%?8!_alo3$b)361(lkv z!aAj=E?ly_TErJ3;u8q*+{PoPB>>XBK^z(!+?YvCnP^Rsql1mxfg4aLCNe4e_xDE~ zka;JK0K(%&7Z8GG0-%42foc)i={a41_4UQS^RFF zG_d@O93B9#^kt67eL+p*^dvoht(HZ?L2LSHLN-|MYCMYdc=@4aR8LHYss2Cq7vyj# zYD`(0!h8`m!234Bbl833G-+x8IyRqFbLKAJ&R??E)G{Z_ik70Ni;AgY`MKLO%~ zs>Lcv^T`fVK?_>`_H(H$0yu=@(bjT4&j0+P0Dtf2^O6&3?vV`Le znr4^^9}E*OX!;MVKYf-4XuYwvX&WojjQ1a&qfvD&521{a0WHJu3;P_n?H`+Ad7Nr-;I(5w_Ddbe#QbSJ(C!9n;YW(>!#Nvxc5p= zG&2orAuLOz-*V-AbX|$Fh{r^EVO?2+9TB#&2bc^2lQc)rmpoK^FBnt03x$}Ri?IEN zA&=Wi%wShd7fKJKntV1-On0bNi&J6A> z0En>td;s|*dBxGEoF63dtj57sd62}=aWSZbm4S|J4$ZPcyXtBx1y{cJTXJoUZHXIh zzVKoZ$CKAJ+JzwOmEp}|AUK*(DgiT2<%IkC67iwG7}a;ojA0yH2J76qR_?f+NKBxi zdWq4w3(rf~Ibjw-X=b!$zXw?M7ayt{i!^-tbQxcT!a8`Wj>Guo?y7_#wiTcTGhE)E zkB{F=m4Ahq33u$?wJ!oOvFDU&HqQIVlT%R_TG4DZ{8Mv6tSP+aEuIo4y%lIG*=mbl znS|F9*g)>@#l)EC5kB(ETFwX@DrwR_X&GMF?qJcdDVckmB4>p1B208qgXCjV{xJEe zt1BRg!vj&FGD7-kmM1IOKxPsZ4bn~PLFC%jT*PctpRpemWl-h2U_j?V7&Z6lOllB@=o+vHGW|#|${L=VgtYte)!)xT9e!~Z znGmu-=?3niR|`Y)lWJkr1f{K3jzq8u0nmrBE49Q{a6rwAxh()3^o1 zzOO3@sHyCxer^a<-VaJ?!)HI5gEe~Me)8pKNZaQVEMxc?GF~Po6QHWg!@AW}lN#(+ zkG)@1aB8NXDbl$6D|Sd=qkbRN*cHypMFw>1IW=i(CBS`WYlc(wF|LQH~Xd*aAm3%sTIjhqh2Bo(HYb87Qvfp-K|ovZfC_Ju4^&2QOXaLomox zj>KBw;nr|UC10^){zOY}5Vx7MEy@sI_*CxNiLzdovhbp6Uu7>`!6^hb1H{*wSSIQ% zFt?S-oO)tG_uJw!(hZ-8I;mUrhs$s76(h_dRP9Td@O9P&`+!pSoYLA<{?rD>5w+{&&za&g_XD!EwCcUQ{DmV?GWb_l5x-hFRTG*JjXTk;3yF>VW=+U?^AKr~!&PPJHYmznODr{Vd5dT5e7632^1g*n4$C(%i^$@oFzxOxE^s7G(9^Kn}TP1LNjvNiFF*;tfXOXRAz14>)i zWtRI*0Fovxkl_7DqW^xXZI@QOV#AQZe)}!e}d8gK!cuSQ&;xR50Wug8R%f z+av*->WM{|c7dr#r2&E^7vH(1O!>73mqxU7MK=gKB>7Sf!5%3gKa+mB)X*GkZHtoQ zhVk3biS$h3s-!l?8QmwS+!RNc$~tg@h&81dTpI{TVu9{OUJVx(Rg+R6e0R`Trrf5Q zN<2%n8u_0KwziKA9+9m3X4sxTS)&#R%}FBPw|-HA@A1U@S`k7R%KAnE=2}@yi=_(0 zJ5ZIe!=qX7k6c@xfX(i@k1feQc!g?GH9Dddd`QLsebX}xhwD4f3L84ZiG1mN8{k8| zi8|b<6=CP;4$h00r32FW{Oe_Gab;_rWo6jTi*5wnf;-k634?!3U63PUA3MX3np+%~X54+}m zpCz+R3fCVc{wl-?TyLEStx6H{Aj9-B$#qwk{tS*N#AhMBtI`8~QXBVCRK5+NUgkG6 zH_#MZX`g6|yM@VIwEYS-qxrhCYDDw6KT8)Ry;W5|wr+&)v%mA%g+>HlgQf`AsjHJc zTY%l2f;M}86>Nnz1#^vimdvqBkkebU?Y|aQY z`CGJ2A3iy6%;sG%4uj1*dQB|OHcX>AP+jKyr%6l$ucS9>^e_c8GzdD6KAL5?s^x9f zRB4y+7k$t!sU(tHU&gDk1sA43WJKK8e7Vd2JTCITIS))GYQoQ%-WSJ`M99rmwGOebp<% z_{rJDz76wq_2$bzw*ELRJDyAB(qqb5)p#r}^c)4ZeXF-aGU-jMVIxJMg^r$HWY0wA z?Xn{*)nrGVhe}PZM}5eF4gM#jOV4irq4*HJty299!b*-aOhipJynl`;%P3pMQM3~L z0>yD@KgR`tI*AMOZY-UHW0dv2TAZtS7f^if|GmoML`6IYC=&IkA=PFf*79m$YX7&q zOTKbZwL8F3v6SheT_(d_Ym07BQqFn;kv+Yw$NMPOp%Xn`n+47w9w)EQ64L3|$5vf+ zs-iuGQv{93{5&I2V<#;wo7%E^rT0YmUrA5XMu@BKONjoX`m`M2ay zIr1aEO&39lc(R}?ez9DPf^tj3a^IhHrRvZ2R+p*hwz3T}iuX!&Po#&pFc%$=@a|t; zAQ9KrCa#>99yQi#8ZurP`YJJB-K)I8x^_2ndIaKVS=v?XQ*TYvackmw++$}-R*trL zDr4Q`S-5pn)|KUjLq)R+7#o9VE5p6s4{#YM_Ocof4bU8$eWjV8R4gLe zR(>uE|LlC9rncqKqwxH6kMz(k^$`nf3D_FEEO8oaMTm)2#k&jC6`BnVUqZw7imLZ+1ar|IL>K?tT3Pm9`Ym znS;+1@hSJ)D=v)3$g50=r|rm>XwLQR&#ne@G!M@+GenB_XLxb%j7G8nzTQtC1^t;B zG)fj>o1KIoUY>@?*wCJHGbH3)xNX+XStbW zoU3sp>Awh?`=T}L@bo@)&u-oFrLC-XbHuF%nlc$AVqyVNaap1Rzh zVr3FE?;bpL|yLy~snQ`*rI~fwZXzs2)P!QNRHr{Iw@b|?EW9)aZ3b*egsXX6H zZ1Lp1TeTWlH8kPyWZiu}QTZBYxNhvHptr<`ZQH48y5OJY>@l6VF5?lN~rb9V#RSMlke zAO5T`bpA+=I0RKo2Vg4@l3O+@kwEC0J%%kesAXp5Cei)mzE}mMtCiR6a*mOq%@Ky% z%-7M~15MWZ)#iNjvxp$}L9C%{JeO0Hr7uAbU|C03er{jVjA%FwG$5q5`O+F8Cfs@# zqj2aJuhJZTvEC{UT6}>iOtQpz2KWT@5@paRxT^0o5*89v-kK~ zMVM^R(^{O{i-JwDTWY&;wY-})`feV^Pot`7dy$MR*^>HTtiU=wLp&M=0Tdn9LmDg- zqZT6d{fS-h?L(K-ty@GR(w7~ZE=OQd_7)S4%eM~$F-un^r2^^=V_8xZScz(o zaS09oK$it;-zw)xxhzFzP`2?B)v9P16jA%Sca^uv*ae6_;6qodE@hGq+M#AAhA&-C zVJbzDZf6Sxl0SH@!B7?R4peTmar5qox>$kBlVcr?BdJcZz057~fxf;x=M}~q-a3-W zA|bbyVD|Dgq06wbzMJ10wq?9NNQkk?-D$cF|reM@sOHU`?SoUTQ0REt`b}laIAo2P4&1n3)xUOT@mOrcxJ{ zk4$93nl{`^rPo4O0^hvSR=UZP^3p{U)RT*akEA-M6E)pOFo$@Sf!}di8c*_EVp#-i zn_)xe+jTi5sly7b+4d)n%SnkR0{{~H8HmAshugXTK|iq+GQCJ&`0@<|--R(Oi)RCn zqjh{oZsL3pB@dNlXd{TNCakLoc%KdBDrW^Z_=(f{Q6U?|ST1IY5H8d$2hNf}t^83Y)nNg?0w(4z3jTqaO*QH8S*Q8jkd zT0x6pVI^{_{UZaV??V++O?EKGDA}lwnG(=D@Y`@t9e`2OgyucXcCV5(-%~m4MGK_u zlam#d*g-IUpXShAAWX0aYJ5s&6K@T0%eo2LSFfM<a?l&EAHo5Q_L;Fi^8MJr35eG-etDVP|NT=R19Q5E-nvPd=Pu47HHWM4NA zUI*@YFgPjmA@(4J6lhfKtUUh)>~Ox2;Y7o{+EQVGeQUU3BOkuM!{E#~Yz z6VvM-3!rW*sd)7abh-q=N+27(oXVV{#`y^jv>BukbE2K>kwI^3rgL=Z<#BB0&W)}zANwMryRO=#L)1Z*byasdh4^?Y1B=J(c+( zCXQ}TO`Qf0m}yg0OsJL@0w?-Mu(K_s?UW6j9zTXMfGvdtYP^R8cs_is+Ol+HB#laA zKVYb;&8uMUjRUE~sWwS15~21fJPV(}w*)=T{YkdV%IZu6awJ5Qrqd{--9t2b#vY@4 zXyWl2i^C+dS1TQnI<3o$wOYC>W#gVC6C!LX4v{FK5XlU|;L?*EVHz-!VSE;}U%=fr zMDL33OCtQm=|H&Q9p75iDuioGJRtmQ&BfSAXLQ6`*awC@sMA(m15L)U%D zMO!_Zuhv32C)rcUllPW1A^ZXD`@K9wvuxmqpGP;XVOD4YMGS0))UVLi; z=TdOH&upuW!`jv&!d*@{^=Ut9KOFFMQFJ9fCLRY=u?ns-Y%P1!(w%<*m4iErMJeQq ztTsn&w=D=6n5g(_w562inhNkB{(f9-fY4E=HRVkE3P`8!tr4snQo*I%(JnaXp?+f9 zgIZO$mp_~tq^tIoD0IfX1B|cLGI_Z45NTsC_+|U?wEiL{fah3?YMnkugvg1%cn<=i zcLhX^`h3Cf3+vOFg)8J{W|&n3)k5}{sHY&}=i~LPtWFB?y0}nMHSjomC?7vl+{NW_ z-Ad?36ZHEiWj9$+%1}$P#%ub4`jei#{K4ShrTozD#E1{$v9s@Ou{&l_7OB-CWp3!7T&g51sVB8mNZmvrkyZJ0;zUe!1Y{AxtVIwfzF-r z>O#Uv+-ON)AowL2`JCoRtDRir46^5vk=$q`3EQR8QEx_8&DKjqAP|P1DqVu*vC%BE z8HjnNJt}jwh!wsIbOLbl8&Vjn;v%`8NHd(iZKn2WrXGmxVW06jpiKx(+xbd}S?8Kb z*+KwRze*)xNYuh38qW8#phT$;g-XR~zcQbZ1Hxt8^L2exEgkE~w)u20>4@-v1jbT_ zqBH3xQ+Xyh97$ce8$x^(ww{?-XuB595^?l{i>?94QwEcPPXJzwgFUc(a5=0&M-+3F zd2*7^Epf8zg?@V*q@G6CjdI)=5|13=J%dda>ZI1k#^JdV?_UL)$(ujYi%v2lNpmv| z16o>PREyO*4YTICtI2sf5bL7cmI_lQ!8*^>;ojiwLHk%KIM+_-OIn5XJl;yqB?Gu4 z2%H&cb&BTjUGeWPw*pFHc1LVZ0fmqSbw)idNyYBJ7|ij9rS{t7>@RZh1rR_hN!JD< zcIaT<7OlW$Uo3Dk6Sf=T*Az!fkd>wC=Y!MWAnC zW$W5jw}jb$1tx(F8D;&2of)=yC>@3QiVk%oHh06_lw(UmXJ&K(He! z8spXHLLI4V>Y{QdJZL*$kZIYf0v#f>iNCY7;mIC{ZGE8zyl>q$V7O6tD=QwtExj zoOB~ozZMX^UkTC7IVQGo@tQR7EczHCf+ADN0tRPX=*w|K-{yvG>WpTS>um^g4(Kfx zLJ~JL(^Sjaseh8b*0nf~>V%@QyCEnMeCFqFpSe7%a!=~Y8~P3Fvwa1?Dl_c>taI>x zW9>mtp26Ly9ivdyibWxN#t;j6H~b~EdlIH1elB5d7?|KBP^fitV53o%y2V8}cmhq0 zhwGB!l!Nor&hTsNRIGJ)l-vMB<%Tb73#SvK3zZ=}KBU6F;#vhGgvLzYbzK zGC|Tr7t4#jCjuQh%yEHZ4%*y#Azl=c6C{ zZH)%gT8m)z^BV;xY^dp~8>Nbff}U|L3p@o%MDe9hQMEU(AyI+wSF?fe1F;D2G9mvhArDOj=}?q{B&I1WJZoR5JiK-7(3hb^4A%d*xbXdqG01Ri&81|3ZkYDok0L z=2~)yzIh-n!vrRx|6Q7-VUwENtaB0S+!;^S1&>=$tHunPmVt1U>i27pT#K)lBhyR& zcWY8S7VV%r!NUVy7H8l06M+%PlK3E+q_{!d8;sf*JQ2t7*=fjca*ivlYl@Ju;9{2z zrdP$ILA#U%s1N-tog#YUVKe9Yc3|Eq*bcL2xtia&19c^pDJ#s*uqGQ9F$9Mio9ff` z+3`Qq-AJ72rBZWUYf5tRJRROF0qiVGiFxPSb_z)jmCr`u3kB{KLF!lN)Y=8EG6$YAu?J8J zFvruau+oVa!OjF<y63cu!ovtIP+#`xoS=o7ZQhOcvuO{hCbhN?Y&;uRYSe~0F%>uk5W7f6JtK}Si zm>il{;WhM}m%@%nm|*;GEU?8RBn~m?B(w6o!iAUh7nmD6pTAfv&^3ZKb~gXgWK9QyzO8f+^QGEK?Ng$2K-t!)~R-6@tw6;HG-;qdaNGk(># z2b$#!>1Q~-P7hg4M2#$N0!?%s^Sh4Pnzv2pmTe|*%<`%w@DH{~;N5o0uyXF}!x-?q<1=~b?FO0Wqn&pyTv-*Zi$a#5LTHKP{FZQGfh z1c8$*M`du&(7-tDVG5mST2Xo_(AL&9T_FJK@0uu9g)M>ca#4jj`rYaq!u?eg?+;~E zE-?0Sd;&%DCyaeuOk*W>Z{>{1ajv%0uX>vIw`I6uW&~Y0F@AadQIY~p+bBL-2!~p1 zp!{cC{aQkaT;axxSKH1rz|xy(f>xl}xb;9*%ja3ck}+72V|jU7sB+@VAwQ7uuJr0PUZW+q zZmiT3KeNJDEw64WZ{m_hLhRo{GK)uRht_QgEiPmIx+4hG$Oem!SSk4?($zV%%bjq? ze(8(RAPqrpZBuMTw(6C$a#5XXfQ^;*UH3poI+XJt1(bvq^eE4$wg^}SH^eJ;9)^%GovbPJ4m86~N{bqK)%$zEK z5KagJaOjuC$0j{Ztg<5t{bBUS$0#1rNNEK1UA&ZNY+cz)stXZ+N<^a~gziGE1p8_` zn&-fNbr7V!`G_Bd@lm<6W|y8oiEQVsNgoq*NR}yS&MW2K;{uHyCv0I@9RP{7`I^Ro4aYs3?cR-yM^Fv4AcxcV*2!wBCB4J zO|@9!_?YKnVI(XPc^Sx}FvzLqm-a`{j=5v$F~3hC=|mdL@*MQrs)qLU%HK|^5&Q0! zINMaW0L6@87n1;yiC>JyMjlJUT=XmCv5q~Hx1|)gnPm8M33@*rI^51Z8%9Xj5|%k* z*UPenp}*TOWpV67_U8K%e7D3?+Sy`IRdboOk-7qS1BFI{Iwyd|`k1}^UM!VkqIIe4 zz2AP#a!?i4_ogSdoVAVgH7%}eYiRKDDBo?PS4qr=OG=eXLI+>LNZ-b&+~agO@{p@ZlL=?6SC$>aB5*SJREe82ANZ?W&R~vYG(0`qh5`{lJHiS*k}& z@ugSXQ`5WLi*(A7=Ae%Bl(q_IMfMxVoFI>c3<9{K_auZE1`P^ttPN@r|BT5FC`SW3 z_gLgqpt{a6D!yj!r~#bYa7FEnTB~6^Ty)4!&2B^t#+*myPYi*i3%G&B@>p*{Z7YGK zljGithvl$K(miCwAXkBH6tFK-qjPZPhW87?VCFUqXw9~^o`iv{woHCQq^naWDlP)2!~&7H~^JGM~t+|MF)Sxae{(E=I$ zp=b->aV%D>1zWDJj4J`iupc9_*V-)j-<>=OkO1CcP zz0}_nc|K4=hQ2TAzU7nMDA1;kP+!U|KH_4h!&ocF6#S&bM6WZn9(43bO4lAq?Z?{P z83_fzXyFOGa1DJ?MUdf%)XHgCSU**@M6Y;@d&?U5J`^3vXul7D?2js?3wsVhh9&id zgC4NRLq|3E(hXreg;Yre@jKZyuc(d4*j*cH$C%#|4@Ot(o@!qLcVyI&9r_hvgP*A^ z`7r(*BRl6bD`(xs>Vbixc?Kvnj%S+nE zSEVkyGGDAE1bH7H_`Va3-Oq~Z1-EFV;LR!#WW_Ydp|JCRcu>t?q92A$uF^@DPK z%vBFAz!NMoVUFT6vEn`xAV11=ID$AvFw0!*mN1?YJ4O2%mkw_Aex~Q@UIaDXcSVb^ z;_6$l>y`T=O-BbsRp8B;{XNM{w-KDG+%Lh1v%_v%)GqIgw`dH6MUG3jwRx=Qm_C0R z3(vvL6KIxFUd95aG5K^|9a;;a{+oK2uw5Bd%H61i(d82z-SuOuE6)~x>CyGw=4Ris zRC&@0mXDF3mt^CeSfW5vLol}nSBkZK*##DK1vU;$s98^7_AUBuBG+JEeZt*d1UI#P60FQ~i=|0NXf8+3Pk%E1JH=S6v);mHKpq|7ZiPGIU3^{3T0=;$sUG{` zDSzDNhpR6q_`X^$zx+sQ=c&)=0D&m<{?p4LFF5Mh+U{b*-XZ<)@R0jbn{_;D^zli; zu8o_e{VbFE!-8H0gx$4Z_a{e7T8WJGi2Bcw>(aFo3BM}OrrETYrds8R3C9GnfF*BP zQ|?2Zu1QUlYuexox1@6(Kfj>PaXUg+Ew$9|?Fe#!SBI9mvn~6C%+0)%vO0^`wW2C> zjuE)EyXrtAK}RrG>@63W3PwFdQ_?J;Os%@UH<={5SH$XZaE>_*qL`HP-%P2$?W`p-*5|8Q*CwvTCDnvSQGpouGk{_^^9RP=baQ{aaP$+>mIsuHPN=t66GeYP z6KdKCHI2-9^~!6X{kOde?ruMeZ1iQG3Xm-Sd9=AZBfqex5PxsJQYO?mr9pVWzNFRe z*CMi{iRP3!4jColX@Ex@Ts3cpJjjd=8Bm7ys(h@boEXQ<&qYrs_32Jxk7j3VuG6tn z$grrTw?iWCc^wJpmmv6Cm1HKVl92GP$~!0+1~|q?tOo;vmFlJg`x{yG%SQyrPxSw4 z?;kJzUV)&0-CSH9oV^T~S^ka(O>7-ZY&;yCZT?e<&dm9*pzu#1Ffe&}ds#{Bw_gIyL?mFc1`s`5)T Date: Tue, 17 Feb 2026 09:23:33 -0800 Subject: [PATCH 02/22] Updated PHP-FRM and NGINX content --- .../web-servers/nginx/php-fpm-nginx/index.md | 585 ++++++++++++++++++ 1 file changed, 585 insertions(+) create mode 100644 docs/guides/web-servers/nginx/php-fpm-nginx/index.md diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md new file mode 100644 index 00000000000..a6fd62860a1 --- /dev/null +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -0,0 +1,585 @@ +--- +slug: php-fpm-nginx +title: "Modern PHP-FPM and NGINX Configuration" +description: 'Install and configure PHP-FPM and NGINX using current upstream best practices and Akamai-specific considerations.' +authors: ["Akamai"] +contributors: ["Akamai"] +published: 2026-03-22 +keywords: ["php", "php-fpm", "nginx", "web servers", "linux"] +tags:["web-servers", "nginx", "php", "serve"] +license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +external_resources: +- [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) +- [NGINX](https://nginx.org/en/docs/) +--- + +The PHP FastCGI Process Manager (PHP-FPM) manages PHP processes independent of the web server as a modern FastCGI implementation with NGINX. + +Use PHP-FPM with NGINX when you need process isolation, independent PHP and web server scaling, or improved resource management for PHP applications compared to mod_php or CGI implementations + +This guide demonstrates how to deploy PHP-FPM and NGINX on Akamai cloud compute infrastructure. It covers installation of both components on a supported Linux distribution, NGINX configuration for FastCGI proxy, PHP-FPM pool setup, deployment testing, and application of basic security hardening. It addresses Akamai-specific requirements for instance sizing, firewall configuration through Cloud Manager, and performance tuning. + +For complete documentation and configuration options see the official: + +- [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) +- [NGINX](https://nginx.org/en/docs/) + +## Before You Begin + +Complete these prerequisites before installing PHP-FPM and NGINX. For initial server setup and OS installation, see the [Ubuntu Server](https://ubuntu.com/server/docs) documentation and [Akamai's Getting Started](https://techdocs.akamai.com/cloud-computing/docs/set-up-and-secure-a-compute-instance) guides. + +### Prerequisites: + +- A compute instance running Ubuntu 22.04 LTS +- SSH access to the instance with a non-root user account +- Sudo privileges for package installation and service management +- Cloud Manager access to configure firewall rules +- Basic familiarity with Linux package management (apt) + +## Akamai-Specific Considerations + +Configure platform-specific settings for your PHP-FPM deployment including firewall rules, instance sizing, and optional storage or load balancing. + +### Cloud Firewall Configuration + +Configure Cloud Firewall rules to allow web traffic to your instance. + +1. Navigate to Cloud Manager and select Firewalls from the sidebar. +2. Create a new firewall or modify an existing one. +3. Add inbound rules for HTTP and HTTPS traffic: + + - HTTP: Protocol: TCP, Port: 80, Source: All IPv4 / All IPv6 + - HTTPS: Protocol: TCP, Port: 443, Source: All IPv4 / All IPv6 +4. Apply the firewall to your compute instance. + +For detailed firewall configuration, see [Getting Started with Cloud Firewalls](https://techdocs.akamai.com/cloud-computing/docs/getting-started-with-cloud-firewalls). + +### Instance Sizing + +PHP-FPM memory requirements scale with concurrent connections. Select an instance plan based on expected traffic. + +#### Development/Testing: + +- Shared CPU (1-2 GB RAM) for low-traffic sites or development environments. + +#### Production - Low to Medium Traffic: + +- Shared CPU (4-8 GB RAM) for small to medium production sites. +- Supports 50-200 concurrent PHP-FPM processes depending on application complexity. + +#### Production - High Traffic: + +Dedicated CPU (8+ GB RAM) for high-traffic applications requiring sustained CPU performance +Eliminates resource contention for consistent PHP execution times + +Monitor CPU and memory usage through Cloud Manager after deployment and resize as needed. + +### Optional: Block Storage + +Consider attaching Block Storage volumes for user-uploaded content, application file storage exceeding local disk capacity, or separation of application data from system storage. Block Storage volumes are portable between instances and can be resized independently. See [Block Storage](https://techdocs.akamai.com/cloud-computing/docs/block-storage) documentation for setup instructions. + +### Optional: Load Balancer Configuration + +For high-availability deployments, use NodeBalancers to distribute traffic across multiple PHP-FPM instances. Configure health checks on port 80 or 443, set session persistence if application requires sticky sessions, and ensure backend nodes run identical PHP-FPM and NGINX configurations. NodeBalancer setup is beyond the scope of this guide. See [Getting Started with NodeBalancers](https://techdocs.akamai.com/cloud-computing/docs/getting-started-with-nodebalancers). + +## Install PHP-FPM + +Install PHP-FPM and NGINX packages using the Ubuntu package manager. For comprehensive PHP installation options and configuration reference, see the official [PHP-FPM](https://www.php.net/manual/en/install.fpm.php) documentation. + +Install the required packages: +```command +sudo apt update +sudo apt install nginx php8.1-fpm +``` + +Verify both services are installed and running: +```command +sudo systemctl status nginx +sudo systemctl status php8.1-fpm +``` + +### Common PHP Extensions + +Install additional PHP extensions based on application requirements: +```command +sudo apt install php8.1-mysql php8.1-xml php8.1-mbstring php8.1-curl php8.1-gd +``` + +**Common extensions**: + +- php8.1-mysql: MySQL/MariaDB database connectivity +- php8.1-xml: XML parsing and manipulation +- php8.1-mbstring: Multibyte string handling +- php8.1-curl: HTTP client functionality +- php8.1-gd: Image processing + +Install only the extensions your application requires. Restart PHP-FPM after installing extensions: + +```command +sudo systemctl restart php8.1-fpm +``` + +## Configure NGINX for PHP-FPM + +NGINX communicates with PHP-FPM through the FastCGI protocol, passing PHP requests to the PHP-FPM process manager for execution. NGINX was installed in the previous section alongside PHP-FPM. For comprehensive NGINX configuration options, see the official [NGINX](https://nginx.org/en/docs/) documentation. + +### FastCGI Communication + +NGINX forwards PHP requests to PHP-FPM via a Unix socket or TCP connection. The Unix socket method provides better performance for local communication between NGINX and PHP-FPM on the same instance. + +Verify the PHP-FPM socket location: + +```command +ls -la /run/php/php8.1-fpm.sock +``` + +The socket path must match the `fastcgi_pass` directive in the NGINX server block configuration. + +### Server Block Configuration + +Create an NGINX server block to handle PHP requests. This example assumes a site served from `/var/www/example.com`. + +Create the server block configuration file: + +```command +sudo nano /etc/nginx/sites-available/example.com +``` + +Add the following configuration: +``` +fileserver { + listen 80; + listen [::]:80; + server_name example.com www.example.com; + root /var/www/example.com; + index index.php index.html; + + location / { + try_files $uri $uri/ =404; + } + + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:/run/php/php8.1-fpm.sock; + } +} +``` +Key directives: + +- listen: Defines ports for IPv4 and IPv6 +- server_name: Domain names for this server block +- root: Document root directory +- fastcgi_pass: Socket path for PHP-FPM communication +- include snippets/fastcgi-php.conf: Standard FastCGI parameters + +Enable the server block and test the configuration: + +```command +sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ +sudo nginx -t +``` + +Reload NGINX to apply changes: + +```command +sudo systemctl reload nginx +``` + +### Configure PHP-FPM + +PHP-FPM uses pool configuration files to define how the process manager handles requests. The default pool configuration is located at `/etc/php/8.1/fpm/pool.d/www.conf`. For comprehensive configuration options and tuning guidance, see the official PHP-FPM configuration documentation. + +### Verify Socket Configuration + +Confirm the PHP-FPM socket path matches the NGINX server block configuration. + +Open the pool configuration file: + +```command +sudo nano /etc/php/8.1/fpm/pool.d/www.conf +``` +Locate the `listen` directive: + +```file +listen = /run/php/php8.1-fpm.sock +``` + +This socket path must match the `fastcgi_pass` directive in your NGINX server block. The default configuration is correct for most deployments. + +### Process Manager Configuration + +PHP-FPM's process manager controls how worker processes are spawned and managed. The `pm` directive defines the process management strategy. + +Key process manager directives in `/etc/php/8.1/fpm/pool.d/www.conf`: + +```file +pm = dynamic +pm.max_children = 5 +pm.start_servers = 2 +pm.min_spare_servers = 1 +pm.max_spare_servers = 3 +``` + +**Process manager settings:** + +- **pm = dynamic**: Spawns child processes based on demand +- **pm.max_children**: Maximum concurrent PHP-FPM processes +- **pm.start_servers**: Processes created at startup +- **pm.min_spare_servers**: Minimum idle processes +- **pm.max_spare_servers**: Maximum idle processes + +### Performance Tuning Considerations + +Adjust `pm.max_children` based on available memory and expected traffic. Each PHP-FPM process typically consumes 20-50 MB of RAM depending on application complexity. + +**Memory calculation:** +``` +pm.max_children = (Available RAM - System RAM) / Average Process Memory +``` + +For a 4 GB instance with 1 GB reserved for system processes and 30 MB per PHP process: +``` +pm.max_children = (4096 MB - 1024 MB) / 30 MB ≈ 100 +``` +Monitor actual memory usage after deployment and adjust accordingly. Exceeding available memory causes swapping and degrades performance. + +Restart PHP-FPM to apply configuration changes: +```command +sudo systemctl restart php8.1-fpm +``` + +### Test the Deployment + +Verify PHP-FPM and NGINX are correctly configured by creating a test PHP file and accessing it through a web browser. + +### Create Test File + +Create a PHP info file in your document root: +```command +sudo nano /var/www/example.com/info.php +``` + +Add the following content: +```file + +``` + +Set appropriate permissions: + +```command +sudo chown www-data:www-data /var/www/example.com/info.php +``` + +### Verify PHP Execution + +Access the test file through your web browser using your server's IP address or domain name: + +``` +http://example.com/info.php +``` + +A page displaying PHP configuration information confirms PHP-FPM is processing requests correctly. The page shows the PHP version, loaded extensions, and configuration directives. + +Verify the Server API line shows `FPM/FastCGI`, confirming NGINX is communicating with PHP-FPM rather than using an alternative PHP handler. + +### Remove Test File + +Delete the info file after verification to prevent exposing system configuration: + +```command +sudo rm /var/www/example.com/info.php +``` + +The `phpinfo()` function displays sensitive server information including file paths, loaded modules, and environment variables. Remove this file immediately after testing. + +## Basic Security Hardening + +Apply foundational security measures to protect your PHP-FPM deployment. These settings address common vulnerabilities without requiring application-specific configuration. + +### Disable Dangerous PHP Functions + +Restrict PHP functions that can execute system commands or access the filesystem in ways that pose security risks. + +Edit the PHP configuration file: + +```command +sudo nano /etc/php/8.1/fpm/php.ini +``` +Locate the `disable_functions` directive and add potentially dangerous functions: + +```file +disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source +``` + +Restart PHP-FPM to apply changes: + +```command +sudo systemctl restart php8.1-fpm +``` +Test your application after disabling functions to ensure required functionality remains intact. Some applications legitimately require these functions. + +### Configure File Permissions + +Set appropriate ownership and permissions for web files to prevent unauthorized modification. + +Set ownership to the web server user: + +```command +sudo chown -R www-data:www-data /var/www/example.com +``` +Set directory permissions: +```command +sudo find /var/www/example.com -type d -exec chmod 755 {} \; +``` +Set file permissions: +```command +sudo find /var/www/example.com -type f -exec chmod 644 {} \; +``` + +Files should be readable by the web server but writable only by the owner. Directories require execute permissions for traversal. + +### Enable HTTPS + +Configure TLS/SSL certificates to encrypt traffic between clients and your server. HTTPS prevents credential interception and protects session data. + +For TLS/SSL certificate configuration on Akamai cloud compute, see [Enable TLS for HTTPS](??????????). + +### Remove Default Content + +Delete default NGINX welcome pages and example files to reduce information disclosure: + +```command +sudo rm /var/www/html/index.nginx-debian.html +``` + +Remove or disable the default NGINX server block if not in use: + +```command +sudo rm /etc/nginx/sites-enabled/default +``` +Reload NGINX after removing default content: + +```command +sudo systemctl reload nginx +``` + +### Production Environment Considerations + +Disable PHP error display in production to prevent exposing system information through error messages. + +Edit the PHP configuration file: + +```command +sudo nano /etc/php/8.1/fpm/php.ini +``` +Set the following directives: + +```file +display_errors = Off +log_errors = On +error_log = /var/log/php-fpm/error.log +``` + +Errors are logged to `/var/log/php-fpm/error.log` for debugging without exposing details to users. Restart PHP-FPM after making changes. + +Never deploy `phpinfo()` or similar diagnostic scripts to production environments. These scripts expose configuration details including file paths, loaded modules, and environment variables. + +## Logging and Monitoring + +Monitor NGINX and PHP-FPM through log files and system metrics to identify errors, performance issues, and security events. + +### NGINX Logs + +NGINX stores access and error logs in `/var/log/nginx/` by default. + +**Log locations**: + +- Access log: /var/log/nginx/access.log - Records all requests +- Error log: /var/log/nginx/error.log - Records server errors and warnings + +View recent NGINX errors: + +```command +sudo tail -f /var/log/nginx/error.log +``` + +Configure custom log locations in server block configurations using the `access_log` and `error_log` directives. + +### PHP-FPM Logs + +PHP-FPM logs process manager events and PHP errors separately from NGINX. + +**Log locations**: + +- PHP-FPM process log: /var/log/php8.1-fpm.log - Pool manager events +- PHP error log: Configured in php.ini via the error_log directive + +View PHP-FPM process events: + +```command +sudo tail -f /var/log/php8.1-fpm.log +``` + +PHP application errors appear in the location specified by the 1error_log1 directive in `/etc/php/8.1/fpm/php.ini`. + +### Performance Monitoring + +Monitor CPU, memory, and network usage through Cloud Manager's built-in metrics dashboard. Track PHP-FPM process counts and memory consumption to identify resource constraints. + +Key metrics to monitor: + +- **CPU usage**: Sustained high CPU indicates insufficient instance sizing or inefficient code +- **Memory usage**: Approaching total RAM triggers swapping and performance degradation +- **PHP-FPM process count**: Reaching `pm.max_children` indicates configuration adjustments needed + +For advanced monitoring, integrate with external observability platforms. See the [NGINX](https://nginx.org/en/docs/http/ngx_http_stub_status_module.html) monitoring documentation for enabling the stub status module. + +## Troubleshooting + +Resolve common issues with PHP-FPM and NGINX deployments. Each section identifies symptoms and provides diagnostic steps. + +### NGINX Gateway Errors + +**Symptom**: Browser displays "502 Bad Gateway" or "504 Gateway Timeout" errors when accessing PHP pages. + +**Causes and solutions: + +PHP-FPM not running**: + +Check PHP-FPM service status: + +```command +sudo systemctl status php8.1-fpm +``` + +Start the service if stopped: + +```command +sudo systemctl start php8.1-fpm +``` +**Socket path mismatch**: + +Verify the socket path in NGINX configuration matches PHP-FPM pool configuration: + +```command +grep "fastcgi_pass" /etc/nginx/sites-available/example.com +grep "listen" /etc/php/8.1/fpm/pool.d/www.conf +``` + +Both values must be identical. Restart both services after correcting mismatches. +**Insufficient PHP-FPM workers**: + +Check if `pm.max_children` limit is reached: +```command +sudo grep "max_children" /var/log/php8.1-fpm.log +``` + +Increase `pm.max_children` in `/etc/php/8.1/fpm/pool.d/www.conf` if processes are hitting the limit. + +### File Permission Issues + +**Symptom**: "Permission denied" errors in NGINX error log or blank pages when accessing PHP files. + +**Solution**: + +Verify NGINX can read PHP files: + +```command +sudo -u www-data test -r /var/www/example.com/index.php && echo "Readable" || echo "Permission denied" +``` + +Set correct ownership: + +```command +sudo chown -R www-data:www-data /var/www/example.com +``` + +Ensure directories are executable and files are readable: + +```command +sudo find /var/www/example.com -type d -exec chmod 755 {} \; +sudo find /var/www/example.com -type f -exec chmod 644 {} \; +``` + +### Firewall Configuration + +**Symptom**: Cannot access website from external network, or connection times out. + +**Solution**: + +Verify Cloud Firewall allows HTTP/HTTPS traffic: + +1. Navigate to Cloud Manager > Firewalls +2. Select the firewall attached to your instance +3. Confirm inbound rules allow TCP ports 80 and 443 + +Check local firewall rules if using UFW or iptables: + +```command +sudo ufw status +``` + +Allow HTTP and HTTPS if blocked: + +```command +sudo ufw allow 80/tcp +sudo ufw allow 443/tcp +``` + +### AppArmor Restrictions + +**Symptom**: PHP-FPM fails to start or access specific files despite correct permissions. + +Ubuntu 22.04 uses AppArmor for mandatory access control. Check AppArmor status: + +```command +sudo aa-status +``` + +Review AppArmor denials in system log: + +```command +sudo grep "apparmor" /var/log/syslog +``` + +PHP-FPM's AppArmor profile is located at `/etc/apparmor.d/php-fpm`. Modify the profile only if legitimate application requirements conflict with default restrictions. Reload AppArmor after profile changes: + +```command +sudo systemctl reload apparmor +``` + +## Next Steps + +Expand your PHP-FPM deployment with database connectivity, advanced performance tuning, and high-availability configurations. + +### Database Integration + +Connect your PHP application to a database server: + +- [MySQL on Ubuntu 22.04](https://www.linode.com/docs/???) - Install and configure MySQL for PHP applications +- [PostgreSQL on Ubuntu 22.04](https://www.linode.com/docs/???) - Deploy PostgreSQL database server +- [Akamai Managed Databases](https://techdocs.akamai.com/cloud-computing/docs/aiven-database-clusters) - Fully managed database clusters + +### Performance Optimization + +Advanced tuning for production workloads: + +- [NGINX Performance Tuning](https://nginx.org/en/docs/http/ngx_http_core_module.html???) - Worker processes, connection limits, and buffer sizing +- [PHP-FPM Performance](https://www.php.net/manual/en/install.fpm.configuration.php) - Process manager optimization and OPcache configuration +- [PHP OPcache Configuration](https://www.php.net/manual/en/opcache.configuration.php) - Bytecode caching for improved performance + +### Security Hardening + +Additional security measures beyond basic hardening: + +- [PHP Security Best Practices](https://www.php.net/manual/en/security.php) - Official PHP security guidance +- [NGINX Security Configuration](https://nginx.org/en/docs/http/ngx_http_ssl_module.html) - TLS/SSL configuration and security headers + +### High Availability + +Scale your deployment across multiple instances: + +- [Getting Started with NodeBalancers](https://techdocs.akamai.com/cloud-computing/docs/getting-started-with-nodebalancers) - Load balancing for PHP-FPM instances +- [Cloud Firewall Advanced Configuration](https://techdocs.akamai.com/cloud-computing/docs/manage-firewall-rules) - Security rules for multi-instance deployments \ No newline at end of file From be806ca2e6c84e5c5cede330c6524a4f0e6602cc Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Tue, 17 Feb 2026 10:14:21 -0800 Subject: [PATCH 03/22] Fixed linting check missing space --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index a6fd62860a1..b27cd371788 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -6,7 +6,7 @@ authors: ["Akamai"] contributors: ["Akamai"] published: 2026-03-22 keywords: ["php", "php-fpm", "nginx", "web servers", "linux"] -tags:["web-servers", "nginx", "php", "serve"] +tags: ["web-servers", "nginx", "php", "serve"] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' external_resources: - [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) From 393ca356a5f78a999d16ed7dbde76813d02eef7a Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Tue, 17 Feb 2026 12:34:11 -0800 Subject: [PATCH 04/22] Made metadata formatting consistent --- .../guides/web-servers/nginx/php-fpm-nginx/index.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index b27cd371788..53c7a6c3881 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -1,12 +1,12 @@ --- slug: php-fpm-nginx -title: "Modern PHP-FPM and NGINX Configuration" +title: 'Modern PHP-FPM and NGINX Configuration' description: 'Install and configure PHP-FPM and NGINX using current upstream best practices and Akamai-specific considerations.' -authors: ["Akamai"] -contributors: ["Akamai"] -published: 2026-03-22 -keywords: ["php", "php-fpm", "nginx", "web servers", "linux"] -tags: ["web-servers", "nginx", "php", "serve"] +authors: ['Akamai'] +contributors: ['Akamai'] +published: 2026-02-20 +keywords: ['php', 'php-fpm', 'fpm', 'nginx', 'web servers', 'linux'] +tags: ['web-servers', 'nginx', php', 'serve', 'fpm'] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' external_resources: - [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) @@ -275,7 +275,6 @@ sudo chown www-data:www-data /var/www/example.com/info.php ### Verify PHP Execution Access the test file through your web browser using your server's IP address or domain name: - ``` http://example.com/info.php ``` From b5d6510459646d5b23229464d654106086dccea4 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Tue, 17 Feb 2026 12:42:53 -0800 Subject: [PATCH 05/22] Added a single quote --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index 53c7a6c3881..c722a8eeb3a 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -1,12 +1,12 @@ --- -slug: php-fpm-nginx +slug: 'php-fpm-nginx' title: 'Modern PHP-FPM and NGINX Configuration' description: 'Install and configure PHP-FPM and NGINX using current upstream best practices and Akamai-specific considerations.' authors: ['Akamai'] contributors: ['Akamai'] published: 2026-02-20 keywords: ['php', 'php-fpm', 'fpm', 'nginx', 'web servers', 'linux'] -tags: ['web-servers', 'nginx', php', 'serve', 'fpm'] +tags: ['web-servers', 'nginx', 'php', 'serve', 'fpm'] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' external_resources: - [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) From 384ede343722d470e3c588c682ed340ac1ced2dd Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Tue, 17 Feb 2026 14:49:47 -0800 Subject: [PATCH 06/22] Finalized troubleshooting section --- .../web-servers/nginx/php-fpm-nginx/index.md | 78 +++++++++---------- 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index c722a8eeb3a..c90e35cc9bf 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -26,7 +26,11 @@ For complete documentation and configuration options see the official: ## Before You Begin -Complete these prerequisites before installing PHP-FPM and NGINX. For initial server setup and OS installation, see the [Ubuntu Server](https://ubuntu.com/server/docs) documentation and [Akamai's Getting Started](https://techdocs.akamai.com/cloud-computing/docs/set-up-and-secure-a-compute-instance) guides. +Complete these prerequisites before installing PHP-FPM and NGINX. + +Create and configure your instance using Akamai's [Creating a Compute Instance](https://techdocs.akamai.com/cloud-computing/docs/create-a-compute-instance) and [Set Up and Secure a Compute Instance](https://techdocs.akamai.com/cloud-computing/docs/set-up-and-secure-a-compute-instance) guides. + +For OS-level documentation, see the [Ubuntu Server](https://ubuntu.com/server/docs) documentation. ### Prerequisites: @@ -139,15 +143,15 @@ The socket path must match the `fastcgi_pass` directive in the NGINX server bloc Create an NGINX server block to handle PHP requests. This example assumes a site served from `/var/www/example.com`. -Create the server block configuration file: +Next, create the server block configuration file: ```command sudo nano /etc/nginx/sites-available/example.com ``` Add the following configuration: -``` -fileserver { +```nginx +server { listen 80; listen [::]:80; server_name example.com www.example.com; @@ -343,7 +347,7 @@ Files should be readable by the web server but writable only by the owner. Direc Configure TLS/SSL certificates to encrypt traffic between clients and your server. HTTPS prevents credential interception and protects session data. -For TLS/SSL certificate configuration on Akamai cloud compute, see [Enable TLS for HTTPS](??????????). +For TLS/SSL certificate configuration on Akamai cloud compute, see [Use Certbot to Enable HTTPS with NGINX on Ubuntu](https://www.linode.com/docs/guides/enabling-https-using-certbot-with-nginx-on-ubuntu/). ### Remove Default Content @@ -412,8 +416,8 @@ PHP-FPM logs process manager events and PHP errors separately from NGINX. **Log locations**: -- PHP-FPM process log: /var/log/php8.1-fpm.log - Pool manager events -- PHP error log: Configured in php.ini via the error_log directive +- PHP-FPM process log: `/var/log/php8.1-fpm.log` - Pool manager events +- PHP error log: Configured in php.ini via the `error_log` directive View PHP-FPM process events: @@ -421,11 +425,11 @@ View PHP-FPM process events: sudo tail -f /var/log/php8.1-fpm.log ``` -PHP application errors appear in the location specified by the 1error_log1 directive in `/etc/php/8.1/fpm/php.ini`. +PHP application errors appear in the location specified by the 1`rror_log` directive in `/etc/php/8.1/fpm/php.ini`. ### Performance Monitoring -Monitor CPU, memory, and network usage through Cloud Manager's built-in metrics dashboard. Track PHP-FPM process counts and memory consumption to identify resource constraints. +Monitor CPU, memory, and network usage through [Cloud Manager's built-in metrics dashboard](https://techdocs.akamai.com/cloud-computing/docs/monitor-and-maintain-a-compute-instance). Track PHP-FPM process counts and memory consumption to identify resource constraints. Key metrics to monitor: @@ -443,60 +447,54 @@ Resolve common issues with PHP-FPM and NGINX deployments. Each section identifie **Symptom**: Browser displays "502 Bad Gateway" or "504 Gateway Timeout" errors when accessing PHP pages. -**Causes and solutions: - -PHP-FPM not running**: +--- -Check PHP-FPM service status: +**Cause**: PHP-FPM service is not running. +**Solution**: Check the service status and start it if stopped: ```command sudo systemctl status php8.1-fpm -``` - -Start the service if stopped: - -```command sudo systemctl start php8.1-fpm ``` -**Socket path mismatch**: -Verify the socket path in NGINX configuration matches PHP-FPM pool configuration: +--- + +**Cause**: Socket path mismatch between NGINX and PHP-FPM configurations. +**Solution**: Verify both paths are identical: ```command grep "fastcgi_pass" /etc/nginx/sites-available/example.com grep "listen" /etc/php/8.1/fpm/pool.d/www.conf ``` -Both values must be identical. Restart both services after correcting mismatches. -**Insufficient PHP-FPM workers**: +Correct any mismatch and restart both services. + +--- -Check if `pm.max_children` limit is reached: +**Cause**: Insufficient PHP-FPM worker processes. + +**Solution**: Check whether `pm.max_children` is being reached: ```command sudo grep "max_children" /var/log/php8.1-fpm.log ``` -Increase `pm.max_children` in `/etc/php/8.1/fpm/pool.d/www.conf` if processes are hitting the limit. +If the limit is being hit, increase `pm.max_children` in `/etc/php/8.1/fpm/pool.d/www.conf`. ### File Permission Issues **Symptom**: "Permission denied" errors in NGINX error log or blank pages when accessing PHP files. -**Solution**: - -Verify NGINX can read PHP files: - +**Solution**: Verify NGINX can read PHP files: ```command sudo -u www-data test -r /var/www/example.com/index.php && echo "Readable" || echo "Permission denied" ``` Set correct ownership: - ```command sudo chown -R www-data:www-data /var/www/example.com ``` Ensure directories are executable and files are readable: - ```command sudo find /var/www/example.com -type d -exec chmod 755 {} \; sudo find /var/www/example.com -type f -exec chmod 644 {} \; @@ -506,22 +504,18 @@ sudo find /var/www/example.com -type f -exec chmod 644 {} \; **Symptom**: Cannot access website from external network, or connection times out. -**Solution**: - -Verify Cloud Firewall allows HTTP/HTTPS traffic: +**Solution**: Verify Cloud Firewall allows HTTP/HTTPS traffic: 1. Navigate to Cloud Manager > Firewalls 2. Select the firewall attached to your instance 3. Confirm inbound rules allow TCP ports 80 and 443 Check local firewall rules if using UFW or iptables: - ```command sudo ufw status ``` Allow HTTP and HTTPS if blocked: - ```command sudo ufw allow 80/tcp sudo ufw allow 443/tcp @@ -531,20 +525,17 @@ sudo ufw allow 443/tcp **Symptom**: PHP-FPM fails to start or access specific files despite correct permissions. -Ubuntu 22.04 uses AppArmor for mandatory access control. Check AppArmor status: - +**Solution**: Ubuntu 22.04 uses AppArmor for mandatory access control. Check AppArmor status: ```command sudo aa-status ``` Review AppArmor denials in system log: - ```command sudo grep "apparmor" /var/log/syslog ``` PHP-FPM's AppArmor profile is located at `/etc/apparmor.d/php-fpm`. Modify the profile only if legitimate application requirements conflict with default restrictions. Reload AppArmor after profile changes: - ```command sudo systemctl reload apparmor ``` @@ -557,15 +548,15 @@ Expand your PHP-FPM deployment with database connectivity, advanced performance Connect your PHP application to a database server: -- [MySQL on Ubuntu 22.04](https://www.linode.com/docs/???) - Install and configure MySQL for PHP applications -- [PostgreSQL on Ubuntu 22.04](https://www.linode.com/docs/???) - Deploy PostgreSQL database server +- [MySQL on Ubuntu 22.04](https://www.linode.com/docs/guides/install-and-configure-mysql-on-ubuntu-22-04/) - Install and configure MySQL for PHP applications +- [PostgreSQL on Ubuntu 22.04](https://www.postgresql.org/download/linux/ubuntu/) - Deploy PostgreSQL database server - [Akamai Managed Databases](https://techdocs.akamai.com/cloud-computing/docs/aiven-database-clusters) - Fully managed database clusters ### Performance Optimization Advanced tuning for production workloads: -- [NGINX Performance Tuning](https://nginx.org/en/docs/http/ngx_http_core_module.html???) - Worker processes, connection limits, and buffer sizing +- [NGINX Performance Tuning: Tips and Tricks](https://blog.nginx.org/blog/performance-tuning-tips-tricks) - Worker processes, connection limits, and buffer sizing - [PHP-FPM Performance](https://www.php.net/manual/en/install.fpm.configuration.php) - Process manager optimization and OPcache configuration - [PHP OPcache Configuration](https://www.php.net/manual/en/opcache.configuration.php) - Bytecode caching for improved performance @@ -581,4 +572,5 @@ Additional security measures beyond basic hardening: Scale your deployment across multiple instances: - [Getting Started with NodeBalancers](https://techdocs.akamai.com/cloud-computing/docs/getting-started-with-nodebalancers) - Load balancing for PHP-FPM instances -- [Cloud Firewall Advanced Configuration](https://techdocs.akamai.com/cloud-computing/docs/manage-firewall-rules) - Security rules for multi-instance deployments \ No newline at end of file +- [Cloud Firewall Advanced Configuration](https://techdocs.akamai.com/cloud-computing/docs/manage-firewall-rules) - Security rules for multi-instance deployments + From 75bf0c10608b6c0c7200ac8fed3bfbf045697b69 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 18 Feb 2026 08:31:14 -0800 Subject: [PATCH 07/22] Fixed metadata in a totally unrelated file --- .../nginx/build-nginx-with-pagespeed-from-source/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md b/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md index 6e22f0069cf..50947efa315 100644 --- a/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md +++ b/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md @@ -1,13 +1,13 @@ --- slug: build-nginx-with-pagespeed-from-source -title: 'Build NGINX with PageSpeed From Source' -description: 'This guide provides you with step-by-step instructions for compiling the Nginx web server from scratch so you can use Google''s PageSpeed moduleon your website.' +title: "Build NGINX with PageSpeed From Source" +description: "This guide provides you with step-by-step instructions for compiling the Nginx web server from scratch so you can use Google''s PageSpeed module on your website." authors: ["Linode"] contributors: ["Linode"] published: 2019-02-01 modified: 2018-02-12 keywords: ["nginx","pagespeed","optimization"] -license: '[CC BY-ND 4.0](http://creativecommons.org/licenses/by-nd/4.0)' +license: "[CC BY-ND 4.0](http://creativecommons.org/licenses/by-nd/4.0)" aliases: ['/web-servers/nginx/install-nginx-pagespeed-module-on-ubuntu1604/','/web-servers/nginx/nginx-with-pagespeed-on-ubuntu-14-04/','/web-servers/nginx/install-nginx-pagespeed-module-on-ubuntu1804/','/web-servers/nginx/build-nginx-with-pagespeed-from-source/'] dedicated_cpu_link: true tags: ["web server","nginx"] From ee3ead63744b11b2d5270ca2e4d4ac4b357c5c16 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 18 Feb 2026 09:57:21 -0800 Subject: [PATCH 08/22] Fixed metadata on several unrelated files that were causing blueberry to choke --- .../configuring-load-balancer-sticky-session/index.md | 2 +- .../index.md | 2 +- .../nginx/how-to-configure-http-2-on-nginx/index.md | 2 +- .../how-to-install-and-use-nginx-on-ubuntu-20-04/index.md | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md b/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md index 94ebc8f4935..c6e9e55dd9b 100644 --- a/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md +++ b/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md @@ -7,7 +7,7 @@ og_description: "When a web application needs to maintain state from one request authors: ["Martin Heller"] contributors: ["Martin Heller"] published: 2021-02-23 -keywords: [‘loadbalancer sticky session'] +keywords: ['loadbalancer sticky session'] tags: ['nginx','networking'] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' --- diff --git a/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md b/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md index b5fe5abc417..3ee97d94520 100644 --- a/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md +++ b/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md @@ -11,7 +11,7 @@ keywords: ["nginx", "web server", "nginx configuration", "multiple sites", "conf license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' aliases: ['/web-servers/nginx/configure-nginx-for-optimized-performance/','/web-servers/nginx/slightly-more-advanced-configurations-for-nginx/','/websites/nginx/configure-nginx-for-optimized-performance/', '/guides/slightly-more-advanced-configurations-for-nginx/'] tags: ["web server","nginx"] -image: Getting-Started-with-NGINX-Part-2-smg.jpg +image: "Getting-Started-with-NGINX-Part-2-smg.jpg" --- ![Getting Started with NGINX - Part 2](Getting-Started-with-NGINX-Part-2-smg.jpg) diff --git a/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md b/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md index e7c9d7cde50..e92609a990a 100644 --- a/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md +++ b/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md @@ -10,7 +10,7 @@ published: 2021-07-16 keywords: ['nginx http2'] tags: ['web server', 'nginx'] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' -image: HowtoConfigureHTTP-2onNGINX.jpg +image: "HowtoConfigureHTTP-2onNGINX.jpg" --- [*HTTP/2*](https://en.wikipedia.org/wiki/HTTP/2) updates the original *Hypertext Transfer Protocol* (HTTP) specification to offer improvements in efficiency and latency. The new version includes several other new features while maintaining compatibility with older browsers. Due to the clear advantages of HTTP/2, web servers should be upgraded to use the new version. This guide explains how to configure, use, and test HTTP/2 with an [*NGINX*](https://www.nginx.com/) server. For a deep-dive into the HTTP/2 protocol see our [An Introduction to HTTP/2](/docs/guides/introducing-http-2/) guide. diff --git a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md index 2adc9dcf94c..bdd091d8f4b 100644 --- a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md +++ b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md @@ -12,10 +12,10 @@ license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' external_resources: - '[NGINX Documentation](https://nginx.org/en/docs/)' relations: - platform: - key: how-to-install-nginx - keywords: - - distribution: Ubuntu 20.04 + platform: + key: how-to-install-nginx + keywords: + - "distribution: Ubuntu 20.04" aliases: ['/web-servers/nginx/installation/ubuntu-10.04-lucid/','/web-servers/nginx/installation/ubuntu-12.04-precise-pangolin/'] --- From 883b379a77e5e3bf7d6d3b4ced2d4dc5d1604ae9 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 18 Feb 2026 10:22:44 -0800 Subject: [PATCH 09/22] Minor punctuation correction --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index c90e35cc9bf..217443fb280 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -15,7 +15,7 @@ external_resources: The PHP FastCGI Process Manager (PHP-FPM) manages PHP processes independent of the web server as a modern FastCGI implementation with NGINX. -Use PHP-FPM with NGINX when you need process isolation, independent PHP and web server scaling, or improved resource management for PHP applications compared to mod_php or CGI implementations +Use PHP-FPM with NGINX when you need process isolation, independent PHP, and web server scaling, or improved resource management for PHP applications compared to mod_php or CGI implementations This guide demonstrates how to deploy PHP-FPM and NGINX on Akamai cloud compute infrastructure. It covers installation of both components on a supported Linux distribution, NGINX configuration for FastCGI proxy, PHP-FPM pool setup, deployment testing, and application of basic security hardening. It addresses Akamai-specific requirements for instance sizing, firewall configuration through Cloud Manager, and performance tuning. From 2d6756cd8e045406aae7cad452bf6b100ae85af9 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 18 Feb 2026 10:38:02 -0800 Subject: [PATCH 10/22] Trying to get the repo working --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index 217443fb280..6beb58a8554 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -15,7 +15,7 @@ external_resources: The PHP FastCGI Process Manager (PHP-FPM) manages PHP processes independent of the web server as a modern FastCGI implementation with NGINX. -Use PHP-FPM with NGINX when you need process isolation, independent PHP, and web server scaling, or improved resource management for PHP applications compared to mod_php or CGI implementations +Use PHP-FPM with NGINX when you need process isolation, independent PHP, and web server scaling or improved resource management for PHP applications compared to mod_php or CGI implementations This guide demonstrates how to deploy PHP-FPM and NGINX on Akamai cloud compute infrastructure. It covers installation of both components on a supported Linux distribution, NGINX configuration for FastCGI proxy, PHP-FPM pool setup, deployment testing, and application of basic security hardening. It addresses Akamai-specific requirements for instance sizing, firewall configuration through Cloud Manager, and performance tuning. From 8e0e7c22f63a50b307a3a618a3a75ee22e47e264 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 18 Feb 2026 11:38:01 -0800 Subject: [PATCH 11/22] Trigger workflow --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index 6beb58a8554..d7c47e03c85 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -17,7 +17,7 @@ The PHP FastCGI Process Manager (PHP-FPM) manages PHP processes independent of t Use PHP-FPM with NGINX when you need process isolation, independent PHP, and web server scaling or improved resource management for PHP applications compared to mod_php or CGI implementations -This guide demonstrates how to deploy PHP-FPM and NGINX on Akamai cloud compute infrastructure. It covers installation of both components on a supported Linux distribution, NGINX configuration for FastCGI proxy, PHP-FPM pool setup, deployment testing, and application of basic security hardening. It addresses Akamai-specific requirements for instance sizing, firewall configuration through Cloud Manager, and performance tuning. +This guide demonstrates how to deploy PHP-FPM and NGINX on Akamai cloud compute infrastructure. It covers installation of both components on a supported Linux distribution, NGINX configuration for FastCGI proxy, PHP-FPM pool setup, deployment testing, and application of basic security hardening. It addresses Akamai-specific requirements for instance sizing, firewall configuration through Cloud Manager as well as performance tuning. For complete documentation and configuration options see the official: From b43b6c8d780c237459ddf601d318c4d16aaa2c81 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 18 Feb 2026 17:31:03 -0800 Subject: [PATCH 12/22] Fixed metadata for quotes and no quotes --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index d7c47e03c85..c3bd60e17d2 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -1,13 +1,13 @@ --- -slug: 'php-fpm-nginx' -title: 'Modern PHP-FPM and NGINX Configuration' -description: 'Install and configure PHP-FPM and NGINX using current upstream best practices and Akamai-specific considerations.' +slug: php-fpm-nginx +title: "Modern PHP-FPM and NGINX Configuration" +description: "Install and configure PHP-FPM and NGINX using current upstream best practices and Akamai-specific considerations." authors: ['Akamai'] contributors: ['Akamai'] published: 2026-02-20 -keywords: ['php', 'php-fpm', 'fpm', 'nginx', 'web servers', 'linux'] -tags: ['web-servers', 'nginx', 'php', 'serve', 'fpm'] -license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +keywords: ['php','php-fpm','fpm','nginx','web servers','linux'] +tags: ['web-servers','nginx','php','serve','fpm'] +license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) external_resources: - [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) - [NGINX](https://nginx.org/en/docs/) From 65d581f7de9a4bd412c6825afb873768451b0302 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Thu, 19 Feb 2026 10:36:18 -0800 Subject: [PATCH 13/22] Metadata correction --- .../nginx/configuring-load-balancer-sticky-session/index.md | 2 +- .../index.md | 2 +- .../web-servers/nginx/how-to-configure-http-2-on-nginx/index.md | 2 +- .../nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md | 2 +- .../web-servers/nginx/serve-php-php-fpm-and-nginx/index.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md b/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md index c6e9e55dd9b..8232d669cc3 100644 --- a/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md +++ b/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md @@ -9,7 +9,7 @@ contributors: ["Martin Heller"] published: 2021-02-23 keywords: ['loadbalancer sticky session'] tags: ['nginx','networking'] -license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) --- ## What is Load Balancing and Why is it Necessary? diff --git a/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md b/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md index 3ee97d94520..74b8b506a5f 100644 --- a/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md +++ b/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md @@ -8,7 +8,7 @@ contributors: ["Linode"] published: 2018-02-09 modified: 2021-12-29 keywords: ["nginx", "web server", "nginx configuration", "multiple sites", "configure caching"] -license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) aliases: ['/web-servers/nginx/configure-nginx-for-optimized-performance/','/web-servers/nginx/slightly-more-advanced-configurations-for-nginx/','/websites/nginx/configure-nginx-for-optimized-performance/', '/guides/slightly-more-advanced-configurations-for-nginx/'] tags: ["web server","nginx"] image: "Getting-Started-with-NGINX-Part-2-smg.jpg" diff --git a/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md b/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md index e92609a990a..a70f2ec9040 100644 --- a/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md +++ b/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md @@ -9,7 +9,7 @@ contributors: ["Jeff Novotny"] published: 2021-07-16 keywords: ['nginx http2'] tags: ['web server', 'nginx'] -license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) image: "HowtoConfigureHTTP-2onNGINX.jpg" --- diff --git a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md index bdd091d8f4b..5de53c1201e 100644 --- a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md +++ b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md @@ -8,7 +8,7 @@ contributors: ["Nathaniel Stickman"] published: 2021-07-09 keywords: ['nginx','web server'] tags: ['ubuntu', 'nginx', 'web server'] -license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) external_resources: - '[NGINX Documentation](https://nginx.org/en/docs/)' relations: diff --git a/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md b/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md index 10d4328c9a9..16b304ddae6 100644 --- a/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md +++ b/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md @@ -8,7 +8,7 @@ published: 2018-02-19 modified: 2021-12-29 keywords: ["php", "php-fpm", "fastcgi"] tags: ["web server","ubuntu","php","nginx"] -license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) aliases: ['/web-servers/nginx/serve-php-php-fpm-and-nginx/','/websites/nginx/install-and-configure-nginx-and-php-fastcgi-on-ubuntu-16-04/','/web-servers/nginx/install-and-configure-nginx-and-php-fastcgi-on-ubuntu-16-04/','/web-servers/nginx/nginx-phpfastcgi-ubuntu-14-04/','/web-servers/nginx/php-fastcgi/ubuntu-12-04-precise-pangolin/'] image: serve-php-with-phpfpm-and-nginx-smp.jpg external_resources: From c521cea7906603dd216c4411e67462b93ae9f3db Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Thu, 19 Feb 2026 12:55:23 -0800 Subject: [PATCH 14/22] Readded quotes to license metadata --- .../nginx/build-nginx-with-pagespeed-from-source/index.md | 2 +- .../nginx/configuring-load-balancer-sticky-session/index.md | 2 +- .../index.md | 2 +- .../how-to-install-and-use-nginx-on-ubuntu-20-04/index.md | 4 ++-- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 6 +++--- .../web-servers/nginx/serve-php-php-fpm-and-nginx/index.md | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md b/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md index 50947efa315..345da56117e 100644 --- a/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md +++ b/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md @@ -6,7 +6,7 @@ authors: ["Linode"] contributors: ["Linode"] published: 2019-02-01 modified: 2018-02-12 -keywords: ["nginx","pagespeed","optimization"] +keywords: ["nginx", "pagespeed", "optimization"] license: "[CC BY-ND 4.0](http://creativecommons.org/licenses/by-nd/4.0)" aliases: ['/web-servers/nginx/install-nginx-pagespeed-module-on-ubuntu1604/','/web-servers/nginx/nginx-with-pagespeed-on-ubuntu-14-04/','/web-servers/nginx/install-nginx-pagespeed-module-on-ubuntu1804/','/web-servers/nginx/build-nginx-with-pagespeed-from-source/'] dedicated_cpu_link: true diff --git a/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md b/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md index 8232d669cc3..e98b836a02f 100644 --- a/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md +++ b/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md @@ -9,7 +9,7 @@ contributors: ["Martin Heller"] published: 2021-02-23 keywords: ['loadbalancer sticky session'] tags: ['nginx','networking'] -license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) +license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" --- ## What is Load Balancing and Why is it Necessary? diff --git a/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md b/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md index 74b8b506a5f..403301963f4 100644 --- a/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md +++ b/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md @@ -8,7 +8,7 @@ contributors: ["Linode"] published: 2018-02-09 modified: 2021-12-29 keywords: ["nginx", "web server", "nginx configuration", "multiple sites", "configure caching"] -license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) +license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" aliases: ['/web-servers/nginx/configure-nginx-for-optimized-performance/','/web-servers/nginx/slightly-more-advanced-configurations-for-nginx/','/websites/nginx/configure-nginx-for-optimized-performance/', '/guides/slightly-more-advanced-configurations-for-nginx/'] tags: ["web server","nginx"] image: "Getting-Started-with-NGINX-Part-2-smg.jpg" diff --git a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md index 5de53c1201e..2cc3f17ac68 100644 --- a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md +++ b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md @@ -6,9 +6,9 @@ description: "Learn the basics of installing and configuring NGINX on your Ubunt authors: ["Nathaniel Stickman"] contributors: ["Nathaniel Stickman"] published: 2021-07-09 -keywords: ['nginx','web server'] +keywords: ['nginx', 'web server'] tags: ['ubuntu', 'nginx', 'web server'] -license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) +license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" external_resources: - '[NGINX Documentation](https://nginx.org/en/docs/)' relations: diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index c3bd60e17d2..d53c2cd6e32 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -5,9 +5,9 @@ description: "Install and configure PHP-FPM and NGINX using current upstream bes authors: ['Akamai'] contributors: ['Akamai'] published: 2026-02-20 -keywords: ['php','php-fpm','fpm','nginx','web servers','linux'] -tags: ['web-servers','nginx','php','serve','fpm'] -license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) +keywords: ['php', 'php-fpm', 'fpm', 'nginx', 'web servers', 'linux'] +tags: ['web-servers', 'nginx', 'php', 'serve', 'fpm'] +license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" external_resources: - [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) - [NGINX](https://nginx.org/en/docs/) diff --git a/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md b/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md index 16b304ddae6..e4e8c5d131f 100644 --- a/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md +++ b/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md @@ -8,7 +8,7 @@ published: 2018-02-19 modified: 2021-12-29 keywords: ["php", "php-fpm", "fastcgi"] tags: ["web server","ubuntu","php","nginx"] -license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) +license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" aliases: ['/web-servers/nginx/serve-php-php-fpm-and-nginx/','/websites/nginx/install-and-configure-nginx-and-php-fastcgi-on-ubuntu-16-04/','/web-servers/nginx/install-and-configure-nginx-and-php-fastcgi-on-ubuntu-16-04/','/web-servers/nginx/nginx-phpfastcgi-ubuntu-14-04/','/web-servers/nginx/php-fastcgi/ubuntu-12-04-precise-pangolin/'] image: serve-php-with-phpfpm-and-nginx-smp.jpg external_resources: From 833d0309e693b91f0815a32c860a56819e44a635 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Fri, 20 Feb 2026 08:47:54 -0800 Subject: [PATCH 15/22] Readded quotes to license metadata in one file --- .../web-servers/nginx/how-to-configure-http-2-on-nginx/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md b/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md index a70f2ec9040..327c225fcc2 100644 --- a/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md +++ b/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md @@ -9,7 +9,7 @@ contributors: ["Jeff Novotny"] published: 2021-07-16 keywords: ['nginx http2'] tags: ['web server', 'nginx'] -license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) +license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" image: "HowtoConfigureHTTP-2onNGINX.jpg" --- From 9274cccff9a90623626de027d6a7c489a941f294 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Fri, 20 Feb 2026 08:56:47 -0800 Subject: [PATCH 16/22] Readded quotes to metadata in one file --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index d53c2cd6e32..45c69f3e1cb 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -9,8 +9,8 @@ keywords: ['php', 'php-fpm', 'fpm', 'nginx', 'web servers', 'linux'] tags: ['web-servers', 'nginx', 'php', 'serve', 'fpm'] license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" external_resources: -- [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) -- [NGINX](https://nginx.org/en/docs/) +- "[PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php)" +- "[NGINX](https://nginx.org/en/docs/)" --- The PHP FastCGI Process Manager (PHP-FPM) manages PHP processes independent of the web server as a modern FastCGI implementation with NGINX. From e1cd46b186b8c86996561364ab10682154f3bf9b Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Fri, 20 Feb 2026 09:27:15 -0800 Subject: [PATCH 17/22] Added new terms to dictionary --- ci/vale/dictionary.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci/vale/dictionary.txt b/ci/vale/dictionary.txt index 67342db7119..c401d91be9b 100644 --- a/ci/vale/dictionary.txt +++ b/ci/vale/dictionary.txt @@ -735,6 +735,7 @@ failsafes falko fanout fastcgi +fastcgi_pass Fastify fastmail fastopen @@ -2317,6 +2318,7 @@ serv server1 serverless servername +server_name serverpassword serverspec servlet From 45216a862c1fba0db4598d20966c259dd643946a Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Fri, 20 Feb 2026 10:21:32 -0800 Subject: [PATCH 18/22] Removed erroneous line for keywords under platform --- .../nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md index 2cc3f17ac68..a2dd6b8de5b 100644 --- a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md +++ b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md @@ -14,8 +14,6 @@ external_resources: relations: platform: key: how-to-install-nginx - keywords: - - "distribution: Ubuntu 20.04" aliases: ['/web-servers/nginx/installation/ubuntu-10.04-lucid/','/web-servers/nginx/installation/ubuntu-12.04-precise-pangolin/'] --- From c8ea5972ead943ce9f9e2eee177bf08d9f51321f Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Fri, 20 Feb 2026 15:03:46 -0800 Subject: [PATCH 19/22] Redid TS section --- .../web-servers/nginx/php-fpm-nginx/index.md | 118 +++++++----------- 1 file changed, 48 insertions(+), 70 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index 45c69f3e1cb..9936f6a836a 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -13,16 +13,11 @@ external_resources: - "[NGINX](https://nginx.org/en/docs/)" --- -The PHP FastCGI Process Manager (PHP-FPM) manages PHP processes independent of the web server as a modern FastCGI implementation with NGINX. +PHP FastCGI Process Manager (PHP-FPM) runs PHP processes independently of the web server, enabling process isolation, independent scaling, and better resource management than mod_php or CGI implementations. -Use PHP-FPM with NGINX when you need process isolation, independent PHP, and web server scaling or improved resource management for PHP applications compared to mod_php or CGI implementations +This guide shows how to deploy PHP-FPM with NGINX on Akamai cloud compute, including installation, FastCGI proxy configuration, PHP-FPM pool setup, and security hardening for Akamai infrastructure. -This guide demonstrates how to deploy PHP-FPM and NGINX on Akamai cloud compute infrastructure. It covers installation of both components on a supported Linux distribution, NGINX configuration for FastCGI proxy, PHP-FPM pool setup, deployment testing, and application of basic security hardening. It addresses Akamai-specific requirements for instance sizing, firewall configuration through Cloud Manager as well as performance tuning. - -For complete documentation and configuration options see the official: - -- [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) -- [NGINX](https://nginx.org/en/docs/) +For full configuration options, see the official [PHP-FPM](https://www.php.net/manual/en/install.fpm.php) and [NGINX](https://nginx.org/en/docs/) documentation. ## Before You Begin @@ -425,7 +420,7 @@ View PHP-FPM process events: sudo tail -f /var/log/php8.1-fpm.log ``` -PHP application errors appear in the location specified by the 1`rror_log` directive in `/etc/php/8.1/fpm/php.ini`. +PHP application errors are written to the file defined by the `error_log` directive in `/etc/php/8.1/fpm/php.ini`. ### Performance Monitoring @@ -441,104 +436,87 @@ For advanced monitoring, integrate with external observability platforms. See th ## Troubleshooting -Resolve common issues with PHP-FPM and NGINX deployments. Each section identifies symptoms and provides diagnostic steps. - -### NGINX Gateway Errors +If your PHP-FPM and NGINX configuration isn't working as expected, use the following steps to diagnose and resolve common issues. PHP, PHP-FPM, and NGINX each log different types of errors, so identifying which component is failing helps you choose the right log and to interpret the issue correctly. -**Symptom**: Browser displays "502 Bad Gateway" or "504 Gateway Timeout" errors when accessing PHP pages. - ---- +1. Check the NGINX Error Log -**Cause**: PHP-FPM service is not running. +NGINX logs routing, FastCGI, and upstream connection issues. Common symptoms include: +- 502 Bad Gateway → NGINX cannot reach PHP FPM +- 403 or 404 errors → incorrect root path or permissions +- PHP file downloads instead of executing → PHP module not loaded -**Solution**: Check the service status and start it if stopped: +View the log: ```command -sudo systemctl status php8.1-fpm -sudo systemctl start php8.1-fpm +sudo tail -f /var/log/nginx/error.log ``` ---- - -**Cause**: Socket path mismatch between NGINX and PHP-FPM configurations. +2. Check the PHP FPM Service Log -**Solution**: Verify both paths are identical: +PHP FPM logs process level issues such as pool misconfiguration, socket failures, crashes, or resource exhaustion. ```command -grep "fastcgi_pass" /etc/nginx/sites-available/example.com -grep "listen" /etc/php/8.1/fpm/pool.d/www.conf +sudo tail -f /var/log/php8.1-fpm.log +``` +Restart PHP FPM if needed: +```command +sudo systemctl restart php8.1-fpm ``` -Correct any mismatch and restart both services. - ---- - -**Cause**: Insufficient PHP-FPM worker processes. +3. Check PHP Application Errors -**Solution**: Check whether `pm.max_children` is being reached: +PHP application level errors (syntax errors, fatal errors, exceptions) are written to the file defined by the `error_log` directive in: ```command -sudo grep "max_children" /var/log/php8.1-fpm.log +/etc/php/8.1/fpm/php.ini ``` -If the limit is being hit, increase `pm.max_children` in `/etc/php/8.1/fpm/pool.d/www.conf`. +Some frameworks override this setting. If the file is empty, check your application’s log directory or the NGINX error log. -### File Permission Issues +4. Verify the PHP FPM Socket or Port -**Symptom**: "Permission denied" errors in NGINX error log or blank pages when accessing PHP files. +If NGINX cannot reach PHP FPM, you may see: -**Solution**: Verify NGINX can read PHP files: -```command -sudo -u www-data test -r /var/www/example.com/index.php && echo "Readable" || echo "Permission denied" -``` +- 502 Bad Gateway +- Connection refused +- No such file or directory -Set correct ownership: +Confirm the socket exists: ```command -sudo chown -R www-data:www-data /var/www/example.com +ls -l /run/php/php8.1-fpm.sock ``` -Ensure directories are executable and files are readable: +If your configuration uses TCP instead of a socket: ```command -sudo find /var/www/example.com -type d -exec chmod 755 {} \; -sudo find /var/www/example.com -type f -exec chmod 644 {} \; +fastcgi_pass 127.0.0.1:9000; ``` -### Firewall Configuration - -**Symptom**: Cannot access website from external network, or connection times out. +Ensure PHP FPM is listening on that address. -**Solution**: Verify Cloud Firewall allows HTTP/HTTPS traffic: +5. Check File and Directory Permissions -1. Navigate to Cloud Manager > Firewalls -2. Select the firewall attached to your instance -3. Confirm inbound rules allow TCP ports 80 and 443 - -Check local firewall rules if using UFW or iptables: +Incorrect ownership or permissions can prevent PHP FPM from reading or executing files. A safe baseline for most deployments: ```command -sudo ufw status +sudo chown -R www-data:www-data /var/www/example.com +sudo find /var/www/example.com -type d -exec chmod 755 {} \; +sudo find /var/www/example.com -type f -exec chmod 644 {} \; ``` -Allow HTTP and HTTPS if blocked: +AppArmor Restrictions (Ubuntu Only) + +If you’re using custom directories or non standard paths, AppArmor may block PHP FPM from reading files even when permissions are correct. Check for denials: ```command -sudo ufw allow 80/tcp -sudo ufw allow 443/tcp +sudo journalctl -xe | grep DENIED ``` -### AppArmor Restrictions - -**Symptom**: PHP-FPM fails to start or access specific files despite correct permissions. +If AppArmor is the cause, update the PHP FPM AppArmor profile or place your files in approved locations. -**Solution**: Ubuntu 22.04 uses AppArmor for mandatory access control. Check AppArmor status: -```command -sudo aa-status -``` +6. Reload or Restart Services -Review AppArmor denials in system log: +After making configuration changes: ```command -sudo grep "apparmor" /var/log/syslog +sudo systemctl reload nginx +sudo systemctl restart php8.1-fpm ``` -PHP-FPM's AppArmor profile is located at `/etc/apparmor.d/php-fpm`. Modify the profile only if legitimate application requirements conflict with default restrictions. Reload AppArmor after profile changes: -```command -sudo systemctl reload apparmor -``` +Reloading NGINX applies configuration changes without dropping active connections. ## Next Steps From add859207d1c1c9a4c8dad4e6486f1059a7f968f Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 25 Feb 2026 16:51:35 -0800 Subject: [PATCH 20/22] Updated from testing --- .../web-servers/nginx/php-fpm-nginx/index.md | 267 +++++++++++++----- 1 file changed, 200 insertions(+), 67 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index 9936f6a836a..02cf8155a67 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -21,7 +21,11 @@ For full configuration options, see the official [PHP-FPM](https://www.php.net/m ## Before You Begin -Complete these prerequisites before installing PHP-FPM and NGINX. +Complete these prerequisites before installing PHP FPM and NGINX. Create and configure your instance using Akamai’s Creating a Compute Instance and Set Up and Secure a Compute Instance guides. + +{{< note>}}: +Before creating your instance, confirm that the plan you select provides enough CPU and RAM for your expected traffic and PHP FPM workload. Use the Instance Sizing Reference below as a quick planning guide. +{{< /note>}} Create and configure your instance using Akamai's [Creating a Compute Instance](https://techdocs.akamai.com/cloud-computing/docs/create-a-compute-instance) and [Set Up and Secure a Compute Instance](https://techdocs.akamai.com/cloud-computing/docs/set-up-and-secure-a-compute-instance) guides. @@ -33,7 +37,19 @@ For OS-level documentation, see the [Ubuntu Server](https://ubuntu.com/server/do - SSH access to the instance with a non-root user account - Sudo privileges for package installation and service management - Cloud Manager access to configure firewall rules -- Basic familiarity with Linux package management (apt) +- Basic familiarity with Linux package management (apt)- + +**Instance Sizing Reference** + +Instance sizing affects PHP FPM performance, especially under concurrent load. Use this table as a planning reference when selecting your instance plan, and revisit it after deployment if you need to resize. + +| Workload | Plan | RAM | +|---|---|---| +| Development/Testing | Shared CPU | 1–2 GB | +| Production: Low to Medium Traffic | Shared CPU | 4–8 GB | +| Production: High Traffic | Dedicated CPU | 8+ GB | + +After deployment, monitor CPU and memory usage in Cloud Manager and adjust your instance size if needed. ## Akamai-Specific Considerations @@ -41,21 +57,23 @@ Configure platform-specific settings for your PHP-FPM deployment including firew ### Cloud Firewall Configuration -Configure Cloud Firewall rules to allow web traffic to your instance. +Configure Cloud Firewall rules to allow web traffic to your instance.Work through these steps promptly, as Cloud Manager sessions can time out and unsaved changes will be lost. -1. Navigate to Cloud Manager and select Firewalls from the sidebar. +1. Navigate to Cloud Manager and select Firewalls from the sidebar under **Networking**. 2. Create a new firewall or modify an existing one. -3. Add inbound rules for HTTP and HTTPS traffic: +3. Add each of the following as a separate inbound rule by clicking **Add an Inbound Rule**, completing the fields, and clicking **Add Rule** before starting the next: - - HTTP: Protocol: TCP, Port: 80, Source: All IPv4 / All IPv6 - - HTTPS: Protocol: TCP, Port: 443, Source: All IPv4 / All IPv6 -4. Apply the firewall to your compute instance. + - HTTP: Protocol: TCP, Port: 80, Action: Accept, Source: All IPv4 / All IPv6 + - HTTPS: Protocol: TCP, Port: 443, Action: Accept, Source: All IPv4 / All IPv6 -For detailed firewall configuration, see [Getting Started with Cloud Firewalls](https://techdocs.akamai.com/cloud-computing/docs/getting-started-with-cloud-firewalls). +4. To apply the firewall to your compute instance: -### Instance Sizing + - select the **Linodes** tab within your firewall + - click **Add Linodes To Firewall** + - select your instance from the list that appears, then click outside the dropdown to close it + - then click **Add**.. -PHP-FPM memory requirements scale with concurrent connections. Select an instance plan based on expected traffic. +For detailed firewall configuration, see [Getting Started with Cloud Firewalls](https://techdocs.akamai.com/cloud-computing/docs/getting-started-with-cloud-firewalls). #### Development/Testing: @@ -68,8 +86,7 @@ PHP-FPM memory requirements scale with concurrent connections. Select an instanc #### Production - High Traffic: -Dedicated CPU (8+ GB RAM) for high-traffic applications requiring sustained CPU performance -Eliminates resource contention for consistent PHP execution times +- Dedicated CPU (8+ GB RAM) for high-traffic applications requiring sustained CPU performance; eliminates resource contention for consistent PHP execution times Monitor CPU and memory usage through Cloud Manager after deployment and resize as needed. @@ -83,19 +100,23 @@ For high-availability deployments, use NodeBalancers to distribute traffic acros ## Install PHP-FPM -Install PHP-FPM and NGINX packages using the Ubuntu package manager. For comprehensive PHP installation options and configuration reference, see the official [PHP-FPM](https://www.php.net/manual/en/install.fpm.php) documentation. +Log in to your instance as the sudo user you create and install PHP-FPM and NGINX packages using the Ubuntu package manager. For comprehensive PHP installation options and configuration reference, see the official [PHP-FPM](https://www.php.net/manual/en/install.fpm.php) documentation. Install the required packages: ```command sudo apt update sudo apt install nginx php8.1-fpm ``` +Type "Y" and enter to continue with installation when prompted about disk space usage.You are returned to the prompt. -Verify both services are installed and running: +Then verify both services are installed and running: ```command sudo systemctl status nginx sudo systemctl status php8.1-fpm ``` +Both commands should return`active (running)` with worker processes listed. Press `q` to return to the command prompt. + +If either service shows a status other than active (running), review the installation steps and check the system logs using `sudo journalctl -u nginx` or `sudo journalctl -u php8.1-fpm`. ### Common PHP Extensions @@ -103,6 +124,7 @@ Install additional PHP extensions based on application requirements: ```command sudo apt install php8.1-mysql php8.1-xml php8.1-mbstring php8.1-curl php8.1-gd ``` +Type "Y" and enter to continue with installation when prompted about disk space usage.You are returned to the prompt. **Common extensions**: @@ -112,39 +134,94 @@ sudo apt install php8.1-mysql php8.1-xml php8.1-mbstring php8.1-curl php8.1-gd - php8.1-curl: HTTP client functionality - php8.1-gd: Image processing -Install only the extensions your application requires. Restart PHP-FPM after installing extensions: +Install only the extensions your application requires. +Restart PHP-FPM after installing extensions: ```command sudo systemctl restart php8.1-fpm ``` +Verify the extensions are active: +```command +php -m | grep -E 'mysql|xml|mbstring|curl|gd' +``` + +A successful installation output looks like this: +```output +curl +gd +libxml +mbstring +mysqli +mysqlnd +pdo_mysql +xml +xmlreader +xmlwriter +``` + +Then confirm PHP-FPM restarted cleanly: +```command +sudo systemctl status php8.1-fpm +``` + +The service should again show `active (running)`. Press `q` to return to the command prompt. + +{{< note>}} +On Ubuntu 22.04 with PHP 8.1, the MySQL extension appears as `mysqlnd` in `php -m` output. This is expected behavior and confirms that MySQL support is active. +{{< /note>}} + +Troubleshooting: MySql extension does not appear in `php-m` + +If the `php -m` doesn't show any of the `mysql` after using the command above to install them, install it explicitly: +```command +sudo apt install php8.1-mysql +``` +Then restart: +```command +sudo systemctl restart php8.1-fpm +``` +Then, again, verify the extensions are active: +```command +php -m | grep -E 'mysql|xml|mbstring|curl|gd' +``` + +A successful installation looks like the output shown above and includes mysql in the list and may include additional modules and indicate normal, expected behavior. + ## Configure NGINX for PHP-FPM -NGINX communicates with PHP-FPM through the FastCGI protocol, passing PHP requests to the PHP-FPM process manager for execution. NGINX was installed in the previous section alongside PHP-FPM. For comprehensive NGINX configuration options, see the official [NGINX](https://nginx.org/en/docs/) documentation. +NGINX communicates with PHP-FPM through the FastCGI protocol, passing PHP requests to the PHP-FPM process manager for execution. NGINX was installed in the previous section alongside PHP-FPM. + +The default NGINX installation requires no additional global configuration to work with PHP-FPM. You only need to create a server block that enables FastCGI processing. + +For comprehensive NGINX configuration options, see the official [NGINX](https://nginx.org/en/docs/) documentation. -### FastCGI Communication +### Verify FastCGI Communication NGINX forwards PHP requests to PHP-FPM via a Unix socket or TCP connection. The Unix socket method provides better performance for local communication between NGINX and PHP-FPM on the same instance. -Verify the PHP-FPM socket location: +**Step 1**: Check the PHP-FPM socket location: ```command ls -la /run/php/php8.1-fpm.sock ``` +This is the type of output you will see: +``` +srw-rw---- 1 www-data www-data 0 Feb 24 18:05 /run/php/php8.1-fpm.sock +``` -The socket path must match the `fastcgi_pass` directive in the NGINX server block configuration. - -### Server Block Configuration +The socket path must match the fastcgi_pass directive in the NGINX server block configuration. If the socket exists and shows the expected ownership and permissions, PHP-FPM is ready for NGINX to connect to it. -Create an NGINX server block to handle PHP requests. This example assumes a site served from `/var/www/example.com`. +### Create the NGINX Server Block -Next, create the server block configuration file: +**Step 1**: Create an NGINX server block file to handle PHP requests. This example assumes a site served from `/var/www/example.com`: ```command sudo nano /etc/nginx/sites-available/example.com ``` -Add the following configuration: +**Step 2**: Add the server block configuration: + ```nginx server { listen 80; @@ -163,7 +240,7 @@ server { } } ``` -Key directives: +**Step 3**: Understand Key directives: - listen: Defines ports for IPv4 and IPv6 - server_name: Domain names for this server block @@ -171,33 +248,40 @@ Key directives: - fastcgi_pass: Socket path for PHP-FPM communication - include snippets/fastcgi-php.conf: Standard FastCGI parameters -Enable the server block and test the configuration: +**Step 4**: Enable the server block and test the configuration: ```command sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t ``` +{{< note>}} +If the symlink already exists, you may see a"File exists" message. This means the site is already enable and you can continue to the next step. +{{< /note>}} -Reload NGINX to apply changes: +Then after you run the next command you receive a confirmation message that the `syntax is okay` and the `test was successful`. + +**Step 5: Reload NGINX to apply changes: ```command sudo systemctl reload nginx ``` +Success returns you to the prompt. -### Configure PHP-FPM +## Configure PHP-FPM -PHP-FPM uses pool configuration files to define how the process manager handles requests. The default pool configuration is located at `/etc/php/8.1/fpm/pool.d/www.conf`. For comprehensive configuration options and tuning guidance, see the official PHP-FPM configuration documentation. +The default pool configuration listens at `/etc/php/8.1/fpm/pool.d/www.conf` which matches the `fastcgi_pass` directive in you NGINX server block. No changes are required for standard deployments (for more information see the official PHP-FPM configuration documentation). -### Verify Socket Configuration +### Verify PHP-FPM Socket Configuration Confirm the PHP-FPM socket path matches the NGINX server block configuration. -Open the pool configuration file: +**Step 1**: Open the pool configuration file ```command sudo nano /etc/php/8.1/fpm/pool.d/www.conf ``` -Locate the `listen` directive: + +**Step 2**: Locate the `listen` directive: ```file listen = /run/php/php8.1-fpm.sock @@ -205,11 +289,11 @@ listen = /run/php/php8.1-fpm.sock This socket path must match the `fastcgi_pass` directive in your NGINX server block. The default configuration is correct for most deployments. -### Process Manager Configuration +### Process Manager Configuration (Optional) -PHP-FPM's process manager controls how worker processes are spawned and managed. The `pm` directive defines the process management strategy. +PHP-FPM's process manager controls how worker processes are spawned and managed. These settings are optional and do not affect basic functionality. -Key process manager directives in `/etc/php/8.1/fpm/pool.d/www.conf`: +**Default Process Manager Settings** ```file pm = dynamic @@ -219,7 +303,7 @@ pm.min_spare_servers = 1 pm.max_spare_servers = 3 ``` -**Process manager settings:** +**Directive Description** - **pm = dynamic**: Spawns child processes based on demand - **pm.max_children**: Maximum concurrent PHP-FPM processes @@ -227,33 +311,35 @@ pm.max_spare_servers = 3 - **pm.min_spare_servers**: Minimum idle processes - **pm.max_spare_servers**: Maximum idle processes -### Performance Tuning Considerations +### Performance Tuning (Advanced, Optional) Adjust `pm.max_children` based on available memory and expected traffic. Each PHP-FPM process typically consumes 20-50 MB of RAM depending on application complexity. -**Memory calculation:** -``` +**Memory Calculation Example** +```text pm.max_children = (Available RAM - System RAM) / Average Process Memory ``` -For a 4 GB instance with 1 GB reserved for system processes and 30 MB per PHP process: -``` -pm.max_children = (4096 MB - 1024 MB) / 30 MB ≈ 100 +For a 4 GB instance with 1 GB reserved for system processes and an average PHP-FPM worker size of 80 MB: +```text +pm.max_children = (4096 MB - 1024 MB) / 80 MB ≈ 38 ``` +This formula is provided as a planning guideline only. It is not a command and does not produce output. + Monitor actual memory usage after deployment and adjust accordingly. Exceeding available memory causes swapping and degrades performance. -Restart PHP-FPM to apply configuration changes: +Restart PHP-FPM to apply configuration changes if you have made any to the process manager settings: ```command sudo systemctl restart php8.1-fpm ``` -### Test the Deployment +## Test the Deployment -Verify PHP-FPM and NGINX are correctly configured by creating a test PHP file and accessing it through a web browser. +Testing confirms that NGINX and PHP-FRM are communicating correctly. ### Create Test File -Create a PHP info file in your document root: +**Step 1**: Create a PHP info file in your document root: ```command sudo nano /var/www/example.com/info.php ``` @@ -265,11 +351,12 @@ phpinfo(); ?> ``` -Set appropriate permissions: +**Step 2**: Set Permissions: ```command sudo chown www-data:www-data /var/www/example.com/info.php ``` +This command produces no output when successful. ### Verify PHP Execution @@ -278,19 +365,23 @@ Access the test file through your web browser using your server's IP address or http://example.com/info.php ``` -A page displaying PHP configuration information confirms PHP-FPM is processing requests correctly. The page shows the PHP version, loaded extensions, and configuration directives. +A page displaying PHP configuration information confirms PHP-FPM is processing requests correctly. -Verify the Server API line shows `FPM/FastCGI`, confirming NGINX is communicating with PHP-FPM rather than using an alternative PHP handler. +Verify the Server API line shows: +``` +`FPM/FastCGI` +``` +This confirms NGINX is communicating with PHP-FPM rather than using an alternative PHP handler. -### Remove Test File +### Remove the Test File -Delete the info file after verification to prevent exposing system configuration: +Delete the info file after verification to prevent exposing system configuration details: ```command sudo rm /var/www/example.com/info.php ``` -The `phpinfo()` function displays sensitive server information including file paths, loaded modules, and environment variables. Remove this file immediately after testing. +The `phpinfo()` function displays sensitive server information including file paths, loaded modules, and environment variables, so removal is necessary. ## Basic Security Hardening @@ -323,14 +414,15 @@ Test your application after disabling functions to ensure required functionality Set appropriate ownership and permissions for web files to prevent unauthorized modification. Set ownership to the web server user: - ```command sudo chown -R www-data:www-data /var/www/example.com ``` + Set directory permissions: ```command sudo find /var/www/example.com -type d -exec chmod 755 {} \; ``` + Set file permissions: ```command sudo find /var/www/example.com -type f -exec chmod 644 {} \; @@ -342,11 +434,13 @@ Files should be readable by the web server but writable only by the owner. Direc Configure TLS/SSL certificates to encrypt traffic between clients and your server. HTTPS prevents credential interception and protects session data. -For TLS/SSL certificate configuration on Akamai cloud compute, see [Use Certbot to Enable HTTPS with NGINX on Ubuntu](https://www.linode.com/docs/guides/enabling-https-using-certbot-with-nginx-on-ubuntu/). +For TLS/SSL certificate configuration on Akamai cloud compute, see [Use Certbot to Enable HTTPS with NGINX on Ubuntu](https://www.linode.com/docs/guides/enabling-https-using-certbot-with-nginx-on-ubuntu/).Although the linked Akamai guide references Ubuntu 18.04/20.04, the Certbot installation and NGINX integration steps are identical on Ubuntu 22.04. You can safely follow the Akamai guide as written. + +For users who prefer the most current upstream reference, [Certbot’s official](https://certbot.eff.org/instructions) Ubuntu 22.04 instructions follow the same workflow and may be used interchangeably. ### Remove Default Content -Delete default NGINX welcome pages and example files to reduce information disclosure: +Remove default NGINX content to prevent exposing server details and reduce your attack surface. Default welcome pages and example configurations can reveal information about your environment and should be removed on production systems. ```command sudo rm /var/www/html/index.nginx-debian.html @@ -365,9 +459,10 @@ sudo systemctl reload nginx ### Production Environment Considerations -Disable PHP error display in production to prevent exposing system information through error messages. +**Critical: Disable PHP Error Display in Production** +Displaying PHP errors in production exposes internal paths, configuration details, and environment information that attackers can exploit. Configure PHP to log errors privately instead. -Edit the PHP configuration file: +Edit the PHP configuration file (scroll or page down to the end of the file to place these directives): ```command sudo nano /etc/php/8.1/fpm/php.ini @@ -379,10 +474,15 @@ display_errors = Off log_errors = On error_log = /var/log/php-fpm/error.log ``` +Be sure to save: Ctrl X, "Y", Enter. -Errors are logged to `/var/log/php-fpm/error.log` for debugging without exposing details to users. Restart PHP-FPM after making changes. +Errors are logged to `/var/log/php-fpm/error.log` for debugging without exposing details to users. -Never deploy `phpinfo()` or similar diagnostic scripts to production environments. These scripts expose configuration details including file paths, loaded modules, and environment variables. +Restart PHP-FPM after making changes: +```command +sudo systemctl reload php8.1-fpm + +**Never deploy `phpinfo()` or similar diagnostic scripts in production**. These scripts expose details about your PHP environment--including file paths, loaded modules, extensions, environment variables, and configuration values--all of which can be used by attackers to map your system and target vulnerabilities. ## Logging and Monitoring @@ -394,25 +494,44 @@ NGINX stores access and error logs in `/var/log/nginx/` by default. **Log locations**: -- Access log: /var/log/nginx/access.log - Records all requests -- Error log: /var/log/nginx/error.log - Records server errors and warnings +- Access log: `/var/log/nginx/access.log` - Records all requests +- Error log: `/var/log/nginx/error.log` - Records server errors and warnings View recent NGINX errors: ```command sudo tail -f /var/log/nginx/error.log ``` +Use `Ctrl+ C` to stop following the log and return to the shell prompt. + +If a command opens in a pager (showing a `:` at the bottom), press `q` to exit. + +**Searching logs** + +Use `grep` to search for specific errors or keywords in large log files: +```command +sudo grep -i "error" /var/log/nginx/error.log +sudo grep -i "timeout" /var/log/nginx/error.log +sudo grep -i "php" /var/log/nginx/error.log +``` +This helps locate relevant entries quickly when logs are long or noisy. -Configure custom log locations in server block configurations using the `access_log` and `error_log` directives. +**Custom log locations** + +Configure custom log locations in server block configurations using the `access_log` and `error_log` directives. For example. +```nginx +access_log /var/log/nginx/example.access.log; +error_log /var/log/nginx/example.log; +``` ### PHP-FPM Logs -PHP-FPM logs process manager events and PHP errors separately from NGINX. +PHP-FPM logs **process manager events** and **PHP application errors** separately from NGINX. **Log locations**: -- PHP-FPM process log: `/var/log/php8.1-fpm.log` - Pool manager events -- PHP error log: Configured in php.ini via the `error_log` directive +- PHP-FPM process log: `/var/log/php8.1-fpm.log` - pool manager lifecycle events +- PHP application error log: Defined by the `error log` directive in `php.ini` View PHP-FPM process events: @@ -420,7 +539,19 @@ View PHP-FPM process events: sudo tail -f /var/log/php8.1-fpm.log ``` -PHP application errors are written to the file defined by the `error_log` directive in `/etc/php/8.1/fpm/php.ini`. +Expected output: + +When PHP FPM restarts (for example, after a system reboot or a configuration reload), the process log records normal lifecycle events such as: + +- `NOTICE: Terminating ...` +- `NOTICE: exiting, bye-bye!` +- `NOTICE: fpm is running, pid ` +- `NOTICE: ready to handle connections` +- `NOTICE: systemd monitor interval set to 10000ms` + +These messages indicate that PHP FPM stopped and started cleanly. The `tail -f` command will remain open and display new events as they occur. + +PHP application level errors (syntax errors, fatal errors, ecceptons) are written to the file defined by the `error_log` directive in `/etc/php/8.1/fpm/php.ini`. ### Performance Monitoring @@ -434,6 +565,8 @@ Key metrics to monitor: For advanced monitoring, integrate with external observability platforms. See the [NGINX](https://nginx.org/en/docs/http/ngx_http_stub_status_module.html) monitoring documentation for enabling the stub status module. +These metrics don't require a test step during deployment; they become relevant as your application begins handling real traffic. + ## Troubleshooting If your PHP-FPM and NGINX configuration isn't working as expected, use the following steps to diagnose and resolve common issues. PHP, PHP-FPM, and NGINX each log different types of errors, so identifying which component is failing helps you choose the right log and to interpret the issue correctly. From 63c097e6311e8b6031d7f2cbdca6fc7236934b8c Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Thu, 26 Feb 2026 09:57:55 -0800 Subject: [PATCH 21/22] Fixed Vale error and added review changes --- .../web-servers/nginx/php-fpm-nginx/index.md | 65 +++++++++++-------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index 02cf8155a67..aee30ea7119 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -551,30 +551,32 @@ When PHP FPM restarts (for example, after a system reboot or a configuration rel These messages indicate that PHP FPM stopped and started cleanly. The `tail -f` command will remain open and display new events as they occur. -PHP application level errors (syntax errors, fatal errors, ecceptons) are written to the file defined by the `error_log` directive in `/etc/php/8.1/fpm/php.ini`. +PHP application-level errors are written to the file specified by the `error_log` directive in `/etc/php/8.1/fpm/php.ini`. ### Performance Monitoring -Monitor CPU, memory, and network usage through [Cloud Manager's built-in metrics dashboard](https://techdocs.akamai.com/cloud-computing/docs/monitor-and-maintain-a-compute-instance). Track PHP-FPM process counts and memory consumption to identify resource constraints. +Monitor CPU, memory, and network usage through [Cloud Manager's built-in metrics dashboard](https://techdocs.akamai.com/cloud-computing/docs/monitor-and-maintain-a-compute-instance). Track PHP-FPM process counts and memory consumption to identify resource constraints as your application begins handling real traffic. Key metrics to monitor: -- **CPU usage**: Sustained high CPU indicates insufficient instance sizing or inefficient code -- **Memory usage**: Approaching total RAM triggers swapping and performance degradation -- **PHP-FPM process count**: Reaching `pm.max_children` indicates configuration adjustments needed +- **CPU usage**: Sustained high CPU means the instance is too small for the workload or the application is doing more work than expected. +- **Memory usage**: High memory usage forces the system to swap to disk, which significantly slows request processing. +- **PHP-FPM process count**: Reaching `pm.max_children` means all workers are busy, so new requests queue and may slow down or time out (configuration adjustments needed). -For advanced monitoring, integrate with external observability platforms. See the [NGINX](https://nginx.org/en/docs/http/ngx_http_stub_status_module.html) monitoring documentation for enabling the stub status module. +For deeper visibility into request behavior and PHP-FPM saturation, integrate with an external observability platforms. See the [NGINX](https://nginx.org/en/docs/http/ngx_http_stub_status_module.html) monitoring documentation for enabling the stub status module. -These metrics don't require a test step during deployment; they become relevant as your application begins handling real traffic. +These metrics don’t require a test step during deployment; they become relevant once your application is serving real traffic. For help interpreting these metrics and resolving issues such as PHP-FPM saturation or slow requests, see the Troubleshooting section that follows. ## Troubleshooting -If your PHP-FPM and NGINX configuration isn't working as expected, use the following steps to diagnose and resolve common issues. PHP, PHP-FPM, and NGINX each log different types of errors, so identifying which component is failing helps you choose the right log and to interpret the issue correctly. +If your PHP-FPM and NGINX configuration isn't working as expected, use the steps below to identify where the issue is occurring and how to resolve it. PHP, PHP FPM, and NGINX each log different types of errors, so knowing which component to check helps you interpret problems quickly and accurately. + +These steps don't produce output unless an issue is present. Use them when your application shows errors, slowdowns, or unexpected behavior. 1. Check the NGINX Error Log NGINX logs routing, FastCGI, and upstream connection issues. Common symptoms include: -- 502 Bad Gateway → NGINX cannot reach PHP FPM +- 502 Bad Gateway → NGINX cannot reach PHP-FPM - 403 or 404 errors → incorrect root path or permissions - PHP file downloads instead of executing → PHP module not loaded @@ -583,9 +585,9 @@ View the log: sudo tail -f /var/log/nginx/error.log ``` -2. Check the PHP FPM Service Log +2. Check the PHP-FPM Service Log -PHP FPM logs process level issues such as pool misconfiguration, socket failures, crashes, or resource exhaustion. +PHP-FPM logs process-level issues such as pool misconfiguration, socket failures, crashes, or resource exhaustion. ```command sudo tail -f /var/log/php8.1-fpm.log ``` @@ -603,9 +605,9 @@ PHP application level errors (syntax errors, fatal errors, exceptions) are writt Some frameworks override this setting. If the file is empty, check your application’s log directory or the NGINX error log. -4. Verify the PHP FPM Socket or Port +4. Verify the PHP-FPM Socket or Port -If NGINX cannot reach PHP FPM, you may see: +If NGINX cannot reach PHP-FPM, you may see: - 502 Bad Gateway - Connection refused @@ -621,11 +623,11 @@ If your configuration uses TCP instead of a socket: fastcgi_pass 127.0.0.1:9000; ``` -Ensure PHP FPM is listening on that address. +Ensure PHP-FPM is listening on that address. 5. Check File and Directory Permissions -Incorrect ownership or permissions can prevent PHP FPM from reading or executing files. A safe baseline for most deployments: +Incorrect ownership or permissions can prevent PHP-FPM from reading or executing files. A safe baseline for most deployments: ```command sudo chown -R www-data:www-data /var/www/example.com sudo find /var/www/example.com -type d -exec chmod 755 {} \; @@ -634,14 +636,25 @@ sudo find /var/www/example.com -type f -exec chmod 644 {} \; AppArmor Restrictions (Ubuntu Only) -If you’re using custom directories or non standard paths, AppArmor may block PHP FPM from reading files even when permissions are correct. Check for denials: +If you’re using custom directories or non-standard paths, AppArmor may block PHP-FPM from reading files even when permissions are correct. Check for denials: ```command sudo journalctl -xe | grep DENIED ``` -If AppArmor is the cause, update the PHP FPM AppArmor profile or place your files in approved locations. +If AppArmor is the cause, update the PHP-FPM AppArmor profile or place your files in approved locations. + +6. Check for PHP-FPM worker saturation + +If your application slows down or returns 504 errors, PHP-FPM may have reached pm.max_children. This means all workers are busy, new requests are waiting in a queue, and some may slow down or time out. + +Look for messages such as: + +• server reached pm.max_children setting +• pool seems busy + +These indicate that PHP-FPM cannot spawn additional workers and is under load. See the Performance Monitoring section for guidance on watching process counts and memory usage. -6. Reload or Restart Services +7. Reload or Restart Services After making configuration changes: ```command @@ -653,30 +666,30 @@ Reloading NGINX applies configuration changes without dropping active connection ## Next Steps -Expand your PHP-FPM deployment with database connectivity, advanced performance tuning, and high-availability configurations. +Expand your PHP-FPM deployment with database connectivity, advanced performance tuning, and high-availability configurations as your application grows. ### Database Integration Connect your PHP application to a database server: - [MySQL on Ubuntu 22.04](https://www.linode.com/docs/guides/install-and-configure-mysql-on-ubuntu-22-04/) - Install and configure MySQL for PHP applications -- [PostgreSQL on Ubuntu 22.04](https://www.postgresql.org/download/linux/ubuntu/) - Deploy PostgreSQL database server -- [Akamai Managed Databases](https://techdocs.akamai.com/cloud-computing/docs/aiven-database-clusters) - Fully managed database clusters +- [PostgreSQL on Ubuntu 22.04](https://www.postgresql.org/download/linux/ubuntu/) - Install PostgreSQL from official Ubuntu packages +- [Akamai Managed Databases](https://techdocs.akamai.com/cloud-computing/docs/aiven-database-clusters) - Fully managed database clusters for production workloads ### Performance Optimization -Advanced tuning for production workloads: +Improve performance for production environments: - [NGINX Performance Tuning: Tips and Tricks](https://blog.nginx.org/blog/performance-tuning-tips-tricks) - Worker processes, connection limits, and buffer sizing -- [PHP-FPM Performance](https://www.php.net/manual/en/install.fpm.configuration.php) - Process manager optimization and OPcache configuration -- [PHP OPcache Configuration](https://www.php.net/manual/en/opcache.configuration.php) - Bytecode caching for improved performance +- [PHP-FPM Configuration](https://www.php.net/manual/en/install.fpm.configuration.php) - Process manager tuning and OPcache settings +- [PHP OPcache Configuration](https://www.php.net/manual/en/opcache.configuration.php) - Bytecode caching for PHP execution ### Security Hardening -Additional security measures beyond basic hardening: +Strengthen your deployment beyond basic hardening: - [PHP Security Best Practices](https://www.php.net/manual/en/security.php) - Official PHP security guidance -- [NGINX Security Configuration](https://nginx.org/en/docs/http/ngx_http_ssl_module.html) - TLS/SSL configuration and security headers +- [NGINX Security Configuration](https://nginx.org/en/docs/http/ngx_http_ssl_module.html) - TLS settings and security headers ### High Availability From 21b52d7ba4cdbd738cd4c01ceb76bdb9e84213e0 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Thu, 26 Feb 2026 13:01:32 -0800 Subject: [PATCH 22/22] Corrected punctuation and spacing --- .../web-servers/nginx/php-fpm-nginx/index.md | 76 ++++++++++--------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index aee30ea7119..cbd7e430ee3 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -21,10 +21,10 @@ For full configuration options, see the official [PHP-FPM](https://www.php.net/m ## Before You Begin -Complete these prerequisites before installing PHP FPM and NGINX. Create and configure your instance using Akamai’s Creating a Compute Instance and Set Up and Secure a Compute Instance guides. +Complete these prerequisites before installing PHP-FPM and NGINX. Create and configure your instance using Akamai’s Creating a Compute Instance and Set Up and Secure a Compute Instance guides. -{{< note>}}: -Before creating your instance, confirm that the plan you select provides enough CPU and RAM for your expected traffic and PHP FPM workload. Use the Instance Sizing Reference below as a quick planning guide. +{{< note>}} +Before creating your instance, confirm that the plan you select provides enough CPU and RAM for your expected traffic and PHP-FPM workload. Use the Instance Sizing Reference below as a quick planning guide. {{< /note>}} Create and configure your instance using Akamai's [Creating a Compute Instance](https://techdocs.akamai.com/cloud-computing/docs/create-a-compute-instance) and [Set Up and Secure a Compute Instance](https://techdocs.akamai.com/cloud-computing/docs/set-up-and-secure-a-compute-instance) guides. @@ -37,11 +37,11 @@ For OS-level documentation, see the [Ubuntu Server](https://ubuntu.com/server/do - SSH access to the instance with a non-root user account - Sudo privileges for package installation and service management - Cloud Manager access to configure firewall rules -- Basic familiarity with Linux package management (apt)- +- Basic familiarity with Linux package management (apt) **Instance Sizing Reference** -Instance sizing affects PHP FPM performance, especially under concurrent load. Use this table as a planning reference when selecting your instance plan, and revisit it after deployment if you need to resize. +Instance sizing affects PHP-FPM performance, especially under concurrent load. Use this table as a planning reference when selecting your instance plan, and revisit it after deployment if you need to resize. | Workload | Plan | RAM | |---|---|---| @@ -57,21 +57,21 @@ Configure platform-specific settings for your PHP-FPM deployment including firew ### Cloud Firewall Configuration -Configure Cloud Firewall rules to allow web traffic to your instance.Work through these steps promptly, as Cloud Manager sessions can time out and unsaved changes will be lost. +Configure Cloud Firewall rules to allow web traffic to your instance. Work through these steps promptly, as Cloud Manager sessions can time out and unsaved changes will be lost. 1. Navigate to Cloud Manager and select Firewalls from the sidebar under **Networking**. 2. Create a new firewall or modify an existing one. 3. Add each of the following as a separate inbound rule by clicking **Add an Inbound Rule**, completing the fields, and clicking **Add Rule** before starting the next: - - HTTP: Protocol: TCP, Port: 80, Action: Accept, Source: All IPv4 / All IPv6 - - HTTPS: Protocol: TCP, Port: 443, Action: Accept, Source: All IPv4 / All IPv6 + - HTTP: Protocol: TCP, Port: 80, Action: Accept, Source: All IPv4 / All IPv6 + - HTTPS: Protocol: TCP, Port: 443, Action: Accept, Source: All IPv4 / All IPv6 4. To apply the firewall to your compute instance: - - select the **Linodes** tab within your firewall - - click **Add Linodes To Firewall** - - select your instance from the list that appears, then click outside the dropdown to close it - - then click **Add**.. + - select the **Linodes** tab within your firewall + - click **Add Linodes To Firewall** + - select your instance from the list that appears, click outside the dropdown to close it + - then click **Add**. For detailed firewall configuration, see [Getting Started with Cloud Firewalls](https://techdocs.akamai.com/cloud-computing/docs/getting-started-with-cloud-firewalls). @@ -107,7 +107,7 @@ Install the required packages: sudo apt update sudo apt install nginx php8.1-fpm ``` -Type "Y" and enter to continue with installation when prompted about disk space usage.You are returned to the prompt. +Type "Y" and enter to continue with installation when prompted about disk space usage. You are returned to the prompt. Then verify both services are installed and running: ```command @@ -198,7 +198,7 @@ For comprehensive NGINX configuration options, see the official [NGINX](https:// ### Verify FastCGI Communication -NGINX forwards PHP requests to PHP-FPM via a Unix socket or TCP connection. The Unix socket method provides better performance for local communication between NGINX and PHP-FPM on the same instance. +NGINX forwards PHP requests to PHP-FPM via a UNIX socket or TCP connection. The Unix socket method provides better performance for local communication between NGINX and PHP-FPM on the same instance. **Step 1**: Check the PHP-FPM socket location: @@ -242,11 +242,11 @@ server { ``` **Step 3**: Understand Key directives: -- listen: Defines ports for IPv4 and IPv6 -- server_name: Domain names for this server block -- root: Document root directory -- fastcgi_pass: Socket path for PHP-FPM communication -- include snippets/fastcgi-php.conf: Standard FastCGI parameters + - listen: Defines ports for IPv4 and IPv6 + - server_name: Domain names for this server block + - root: Document root directory + - fastcgi_pass: Socket path for PHP-FPM communication + - include snippets/fastcgi-php.conf: Standard FastCGI parameters **Step 4**: Enable the server block and test the configuration: @@ -255,7 +255,7 @@ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t ``` {{< note>}} -If the symlink already exists, you may see a"File exists" message. This means the site is already enable and you can continue to the next step. +If the symlink already exists, you may see a "File exists" message. This means the site is already enabled and you can continue to the next step. {{< /note>}} Then after you run the next command you receive a confirmation message that the `syntax is okay` and the `test was successful`. @@ -269,7 +269,7 @@ Success returns you to the prompt. ## Configure PHP-FPM -The default pool configuration listens at `/etc/php/8.1/fpm/pool.d/www.conf` which matches the `fastcgi_pass` directive in you NGINX server block. No changes are required for standard deployments (for more information see the official PHP-FPM configuration documentation). +The default pool configuration listens at `/etc/php/8.1/fpm/pool.d/www.conf` which matches the `fastcgi_pass` directive in your NGINX server block. No changes are required for standard deployments (for more information see the official PHP-FPM configuration documentation). ### Verify PHP-FPM Socket Configuration @@ -305,11 +305,11 @@ pm.max_spare_servers = 3 **Directive Description** -- **pm = dynamic**: Spawns child processes based on demand -- **pm.max_children**: Maximum concurrent PHP-FPM processes -- **pm.start_servers**: Processes created at startup -- **pm.min_spare_servers**: Minimum idle processes -- **pm.max_spare_servers**: Maximum idle processes + - **pm = dynamic**: Spawns child processes based on demand + - **pm.max_children**: Maximum concurrent PHP-FPM processes + - **pm.start_servers**: Processes created at startup + - **pm.min_spare_servers**: Minimum idle processes + - **pm.max_spare_servers**: Maximum idle processes ### Performance Tuning (Advanced, Optional) @@ -389,7 +389,7 @@ Apply foundational security measures to protect your PHP-FPM deployment. These s ### Disable Dangerous PHP Functions -Restrict PHP functions that can execute system commands or access the filesystem in ways that pose security risks. +Restrict PHP functions that can execute system commands or access the file system in ways that pose security risks. Edit the PHP configuration file: @@ -434,7 +434,7 @@ Files should be readable by the web server but writable only by the owner. Direc Configure TLS/SSL certificates to encrypt traffic between clients and your server. HTTPS prevents credential interception and protects session data. -For TLS/SSL certificate configuration on Akamai cloud compute, see [Use Certbot to Enable HTTPS with NGINX on Ubuntu](https://www.linode.com/docs/guides/enabling-https-using-certbot-with-nginx-on-ubuntu/).Although the linked Akamai guide references Ubuntu 18.04/20.04, the Certbot installation and NGINX integration steps are identical on Ubuntu 22.04. You can safely follow the Akamai guide as written. +For TLS/SSL certificate configuration on Akamai cloud compute, see [Use Certbot to Enable HTTPS with NGINX on Ubuntu](https://www.linode.com/docs/guides/enabling-https-using-certbot-with-nginx-on-ubuntu/). Although the linked Akamai guide references Ubuntu 18.04/20.04, the Certbot installation and NGINX integration steps are identical on Ubuntu 22.04. You can safely follow the Akamai guide as written. For users who prefer the most current upstream reference, [Certbot’s official](https://certbot.eff.org/instructions) Ubuntu 22.04 instructions follow the same workflow and may be used interchangeably. @@ -460,6 +460,7 @@ sudo systemctl reload nginx ### Production Environment Considerations **Critical: Disable PHP Error Display in Production** + Displaying PHP errors in production exposes internal paths, configuration details, and environment information that attackers can exploit. Configure PHP to log errors privately instead. Edit the PHP configuration file (scroll or page down to the end of the file to place these directives): @@ -481,6 +482,7 @@ Errors are logged to `/var/log/php-fpm/error.log` for debugging without exposing Restart PHP-FPM after making changes: ```command sudo systemctl reload php8.1-fpm +``` **Never deploy `phpinfo()` or similar diagnostic scripts in production**. These scripts expose details about your PHP environment--including file paths, loaded modules, extensions, environment variables, and configuration values--all of which can be used by attackers to map your system and target vulnerabilities. @@ -541,7 +543,7 @@ sudo tail -f /var/log/php8.1-fpm.log Expected output: -When PHP FPM restarts (for example, after a system reboot or a configuration reload), the process log records normal lifecycle events such as: +When PHP-FPM restarts (for example, after a system reboot or a configuration reload), the process log records normal lifecycle events such as: - `NOTICE: Terminating ...` - `NOTICE: exiting, bye-bye!` @@ -549,7 +551,7 @@ When PHP FPM restarts (for example, after a system reboot or a configuration rel - `NOTICE: ready to handle connections` - `NOTICE: systemd monitor interval set to 10000ms` -These messages indicate that PHP FPM stopped and started cleanly. The `tail -f` command will remain open and display new events as they occur. +These messages indicate that PHP-FPM stopped and started cleanly. The `tail -f` command will remain open and display new events as they occur. PHP application-level errors are written to the file specified by the `error_log` directive in `/etc/php/8.1/fpm/php.ini`. @@ -563,13 +565,13 @@ Key metrics to monitor: - **Memory usage**: High memory usage forces the system to swap to disk, which significantly slows request processing. - **PHP-FPM process count**: Reaching `pm.max_children` means all workers are busy, so new requests queue and may slow down or time out (configuration adjustments needed). -For deeper visibility into request behavior and PHP-FPM saturation, integrate with an external observability platforms. See the [NGINX](https://nginx.org/en/docs/http/ngx_http_stub_status_module.html) monitoring documentation for enabling the stub status module. +For deeper visibility into request behavior and PHP-FPM saturation, integrate with external observability platforms. See the [NGINX](https://nginx.org/en/docs/http/ngx_http_stub_status_module.html) monitoring documentation for enabling the stub status module. These metrics don’t require a test step during deployment; they become relevant once your application is serving real traffic. For help interpreting these metrics and resolving issues such as PHP-FPM saturation or slow requests, see the Troubleshooting section that follows. ## Troubleshooting -If your PHP-FPM and NGINX configuration isn't working as expected, use the steps below to identify where the issue is occurring and how to resolve it. PHP, PHP FPM, and NGINX each log different types of errors, so knowing which component to check helps you interpret problems quickly and accurately. +If your PHP-FPM and NGINX configuration isn't working as expected, use the steps below to identify where the issue is occurring and how to resolve it. PHP, PHP-FPM, and NGINX each log different types of errors, so knowing which component to check helps you interpret problems quickly and accurately. These steps don't produce output unless an issue is present. Use them when your application shows errors, slowdowns, or unexpected behavior. @@ -591,7 +593,7 @@ PHP-FPM logs process-level issues such as pool misconfiguration, socket failures ```command sudo tail -f /var/log/php8.1-fpm.log ``` -Restart PHP FPM if needed: +Restart PHP-FPM if needed: ```command sudo systemctl restart php8.1-fpm ``` @@ -645,12 +647,12 @@ If AppArmor is the cause, update the PHP-FPM AppArmor profile or place your file 6. Check for PHP-FPM worker saturation -If your application slows down or returns 504 errors, PHP-FPM may have reached pm.max_children. This means all workers are busy, new requests are waiting in a queue, and some may slow down or time out. +If your application slows down or returns 504 errors, PHP-FPM may have reached `pm.max_children`. This means all workers are busy, new requests are waiting in a queue, and some may slow down or time out. Look for messages such as: -• server reached pm.max_children setting -• pool seems busy + • server reached `pm.max_children` setting + • pool seems busy These indicate that PHP-FPM cannot spawn additional workers and is under load. See the Performance Monitoring section for guidance on watching process counts and memory usage. @@ -662,7 +664,7 @@ sudo systemctl reload nginx sudo systemctl restart php8.1-fpm ``` -Reloading NGINX applies configuration changes without dropping active connections. +**Reloading** NGINX applies configuration changes without dropping active connections. ## Next Steps