Warning: count(): Parameter must be an array or an object that implements Countable in /home/www/javier.rodriguezcarballo.es/htdocs/wp-includes/post-template.php on line 284

Servidor web en una VPS de 256MB

Hasta hoy, este blog se alojaba en un servidor compartido de dreamhost. Había contratado un buen plan, gracias a esta oferta (ya caducada) publicada en Lifehacker, pero ahora que me tocaba renovar, he preferido buscar un nuevo alojamiento.

Como el sistema solo aloja un blog amateur no me preocupa demasiado la integridad ni disponibilidad, pero si la economía y la posibilidad de instalar software en el servidor, y tener algo con lo que trastear estas tardes de invierno. He optado por contratar una VPS escandalosamente barata en http://buyvm.net. En unos meses os diré como va.

Esta VPS, basada en OpenVZ, ofrece 256mb de RAM garantizada  y 30GB de espacio en disco. Parece un poco escaso en vista de las cifras que manejamos a día de hoy, pero creo que me será más que suficiente, ya que no necesito panel de administración ni servidor de correo.

El software que he elegido es el siguiente:

  • Debian 7 (32 Bits)
  • Servidor web: Nginx
  • Servidor php: php-fpm
  • Servidor BBDD: MySQL
  • MTA: ssmtp

He elegido Debian por que en mi trabajo he manejado principalmente esta distribución, y me ha dado buen resultado. Unas horas después de efectuar la compra recibí un correo de aviso de que mi servidor estaba listo. Tras resolver ciertos problemas con la contraseña de root (que no era la que yo esperaba, pero pude cambiar desde el panel de administración del proveedor), me conecté por ssh y actualicé el sistemas:

apt-get update
apt-get upgrade
reboot

Nginx

He preferido instalar nginx desde la web del proyecto en lugar de utilizar la versión del repositorio de debian.

wget http://nginx.org/keys/nginx_signing.keyapt-key 
add nginx_signing.key
echo "deb http://nginx.org/packages/debian/ wheezy nginx" >> /etc/apt/sources.list
echo "deb-src http://nginx.org/packages/debian/ wheezy nginx" >> /etc/apt/sources.list
apt-get update
apt-get install nginx

Para mayor comodidad a la hora de hacer los backups, he decidido almacenar todos los proyectos web en /home/www.

mkdir -p /home/www/javier.rodriguezcarballo.es/htdocs/
mkdir /home/www/javier.rodriguezcarballo.es/logs/
chown -R /home/www/javier.rodriguezcarballo.es/htdocs/

“/etc/nginx/nginx.conf”

user www-data;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
 worker_connections 1024;
}
http {
 include /etc/nginx/mime.types;
 default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
 #tcp_nopush on;
keepalive_timeout 65;
#gzip on;
 upstream php {
 server unix:/var/run/php5-fpm.sock;
 }
 include /etc/nginx/conf.d/*.conf;
}

Luego he creado un archivo especifico para definir la configuración de este blog. He preferido utilizar un archivo aparte, porque para utilizar WP SuperCache no se pueden pasar variables al index.php

“/etc/nginx/conf.d/javier.rodriguezcarballo.es.conf”

server {
 listen 80;
 server_name javier.rodriguezcarballo.es;
 root /home/www/javier.rodriguezcarballo.es/htdocs/;
 access_log /home/www/javier.rodriguezcarballo.es/logs/access.log;
 error_log /home/www/javier.rodriguezcarballo.es/logs/error.log;
index index.php;

 location = /favicon.ico { log_not_found off; access_log off; }
 location = /robots.txt { allow all; log_not_found off; access_log off; }
#INICIO SUPERCACHE
 set $cache_uri $request_uri;
# POST requests and urls with a query string should always go to PHP
 if ($request_method = POST) {
 set $cache_uri 'null cache';
 } 
 if ($query_string != "") {
 set $cache_uri 'null cache';
 }
# Don't cache uris containing the following segments
 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 $cache_uri 'null cache';
 }
# Don't use the cache for logged in users or recent commenters
 if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
 set $cache_uri 'null cache';
 }
# Use cached or actual file if they exists, otherwise pass request to WordPress
 location / {
 try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php ;
 } 
 #FIN SUPERCACHE
location ~ \.php$ {
 include fastcgi_params;
 fastcgi_split_path_info ^(.+\.php)(.*)$;
 fastcgi_pass php;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME /home/www/javier.rodriguezcarballo.es/htdocs/$fastcgi_script_name;
 include fastcgi_params;
 fastcgi_intercept_errors on;
 fastcgi_ignore_client_abort off;
 fastcgi_connect_timeout 60;
 fastcgi_send_timeout 180;
 fastcgi_read_timeout 180;
 fastcgi_buffer_size 128k;
 fastcgi_buffers 4 256k;
 fastcgi_busy_buffers_size 256k;
 fastcgi_temp_file_write_size 256k;
 }

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

PHP

Para instalar el servidor fpm utilizo los repositorios de debian:

apt-get install install php5-fpm php5-mysqlnd

“/etc/php5/fpm/php-fpm.conf”

[global]
 pid = /var/run/php5-fpm.pid
 error_log = /var/log/php5-fpm.log
 log_level = notice
 process.max = 3
 include=/etc/php5/fpm/pool.d/*.conf

“/etc/php5/fpm/pool.d/www.conf”

[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

access.log = /home/www/log/$pool.access.log

chdir = /

MySQL

Aunque este es un software muy exigente en cuanto a memoria, lo utilizan la mayor parte de las aplicaciones web modernas. En mi caso, como no necesito innodb, he desactivado el soporte para ahorrar RAM. Aún así, el servidor reserva unos 300mb, que es más de la memoria garantizada en mi máquina.

apt-get install mysql-server

“/etc/mysql/my.cnf”

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address            = 127.0.0.1
key_buffer              = 16K
max_allowed_packet      = 1M
table_cache             = 4
sort_buffer_size        = 64K
thread_stack            = 64K
thread_cache_size       = 8
sort_buffer             = 64K
net_buffer_length       = 2K
read_buffer_size        = 256K
read_rnd_buffer_size    = 256K
myisam-recover         = BACKUP
query_cache_limit       = 1M
query_cache_size        = 2M
expire_logs_days        = 10
max_binlog_size         = 100M

[mysqldump]
quick
quote-names
max_allowed_packet      = 8M

[mysql]

[isamchk]
key_buffer              = 8M

!includedir /etc/mysql/conf.d/
skip-bdb
skip-innodb

He instalado también automysqlbackup, que es un software que gestiona copias locales de tus BBDD de forma automática.

apt-get install automysqlbackup

SSMTP

Tengo el correo en Google Apps y no necesito un servidor de correo local en la VPS. Para utilizar sendmail desde mis aplicaciones he instalado ssmtp y lo he configurado para enviar el correo a través de Google Apps, aunque también vale una cuenta de GMail.

apt-get install ssmtp

“/etc/ssmtp/ssmtp.conf”

#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=[email protected]

# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=smtp.gmail.com:587

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
hostname=DOMINIO.COM

UseTLS=YES
UseSTARTTLS=YES
AuthUser=[email protected]
AuthPass=CONTRASEÑA

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

“/etc/ssmtp/revaliases”

# sSMTP aliases
#
# Format:       local_account:outgoing_address:mailhub
#
# Example: root:[email protected]:mailhub.your.domain[:port]
# where [:port] is an optional port number that defaults to 25.
root:[email protected]:smtp.gmail.com:587

Notas

He detectado dos errores en el sistema: el comando reboot apaga el sistema en lugar de reiniciarlo, y que la reinstalación automática del sistema no funciona. Sin embargo creo que el servicio se adapta a mis necesidades, ya que, como decía tiene un precio francamente bueno.

En algún momento probaré esta configuración con MariaDB.

11. January 2014 by Xavier
Categories: Alojamiento, Tecnología | 1 comment

One Comment

  1. Pingback: Xavier Carballo

Leave a Reply

Required fields are marked *


Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies