Usando caddy para desarollo local en PHP

Durante el desarrollo en local de nuestra aplicación en PHP (con el framework CakePHP) solíamos usar el servidor que venía por defecto:

bin/cake server

El problema de esto (que por debajo usa el servidor embedido de PHP), es que es mono-hilo, es decir, que sirve sólo una petición a la vez, por lo que a veces la carga de la web se hacía bastante pesada.

Para evitar esto, podemos usar Caddy, que básicamente es un servidor web en un único ejecutable, sin necesidad de instalar un servidor web completo como Apache o nginx, ni tener que gestionar servidores con permisos de root.

Para poder utilizar Caddy con CakePHP, primero lo instalaremos:

mkdir -p ~/bin
curl -sSfL "https://caddyserver.com/download/linux/amd64?license=personal&telemetry=off" | tar -C ~/bin -zx caddy
chmod +x ~/bin/caddy

A continuación, instalaremos el paquete php7.2-cgi, de tal forma que Caddy, cuando arranque, inicie también un proceso PHP que gestionará las peticiones:

sudo apt install php7.2-cgi

Tras esto, generaremos un fichero de configuración Caddyfile con los siguientes parámetros:

  • Levantará el servidor web en http://127.0.0.1:8765
  • Levanta un servidor php-cgi que escucha en el puerto 9000
  • Redirigirá todas las peticiones al servidor php-cgi anterior, excepto las que empiecen por:
    • /static
    • /img
    • /js
    • /css
    • /favicon.ico
:8765
bind 127.0.0.1
root webroot
index index.php index.html index.htm
gzip
fastcgi / 127.0.0.1:9000 php
rewrite {
    if {uri} not_starts_with /static
    if {uri} not_starts_with /img
    if {uri} not_starts_with /js
    if {uri} not_starts_with /css
    if {uri} not_starts_with /favicon.ico
    to /index.php?{query}
}

log stdout
errors stdout
on startup php-cgi -b 127.0.0.1:9000

Ya sólo nos queda arrancar el entorno de desarrollo (a mi me gusta por limpieza eliminar temporales y cache), ejecutando este comando desde la raíz del proyecto de CakePHP (o similar para otros frameworks):

rm -Rf tmp/* logs/* && ~/bin/caddy

Y acceder a nuestra web usando la URL http://127.0.0.1:8765.

comments powered by Disqus