Skip to main content

IIS Express: consentire l’accesso da connessioni remote (external requests)

A partire da Visual Studio 2012 il venerando web server di sviluppo Cassini è stato rimpiazzato da IIS Express. Questo cambiamento, che secondo la Microsoft ha il merito di aver notevolmente semplificato le cose ai nuovi sviluppatori, ha provocato la scomparsa – per ragioni di sicurezza – di alcune importanti opzioni di configurazione, tra cui la possibilità di cambiare il local hostname e la porta HTTP mediante la GUI (tramite la finestra Proprietà dell’applicazione web). Come se non bastasse la configurazione predefinita di IIS Express, a differenza di quella di Cassini, non consente di rispondere a request esterne, ovvero effettuate da altri dispositivi collegati tramite rete.

HTTP Error 503. The service is unavailable.

OUCH!.Don.Draper

Si tratta di una limitazione particolarmente grave, specialmente in un periodo come quello attuale in cui, stante la grande diffusione di siti responsive, pagine mobile-friendly e webapp, effettuare test su dispositivi diversi si rivela spesso un’operazione fondamentale fin dalle prime fasi dello sviluppo.

Il Problema.

I motivi che impediscono a IIS Express di rispondere a richieste esterne sono generalmente tre:

  1. Il file di configurazione predefinito, che contiene i riferimenti ad ogni applicazione web nel momento in cui questa viene attivata in Debug o in Release mode da Visual Studio.
  2. I criteri di accesso predefiniti (ACL) previsti per le connessioni al componente HTTP.SYS, che non consentono a un’applicazione dotata di privilegi standard – come Visual Studio eseguito normalmente, ovvero senza privilegi di amministratore – di gestire traffico esterno.
  3. Il Firewall di Windows (o altro firewall installato sul sistema), che con tutta probabilità non è configurato per consentire connessioni esterne in ingresso dalla porta TCP assegnata automaticamente all’applicazione web.

La Soluzione.

Vediamo come risolvere tutti questi problemi:

  • Assicuratevi di non avere istanze di Visual Studio aperte.
  • Aprite il file  %userprofile%\Documenti\IISExpress\config\applicationhost.config  , dove %userprofile% corrisponde alla cartella che ospita il profilo del vostro utente – ad esempio C:\Users\NomeUtente\
  • Cercate la entry corrispondente all’applicazione web che vogliamo modificare e cambiamo le configurazioni di binding nel seguente modo:
    <binding protocol="http" bindingInformation="*:<port>:*" /> In buona sostanza si tratta di sostituire una coppia di localhost con altrettanti asterischi, lasciando inalterata la porta assegnata automaticamente (che troverete al posto di <port>). Se avete necessità di cambiare anche quest’ultima, sostituitela con una porta TCP a piacere (es. 8080) ed eseguite anche il prossimo passaggio, in caso contrario potrete saltare direttamente allo step successivo.
  • Se avete cambiato la porta, aprite il file di progetto (.csproj) e il file di soluzione (.sln) corrispondenti alla vostra applicazione web e assicuratevi che non vi siano riferimenti alla porta precedente: è possibile che siano presenti o meno a seconda del tipo di progetto (Web Application, MVC App, Web Site, etc.).  In caso affermativo, sostituite la vecchia porta con la nuova.
  • Aprite un Prompt dei Comandi (con privilegi di Amministratore) e digitate il seguente comando:
    netsh http add urlacl url=http://*:<port>/ user=everyone Inserendo ovviamente la porta dell’applicazione web al posto di <port>. Nel caso in cui riceviate un messaggio di errore (1789) significa che il gruppo Everyone non è presente nel vostro sistema, cosa che può accadere in alcune localizzazioni di Windows. Se è il vostro caso, sostituite everyone con il nome del gruppo corrispondente. In alternativa ad effettuare questo passaggio potete provare ad eseguire Visual Studio con privilegi di amministratore.
  • Abilitate il traffico interno dell’applicazione IISExpress.exe mediante il pannello di configurazione avanzata di Windows Firewall (o altro Firewall installato) o, in alternativa, aprite il traffico interno per la porta TCP corrispondente a quella della vostra applicazione.

Una volta fatto tutto questo potrete lanciare nuovamente Visual Studio e lanciare la vostra applicazione in Debug o Release mode:  dovreste essere in grado di accedervi da qualsiasi dispositivo collegato alla vostra stessa rete al seguente indirizzo web:

http://<lan-ip-address>:<port>/

Visual Studio 2015 Update

Come giustamente indicato da Zachary Pittman (a cui vanno i nostri ringraziamenti), la versione di IIS Express installata con Visual Studio 2015 crea un file applicationhost.config specifico per ciascun progetto web: tale file si trova nella sottocartella   /.vs/ , situata all’interno della cartella principale del progetto. In ogni caso, per determinare l’esatta collocazione del file, è sempre possibile fare click con il tasto destro sull’icona di IIS Express presente nel system tray: da lì è possibile selezionare > Show all applications e visualizzare il percorso del file applicationhost.config relativo al proprio progetto.

Le Alternative.

Diciamolo pure: IIS Express, con tutte le sue limitazioni, è ben lontano dall’essere uno strumento di lavoro perfetto. Chiunque sentisse la necessità di dotarsi di un web server più completo, robusto e configurabile troverà senz’altro maggiori soddisfazioni nel passare a IIS 7.5 o superiore. Il problema è che potreste essere obbligati anche in questo caso ad eseguire Visual Studio come amministratori di sistema per non incorrere nel seguente errore:

4743_error

In quanto Visual Studio ha bisogno di accedere alla IIS metabase, privilegio negato a tutti gli account standard.

OUCH!.Don.Draper

UPDATE: In alternativa ad eseguire Visual Studio con privilegi di amministratore potete utilizzare il workaround descritto in questo articolo, che consente di impostare i permessi di accesso alla IIS Metabase per l’utente corrente in modo semplice ed efficace.

Cos’altro dire? Felice (si fa per dire) sviluppo!

EDIT: Per chiunque volesse approfondire l’argomento IIS Express e comprendere le ragioni che hanno portato la Microsoft a renderlo il successore di Cassini suggerisco questo ottimo (anche se datato) articolo di Scott Hanselman, ovviamente in inglese. Buona lettura!

PHP: Guida all’installazione di WinCache su IIS

Il principale collo di bottiglia della maggior parte dei software basati su PHP è quasi sempre legato all’utilizzo della memoria da parte dell’interprete dei comandi. Nel caso di siti poco frequentati questo può essere un problema trascurabile, ma quando un blog in WordPress o un sito commerciale in Joomla comincia a diventare popolare i nodi cominciano a venire al pettine: pagine che caricano sempre più lentamente, request che si accavallano e un senso generalizzato di lentezza che verrà puntualmente confermato da strumenti di monitor come Yslow (se ancora non lo utilizzate, correte a installarlo!), Analytics etc.

Per migliorare le sorti di un sito in PHP molto trafficato che gira sotto IIS è possibile installare una delle estensioni gratuite di cache attualmente a disposizione: in questo articolo parleremo del sistema di cache proprietario messo a punto dalla Microsoft e chiamato WinCache, installabile gratuitamente e incluso nel pacchetto base delle versioni di PHP per Windows dalla 5.2 in poi. Questa estensione garantisce un notevole incremento prestazionale grazie a una cache a 5 livelli:

  • OPCode Cache: Caching degli script compilati a livello di bytecode, per evitare che il sistema processi più volte lo stesso identico script.
  • File Cache: Caching dei file php veri e propri, risparmiando al sistema numerosi accessi al disco per leggere più volte gli stessi identici file.
  • Resolve File Path Cache: Caching dei path assoluti degli script, in molti casi costruiti grazie a funzioni di risoluzione ripetute decine di volte nel corso del codice. Il sistema memorizza il mapping tra path relativi e assoluti evitando così di eseguire le operazioni di risoluzione.
  • User Cache: Caching degli oggetti e variabili create a livello di singolo utente, per evitare di dover ricreare le stesse cose di processo in processo.
  • Session Cache: Un vero e proprio session manager che consente di memorizzare le informazioni di sessione dell’utente evitando le frequenti operazioni sul file-system tipicamente richieste dal sistema di sessioni normalmente utilizzato da PHP (la classica cartella /sessiondata/), velocizzando inoltre il recupero dei dati di sessione.

Installare WinCache è estremamente semplice. Per prima cosa occorre assicurarsi che il file dll relativo all’estensione sia incluso nell’installazione PHP presente sul nostro sistema. In altre parole, il file php_wincache.dll dev’essere presente nella sottocartella /ext/ contenuta nella directory di installazione di PHP. Nel caso in cui non ci fosse è possibile scaricare una versione aggiornata della libreria dal sito ufficiale di WinCache (assicurandovi di selezionare il file compatibile con la vostra versione di PHP) e copiarla manualmente nella cartella suddetta.

Una volta fatto questo occorre abilitare l’estensione aggiungendo le seguenti due righe al proprio file php.ini, normalmente presente nella directory di installazione di PHP oppure nella cartella di installazione di Windows.

IMPORTANTE: Prima di aggiungere queste righe è consigliabile accertarsi che l’estensione non sia già abilitata effettuando una rapida ricerca di “php_wincache.dll” all’interno del file.

Se utilizzate PHP Manager per IIS (cosa altamente consigliabile) potete anche installare l’estensione anche attraverso la GUI fornita da questo ottimo programma.

Se non utilizzate PHP Manager e/o non avete idea di dove si trovi il vostro php.ini potete rintracciarlo eseguendo il comando phpinfo() sul vostro server (se non sapete cosa significa cliccate qui per ottenere uno script da caricare ed eseguire) e, una volta fatto, dare un’occhiata al parametro Loaded Configuration File:

Loaded Configuration File

Il comando phpinfo() può essere utilizzato anche per verificare che l’estensione WinCache sia stato installata correttamente. In caso affermativo troverete infatti una sezione fatta più o meno in questo modo:

Wincache configuration in PHPInfoCon tutta probabilità, come nell’immagine di cui sopra, il sistema vi informerà che le cache sono disabilitate. La cosa è del tutto normale: l’estensione è presente ed è stata correttamente installata, ma non è ancora attiva.

Per attivarla è necessario aggiungere al file php.ini una serie di parametri di configurazione nel seguente modo:

I parametri sopra elencati sono grosso modo adeguati per un server di produzione: per esigenze specifiche si consiglia di consultare la documentazione di riferimento di WinCache, che contiene una spiegazione dettagliata di ciascun parametro e le indicazioni di base su come impostare l’estensione nel modo adeguato.

Se si desidera abilitare anche la Session Cache e utilizzare WinCache come session handler è inoltre necessario modificare il seguente parametro, sempre nel php.ini:

Al termine della configurazione, e dopo un necessario riavvio di IIS, sarà possibile verificare il risultato dei propri sforzi eseguendo nuovamente il comando phpinfo():

PHPINFO: wincache enabled

 

VMware 10 e Windows Update KB2995388: Not enough physical memory available

Gli utenti che utilizzano la versione 10 di VMware Player o Workstation sotto Windows e tengono aggiornato il proprio sistema incontreranno molto probabilmente un problema di questo tipo:

Error_msg

L’errore è dovuto a una incompatibilità tra la versione di VMWare in oggetto e l’aggiornamento KB2995388 rilasciato da Microsoft tra ottobre e novembre 2014. Il problema è stato subito segnalato dal team di sviluppo di VMware, che annuncia la prossima pubblicazione di un fix per risolvere il problema. Nel frattempo, l’unica soluzione percorribile è quella di disinstallare l’aggiornamento dal proprio sistema (Pannello di Controllo -> Programmi e Funzionalità -> Visualizza Aggiornamenti Installati):

Control_panel_2

Per ulteriori informazioni sull’errore “Not enough physical memory” si consiglia di fare riferimento all’articolo pubblicato sul blog di sviluppo di VMware.

 

Close