Información del Sistema en PowerShell

System Information en PowerShell

Se enumeran comandos útiles de PowerShell para determinar información del Sistema:

  • Versión de PowerShell
    (Get-Host).Version
    
  • PowerShell de 32 bits
  • # $True it's running PowerShell 32 bits
    # $False it's running PowerShell 64 bits
    [IntPtr]::size -eq 4
    
  • Versión de Sistema Operativo
    $major = [environment]::OSVersion.Version.Major
    $minor = [environment]::OSVersion.Version.Minor
    

    En función del valor de estas variables y la siguiente tabla anexa podemos determinar el Sistema Operativo.

    Sistema Operativo $major $minor
    Windows 8.1 6 3
    Windows Server 2012 R2 6 3
    Windows 8 6 2
    Windows Server 2012 6 2
    Windows 7 6 1
    Windows Server 2008 R2 6 1
    Windows Server 2008 6 0
    Windows Vista 6 0
    Windows Server 2003 R2 5 2
    Windows Home Server 5 2
    Windows Server 2003 5 2
    Windows XP Professional x64 Edition 5 2
    Windows XP 5 1
    Windows 2000 5 0
  • Versión de Internet Information Server
  • Get-ItemProperty "HKLM:\software\microsoft\InetStp";
    
Publicado en PowerShell, Sistemas | Deja un comentario

Ejecutar comando PowerShell al crear la maquina virtual de Azure

En la anterior entrada vimos la posibilidad de crear una maquina de Azure mediante Powershell. En esta nueva maquina nos puede resultar interesante que se ejecute un comando PowerShell para acabar de configurar ciertos aspectos de la misma. Así dispondríamos de la maquina lista para nuestro uso; sin necesidad de realizar nosotros ninguna tarea repetitiva.

Ejecutando el comando en la creación de la maquina

  • 1.- Creamos el script a ejecutar en la maquina virtual. Por ejemplo test.ps1.
    #Script that creates a directory 
    mkdir("c:\basura2");
    
  • 2.- Ejecutamos NewMachineOnAzure con el nuevo parámetro RunScript donde se indica el script a ejecutar.
    ./NewMachineOnAzure -RunScript "test.ps1"
    
  • 3.- De esta manera al crear la maquina nos ejecutará nuestro script. Podemos visualizar, si lo vemos necesario el log de ejecución en el fichero
    C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension\1.2\CustomScriptHandler.log de la maquina virtual.
    Log de Ejecución Script

    Log de Ejecución Script

Como funciona

Hay un comando de PowerShell Set-AzureVMCustomScriptExtension que permite indicar un script a ejecutar. El script debe estar disponible en una url.

  • 1.- Creamos un contenedor publico donde subir el script.

    $containerStorage = "scripts";	
    New-AzureStorageContainer $containerStorage -Permission Blob
    
  • 2.- Subimos el fichero de script al contenedor.
    $file = ".\" + $RunScript
    Set-AzureStorageBlobContent -Blob $RunScript -Container $containerStorage -File $file
    
  • 3.- Indicamos el script a ejecutar, indicando la url del fichero subido en el paso anterior.
    $fileUri = "https://" + $StorageAccountName + ".blob.core.windows.net/" + $containerStorage + "/" + $RunScript;
    $vmConfig = $vmConfig | Set-AzureVMCustomScriptExtension -FileUri $fileUri -Run $RunScript
    

Nuevo Script NewMachineOnAzure

Os adjunto el nuevo script actualizado ;-)

################################################################################################################################################################  
# This script Create a Virtual Machine on Azure
#
# To run the script
#  
# ./NewMachineOnAzure -NameMachine "testrodrijp"
################################################################################################################################################################  
Param(  
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $NameMachine = "",
# Specifies the size of the instance. Allowed values are ExtraSmall, Small, Medium, Large, ExtraLarge, A5, A6,
# A7, A8, A9, Basic_A0, Basic_A1, Basic_A2, Basic_A3, Basic_A4, Standard_D1, Standard_D2, Standard_D3,
# Standard_D4, Standard_D11, Standard_D12, Standard_D13, Standard_D14.	
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $InstanceSize = "Small",
# ImagesFor Example to Search Windows 2008 images
# Get-AzureVMImage | Where { $_.ImageName -like "*2008*" } 
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $Image = "bd507d3a70934695bc2128e3e5a255ba__RightImage-Windows-2008R2-SP1-x64-iis75-v5.8.8",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $User = "administrador",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $Password = "Poner1Passw",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $TimeZone = "GMT Standard Time",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $ServiceName = "",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $Location = "West Europe",
#The storage account name must be unique to Azure and must be between 3 and 24 characters in length and use lowercase letters and numbers only.	
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $StorageAccountName = "",
        [Parameter(ValueFromPipeline=$true)]
	[string] $RunScript = ""
)

#Setting Default Parameters
if ($NameMachine -eq "") {
	$NameMachine = "a" + [guid]::NewGuid().ToString("N").substring(0,14);
}
if ($ServiceName -eq "") {
	$ServiceName = $NameMachine;
}
if ($StorageAccountName -eq "") {
	$StorageAccountName = $NameMachine;	
}
$StorageLabel = $NameMachine + "Storage";

#Log-in on Subscription
Add-AzureAccount

#Create Storage Account needed by Azure Virtual Machine & Setting it on AzureSubscription
New-AzureStorageAccount -StorageAccountName $StorageAccountName -Label $StorageLabel -Location $Location
$SubscriptionName =  (Get-AzureSubscription -Current).SubscriptionName
Set-AzureSubscription -SubscriptionName $SubscriptionName -CurrentStorageAccountName $StorageAccountName

#Create Virtual Machine
$vmConfig = New-AzureVMConfig -Name $NameMachine -InstanceSize $InstanceSize -Image $Image
$vmConfig = $vmConfig | Add-AzureProvisioningConfig -Windows -AdminUserName $User -Password $Password -TimeZone $TimeZone
if ($RunScript -ne "") {
	$containerStorage = "scripts";	
    New-AzureStorageContainer $containerStorage -Permission Blob
	$file = ".\" + $RunScript
    Set-AzureStorageBlobContent -Blob $RunScript -Container $containerStorage -File $file
	$fileUri = "https://" + $StorageAccountName + ".blob.core.windows.net/" + $containerStorage + "/" + $RunScript;
	$vmConfig = $vmConfig | Set-AzureVMCustomScriptExtension -FileUri $fileUri -Run $RunScript
}
$vmConfig | New-AzureVM -ServiceName $ServiceName -Location $Location

Write-Host "Virtual Machine: " $NameMachine " creatted!!!"
Publicado en Azure, PowerShell | Etiquetado | Deja un comentario

PowerShell y Creación de una maquina virtual en Azure a tan solo un click

Siguiendo con PowerShell, disponemos también de la librería Microsoft Azure PowerShell. Esta librería nos permite trabajar directamente contra Azure sin necesidad de usar el portal. A tan solo un click podemos crear una máquina que nos puede ser muy útil, en diferentes operativas:

  • Para realizar test en diferentes entornos.
  • Realizar pruebas de instalacción de aplicativos.
  • Para crear rápidamente entornos de preproducción/producción.

Crear una maquina virtual con un Script de PowerShell

  • 1.- Descargar Modulo de Azure PowerShell en el siguiente enlace: http://go.microsoft.com/fwlink/p/?linkid=320376&clcid=0x40a
  • 2.- Importar el Modulo instalado en PowerShell
    Import-Module "C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\ShortcutStartup.ps1"
    
  • 3.- Ejecutar script de Creación de Maquina Virtual
    ./NewMachineOnAzure
    

    o

    ./NewMachineOnAzure -NameMachine "testrodrijp"
    

Script NewMachineOnAzure

Por defecto la maquina que se crea es Small, en West Europe y utiliza una Imagen de Windows 2008. En el script se pueden sobrescribir estos parámetros por defecto. Por ejemplo, para una maquina Medium con un Ubutu:

./NewMachineOnAzure -InstanceSize "Medium" -Image "0b11de9248dd4d87b18621318e037d37__RightImage-Ubuntu-12.04-x64-v5.8.8"

Hay un comando de PowerShell New-AzureQuickVM que permite realizar gran parte de la funcionalidad de este script. En nuestro caso hemos utilizado otra combinación de llamadas (New-AzureVMConfig, Add-AzureProvisioningConfig y New-AzureVM) que nos permite desplegar más parámetros adicionales. Por ejemplo en nuestro caso la maquina virtual por defecto usa horario UTC.

################################################################################################################################################################  
# This script Create a Virtual Machine on Azure
#
# To run the script
#  
# ./NewMachineOnAzure -NameMachine "testrodrijp"
################################################################################################################################################################  
Param(  
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $NameMachine = "",
# Specifies the size of the instance. Allowed values are ExtraSmall, Small, Medium, Large, ExtraLarge, A5, A6,
# A7, A8, A9, Basic_A0, Basic_A1, Basic_A2, Basic_A3, Basic_A4, Standard_D1, Standard_D2, Standard_D3,
# Standard_D4, Standard_D11, Standard_D12, Standard_D13, Standard_D14.	
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $InstanceSize = "Small",
# ImagesFor Example to Search Windows 2008 images
# Get-AzureVMImage | Where { $_.ImageName -like "*2008*" } 
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $Image = "bd507d3a70934695bc2128e3e5a255ba__RightImage-Windows-2008R2-SP1-x64-iis75-v5.8.8",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $User = "administrador",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $Password = "Poner1Passw",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $TimeZone = "GMT Standard Time",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $ServiceName = "",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $Location = "West Europe",
#The storage account name must be unique to Azure and must be between 3 and 24 characters in length and use lowercase letters and numbers only.	
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $StorageAccountName = ""
)

#Setting Default Parameters
if ($NameMachine -eq "") {
	$NameMachine = "a" + [guid]::NewGuid().ToString("N").substring(0,14);
}
if ($ServiceName -eq "") {
	$ServiceName = $NameMachine;
}
if ($StorageAccountName -eq "") {
	$StorageAccountName = $NameMachine;	
}
$StorageLabel = $NameMachine + "Storage";

#Log-in on Subscription
Add-AzureAccount

#Create Storage Account needed by Azure Virtual Machine & Setting it on AzureSubscription
New-AzureStorageAccount -StorageAccountName $StorageAccountName -Label $StorageLabel -Location $Location
$SubscriptionName =  (Get-AzureSubscription -Current).SubscriptionName
Set-AzureSubscription -SubscriptionName $SubscriptionName -CurrentStorageAccountName $StorageAccountName

#Create Virtual Machine
$vmConfig = New-AzureVMConfig -Name $NameMachine -InstanceSize $InstanceSize -Image $Image
$vmConfig = $vmConfig | Add-AzureProvisioningConfig -Windows -AdminUserName $User -Password $Password -TimeZone $TimeZone
$vmConfig | New-AzureVM -ServiceName $ServiceName -Location $Location

Write-Host "Virtual Machine: " $NameMachine " creatted!!!"

Script DeleteMachineOnAzure

También tenemos la posibilidad de borrar la maquina virtual creada con otro script.

./DeleteMachineOnAzure -NameMachine "testrodrijp"

OJO!!! también se borra automáticamente la cuenta de Storage asociada. Si la cuenta que creamos en su día al crear la maquina la hubiésemos usado para otros servicios, podríamos tener problemas ;-).

################################################################################################################################################################  
# This script Delete a Virtual Machine on Azure
#
# To run the script
#  
# ./DeleteMachineOnAzure -NameMachine "testrodrijp"
################################################################################################################################################################  
Param(  
	[Parameter(ValueFromPipeline=$true, Mandatory=$True)]  	
	[string] $NameMachine,
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $ServiceName = "",
#The storage account name must be unique to Azure and must be between 3 and 24 characters in length and use lowercase letters and numbers only.	
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $StorageAccountName = ""
)

#Setting Default Parameters
if ($ServiceName -eq "") {
	$ServiceName = $NameMachine;
}
if ($StorageAccountName -eq "") {
	$StorageAccountName = $NameMachine;	
}

#Log-in on Subscription
Add-AzureAccount

Remove-AzureVM -ServiceName $ServiceName -Name $NameMachine -DeleteVHD;

#Remove Azure Storage Account
$SubscriptionName =  (Get-AzureSubscription -Current).SubscriptionName;
Set-AzureSubscription -SubscriptionName $SubscriptionName -CurrentStorageAccountName $StorageAccountName;
#Wait until VHD are deleted (is Asynchronous Operation).
$AlredyExist = $true;
while($AlredyExist) 
{
	Write-Host "Waitting VHD deleted..."
	$AlredyExist = $false;
	$blobs = Get-AzureStorageBlob -Container "vhds" | select Name;
	foreach($blob in $blobs)
	{
		if ($blob.Name.EndsWith(".vhd")) { $AlredyExist = $true; }
	}
	Start-Sleep -m 20000
}
#VHD are deleted but there's a *.status file ¿?. 
$blobs = Get-AzureStorageBlob -Container "vhds" | select Name;
foreach($blob in $blobs)
{
	Remove-AzureStorageBlob -Container "vhds" -Blob $blob.Name 
}

Remove-AzureService -ServiceName $ServiceName -Force;
Remove-AzureStorageAccount -StorageAccountName $StorageAccountName  

Write-Host "Virtual Machine: " $NameMachine " removed!!!"
Publicado en Azure, PowerShell | Etiquetado | 1 comentario

PowerShell y Administración de IIS

PowerShell, es una tecnología que permite ejecutar comandos de Windows. Es muy útil para realizar tareas repetitivas como instalaciones complejas de aplicaciones, procesos de mantenimiento…

Compatibilidad

En función de las diferentes versiones de Windows tendremos acceso a las diferentes versiones de PowerShell:

  • Windows Server 2003: No viene instalado por defecto, pero se puede instalar hasta la versión de PowerShell 2.0. Requiere previamente de instalar NET Framework 2.0. Si quisieramos instalar PowerShell 2.0 y previamente estuviera instalado PowerShell 1.0; deberiamos desinstalarlo o eliminar la clave del registro HKLM\SOFTWARE\Microsoft\Powershell\1.
  • Windows Server 2008 anterior a SP2:No viene instalado por defecto, pero se puede instalar hasta la versión de PowerShell 2.0 x86 o PowerShell 2.0 x64. Si opcionalmente queremos usar el editor integrado de PowerShell debemos instalar Microsoft .NET Framework 3.5 Service Pack 1.
  • Windows Server 2008 SP2: Viene instalado por defecto PowerShell 2.0.
  • Windows Server 2012:Disponible PowerShell 3.0 y PowerShell 4.0.

Compatibilidad Librería WebAdministration

En PowerShell se pueden añadir librerías que aportan más funcionalidad para trabajar en configuraciones más especificas del Sistema. Por ejemplo, PowerShell incorpora la libreria WebAdministration para trabajar con configuraciones del IIS. Para ello debemos activar IIS Management Console en nuestro servidor.

  • IIS 6.0: No hay librería disponible. Una alternativa que disponemos es la ejecución de Objectos WMI de IIS.
  • IIS 7.0: Previamente debemos instalar el PowerShell Snap-In for IIS 7.0
    Add-PSSnapIn WebAdministration
    
  • IIS 7.5 o Superior: Por defecto esta instalada.
    Import-Module WebAdministration
    

Creación de un Application/Web Site en IIS

El siguiente ejemplo de PowerShell crea una aplicación en el IIS; independiente de la versión de IIS de este.
Los parámetros necesarios son:

  • appName: Nombre de la aplicación.
  • appPath: Directorio de instalación.
  • appDefaultDocument: Pagina por defecto.
  • appPoolName: Application pool que usará la aplicación.

Adicionalmente internamente fuerza que la aplicación se ejecute en NET 4.0 en modo integrado.

################################################################################################################################################################  
# This script Create IISWebApp
#
# To run the script
#  
# ./CreateIISWebApp -appPath "C:directory" -appName "ExampleApp" -appDefaultDocument "Start.aspx" -appPoolName "DefaultAppPool"
################################################################################################################################################################  

Param(  
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)]  
    [string] $appPath,  
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)]  
    [string] $appName, 
    [Parameter(ValueFromPipeline=$true)]  
    [string] $appDefaultDocument = "", 
	[Parameter(Mandatory=$true, ValueFromPipeline=$true)]  
	[string] $appPoolName
)

$appPoolNameNetFrameworkVersion = "v4.0"
$appPoolNameManagedPipelineMode = "Integrated"
$appEnableAnonymousAuthentication = $true


Write-Host "###### CreateIISWebApp ######"
Write-Host "######appPath:"$appPath  
Write-Host "######appName:"$appName  
Write-Host "######appDefaultDocument:"$appDefaultDocument  
Write-Host "######appPoolName:"$appPoolName  

$iisVersion = Get-ItemProperty "HKLM:softwaremicrosoftInetStp";
Write-Host "Creating Web Application"$appName" on IIS:" $iisVersion.MajorVersion"."$iisVersion.MinorVersion

if ($iisVersion.MajorVersion -eq 6)
{
    $DefaultWebSiteWmiName = "W3SVC/1/ROOT/";
    $AppNameWmiName = $DefaultWebSiteWmiName + $appName;
    $creationArgs = @{Name = ($AppNameWmiName)}
    $vDir = set-wmiinstance -Class IIsWebVirtualDir -Namespace rootmicrosoftiisv2 -Arguments $creationArgs;
    $vDir.Put();
    $filter = "Name = '" + $AppNameWmiName + "'"
    $vDirSetting = get-wmiobject -Class IIsWebVirtualDirSetting -Namespace rootmicrosoftiisv2 -Filter $filter 
    $vDirSetting.AppFriendlyName = $appName
    $vDirSetting.Path = $appPath
    if ($appDefaultDocument -ne "") {
        $vDirSetting.Properties["DefaultDoc"].Value = $appDefaultDocument + "," + $vDirSetting.Properties["DefaultDoc"].Value
    }
    $vDirSetting.Put();
    $vDir = get-wmiobject -Class IIsWebVirtualDir -Namespace rootmicrosoftiisv2 -Filter $filter 
    $vDir.AppCreate3(2, $appPoolName, 1);
    c:WINDOWSMicrosoft.NETFrameworkv4.0.30319aspnet_regiis -s $AppNameWmiName
    return
}
if ($iisVersion.MajorVersion -eq 7)
{
    if ($iisVersion.MinorVersion -ge 5)
    {
        Import-Module WebAdministration;
    }           
    else
    {
        if (-not (Get-PSSnapIn | Where {$_.Name -eq "WebAdministration";})) {
            Add-PSSnapIn WebAdministration;
        }
    }
}
if ($iisVersion.MajorVersion -ge 7)
{
        Import-Module WebAdministration;
}

$siteName = "Default Web Site"
$appNamePath = "IIS:sites" + $siteName + "" + $appName
$app = New-WebApplication -Name $appName -ApplicationPool $appPoolName -PhysicalPath $appPath -Site $siteName

$DefaultDocumenentfilter = "/system.WebServer/defaultdocument/files"

if ($appDefaultDocument -ne "") {
    Write-Host "   -Setting Default Document:"$appDefaultDocument"..."
	Add-WebConfiguration $DefaultDocumenentfilter $appNamePath -atIndex 0 -Value @{value=$appDefaultDocument}
}

Set-WebConfigurationProperty -filter /system.WebServer/security/authentication/AnonymousAuthentication -name enabled -value $appEnableAnonymousAuthentication -PSPath $appNamePath

Nota

Para poder ejecutar scripts; es necesario autorizar a PowerShell ;-)

Set-ExecutionPolicy Unrestricted
Publicado en IIS, PowerShell, Sistemas | Etiquetado , , , | Deja un comentario

Número de usuarios conectados a la Web

SignalR nos permite conocer el numero de usuarios conectados a una aplicación Web.

Como funciona

SignalR nos ofrece eventos para registrar conexiones o desconexiones al Hub.

  • Al iniciar una conexión $.connection.hub.start(); al iniciar nuestra pagina Web, se dispara el evento OnConnected.
  • Al parar una conexión $.connection.hub.stop(); al cerrar nuestra pagina Web; se dispara el evento OnDisconnected.
  • Si cerramos el navegador a los 30 segundos por defecto se dispara el evento OnDisconnected.

En estos eventos:

  • En el evento OnConnected añadimos la conexión (ConnectionId) en una lista de Usuarios conectados.
  • En el evento OnDisconnected eliminamos la conexión (ConnectionId) de la lista de Usuarios conectados.

public class KnowUserHub : Hub
{
        /// <summary>
        /// The list of users connected.
        /// </summary>
        public static List<string> Users = new List<string>();

        /// <summary>
        /// The OnConnected event.
        /// </summary>
        public override System.Threading.Tasks.Task OnConnected()
        {
            string clientId = GetClientId();

            if (Users.IndexOf(clientId) == -1)
            {
                Users.Add(clientId);
            }
            return base.OnConnected();
        }

        /// <summary>
        /// The OnReconnected event.
        /// </summary>
        public override System.Threading.Tasks.Task OnReconnected()
        {
            string clientId = GetClientId();
            if (Users.IndexOf(clientId) == -1)
            {
                Users.Add(clientId);
            }

            return base.OnReconnected();
        }

        /// <summary>
        /// The OnDisconnected event.
        /// </summary>
        public override System.Threading.Tasks.Task OnDisconnected()
        {
            string clientId = GetClientId();

            if (Users.IndexOf(clientId) > -1)
            {
                Users.Remove(clientId);
            }

            return base.OnDisconnected();
        }

        /// <summary>
        /// Get's the currently connected Id of the client.
        /// This is unique for each client and is used to identify
        /// a connection.
        /// </summary>
        /// <returns>The client Id.</returns>
        private string GetClientId()
        {
            return Context.ConnectionId;
        }

}

Para conocer el número de usuarios conectados; podemos obtenerlo fácilmente ;-).

   var userCount = KnowUserHub.Users.Count;
Publicado en SignalR | Etiquetado , , | Deja un comentario

Instalación de WordPress en Windows

WordPress es el gestor de contenidos que usa este blog. La instalación de WordPress requiere de los siguientes prerequisitos:

  • El motor de ejecución de código, en nuestro caso VC++ Visual Studio 2012 (VC11)
  • Un servidor de HTTP, en nuestro caso Apache 2.4
  • PHP como servidor de Aplicaciones, en nuestro caso PHP 5.6
  • MySQL como base de datos, en nuestro caso MySQL 5.6.20

Tenemos disponibles diferentes instaladores que nos permiten instalar fácilmente WordPress:

Pero no permiten la granularidad de instalar las versiones especificas de los componentes, que normalmente no coinciden con la existente en nuestro hosting. En la presente entrada describiremos los pasos necesarios para la instalación de los prerequisitos y WordPress paso a paso.

1.- Instalación VC++ Visual Studio 2012 (VC11)

2.- Instalación Apache 2.4

También es factible instalar la WordPress sobre un Internet Information Server (IIS).

  • 1.- Descargar la versión compilada httpd-2.4.10-win32-VC11.
  • 2.- Descomprimir el contenido en c:\apache24.
  • 3.- Asignar el parámetro ServerName del httpd.config ubicado en C:\Apache24\conf.
    ServerName localhost
    
  • 4.- Instalar el servicio de Apache 2.4. Para esto se abre la ventana de Command(cmd) como administrador y se ejecuta el siguientes los siguientes comandos.
    cd c:\apache24\bin
    httpd -k install
    
  • 5.- Insertar un enlace directo de c:\apache24\bin\ApacheMonitor en C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup. Esto nos creara en la area de iconos y notificaciones un acceso para informar de/iniciar/parar el servicio de Apache.
  • 6.- Probar el servicio (con el servicio iniciado). Poner en navegador http://localhost

3.- Instalar Php 5.6

  • 1.- Descargar el paquete en VC11 x86 Thread Safe. Apache sólo soporta la versión Thread Safe. En nuestro caso, hemos utilizado las versiones de 32 bits. La causa es que PHP en 64 bits tan solo esta disponible en modo experimental.
  • 2.- Descomprimir en c:\php
  • 3.- Crear el fichero php.ini a partir de php.ini-development o php.ini-productionen el directorio c:\php.
  • 4.- Añadir en el path de la maquina el directo c:\php.
  • 5.- Añadir al final del fichero httpd.config de Apache.
    LoadModule php5_module "c:/php/php5apache2_4.dll"
    AddHandler application/x-httpd-php .php
    PHPIniDir "c:/php"
    
  • 6.- Añadir la página por defecto de php (index.php) en el párametro DirectoryIndex del httpd.config de Apache la página por defecto de php.
    DirectoryIndex index.html index.php
    
  • 7.- Crear en el directorio c:\apache24\htdocs la pagina test.php con el siguiente contenido.

<html>
<head>
<title>PHP Test</title>
</head>
<body>
<?php phpinfo(); ?>
</body>
</html>

4.- Instalar MySQL 5.6

  • 1.- Descargar el MySQL Installer y lo ejecutamos.

    Configuración Asistente MySql 1/3

    Configuración Asistente MySql 2/3

    Configuración Asistente MySql 2/3

    Configuración MySql Asistente 3/3

    Configuración MySql Asistente 3/3

  • 2.- En el php.ini descomentamos la siguiente parámetro extension_dir = “ext”.
    ; Directory in which the loadable extensions (modules) reside.
    ; http://php.net/extension-dir
    ; extension_dir = "./"
    ; On windows:
    extension_dir = "ext"
    
  • 3.- En el php.ini descomentamos las extensiones de php_mbstring.dll, php_mysql.dll y php_mysqli.dll.
    ;extension=php_ldap.dll
    extension=php_mbstring.dll
    ;extension=php_exif.dll      ; Must be after mbstring as it depends on it
    extension=php_mysql.dll
    extension=php_mysqli.dll
    ;extension=php_oci8_12c.dll  ; Use with Oracle Database 12c Instant Client
    ;extension=php_openssl.dll
    
  • 4.- Descargar el phpMyAdmin
  • 5.- Descomprimir el paquete descargado en c:\apache24\htdocs\phpmyadmin. Esta aplicación permite interactuar con el servidor mediante una aplicación web (utilizada normalmente por los servicios de hosting).
  • 6.- Poner en el navegador http://localhost/phpmyadmin.
  • 7.- Crear la Base de Datos. En el menu de Base de Datos, introducir el nombre de la base de datos y pulsar en botón de Crear.

    Creación BD WordPress

    Creación BD WordPress

5.- Instalación de WordPress

  • 1.- Descargar WordPress en http://wordpress.org/
  • 2.- Descomprimir el contenido en C:\Apache24\htdocs\wordpress.
  • 3.- Navegar a http://localhost/wordpress.
  • 4.- Introcudir el nombre de base de datos que creamos y los parámetros de conexión al MySQL.

    Asistente WordPress 3

    Asistente WordPress 3

  • 5.- Introducimos el Sitio a crear, el usario y password de WordPress para acceder al Sito
Asistente WordPress 5

Asistente WordPress 5

Y finalmente ya tenemos WordPress instalado!!!

Publicado en Base de Datos | Etiquetado , | Deja un comentario

SignalR: Mantener activa siempre la comunicación

En un anterior entrada describí SignalR. SignalR permite la comunicación fluida entre un navegador Web y un Servidor. En esta entrada vamos describir como proceder cuando se producen errores de conectividad entre el Navegador y el Servidor.

Introducción arquitectura de comunicación en SignalR

Cuando se produce un fallo de conectividad; SignalR intenta restablecer la comunicación en varias ocasiones (Reconexión). Si persiste el fallo; finalmente finaliza la comunicación (Desconexión). Por defecto se realizan 3 reintentos en 30 segundos. El número de reintentos y el tiempo de timeout es configurable (con las propiedades DisconnetTimeout and KeepAlive). SignalR dispone de eventos tanto en la parte cliente como en la servidor. Los eventos de reconexión se producen cuando se restaura la comunicación perdida y los eventos de desconexión cuando se da por finalizada la comunicación.

  • En la parte Servidor:
    • OnReconnected()
    • OnDisconnected()
  • En la parte Cliente:
    • $.connection.hub.reconnected
    • $.connection.hub.disconnected

En este articulo, se explica la más a fondo la arquitectura de comunicación de SignalR.

Problema

Hay ocasiones en que se produce una caída de conectividad durante un largo periodo de tiempo; por ejemplo:

  • Caída de la linea.
  • Reinicio de la Servidor o Servicio Web.
  • Parada programa del Servidor por mantenimiento/actualización.

Estas caídas de conectividad provocarán que se produzca la desconexión. La idea es restablecer la comunicación tan pronto vuelva a estar operativa la conectividad sin necesidad de recargar la pagina.

Solución

La manera para realizarlo es volver a iniciar una nueva conexión en el evento de desconexión. En nuestro caso a los 10 segundos de producirse la desconexión; se intentará restaurarla.

   $.connection.hub.start().done(function() { $("#status").text('Connected'); });
        $.connection.hub.disconnected(function() {
		$("#status").text('Disconnected');
        setTimeout(function() {
                $.connection.hub.start().done(function() {  $("#status").text('Connected'); });
            }, 10000);
        });
Publicado en SignalR | Etiquetado | Deja un comentario