Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save aldibier/11332928 to your computer and use it in GitHub Desktop.
Save aldibier/11332928 to your computer and use it in GitHub Desktop.
Instalación de un servidor Nginx+PHP-FPM Optimizado para Drupal
--------------------
Información
--------------------
- Ubuntu 12.04 LTS
- Linode
- MEM: 4GB
- CPU: 4 CORES
-------------------
Instalación:
-------------------
Ingrese con el usuario Root, si no lo tiene use "sudo"
1. Creación de usuario distinto a root
# adduser admin
2. Añadir el nuevo usuario a sudo
# nano /etc/sudoers
Si encuentra la siguiente línea no necesita hacer nada, de lo contrario debe crearla, esto le dará acceso de sudo a todos los usuarios que están dentro del grupo admin.
# Members of the admin group may gain root privileges
%admin ALL=(ALL) NOPASSWD: ALL
Importante: que la instrucciòn después del parétesis exista ya que asi no pedirá contraseña cuando se use sudo
3. Generar la llave de acceso al servidor
Estos pasos los debe realizar en su máquina local
$ ssh-keygen -t rsa -b 2048 -v
Le preguntará por el nombre del archivo, inserte el nombre que prefiera, en este caso, he usado el nombre "mykey-replace", esto generará un archivo mykey-replace.pub y el archivo mykey-replace sin una extensión, ese archivo renombrelo a mykey-replace.pem los archivos son creados en el directorio donde se encuentre en la cosnsola, en el proceso le preguntará por una palabra clave, esto es para asegurar el certificado en la máquina local, puede ignorar esta opción si considera que el equipo donde se va a usar la llave es seguro.
3. Transferir la llave de usuario al servidor
Desde el equipo que usará para conectarse, transfiera la llave a la carpeta del usuario que creó en el servidor
$ scp /home/mylocaluser/.ssh/mykey-replace.pub myuser@myserver:~
4. Incluya la llave al servidor como autorizada
Ingrese desde su equipo al servidor
$ ssh myuser@myserver
En el servidor quiźas tenga que crear la carpeta .ssh
$ mkdir ~/.ssh
$ cat key-replace.pub >> ~/.ssh/authorized_keys
Regrese a la consola de suequipo y pruebe nuevamente la conexión, si todo salió bien en esta ocasión no le solicitará la contraseña
$ ssh myuser@myserver -i key-replace.pem
5. Configuración del Acceso SSH al servidor
$ sudo nano /etc/ssh/sshd_config
Cambie a las siguientes directivas para no permitir el acceso por SSH al usuario Root, para eso usamos los usuarios con permisos de sudo y también restringir el acceso a solo si se tiene una llave autorizada.
PermitRootLogin no
PasswordAuthentication no
$ sudo /etc/init.d/ssh restart
--- hostname ---
$ sudo nano /etc/hostname
myservername
$ sudo hostname myservername
$ sudo nano /etc/hosts
127.0.0.1 localhost myserver
--- Apache + PHP5-FPM ---
$ sudo apt-get update
$ sudo apt-get install nginx
$ sudo apt-get install php5-fpm php5 php5-curl php5-gd php5-imagick php-apc php5-mysql php-pear
== Comportamiento de PHP-FPM ==
Como PHP-FPM es un proceso independiente también tiene un archivo de configuración que determina su comportamiento.
Archivo de configuración: /etc/php-fpm.d/www.conf
;listen = 127.0.0.1:9000
listen = /var/run/php5-fpm.sock
pm = static
pm.max_children = 32
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 35
Comportamiento de PHP
Archivo de configuración: /etc/php5/fpm/php.ini
Las siguientes son las configuraciones que se aplicaron al archivo
Se desactiva la información que indica la versión de PHP
expose_php = Off
Máxima cantidad de memoria a consumir por PHP
memory_limit = 256M
No mostrar los errores de PHP al usuario final
display_errors = Off
Comportamiento de APC
Archivo de configuración: /etc/php5/fpm/conf.d/apc.ini
apc.shm_size=256M
== Nginx + PHP-FPM ==
=== Nginx ===
El archivo de configuración de host virtual que responderá al sitio se debe crear en la carpeta de sitios disponibles para luego hacer el enlace simbólico a sitios disponibles, debemos crear el archivo de configuración del sitio
$ sudo nano /etc/nginx/sites-available/misitio
Configuración del virtual host
Las siguientes son las instrucciones (explicadas) del archivo de configuración (explicado) en Nginx que sirve el portal www.clubvivamos.com
server {
El servidor responde en puerto 80
listen 80;
Las direcciones a las que responde el servidor y la ruta de los archivos
server_name www.misitio.com misitio.com;
root /var/www/vhost/misitio;
No se muestra información del servidor
server_tokens off;
El archivo de inicio es “solo” index.php
index index.php;
Ruta de los archivos log (importante para monitorear errores, tener en cuenta para efectos de espacio en el disco en el futuro)
access_log /var/log/nginx/misitio.access.log;
error_log /var/log/nginx/misitio.error.log info;
Un error común es que el navegador Internet explorer espere que el archivo de favicon esté en la raíz del sitio y esto ya no es cierto, por ello se le especifica que no registre esto en los logs de errores porque no es un error
location = /favicon.ico {
log_not_found off;
access_log off;
}
Permitir el acceos al archivo robots.txt pero no registrar ese acceso, no es necesario
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
Esta configuración es ùtil cuando se està usando drush ya que suele ser una carpeta de backups, en esta instrucción se restringe el acceso si la carpeta existe
# This matters if you use drush
location = /backup {
deny all;
}
Se restringe el acceso a todos los archivos que empiecen por .ht
location ~ /\.ht {
deny all;
}
Si se intenta acceder a un archivo que termina en .txt o .log solo le es permitido si es la propia màquina, de lo contrario se restringe el acceso
# Very rarely should these ever be accessed outside of your lan
location ~* \.(txt|log)$ {
allow 127.0.0.1;
deny all;
}
Esta instrucción comentada sirve cuando solo se quiere permitir que el index.php de Drupal sea el ùnico que responda, sin embargo en este caso el sitio tiene otros archivos para servicio web que deben funcionar, por eso está comentada
#location ~ \..*/.*\.php {
# return 403;
#}
Si la peticiòn es un archivo estático, php no es el que responde sino solo Nginx, esto ayuda a reducir la carga
location / {
# This is cool because no php is touched for static content
try_files $uri $uri/ @rewrite;
expires max;
}
Lo mismo para lo anterior, pero especìficamente para la carpeta styles de Drupal
location ~* /files/styles {
# access_log off;
# expires 30d;
try_files $uri @rewrite;
}
Este es el equivalente al mod_rewrite de Apache
location @rewrite {
# Some modules enforce no slash (/) at the end of the URL
# Else this rewrite block wouldn't be needed (GlobalRedirect)
rewrite ^/(.*)$ /index.php?q=$1;
}
Si el archivo es un .php lo procesa php-fpm
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Ahora hay que habilitar el sitio, para ello hay que crear un enlace simbólico desde del archivo que acabamos de crear hasta la carpeta sites-enabled
Se crea el directorio donde se van a alojar los archivos
$ sudo mkdir /var/www/vhost/misitio
Para probar cree el archivo index.php dentro de la carpeta con la instalación
$ sudo ln -s /etc/nginx/sites-available/artpat /etc/nginx/sites-enabled/artpat
<?php
phpinfo();
Si carga la página informativa de php entonces todo está en orden
--- MYSQL---
$ sudo apt-get install mysql-server mysql-client
Se asegura la instalación de MySQL eliminando los usuarios anònimos, la base de datos de prueba y permitir el login del root solo desde la propia máquina
$ sudo mysql_secure_installation
7. Instalación Git
$ sudo apt-get install git
----------------------
CONFIGURACIÓN
----------------------
Permitir que el usuario creado pueda escribir en la carpeta de publicación de apache, aprovechamos el grupo www-data
$ sudo groupadd www-users
$ sudo usermod -a -G www-users myuser
$ sudo chown -R :www-users /var/www
$ sudo chmod -R g+rwX /var/www
$ sudo chmod g+s /var/www
¡Importante!: Si después de estos cambios quiere crear archivos debería salir de la sesión y luego volver a entrar para que tengan efecto.
Configuración de nano para que no muestre el error con el archivo .nano_history
$ sudo nano /etc/nanorc
# set historylog
$ mkdir /var/www/default
$ mkdir /var/www/vhost
Edita el archivo de configuración del virtual host por defecto para que apunte al directorio /var/www/html
$ sudo nano /etc/apache2/sites-available/default
DocumentRoot /var/www/default
<Directory /var/www/default>
--- PHP ---
Instalación de PECL Upload Progress
$ sudo apt-get install build-essential
$ sudo pecl install uploadprogress
$ sudo nano /etc/php5/fpm/conf.d/uploadprogress.ini
extension=uploadprogress.so
-------------------------
HARDENING
-------------------------
--- En PHP ---
$ sudo nano /etc/php5/fpm/php.ini
expose_php = Off
--- En MySQL ---
$ sudo mysql_secure_installation
- Change the root password? [Y/n] n
- Remove anonymous users? [Y/n] y
- Disallow root login remotely? [Y/n] y
- Remove test database and access to it? [Y/n] y
- Reload privilege tables now? [Y/n] y
--- En Apache ---
$ sudo nano /etc/apache2/conf.d/security
ServerTokens Prod
ServerSignature Off
------------------------
DRUPAL
------------------------
--- Instalación de Drush ---
$ sudo pear channel-discover pear.drush.org
$ sudo pear install drush/drush
$ cd ~
$ wget -c http://download.pear.php.net/package/Console_Table-1.1.3.tgz
$ tar -zxvf Console_Table-1.1.3.tgz
$ sudo cp -rp Console_Table-1.1.3 /usr/share/php/drush/lib/
$ drush dl registry_rebuild
--- Probar Drupal ---
$ cd /var/www/vhost/
$ drush dl drupal
Esto descargará la versión mas reciente de Drupal, en mi caso drupal-7.22
--- Configuración Por sitio ---
$ sudo nano /etc/apache2/sites-available/mysite
<VirtualHost *:80>
ServerName mysite.com
ServerAlias www.mysite.com
ServerAdmin nickname@dominio.com
DocumentRoot /var/www/vhost/drupal-7.22
<Directory /var/www/vhost/drupal-7.22>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/mysite.error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/mysite.access.log combined
</VirtualHost>
$ sudo a2ensite mysite
$ sudo service apache2 reload
================ REDIS ===========
$ sudo apt-get install redis-server
$ sudo update-rc.d redis-server disable
$ sudo nano /etc/init/redis-server
description "redis server"
start on runlevel [23]
stop on shutdown
exec sudo -u redis /usr/bin/redis-server /etc/redis/redis.conf
respawn
$ sudo start redis-server
$ sudo restart redis-server
$ sudo stop redis-server
Download an unzip the phpredis library in the libraries folder
https://github.com/nrk/predis
$ nano settings.php
define('PREDIS_BASE_PATH', DRUPAL_ROOT . '/sites/mysite/libraries/predis-0.8/lib/');
$conf['redis_client_interface'] = 'Predis';
$conf['cache_backends'][] = 'sites/mysite/modules/contrib/redis/redis.autoload.inc';
$conf['cache_class_cache'] = 'Redis_Cache';
$conf['cache_class_cache_form'] = 'Redis_Cache';
$conf['cache_class_cache_views'] = 'Redis_Cache';
$conf['cache_class_cache_page'] = 'Redis_Cache';
$conf['cache_class_cache_menu'] = 'Redis_Cache';
$conf['cache_class_cache_path'] = 'Redis_Cache';
$conf['cache_class_cache_entity_node'] = 'Redis_Cache';
$conf['cache_class_cache_entity_taxonomy_term'] = 'Redis_Cache';
$conf['cache_class_cache_entity_taxonomy_vocabulary'] = 'Redis_Cache';
$conf['cache_class_cache_entity_file'] = 'Redis_Cache';
$conf['cache_class_cache_entity_user'] = 'Redis_Cache';
$conf['cache_class_cache_filter'] = 'Redis_Cache';
$conf['cache_class_cache_admin_menu'] = 'Redis_Cache';
$conf['cache_class_cache_bootstrap'] = 'Redis_Cache';
$conf['lock_inc'] = 'sites/mysite/modules/contrib/redis/redis.lock.inc';
$conf['redis_client_base'] = 1; //Change Database number
$conf['cache_class_cache_field'] = 'Redis_Cache';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment