En este articulo voy a mostrarte como configurar el mejor servidor web para tu VPS, con estos pasos tendrás un servidor rápido y seguro. Vamos a instalar y configurar nginx, pagespeed, naxsi, mysql y WordPress sobre Ubuntu. En este articulo voy a enseñarte a realizar la misma configuración que uso para correr mis sitios web en mí VPS.
Por si no sabes que es cada una de estas opciones, voy a contarte un poco para que sirven:
- nginx: es un servidor web, como apache, pero es mucho más eficiente, actualmente corro un blog con más de 4,000 visitas diarias, en un servidor con 512MB en ram, por solo 5$ al mes con digital ocean.
- pagespeed: Es una herramienta de google que reduce el tiempo que tarda una página en cargar (en mostrarse en tu computadora), en general esto hace a los usuarios más felices y también te ayuda a salir mejor posicionado en las búsquedas de google, ya que ellos premian a las páginas que cargan rápido.
- naxsi: Es un firewall web, y te protege de algunas vulnerabilidades que pueda tener wordpress, algún plugin o cualquier aplicación web en tu servidor. (Mantiene a los hacker/craker fuera de tu servidor)
- MySQL o MariaDB: Es un servidor de bases de datos, gratis y muy bueno.
- WordPress: El mejor gestor de contenido, especialmente para blogs.
Ahora manos a la obra, lo primero que necesitamos es un servidor ubuntu instalado, en este tutorial voy a utilizar ubuntu 17.04
NOTA: Para ejecutar los comandos vas a necesitar acceso a la consola del servidor, para ello puedes utilizar el programa Putty si estas usando Windows. Puedes copiar cada bloque de comandos y ejecutarlos en un solo paso, copiando y pegando en la consola.
Instalando nginx, pagespeed y naxsi desde su código fuente.
Vamos a instalar nginx junto a pagespeed y naxsi desde sus fuentes, esto hará que trabajen más rápido.
Nota: Vamos a necesitar acceso root, para no tener que digitar sudo antes de cada comando, digitamossu -i
y luego nuestra clave (en caso de no estar logeados como root).
Primero debemos de instalar algunas librerías que nos permitirán compilar los códigos fuente de los programas.
apt-get install -y libpcre3 libpcre3-dev libssl-dev build-essential unzip
Ahora vamos a ir a la carpeta /tmp y descargar el código fuente de nginx, naxsi y pagespeed.
cd /tmp wget http://nginx.org/download/nginx-1.9.9.tar.gz wget https://codeload.github.com/nbs-system/naxsi/tar.gz/0.55.3 wget https://github.com/pagespeed/ngx_pagespeed/archive/v1.12.34.2-beta.zip
Ahora vamos a descomprimir los archivos de código fuente
tar xvzf nginx-1.9.9.tar.gz tar xvzf 0.55.3 unzip v1.12.34.2-beta.zip
Luego preparamos Google pagespeed para ser compilado
NPS_VERSION=1.12.34.2 cd ngx_pagespeed-${NPS_VERSION}-beta/ psol_url=https://dl.google.com/dl/page-speed/psol/${NPS_VERSION}.tar.gz [ -e scripts/format_binary_url.sh ] && psol_url=$(scripts/format_binary_url.sh PSOL_BINARY_URL) wget ${psol_url} tar -xzvf $(basename ${psol_url}) # extracts to psol/
El siguiente paso es configurar nginx para ser compilado
cd .. cd nginx-1.9.9/ ./configure --conf-path=/etc/nginx/nginx.conf --add-module=../naxsi-0.55.3/naxsi_src/ \ --add-module=../ngx_pagespeed-1.12.34.2-beta \ --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body \ --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log \ --http-proxy-temp-path=/var/lib/nginx/proxy --lock-path=/var/lock/nginx.lock \ --pid-path=/var/run/nginx.pid --with-http_ssl_module \ --without-mail_pop3_module --without-mail_smtp_module \ --without-mail_imap_module --without-http_uwsgi_module \ --without-http_scgi_module --with-ipv6 --prefix=/usr
Si no hay algún error, ahora vamos a generar el programa e instalarlo.
make make install
Ahora para comprobar si la instalación funcionó, ejecutamos este comando
nginx -v
Y la salida del comando deberá ser algo como esta:

Instalar MySQL o MariaDB
Ahora que tenemos nuestro servidor con nginx (servidor web), lo siguiente es instalar un servidor de base de datos. La opción más común es MySQL (o MariaDB)
apt-get install -y mysql-server
Al ejecutar el comando anterior, se va a descargar e instalar mysql y en un momento nos pedirá ingresar una clave, luego presionamos la tecla Tab (para movernos al botón Ok) y presionamos la tecla Enter

Luego nos pedirá confirmar la clave anterior, entonces la ingresamos y presionamos nuevamente la tecla Tab y tecla Enter.

Ahora vamos a ejecutar un asistente para configurar ciertas opciones relacionadas con la seguridad, cuando nos pida un password debemos ingresar el que colocamos en el paso anterior. Debemos leer las instrucciones que se presenten y aceptar o no las sugerencias.
mysql_secure_installation
Crear bases de datos y otorgar accesos
Primero debemos iniciar sesión en el servidor de base de datos, esto lo hacemos con este comando
mysql -u root -p
y luego digitamos la clave de root (que colocamos en unos pasos anteriores)
Ahora vamos a crear una base de datos con este comando:
CREATE DATABASE mi_base;
Donde mi_base
, es el nombre de la base de datos que vamos a crear. Ahora vamos a crear un usuario y a darle acceso a la base de datos.
CREATE USER [email protected]; SET PASSWORD FOR [email protected]= PASSWORD("Clave"); GRANT ALL PRIVILEGES ON mi_base.* TO [email protected] IDENTIFIED BY 'Clave'; FLUSH PRIVILEGES;
En el código anterior se debe cambiar todas las coincidencias de la palabra usuario
, por el nombre de usuario que va a crearse, también la palabra Clave
por la clave o password que va a usarse, mi_base
es el nombre de la base de datos a la que va a darse acceso.
Ahora hemos creado la base de datos, un usuario y le hemos dado acceso a la base de datos, ahora está todo listo con nuestra base de datos, para cerrar esta sesión y regresar a la consola de ubuntu digitamos este comando:
exit;
Configurar nignx para ejecutar código PHP
Ya tenemos instalado nginx y puede procesar páginas con código de HTML, pero lo más usual es ejecutar código dinámico como PHP, para instalar PHP vamos a correr estos comandos:
apt-get install -y php-fpm php-mysql php-curl php-gd php-mbstring php-mcrypt php-xml php-xmlrpc
NOTA: Ahora vamos a configurar los programas, esto se hace editando archivos de texto en el servidor, en Linux el editor de texto predeterminado es VI, si nunca has usado este programa, puedes leer una guía haciendo clic aquí.
Ahora vamos a configurar nginx, creando un archivo con este comando.
vi /etc/nginx/nginx.conf
El contenido del archivo debe ser el siguiente:
Nota: Si una archivo ya tiene información, podemos borrar todo con este comando de vi :1,$d
user www-data; worker_processes 1; events { worker_connections 1024; } http { include /etc/nginx/rules/naxsi_core.rules; include /etc/nginx/mime.types; fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=mycache:100m inactive=60m; fastcgi_cache_key "$scheme$request_method$host$request_uri"; gzip on; gzip_min_length 1000; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; server_tokens off; include /etc/nginx/sites-enabled/*; }
También debemos de copiar este archivo:
mkdir /etc/nginx/rules vi /etc/nginx/rules/naxsi_core.rules
Con este contenido:
################################## ## INTERNAL RULES IDS:1-999 ## ################################## #@MainRule "msg:weird request, unable to parse" id:1; #@MainRule "msg:request too big, stored on disk and not parsed" id:2; #@MainRule "msg:invalid hex encoding, null bytes" id:10; #@MainRule "msg:unknown content-type" id:11; #@MainRule "msg:invalid formatted url" id:12; #@MainRule "msg:invalid POST format" id:13; #@MainRule "msg:invalid POST boundary" id:14; #@MainRule "msg:invalid JSON" id:15; #@MainRule "msg:empty POST" id:16; #@MainRule "msg:libinjection_sql" id:17; #@MainRule "msg:libinjection_xss" id:18; ################################## ## SQL Injections IDs:1000-1099 ## ################################## MainRule "rx:select|union|update|delete|insert|table|from|ascii|hex|unhex|drop" "msg:sql keywords" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1000; MainRule "str:\"" "msg:double quote" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8,$XSS:8" id:1001; MainRule "str:0x" "msg:0x, possible hex encoding" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:2" id:1002; ## Hardcore rules MainRule "str:/*" "msg:mysql comment (/*)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1003; MainRule "str:*/" "msg:mysql comment (*/)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1004; MainRule "str:|" "msg:mysql keyword (|)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1005; MainRule "str:&&" "msg:mysql keyword (&&)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1006; ## end of hardcore rules MainRule "str:--" "msg:mysql comment (--)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1007; MainRule "str:;" "msg:semicolon" "mz:BODY|URL|ARGS" "s:$SQL:4,$XSS:8" id:1008; MainRule "str:=" "msg:equal sign in var, probable sql/xss" "mz:ARGS|BODY" "s:$SQL:2" id:1009; MainRule "str:(" "msg:open parenthesis, probable sql/xss" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$SQL:4,$XSS:8" id:1010; MainRule "str:)" "msg:close parenthesis, probable sql/xss" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$SQL:4,$XSS:8" id:1011; MainRule "str:'" "msg:simple quote" "mz:ARGS|BODY|URL|$HEADERS_VAR:Cookie" "s:$SQL:4,$XSS:8" id:1013; MainRule "str:," "msg:comma" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1015; MainRule "str:#" "msg:mysql comment (#)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1016; MainRule "str:@@" "msg:double arobase (@@)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1017; ############################### ## OBVIOUS RFI IDs:1100-1199 ## ############################### MainRule "str:http://" "msg:http:// scheme" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1100; MainRule "str:https://" "msg:https:// scheme" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1101; MainRule "str:ftp://" "msg:ftp:// scheme" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1102; MainRule "str:php://" "msg:php:// scheme" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1103; MainRule "str:sftp://" "msg:sftp:// scheme" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1104; MainRule "str:zlib://" "msg:zlib:// scheme" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1105; MainRule "str:data://" "msg:data:// scheme" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1106; MainRule "str:glob://" "msg:glob:// scheme" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1107; MainRule "str:phar://" "msg:phar:// scheme" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1108; MainRule "str:file://" "msg:file:// scheme" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1109; MainRule "str:gopher://" "msg:gopher:// scheme" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1110; ####################################### ## Directory traversal IDs:1200-1299 ## ####################################### MainRule "str:.." "msg:double dot" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$TRAVERSAL:4" id:1200; MainRule "str:/etc/passwd" "msg:obvious probe" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$TRAVERSAL:4" id:1202; MainRule "str:c:\\" "msg:obvious windows path" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$TRAVERSAL:4" id:1203; MainRule "str:cmd.exe" "msg:obvious probe" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$TRAVERSAL:4" id:1204; MainRule "str:\\" "msg:backslash" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$TRAVERSAL:4" id:1205; #MainRule "str:/" "msg:slash in args" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$TRAVERSAL:2" id:1206; ######################################## ## Cross Site Scripting IDs:1300-1399 ## ######################################## MainRule "str:<" "msg:html open tag" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1302; MainRule "str:>" "msg:html close tag" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1303; MainRule "str:[" "msg:open square backet ([), possible js" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$XSS:4" id:1310; MainRule "str:]" "msg:close square bracket (]), possible js" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$XSS:4" id:1311; MainRule "str:~" "msg:tilde (~) character" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$XSS:4" id:1312; MainRule "str:`" "msg:grave accent (`)" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1314; MainRule "rx:%[2|3]." "msg:double encoding" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1315; #################################### ## Evading tricks IDs: 1400-1500 ## #################################### MainRule "str:&#" "msg:utf7/8 encoding" "mz:ARGS|BODY|URL|$HEADERS_VAR:Cookie" "s:$EVADE:4" id:1400; MainRule "str:%U" "msg:M$ encoding" "mz:ARGS|BODY|URL|$HEADERS_VAR:Cookie" "s:$EVADE:4" id:1401; ############################# ## File uploads: 1500-1600 ## ############################# MainRule "rx:\.ph|\.asp|\.ht" "msg:asp/php file upload" "mz:FILE_EXT" "s:$UPLOAD:8" id:1500;
Ahora este archivo
vi /etc/nginx/rules/naxsi.rules
Con este contenido:
# Sample rules file for default vhost. #LearningMode; SecRulesEnabled; #SecRulesDisabled; DeniedUrl "/50x.html"; ## check rules CheckRule "$SQL >= 8" BLOCK; CheckRule "$RFI >= 8" BLOCK; CheckRule "$TRAVERSAL >= 4" BLOCK; CheckRule "$EVADE >= 4" BLOCK; CheckRule "$XSS >= 8" BLOCK;
Y también este otro archivo
vi /etc/nginx/mime.types
Con este contenido:
types { text/html html htm shtml; text/css css; text/xml xml; image/gif gif; image/jpeg jpeg jpg; application/javascript js; application/atom+xml atom; application/rss+xml rss; text/mathml mml; text/plain txt; text/vnd.sun.j2me.app-descriptor jad; text/vnd.wap.wml wml; text/x-component htc; image/png png; image/tiff tif tiff; image/vnd.wap.wbmp wbmp; image/x-icon ico; image/x-jng jng; image/x-ms-bmp bmp; image/svg+xml svg svgz; image/webp webp; application/font-woff woff; application/java-archive jar war ear; application/json json; application/mac-binhex40 hqx; application/msword doc; application/pdf pdf; application/postscript ps eps ai; application/rtf rtf; application/vnd.apple.mpegurl m3u8; application/vnd.ms-excel xls; application/vnd.ms-fontobject eot; application/vnd.ms-powerpoint ppt; application/vnd.wap.wmlc wmlc; application/vnd.google-earth.kml+xml kml; application/vnd.google-earth.kmz kmz; application/x-7z-compressed 7z; application/x-cocoa cco; application/x-java-archive-diff jardiff; application/x-java-jnlp-file jnlp; application/x-makeself run; application/x-perl pl pm; application/x-pilot prc pdb; application/x-rar-compressed rar; application/x-redhat-package-manager rpm; application/x-sea sea; application/x-shockwave-flash swf; application/x-stuffit sit; application/x-tcl tcl tk; application/x-x509-ca-cert der pem crt; application/x-xpinstall xpi; application/xhtml+xml xhtml; application/xspf+xml xspf; application/zip zip; application/octet-stream bin exe dll; application/octet-stream deb; application/octet-stream dmg; application/octet-stream iso img; application/octet-stream msi msp msm; application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx; application/vnd.openxmlformats-officedocument.presentationml.presentation pptx; audio/midi mid midi kar; audio/mpeg mp3; audio/ogg ogg; audio/x-m4a m4a; audio/x-realaudio ra; video/3gpp 3gpp 3gp; video/mp2t ts; video/mp4 mp4; video/mpeg mpeg mpg; video/quicktime mov; video/webm webm; video/x-flv flv; video/x-m4v m4v; video/x-mng mng; video/x-ms-asf asx asf; video/x-ms-wmv wmv; video/x-msvideo avi; }
Ahora vamos a configurar el host virtual para nginx, para ello creamos este archivo
mkdir /etc/nginx/sites-enabled vi /etc/nginx/sites-enabled/default.conf
Con este contenido, teniendo cuidado de cambiar la línea 192.168.56.132
por la ip de tu servidor o el nombre de dominio.
server { listen 80; server_name 192.168.56.132; root /var/www/html; index index.html index.php; client_max_body_size 5m; client_body_timeout 60; ###################### # Configurar pagespeed ###################### pagespeed On; pagespeed FileCachePath "/var/cache/ngx_pagespeed/"; pagespeed EnableFilters rewrite_css; pagespeed EnableFilters fallback_rewrite_css_urls; pagespeed EnableFilters combine_css; location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; } location ~ "^/ngx_pagespeed_static/" { } location ~ "^/ngx_pagespeed_beacon$" { } location /ngx_pagespeed_statistics { allow 127.0.0.1; deny all; } location /ngx_pagespeed_global_statistics { allow 127.0.0.1; deny all; } location /ngx_pagespeed_message { allow 127.0.0.1; deny all; } ###################### # Cache ###################### set $no_cache 0; if ($request_method = POST) { set $no_cache 1; } if ($query_string != "") { set $no_cache 1; } if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") { set $no_cache 1; } if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") { set $no_cache 1; } ##################################### # Configurar Naxsi y pagina index ##################################### location / { include /etc/nginx/rules/naxsi.rules; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; try_files $uri $uri/ /index.php?$args; } location ~ \.php?$ { try_files $uri =404; include fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors on; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_hide_header X-Powered-By; fastcgi_pass unix:/run/php/php7.0-fpm.sock; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_send_timeout 90; fastcgi_read_timeout 90; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_cache_bypass $no_cache; fastcgi_no_cache $no_cache; fastcgi_cache mycache; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1h; fastcgi_cache_valid any 1h; fastcgi_cache_min_uses 2; add_header X-Fastcgi-Cache $upstream_cache_status; } ################################################# #Opciones de seguridad y otros cache ################################################# # No ejecutar php en carpeta upload location ~* /(?:uploads|files)/.*.php$ { deny all; } # Impedir acceso a scripts location ~* .(pl|cgi|py|sh|lua)$ { return 444; } # Ocultar acceso a comentarios y otros archivos de wp location ~ /(wp-config.php|wp-comments-post.php|readme.html|license.txt) { deny all; } location ~* \.(ico|pdf|flv)$ { expires 1y; } location ~* \.(js|css|png|jpg|jpeg|gif|swf|xml|txt)$ { expires 30d; } }
Vamos a crear unos directorios para nginx
mkdir /var/lib/nginx mkdir -p /var/www/html
Ahora si todo esta bien vamos a iniciar nginx o reiniciarlo con uno de estos comandos, si no lo hemos iniciado aun, lo hacemos con este comando
nginx
O si ya ha sido iniciado, debemos reiniciarlo
nginx -s reload
Instalar WordPress
Muy bien, ahora vamos a instalar WordPress en nuestro servidor, primero vamos a descargar el instalador en la carpeta que hemos preparado.
cd /var/www/html wget https://wordpress.org/latest.tar.gz tar --strip-components=1 -zxvf latest.tar.gz rm latest.tar.gz chown -R www-data:www-data /var/www/*
Ahora en un navegador colocamos la dirección ip o el dominio de nuestro servidor y seguimos los pasos del asistente para instalar WordPress

¡Cuando termines de seguir los pasos de el asistente de instalación de WordPress ya habrás terminado de configurar tu servidor, ahora lo que sigue es crear algo de contenido en WordPress!.
hi 🙂 bross 🙂
i am from Italy hello. Can you help me translate? /rardor