Last active
August 29, 2015 14:00
-
-
Save aldibier/11332928 to your computer and use it in GitHub Desktop.
Instalación de un servidor Nginx+PHP-FPM Optimizado para Drupal
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-------------------- | |
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 [email protected] | |
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