Configuración de Servidor Web

Para que el esquema de rutas de una aplicación Phalcon funcione, será necesario que configures tu servidor web para procesar las redirecciones adecuadamente. Las instrucciones de configuración de servidores web populares son:

PHP-FPM

Generalmente se usa PHP-FPM (FastCGI Process Manager) para procesar archivos PHP. Hoy en día PHP-FPM está incluído en todas las distribuciones Linux.

En Windows PHP-FPM está en el archivo de distribución de PHP a través del archivo php-cgi.exe y puede iniciarlo con este script para ayudarlo a configurar las opciones. Windows no soporta sockets unix por lo que este script empezará fast-cgi en TCP en el puerto 9000.

Crear el archivo php-fcgi.bat con el siguiente contenido:

@ECHO OFF
ECHO Starting PHP FastCGI...
set PATH=C:\PHP;%PATH%
c:\bin\RunHiddenConsole.exe C:\PHP\php-cgi.exe -b 127.0.0.1:9000

PHP servidor Web incorporado (para desarrolladores)

Para acelerar la ejecución de su aplicación Phalcon en desarrollo, la forma más fácil es utilizar este servidor PHP incorporado. No use este servidor en producción. Las siguientes configuraciones para Nginx y Apache son las que necesita.

Configuración de Phalcon

Para habilitar la reescritura de URI dinámicas, sin Apache o Nginx, que Phalcon necesita que usted utilice el siguiente archivo: .htrouter.php

Si ha creado su aplicación con Phalcon Devtools este archivo ya debe existir en el directorio raíz de tu proyecto y puede iniciar el servidor con el siguiente comando:

$(which php) -S localhost:8000 -t public .htrouter.php

La anatomía de este comando:

  • $(which php) insertará la ruta absoluta a su PHP binario
  • -S localhost:8000 invoca el modo de servidor con host:puerto proporcionado
  • -t public define el directorio raíz de los servidores, es necesario para php para las solicitudes de ruta a activos como JS, CSS e imágenes en el directorio público
  • .htrouter.php el punto de entrada que será evaluado para cada solicitud

Luego dirija su navegador a http://localhost:8000/ para comprobar si todo está funcionando.

Nginx

Nginx es un servidor y proxy inverso gratuito y de código abierto de alto desempeño, así como un servidor proxy para IMAP/POP3. A diferencia de los tradicionales servidores, Nginx no se basa en hilos para procesar las solicitudes. En lugar de esto, utiliza una arquitectura basada en eventos (asíncrona) que es más escalable. Esta arquitectura utiliza pequeñas cantidades de memoria, pero más importante, predecibles bajo carga.

Phalcon con Nginx y PHP-FPM proveen un set de herramientas poderoso para ofrecer el mejor desempeño para tus aplicaciones PHP.

Instalar Nginx

Sitio oficial de NginX

Configuración de Phalcon

Puede utilizar la siguiente configuración posible para configurar Nginx con Phalcon:

server {
    # El puerto 80 requerirá que Nginx se inicie con permisos de root
    # Dependiendo de cómo instale Nginx para usar el puerto 80, deberá iniciar
    # el servidor con puertos `sudo` cerca de 1000 no requieren 
    # privilegios de root
    # escuchar      80;

    listen        8000;
    server_name   default;

    ##########################
    # En producción es requerido SSL
    # escuchar 443 ssl default_server;

    # ssl on;
    # ssl_session_timeout  5m;
    # ssl_protocols  SSLv2 SSLv3 TLSv1;
    # ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    # ssl_prefer_server_ciphers   on;

    # Estas ubicaciones dependerán de donde se ubiquen los certificados
    # ssl_certificate        /var/nginx/certs/default.cert;
    # ssl_certificate_key    /var/nginx/certs/default.key;
    ##########################

    # Esta es la carpeta donde esta el index.php
    root /var/www/default/public;
    index index.php index.html index.htm;

    charset utf-8;
    client_max_body_size 100M;
    fastcgi_read_timeout 1800;

    # Representación del dominio raíz 
    # http://localhost:8000/[index.php]
    location / {
        # Coincidir URLS `$_GET['_url']`
        try_files $uri $uri/ /index.php?_url=$uri&$args;
    }

    # Cuando la consulta HTTP no coincide con lo anterior
    # y el archivo termina en .php
    location ~ [^/]\.php(/|$) {
        # try_files $uri =404;

        # Ubuntu y PHP7.0-fpm en modo socket
        # Este camino depende de la versión instalada de PHP
        fastcgi_pass  unix:/var/run/php/php7.0-fpm.sock;

        # También puede usar PHP-FPM en modo TCP (Necesario en Windows)
        # Debe configurar al FPM para escuchar el puerto estándar
        # https://www.nginx.com/resources/wiki/start/topics/examples/phpfastcgionwindows/
        # fastcgi_pass  127.0.0.1:9000;

        fastcgi_index /index.php;

        include fastcgi_params;
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }

        fastcgi_param PATH_INFO       $fastcgi_path_info;
        # fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        # and set php.ini cgi.fix_pathinfo=0

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny all;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires       max;
        log_not_found off;
        access_log    off;
    }
}

Iniciar Nginx

Usar start nginx desde la línea de comandos, pero esto depende del método de instalación.

Apache

Apache es un servidor web popular y bien conocido disponible en muchas plataformas.

Configuración de Phalcon

Las siguientes son posibles configuraciones que puedes usar para configurar Apache con Phalcon. Estas notas están principalmente enfocadas a la configuración del módulo mod_rewrite permitiendo usar URLs amigables y el componente router. Comúnmente una aplicación tiene la siguiente estructura:

test/
  app/
    controllers/
    models/
    views/
  public/
    css/
    img/
    js/
    index.php

Raíz de documentos

Este es el caso más común, la aplicación se instala en un directorio bajo la raíz del documento. En este caso, utilizamos dos archivos .htaccess, el primero de ellos para ocultar el código de la aplicación reenviando todas las solicitudes a la raíz de documentos (public/).

Tenga en cuenta que la utilización de archivos .htaccess requiere que la instalación de apache tenga la opción AllowOverride All.
# test/.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule   ^$ public/    [L]
    RewriteRule   ((?s).*) public/$1 [L]
</IfModule>

Un segundo archivo .htaccess se encuentra en el directorio public/, este reescribe todas las URIs hacia el archivo public/index.php:

# test/public/.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond   %{REQUEST_FILENAME} !-d
    RewriteCond   %{REQUEST_FILENAME} !-f
    RewriteRule   ^((?s).*)$ index.php?_url=/$1 [QSA,L]
</IfModule>

Para los usuarios que usan la letra persa 'م' (meem) en los parámetros uri, existe un problema con mod_rewrite. Para permitir que la coincidencia funcione como lo hace con los caracteres en inglés, deberá cambiar su archivo .htaccess:

# test/public/.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond   %{REQUEST_FILENAME} !-d
    RewriteCond   %{REQUEST_FILENAME} !-f
    RewriteRule   ^([0-9A-Za-z\x7f-\xff]*)$ index.php?params=$1 [L]
</IfModule>

Si su uri contiene caracteres distintos al inglés, puede que necesite recurrir al cambio anterior para permitir que mod_rewrite coincida exactamente con su ruta.

Configuración de Apache

Si no desea utilizar los archivos .htaccess puede mover estas configuraciones al archivo de configuración principal de apache:

<IfModule mod_rewrite.c>

    <Directory "/var/www/test">
        RewriteEngine on
        RewriteRule  ^$ public/    [L]
        RewriteRule  ((?s).*) public/$1 [L]
    </Directory>

    <Directory "/var/www/test/public">
        RewriteEngine On
        RewriteCond   %{REQUEST_FILENAME} !-d
        RewriteCond   %{REQUEST_FILENAME} !-f
        RewriteRule   ^((?s).*)$ index.php?_url=/$1 [QSA,L]
    </Directory>

</IfModule>

Hosts virtuales

Y esta segunda configuración le permite instalar una aplicación de Phalcon en un virtual host:

<VirtualHost *:80>

    ServerAdmin    [email protected]
    DocumentRoot   "/var/vhosts/test/public"
    DirectoryIndex index.php
    ServerName     example.host
    ServerAlias    www.example.host

    <Directory "/var/vhosts/test/public">
        Options       All
        AllowOverride All
        Require       all granted
    </Directory>

</VirtualHost>

Cherokee

Cherokee es un servidor web de alto desempeño. Es muy rápido, flexible y fácil de configurar.

Configuración de Phalcon

Cherokee ofrece una interfaz gráfica amigable para configurar cada opción disponible en el servidor web.

Iniciar el administrador del cherokee ejecutando como root /ruta-hacia-cherokee/sbin/cherokee-admin

Crea un nuevo host virtual haciendo clic en vServers, y agrega un nuevo servidor virtual:

El servidor virtual recientemente añadido debe aparecer en la barra izquierda de la pantalla. En la ficha Behaviors o Comportamientos verá un conjunto de comportamientos por defecto para este servidor virtual. Haz clic en el botón Gestión de reglas. Elimine las que estén marcadas como Directorio /cherokee_themes y Directorio /icons:

Agregar el comportamiento PHP Language utilizando el asistente. Este comportamiento le permite correr aplicaciones PHP:

Normalmente este comportamiento no requiere configuración adicional. Añade otro comportamiento, esta vez en la sección de Configuración Manual. En Rule Type elige File Exists, luego asegúrate que la opción Match any file esté habilitada:

En la ficha 'Controlador' elegir Listar y enviar como controlador:

Edita el comportamiento Default para habilitar el motor de reescritura de URLs. Cambiar el controlador a Redirection, luego agrega la siguiente expresión regular para el motor ^(.*)$:

Por último, asegúrate de que los comportamientos tienen el siguiente orden:

Ejecuta la aplicación en un navegador: