Ce este IIS?

În această postare, vom arunca o privire atentă asupra IIS (Internet Information Services). Ne vom uita la ceea ce face și cum funcționează. Veți învăța cum să îl activați pe Windows. Și după ce am stabilit o bază de referință cu gestionarea IIS folosind GUI, veți vedea cum să lucrați cu el folosind CLI. Să începem!

Ce este un server web IIS?

Un server web IIS rulează pe platforma Microsoft .NET pe sistemul de operare Windows. Deși este posibil să rulați IIS pe Linux și Mac-uri folosind Mono, nu este recomandat și probabil va fi instabil. (Există și alte opțiuni, pe care le voi prezenta mai târziu). Este versatil și stabil și este utilizat pe scară largă în producție de mulți ani. Versiunea 10 este cea mai recentă. După ce este instalat, veți vedea această pagină de bun venit în browserul dumneavoastră. „Tervetuloa!”

Dar înainte de a intra în detalii despre IIS, să începem prin a defini un server web în sens general.

Ce este un server web?

Internetul este bun. Iar internetul nu poate exista fără servere web. Dar ce este mai exact un server web? Să definim acest lucru în abstract, astfel încât să putem avea un anumit context pentru modul în care IIS îndeplinește acest rol.

Un server web este un proces pentru găzduirea aplicațiilor web. Serverul web permite unei aplicații să proceseze mesajele care sosesc prin anumite porturi TCP (în mod implicit). De exemplu, portul implicit pentru traficul HTTP este 80, iar cel pentru HTTPS este 443.

Când vizitați un site web în browser, de obicei nu specificați numărul portului, cu excepția cazului în care serverul web este configurat să primească trafic pe alte porturi decât cele implicite. Vizitând http://www.example.com, veți trimite implicit cererea dvs. către portul 80. Ați putea specifica numărul portului dacă doriți http://www.example.com:80, și https://www.example.com:443 pentru TLS (Transport Layer Security).

Să presupunem că este configurată configurația implicită și că TLS este configurat pentru aplicația dumneavoastră web, serverul web va primi tot traficul de intrare pe porturile 80 și 443. Depinde ce face serverul web cu traficul de acolo. Există nenumărate opțiuni pentru modul în care serverul web poate procesa aceste cereri.

Cum tratează IIS cererile web?

Cele două modele principale de procesare pentru serverele web sunt fie tratarea tuturor cererilor pe un singur fir, fie generarea unui nou fir pentru fiecare cerere. Deși modelul cu un singur fir (Node.js, de exemplu) are la dispoziție câteva fire de lucru (worker threads), acesta le folosește de obicei doar pentru anumite tipuri de muncă, cum ar fi accesul la sistemul de fișiere. Modelul thread-per-request pe care îl folosește IIS (și vărul său ușor IIS Express) va prelua un fir de la un grup de fire pentru fiecare solicitare.

Serverele web tratează de obicei solicitările folosind un model cerere-răspuns. Clientul trimite o cerere și primește un răspuns dacă totul merge bine. Protocolul HTTP este alegerea omniprezentă atunci când se comunică între un client și un server web pe internet.

Caracteristici

IIS este bogat în caracteristici. Cel mai frecvent, IIS este utilizat pentru a găzdui aplicații web ASP.NET și site-uri web statice. De asemenea, poate fi folosit ca server FTP, poate găzdui servicii WCF și poate fi extins pentru a găzdui aplicații web construite pe alte platforme, cum ar fi PHP.

Există opțiuni de autentificare încorporate, cum ar fi Basic, ASP.NET și Windows auth. Aceasta din urmă este utilă dacă aveți un mediu Windows Active Directory-utilizatorii pot fi conectați automat la aplicațiile web folosind contul lor de domeniu. Alte caracteristici de securitate încorporate includ gestionarea și legarea certificatelor TLS pentru a activa HTTPS și SFTP pe site-urile dvs., filtrarea cererilor pentru lista albă sau neagră a traficului, reguli de autorizare, jurnalizarea cererilor și un set bogat de opțiuni de securitate specifice FTP.

O caracteristică cheie a IIS este pool-ul de aplicații. Va trebui să ne uităm mai îndeaproape la pool-ul de aplicații, deoarece este o componentă critică a modelului de proces IIS.

O caracteristică neprețuită este managementul la distanță. IIS poate fi gestionat și prin intermediul CLI sau folosind PowerShell. Puteți să scriptuiți totul, ceea ce este grozav dacă vă place puterea care vine odată cu posibilitatea de a face acest lucru.

Până acum, ar trebui să aveți o impresie bună despre configurabilitatea și versatilitatea IIS. De asemenea, ar trebui să știți că acesta poate fi extins pentru a servi (joc de cuvinte) multor scopuri în afară de găzduirea aplicațiilor ASP.NET. Prin extindere, IIS devine un server web extrem de versatil și stabil pentru platforma Windows. Să aruncăm o privire asupra modului de instalare a IIS pe Windows 10. (Același proces este valabil și pentru Windows 7 și 8.)

Configurați IIS

Să-i spunem „instalare” ar fi cam mult. La urma urmei, IIS este o funcție din Windows. Ceea ce trebuie să faceți de fapt este să activați caracteristica. În Windows 10, puteți apăsa tasta Windows și tasta „turn win”. Ar trebui să vedeți „Turn Windows features on or off.”

Select that to open the „Windows Features” dialog. De aici, puteți activa tot felul de caracteristici suplimentare, inclusiv PowerShell 2.0, un arbore de directoare profund de opțiuni pentru Internet Information Services (IIS) și un subsistem pentru Linux. (Trebuie să spun că ultima mi-a fost utilă de nenumărate ori, de exemplu atunci când o aplicație Node are câteva scripturi shell ca parte a compilării npm).

Opțiunea Internet Information Services (IIS) este cea pe care o dorim!

Doar făcând clic pe căsuța pentru aceasta vă va oferi un bun punct de plecare. S-ar putea, totuși, să doriți să săpați mai adânc. World Wide Web Services > Caracteristicile de dezvoltare a aplicației > este locul în care activați ASP.NET, CGI și protocolul WebSocket. Puteți reveni oricând la acest lucru dacă trebuie să faceți ajustări.

Pentru a activa IIS pe Windows Server, puteți utiliza fie PowerShell, fie Server Manager pentru a instala „Rolul Web (IIS)”. Consultați acest walkthrough pentru detalii.

După ce ați selectat toate caracteristicile IIS dorite, faceți clic pe OK și mergeți să vă luați o ceașcă de cafea proaspătă. Când instalarea este gata, puteți ajunge la IIS GUI tastând „IIS” în căutarea din Windows sau rulând „inetmgr.”

GUI

Înainte de a intra în detalii, vreau să vă fac o scurtă introducere în IIS Manager. Am evidențiat zonele de interes pentru că acest lucru este un adevărat dezastru. Este nevoie de ceva timp pentru a se obișnui, dar există câteva lucruri cu care vă pot oferi ajutor, în ceea ce privește deplasarea aici.

În primul rând, există trei panouri. Cel din stânga are serverele conectate. (Vă puteți conecta și la serverele de la distanță.) Panoul din mijloc este cel în care se găsesc toate funcțiile, cum ar fi securitatea aplicațiilor, logarea, filtrarea și redirecționarea. Sau când selectați „Content View” (Vizualizare conținut), veți vedea în schimb conținutul aici, în mijloc. În dreapta se află panoul de acțiuni. Acesta se schimbă în funcție de contextul selectat.

Nu sunt sigur de ce este acolo acea mică pictogramă suplimentară din dreapta jos, dar puteți redimensiona fereastra și acolo jos.

TIP: puteți face clic dreapta pe majoritatea pictogramelor și folosi meniul contextual pentru a efectua cele mai comune acțiuni.

Dacă extindeți „conexiune” în panoul conexiuni, primul lucru pe care ar trebui să îl vedeți este „Application Pools”, urmat de „Sites”. Ne vom concentra pe acestea în următoarele două secțiuni.

Poluri de aplicații…Ce sunt și cum funcționează?

Iată o privire asupra grupurilor de aplicații care sunt configurate în mod implicit în IIS. După cum puteți vedea, există combinații de v2.0 și v4.0, precum și de clasic și integrat.

Painelul integrat diferă de cel clasic prin faptul că ASP.NET este integrat în pipeline-ul de cereri al IIS. În modul clasic, cererile trebuiau să treacă printr-o conductă pentru IIS și o alta pentru ASP.NET. Modul integrat a fost modul preferat de când IIS 7 a fost lansat cu Windows Server 2008 și Vista. Nu folosiți modul clasic decât dacă sunteți nevoit. Același lucru este valabil și pentru v2.0. Ele sunt doar pentru suportul moștenit. De fapt, dacă nu aveți nevoie de aceste pool-uri de aplicații, ați putea la fel de bine să mergeți mai departe și să le eliminați. Nu avem nevoie de nimic care să atârne prin preajmă!

Un singur pool de aplicații are de la zero la mai multe procese de lucru (w3wp.exe) care rulează la un moment dat. Procesele de lucru rulează instanțe ale aplicației dumneavoastră.

Crearea grupurilor de aplicații

În panoul „Actions” din partea dreaptă a ferestrei IIS, faceți clic pe „Add Application Pool…” pentru a afișa fereastra de dialog. Este destul de simplu. De obicei, puteți doar să introduceți un nume și să apăsați „enter” sau să faceți clic pe „OK.”

De asemenea, puteți adăuga un pool de aplicații făcând clic dreapta pe nodul „Application Pools” din panoul „Connections”. Sfatul de mai devreme își dovedește deja valoarea!

Utilizatori de pool de aplicații

IIS creează un utilizator virtual pentru fiecare pool de aplicații (nomenclatură comună pentru pool de aplicații). Aceste procese worker rulează în mod implicit ca utilizator virtual al app pool-ului. Ele pot rula ca un alt utilizator (un cont de domeniu, de exemplu) dacă au nevoie de permisiuni speciale.

Chiar dacă am eliminat pool-urile de aplicații de pe server, utilizatorii virtuali continuă să trăiască!

Acesti utilizatori virtuali primesc în continuare propriile lor dosare standard, cum ar fi „Desktop”, „Music” și „Pictures”. Ele nu mestecă atât de mult spațiu (110 MB), dar odată ce app pool-ul este eliminat, aceste dosare de utilizator sunt cruft și pot fi șterse.

Reciclarea app pool-ului

O caracteristică cheie a app pool-urilor este reciclarea. În mod implicit, app pools se reciclează la fiecare 1740 de minute (29 de ore) și atunci când fișierul de configurare se modifică. Puteți configura reciclarea pentru a se potrivi nevoilor dumneavoastră. Reciclarea app pool-ului eliberează memoria consumată de aplicațiile care rulează într-un app pool. Reciclarea poate împiedica procesele de tip „runaway” să mestece toată memoria de pe serverul dumneavoastră.

Ce tipuri de lucruri folosesc memoria în procesul dumneavoastră? Tot ceea ce se află pe stivă și heap – variabile statice și proprietăți, tot ceea ce se află în memoria cache, orice obiecte care sunt referite de un alt obiect, orice blocuri de memorie care așteaptă să fie colectate la gunoi, ați înțeles imaginea.

Puteți alege ce evenimente doriți să înregistrați (sau să nu înregistrați). După cum puteți vedea, nu toate opțiunile sunt afișate în dialogul anterior – „Evenimentele de reciclare în timp de execuție” nu par a fi configurabile. Acest lucru nu este în întregime adevărat.

O reciclare pornește un nou proces, apoi oprește procesul curent. Noul proces va avea, așa cum v-ați aștepta, un nou PID. Puteți schimba acest comportament, precum și alte comportamente de reciclare, în „Advanced Settings…”. De fapt, puteți edita oricare dintre configurațiile de reciclare din acest meniu. Dialogul „Recycling…” este redundant din acest punct de vedere. Cu toate acestea, aici puteți dezactiva reciclarea pentru modificările de configurare. Totuși, probabil că nu doriți să o faceți. Aplicația dvs. în execuție nu ar primi actualizările de configurare.

Rețineți că „reciclare suprapusă” implică faptul că este posibil să aveți mai multe instanțe ale aplicației. Ar trebui să dezactivați acest lucru numai dacă aplicația dvs. o necesită. Reciclarea suprapusă previne întreruperile care ar apărea dacă reciclarea ar aștepta ca procesul curent să epuizeze cererile înainte de a începe noul proces. Cu alte cuvinte, nicio nouă cerere nu ar fi gestionată până când cererile curente nu se termină sau până când nu se scurge perioada de timp configurabilă (90 de secunde în mod implicit).

Configurare avansată

Există mult prea multe configurații ale app pool-ului pentru a le itera în detaliu în această postare. Pentru moment, o scurtă prezentare generală va trebui să fie suficientă. Voi înșira rapid câteva puncte despre fiecare dintre zonele de „Advanced Settings” (Setări avansate), așa cum se arată mai jos.

  • Setarea „General” vă va permite
    • Schimbarea .NET CLR versiuni
    • Permiteți 32-.aplicații pe 32 biți
    • Schimbarea modului pipeline
    • Setarea lungimii cozii de așteptare (1000 de cereri în mod implicit)
    • Setarea de a rula întotdeauna sau la cerere
  • Opțiunea „CPU” acoperă
    • Throttling
    • Afinitatea procesorului
  • „Process model” vă va permite să alegeți setările pentru
    • Identity
    • Idle timeout
    • Max worker processes
    • Health monitoring (Ar trebui să dezactivați acest lucru la nivel local pentru depanare, deoarece un depanator oprit nu va răspunde la ping)
  • „Process Orphaning” este util pentru depanarea proceselor care nu răspund
  • „Rapid-Fail Protection” este bun pentru atunci când doriți să configurați răspunsurile de echilibrare a încărcăturii la eșecuri

Site

„Sites” este nodul de lângă „Application Pools” în nodul server din managerul IIS. Aici se adaugă și se gestionează site-urile web și site-urile FTP (dacă sunt instalate). În timp ce pool-urile de aplicații au un dialog de setări avansate, site-urile au mult mai multe opțiuni de configurare! Site-urile au multe caracteristici, fiecare cu propriile lor configurații.

Aceste caracteristici se regăsesc sub trei rubrici în managerul IIS:

  • ASP.NET (dacă îl aveți instalat)
  • IIS
  • Management

Meniu context

Puteți comuta între „Features” (Caracteristici) și „Content” (Conținut) atunci când aveți un site selectat. Puteți să faceți clic dreapta pe site și să deschideți dosarul din meniul contextual selectând „Explorare”. Există și alte lucruri pe care le puteți face din acest meniu contextual, cum ar fi editarea permisiunilor.

De fapt, acest lucru nu face decât să afișeze proprietățile dosarului site-ului. De acolo, va trebui să treceți la fila „Securitate” pentru a edita efectiv permisiunile.

În mod tipic Windows, există mai multe alte moduri în care puteți edita permisiunile. Consultați site-urile dvs. preferate de ajutor Windows pentru mai multe informații despre cum să setați permisiunile dosarelor.

Puteți efectua mai multe sarcini comune din meniul contextual. În interiorul elementului „Gestionare site web”, puteți porni și opri site-ul web, îl puteți deschide în browser și puteți merge la setările avansate. Cu siguranță vom dori să ne uităm la acestea, dar mai întâi, să vorbim despre ceea ce veți vedea atunci când selectați „Edit Bindings…”, care este, de asemenea, disponibil în panoul „Action” ca „Bindings…”.

Bindings

Vă va trebui să adăugați o legătură de site în fereastra de dialog „Bindings…” dacă activați HTTPS pentru site-ul dumneavoastră. De asemenea, puteți seta acolo numele gazdei și numerele de port. Dacă aveți legături suplimentare pentru site-ul dvs., le puteți adăuga și pe acestea aici. Poate că folosiți legăturile net.tcp sau net.pipe (dacă ați adăugat aceste caracteristici pe server și le-ați activat pentru site). Sau puteți seta o adresă IP aici.

Este posibil să rulați mai mult de un site care ascultă pe același port. Pentru a face acest lucru, veți folosi nume de gazdă diferite. De exemplu, ați putea avea admin.example.com legat la site-ul dvs. de administrare și blog.example.com legat la blogul dvs. Tot traficul de pe example.com ar merge către același IP (load-balancer/server), dar IIS ar folosi antetul de gazdă pentru a direcționa traficul către site-ul corespunzător. Acestea sunt utile și pentru aplicațiile cu etichetă albă: acme.example.com, foo.example.com, bar.example.com.

Setări de bază

„Setări de bază…” este aceeași fereastră de dialog pe care o obțineți atunci când configurați site-ul pentru prima dată. Probabil că nu va fi nevoie să mergeți acolo decât dacă doriți să schimbați grupul de aplicații sau locația site-ului sau dacă doriți să vă conectați ca utilizator diferit, în loc de IUSR (pass thru). Dacă trebuie să folosiți un cont de serviciu pentru a accesa directorul site-ului, puteți alege „Connect as…” (Conectare ca…) din fereastra de dialog „Edit Site” (Editare site).

Nota: trebuie să aveți grijă să securizați orice directoare pe care o folosiți în IIS. Puteți beneficia de citirea informațiilor despre modul în care este securizat directorul implicit inetpub.

Subsite și directoare virtuale

Puteți găzdui mai multe aplicații și directoare virtuale sub un singur site. Aplicațiile pot rula în propriile grupuri de aplicații, dar nu și directoarele virtuale. După cum se arată mai jos, am configurat o aplicație de administrare și un director virtual de blog sub Site2. Acestea pot fi accesate folosind http://localhost/admin și http://localhost/blog. Ambele vor răspunde cu pagini de eroare încorporate, cu excepția cazului în care există ceva în directoare.

Directoarele sursă pentru subaplicații și directoare virtuale nu trebuie să fie neapărat subdirectoare ale site-ului părinte. Puteți păstra aceste directoare oriunde doriți. Este posibil să doriți să mapezi unele resurse web comune (imagini sau fișiere JS) pe o cale relativă pentru mai multe site-uri. Directoarele virtuale sunt perfecte pentru acest lucru.

Documente implicite și de eroare

Când un utilizator vizitează rădăcina site-ului dumneavoastră (www.example.com/), îi va fi prezentat un document implicit. Documentele implicite sunt prezentate mai jos. Puteți să adăugați propriile documente, să eliminați documente sau să le dezactivați cu totul. Dacă le dezactivați, utilizatorul va primi un ecran de eroare 403 urât, cu excepția cazului în care ați acordat permisiunea de a lista conținutul dosarelor (nerecomandat). Cel mai bine este să aveți un document implicit.

Am pus un document de index în fiecare director: site-ul, aplicația și directorul virtual.

  • Site2
    • Admin
      • index.html
    • Blog
      • index.html
    • index.html
  • index.html
  • http://localhost/ va încărca documentul implicit de la Site2/index.html
  • http://localhost/admin/ va încărca documentul implicit de la Site2/Admin/index.html
  • http://localhost/blog/ va încărca documentul implicit de la Site2/Blog/index.html
  • Dacă vă îngrijorează faptul că IIS ocupă memorie și CPU pe mașina dumneavoastră, nu vă îngrijorați. Cu excepția cazului în care procesele worker sunt în curs de execuție (și gestionează cereri cu procesare intensă), acesta stă degeaba. Dacă observați o utilizare intensă a CPU, acest ghid de depanare vă poate ajuta, cu condiția să folosiți ASP.NET.

    CLI și gestionare la distanță

    AppCmd.exe

    AppCmd este instrumentul CLI încorporat pentru configurarea și gestionarea IIS. Îl puteți utiliza pentru a crea site-uri și grupuri de aplicații, pentru a lega directoare virtuale și pentru a edita configurații. Să ne uităm la câteva lucruri pe care le poate face.

    În primul rând, adăugați %systemroot%\system32\inetsrv\ la calea dvs. de acces, astfel încât să puteți rula appcmd de la o linie de comandă din orice locație.

    Rulați linia de comandă ca administrator.

    setx PATH "%PATH%;%systemroot%\system32\inetsrv\"

    Încercați următoarele comenzi pentru a explora appcmd:

    • Runcă appcmd /? pentru a vedea textul de ajutor
    • Vezi ce aplicații rulează cu appcmd list app
    • Utilizați appcmd list backup pentru a vedea copiile de rezervă ale configurației IIS

    Adaugați site-ul

    appcmd add site /name:"Dummy Site" /id:10 /bindings:http/*:81:

    Acum listați din nou aplicațiile. Nu veți vedea noul site pe care l-ați adăugat, deoarece nu este considerat o aplicație. Dacă mergeți la GUI și reîmprospătați site-urile, veți vedea noul site acolo, dar va fi stricat. Trebuie să adăugăm o aplicație folosind appcmd.

    appcmd add app /site.name:"Dummy Site" /path:"/"

    Aceasta va adăuga aplicația doar la site-ul de la rădăcină. Va crea o aplicație numită „Dummy Site/”. Încă mai trebuie să legăm aplicația la un director virtual, apoi să o direcționăm către o cale fizică.

    appcmd add vdir /app.name:"Dummy Site/" path:"/"appcmd set vdir "Dummy Site/" /physicalPath:"c:\inetpub\wwwroot"

    Aceasta este modalitatea veritabilă de a folosi appcmd pentru a crea un site IIS. Există o cale mai ușoară.

    Calea EZ

    Puteți economisi o mulțime de apăsări de taste în timpul creării site-ului dacă setați parametrul physicalPath în prima comandă. Aceasta va face totul dintr-o singură lovitură:

    appcmd add site /name:"Dummy Site" /id:10 /bindings:http/*:81: /physicalPath:"c:\inetpub\wwwroot"

    Dar cunoașterea celorlalte comenzi vă oferă o idee mai bună despre cum funcționează cu adevărat o aplicație IIS sub capotă. În trecut, am folosit appcmd în scriptul post-build al fișierelor proj ASP.NET pentru a mă asigura că site-ul a fost configurat local pe noile mașini ale dezvoltatorilor. De asemenea, puteți face o copie de rezervă și o restaurare a configurației IIS folosind appcmd.

    Deploying updates

    Pentru a vă mai da o idee despre utilizarea appcmd, luați în considerare următoarele:

    1. Crearea unui dosar „sites”.
    2. Crearea unui subdosar pentru fiecare site.
    3. Dispuneți versiunile în subfolderele de sub fiecare dintre acestea.
    4. Stabiliți noile versiuni.
    5. Utilizați appcmd pentru a actualiza site-ul pentru a utiliza noul dosar.

    Dată o aplicație numită „Hello World” care indică spre C:\Sites\HelloWorld\1.0.0.0 și un nou build „1.0.1” care a fost pregătit în C:\Sites\HelloWorld\1.0.1 , atunci când este timpul să intrați în funcțiune, atunci puteți folosi următoarea comandă pentru a întoarce site-ul la noua versiune:

    appcmd set vdir "Dummy Site/" /physicalPath:"c:\Sites\HelloWorld.0.1"appcmd recycle apppool /apppool.name:defaultapppool

    Și dacă aveți nevoie să dați înapoi site-ul, rulați următoarele:

    appcmd set vdir "Dummy Site/" /physicalPath:"c:\Sites\HelloWorld.0.0"appcmd recycle apppool /apppool.name:defaultapppool

    Iată un ghid excelent de la Microsoft cu mai multe informații despre utilizarea AppCmd.

    IIS reset

    „iisreset” este un executabil separat utilizat pentru a opri, porni, reporni IIS sau eveniment pentru a reporni calculatorul (/REBOOT). Îi puteți trece un parametru „computername” pentru ca acesta să controleze IIS pe un alt calculator. Va trebui să îl rulați ca administrator. Mulți dezvoltatori și administratori de sistem preferă să folosească acest lucru după o implementare, și nici asta nu este o idee rea!

    PowerShell

    PowerShell are un set puternic de instrumente pentru gestionarea IIS. De asemenea, ați putea trimite comanda iisreset de la distanță folosind Invoke-Command -ComputerName „computername” -ScriptBlock {iisreset}, cu condiția să permiteți invocarea de la distanță a comenzilor arbitrare pe serverele dumneavoastră – și asta nu este, în general, o idee bună!

    În ciuda propriilor mele preocupări legate de securitate cu privire la trimiterea de comenzi arbitrare de la distanță folosind PowerShell, cmdleturile de administrare IIS sunt foarte utile pentru administrarea serverului web în stil DevOps. Puteți verifica această documentație pentru administrarea IIS folosind PowerShell pentru a vă face o idee despre ceea ce poate face.

    Închiderea

    În ciuda tuturor caracteristicilor, configurațiilor și comenzilor pe care le-am acoperit în această postare, am zgâriat doar suprafața. Fiecare caracteristică are propriile sale configurații și există multe extensii care pot fi adăugate prin instalarea extensiei Web Platform Installer.

    Și cu aceasta, să încheiem acest post și serverul IIS:

    iisreset /stop

    Cu APM, măsurători de sănătate a serverului și integrarea jurnalului de erori, îmbunătățiți-vă performanța aplicației cu Stackify Retrace. Încercați astăzi versiunea de încercare gratuită de două săptămâni

    .

    Lasă un răspuns

    Adresa ta de email nu va fi publicată.