{"id":246,"date":"2026-04-18T08:32:33","date_gmt":"2026-04-18T12:32:33","guid":{"rendered":"https:\/\/juredev.com\/blog\/?p=246"},"modified":"2026-04-18T08:56:09","modified_gmt":"2026-04-18T12:56:09","slug":"como-instalar-wordpress-vps-alpine-linux-guia-optimizada","status":"publish","type":"post","link":"https:\/\/juredev.com\/blog\/2026\/04\/como-instalar-wordpress-vps-alpine-linux-guia-optimizada\/","title":{"rendered":"C\u00f3mo instalar WordPress en un VPS con Alpine Linux (gu\u00eda optimizada y realista)"},"content":{"rendered":"\n<p>Hace poco compart\u00ed una <a href=\"https:\/\/juredev.com\/blog\/2026\/02\/guia-practica-configurar-nginx-para-wordpress-en-debian\/\">gu\u00eda pr\u00e1ctica para configurar Nginx con WordPress en Debian<\/a>. Esta vez necesitaba un entorno nuevo para pruebas y decid\u00ed probar Alpine Linux, una de las distribuciones m\u00e1s ligeras y r\u00e1pidas que existen para un VPS.<\/p>\n\n\n\n<p>Esa ligereza tiene su precio: casi nada viene configurado por defecto. Y WordPress no es precisamente indulgente con las configuraciones a medias. Esta gu\u00eda te muestra paso a paso c\u00f3mo montar un stack completo <strong>Nginx + PHP-FPM + MariaDB + WordPress<\/strong>, con las optimizaciones reales que suelo usar en entornos de producci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Preparaci\u00f3n inicial del sistema<\/h2>\n\n\n\n<p>Lo primero, como siempre, es actualizar el sistema:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apk update &amp;&amp; apk upgrade<\/code><\/pre>\n\n\n\n<p>Despu\u00e9s instalamos las herramientas b\u00e1sicas que vamos a necesitar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apk add nano curl wget unzip<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2. Instalaci\u00f3n del stack<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Instalar Nginx, PHP-FPM y MariaDB<\/h3>\n\n\n\n<p>Con un solo comando instalamos todo el stack principal:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apk add nginx mariadb mariadb-client \\\nphp83 php83-fpm php83-mysqli php83-json php83-openssl \\\nphp83-curl php83-zlib php83-xml php83-phar php83-intl \\\nphp83-dom php83-xmlreader php83-xmlwriter php83-ctype \\\nphp83-session php83-mbstring php83-gd<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Importante<\/strong>: Alpine no instala las extensiones de PHP de forma autom\u00e1tica. Si falta alguna, WordPress puede fallar silenciosamente o mostrar errores confusos. Instala todas las que aparecen arriba.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Paso cr\u00edtico: eliminar la configuraci\u00f3n por defecto de Nginx<\/h3>\n\n\n\n<p>Alpine incluye un archivo de configuraci\u00f3n predeterminado que rompe WordPress. Si no lo eliminas, vas a tener errores 404 o 500 muy dif\u00edciles de diagnosticar.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rm \/etc\/nginx\/http.d\/default.conf<\/code><\/pre>\n\n\n\n<p><strong>No saltes este paso<\/strong>. Te ahorrar\u00e1 mucho dolor de cabeza.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Configurar MariaDB<\/h2>\n\n\n\n<p>Inicializamos la base de datos y arrancamos el servicio:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysql_install_db --user=mysql --datadir=\/var\/lib\/mysql\nrc-service mariadb start\nrc-update add mariadb<\/code><\/pre>\n\n\n\n<p>Ahora ejecutamos el asistente de seguridad para eliminar las configuraciones inseguras por defecto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysql_secure_installation<\/code><\/pre>\n\n\n\n<p>Una vez dentro de MySQL, creamos la base de datos y el usuario para WordPress:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE DATABASE wordpress;\nCREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'password_seguro';\nGRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';\nFLUSH PRIVILEGES;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4. Configurar PHP-FPM<\/h2>\n\n\n\n<p>Editamos el archivo del pool de PHP-FPM:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano \/etc\/php83\/php-fpm.d\/www.conf<\/code><\/pre>\n\n\n\n<p>Buscamos y modificamos estas l\u00edneas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user = nginx\ngroup = nginx\n\nlisten = 127.0.0.1:9000<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Si dejas el usuario como <code>nobody<\/code> (valor por defecto), tendr\u00e1s problemas de permisos cuando WordPress intente escribir archivos.<\/p>\n<\/blockquote>\n\n\n\n<p>Iniciamos el servicio y lo agregamos al arranque:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rc-service php-fpm83 start\nrc-update add php-fpm83<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">5. Configurar Nginx para WordPress<\/h2>\n\n\n\n<p>Creamos el archivo de configuraci\u00f3n del sitio:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano \/etc\/nginx\/http.d\/wordpress.conf<\/code><\/pre>\n\n\n\n<p>Y usamos esta configuraci\u00f3n base:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n    listen 80;\n    server_name tu-dominio.com;\n\n    root \/var\/www\/wordpress;\n    index index.php index.html;\n\n    location \/ {\n        try_files $uri $uri\/ \/index.php?$args;\n    }\n\n    location ~ \\.php$ {\n        include fastcgi.conf;\n        fastcgi_pass 127.0.0.1:9000;\n    }\n\n    location ~* \\.(js|css|png|jpg|jpeg|gif|ico|svg)$ {\n        expires max;\n        log_not_found off;\n    }\n}<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Nota importante<\/strong>: En Alpine se recomienda usar <code>fastcgi.conf<\/code> en lugar de <code>fastcgi_params<\/code>. Esto evita el cl\u00e1sico error \u00abFile not found\u00bb al procesar los archivos PHP.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">6. Descargar e instalar WordPress<\/h2>\n\n\n\n<p>Creamos el directorio y descargamos la \u00faltima versi\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/var\/www\/wordpress\ncd \/var\/www\nwget https:\/\/wordpress.org\/latest.zip\nunzip latest.zip<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">7. Permisos (un punto clave en Alpine)<\/h2>\n\n\n\n<p>Asignamos los permisos correctos para que Nginx pueda leer y escribir sin problemas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chown -R nginx:nginx \/var\/www\/wordpress\nchmod -R 755 \/var\/www<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Recuerda que todas las carpetas en la ruta necesitan permiso de ejecuci\u00f3n (<code>+x<\/code>). Si falta en alguna, WordPress no podr\u00e1 acceder a sus propios archivos<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">8. Iniciar Nginx y terminar la instalaci\u00f3n<\/h2>\n\n\n\n<p>Arrancamos Nginx y lo agregamos al arranque autom\u00e1tico:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rc-service nginx start\nrc-update add nginx<\/code><\/pre>\n\n\n\n<p>Ahora puedes abrir tu navegador e ir a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;TU_IP<\/code><\/pre>\n\n\n\n<p>Deber\u00edas ver el asistente de instalaci\u00f3n de WordPress.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9. Optimizaciones para producci\u00f3n<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">FastCGI Cache<\/h3>\n\n\n\n<p>El cach\u00e9 de FastCGI es una de las mejoras m\u00e1s efectivas para reducir la carga del servidor. Primero a\u00f1adimos esto fuera del bloque <code>server<\/code> (en <code>nginx.conf<\/code> o en el archivo del sitio):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fastcgi_cache_path \/var\/cache\/nginx levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;<\/code><\/pre>\n\n\n\n<p>Luego, dentro del bloque <code>server<\/code>, agregamos la l\u00f3gica para evitar cachear peticiones que no deben guardarse:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>set $no_cache 0;\n\nif ($request_method = POST) {\n    set $no_cache 1;\n}\n\nif ($http_cookie ~* \"wordpress_logged_in\") {\n    set $no_cache 1;\n}\n\nlocation ~ \\.php$ {\n    include fastcgi.conf;\n    fastcgi_pass 127.0.0.1:9000;\n\n    fastcgi_cache WORDPRESS;\n    fastcgi_cache_bypass $no_cache;\n    fastcgi_no_cache $no_cache;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Gzip<\/h3>\n\n\n\n<p>Activamos la compresi\u00f3n para reducir el tama\u00f1o de las respuestas hasta en un 80%:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gzip on;\ngzip_types text\/plain text\/css application\/json application\/javascript text\/xml application\/xml application\/xml+rss text\/javascript;\ngzip_min_length 256;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">10. Fix para Cloudflare con SSL Flexible<\/h2>\n\n\n\n<p>Si est\u00e1s usando Cloudflare en modo <strong>SSL Flexible<\/strong>, agrega este c\u00f3digo <strong>al principio<\/strong> de <code>wp-config.php<\/code> para evitar bucles de redirecci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (isset($_SERVER&#91;'HTTP_X_FORWARDED_PROTO']) \n    &amp;&amp; $_SERVER&#91;'HTTP_X_FORWARDED_PROTO'] == 'https') {\n    $_SERVER&#91;'HTTPS'] = 'on';\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Problemas frecuentes y soluciones<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Error 403<\/h3>\n\n\n\n<p>Casi siempre es por permisos. Soluci\u00f3n r\u00e1pida:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chown -R nginx:nginx \/var\/www\/wordpress<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Error \u00abFile not found\u00bb<\/h3>\n\n\n\n<p>Significa que FastCGI est\u00e1 mal configurado. Aseg\u00farate de usar <code>include fastcgi.conf;<\/code> en el bloque de PHP.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">WordPress no sube im\u00e1genes<\/h3>\n\n\n\n<p>Verifica que tengas instalados <code>php83-gd<\/code> y <code>php83-mbstring<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">No se conecta a la base de datos<\/h3>\n\n\n\n<p>Confirma que <code>php83-mysqli<\/code> est\u00e9 instalado y que las credenciales en <code>wp-config.php<\/code> coincidan exactamente con las que creaste en MariaDB.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Checklist antes de publicar<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eliminaste <code>\/etc\/nginx\/http.d\/default.conf<\/code><\/li>\n\n\n\n<li>Instalaste todas las extensiones PHP necesarias<\/li>\n\n\n\n<li>Cambiaste el usuario de PHP-FPM a <code>nginx<\/code><\/li>\n\n\n\n<li>Los permisos en <code>\/var\/www\/wordpress<\/code> son correctos<\/li>\n\n\n\n<li>Nginx apunta a <code>\/var\/www\/wordpress<\/code><\/li>\n\n\n\n<li>Usaste <code>fastcgi.conf<\/code> en la configuraci\u00f3n de PHP<\/li>\n\n\n\n<li>Activaste el cach\u00e9 FastCGI (recomendado)<\/li>\n\n\n\n<li>Activaste Gzip<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Listo para usar<\/h2>\n\n\n\n<p>Alpine Linux no es \u201cplug and play\u201d. Es m\u00e1s como armar un servidor desde cero, pieza por pieza. Si algo est\u00e1 mal configurado, suele fallar sin darte muchas pistas.<\/p>\n\n\n\n<p>Pero cuando lo haces bien, el resultado vale la pena: un stack <strong>extremadamente ligero, r\u00e1pido y estable<\/strong> que consume muy pocos recursos de tu VPS.<\/p>\n\n\n\n<p>Al final terminas con un WordPress que responde con velocidad y sin desperdiciar memoria RAM. Justo lo que buscas cuando quieres un entorno eficiente.<\/p>\n\n\n\n<p>\u00bfUsas Alpine para WordPress? \u00bfQu\u00e9 truco o optimizaci\u00f3n extra has descubierto? Cu\u00e9ntame en los comentarios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hace poco compart\u00ed una gu\u00eda pr\u00e1ctica para configurar Nginx con WordPress en Debian. Esta vez necesitaba un entorno nuevo para pruebas y decid\u00ed probar Alpine Linux, una de las distribuciones m\u00e1s ligeras y r\u00e1pidas que existen para un VPS. Esa ligereza tiene su precio: casi nada viene configurado por defecto. Y WordPress no es precisamente [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[24,15,19],"class_list":["post-246","post","type-post","status-publish","format-standard","hentry","category-guia","tag-linux","tag-php","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/comments?post=246"}],"version-history":[{"count":0,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/246\/revisions"}],"wp:attachment":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/media?parent=246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/categories?post=246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/tags?post=246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}