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.