marzo 27, 2013

Instalación y configuración de NGINX en CentOS (PHP, SSL, PROXY)


Instalación NGINX 

Descargamos el repositorio del sitio oficial NGINX, lo instalamos e inhabilitamos su carga automática.
[user@host ~]# wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
[user@host ~]# yum localinstall nginx-release-centos-6-0.el6.ngx.noarch.rpm 
[user@host ~]# vim /etc/yum.repos.d/nginx.repo 
# nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
# 1:Activo 0: Desactivado
enabled=0

Instalamos el paquete NGINX usando el repositorio previamente instalado, despues activamos el inicio automatico del servicio con el sistema.
[user@host ~]# yum install nginx --enablerepo nginx
[user@host ~]# chkconfig nginx on
[user@host ~]# service nginx start

Como buena practica de configuración, creamos la carpeta "sites-available" donde alojaremos los archivos de configuración de nuestros sitios (virtualhost) y la carpeta "sites-enabled" que nos servirá para crear enlaces simbólicos hacia los archivos de configuración "sites-available" esto ponerlos en un estado "online". De igual forma creamos el directorio "sites" dentro de la carpeta de logs de NGINX como buena practica para tener ordenado nuestros registros de cada sitio que levantemos.
[user@host ~]# mkdir /etc/nginx/sites-available
[user@host ~]# mkdir /etc/nginx/sites-enabled
[user@host ~]# mkdir /var/log/nginx/sites

Creamos un respaldo de la configuración global y aplicamos las configuraciones siguientes para el servicio.
[user@host ~]# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old
[user@host ~]# vim /etc/nginx/nginx.conf
user  nginx;
## Numero de CPUs
worker_processes  2;

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;
    ## Optimiza el rendimiento de sendfile al enviar tramas HTTP
    ## en un solo paquete.
    tcp_nopush     on;
    ## Soporte gzip. Reduce la cantidad de datos a transferir
    gzip  on;

    ## Configuracion de buffers
    client_body_buffer_size  1K;
    client_header_buffer_size 1k;
    client_max_body_size 1k;
    large_client_header_buffers 2 1k;

    ## Configuracion de timeouts 
    client_body_timeout   10;
    client_header_timeout 10;
    keepalive_timeout     5 5;
    send_timeout          10;

    include /etc/nginx/conf.d/*.conf;
    
    ## Directorio de configuracion para vhost's en linea
    include /etc/nginx/sites-enabled/*.conf;
}

Agregamos la ip 127.0.0.1 para escucha solo local del sitio default, también podemos borrar este archivo si quieren deshabilitar completamente.
[user@host ~]# vim /etc/nginx/conf.d/default.conf 
server {
    listen       127.0.0.1:80;
Abrimos el puerto 80 en el firewall y reiniamos el servicio
[user@host ~]# vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
[user@host ~]# service iptables restart

Soporte PHP

Instalamos los paquetes para el soporte a PHP con PHP-FPM, habilitamos PHP-FPM como servicio, lo cargamos para que inicie con el sistema operativo.
[user@host ~]# yum install php-fpm php-common php-pecl-apc php-cli php-pear php-pdo \
php-mysql php-gd php-mbstring php-xml
[user@host ~]# chkconfig --add php-fpm
[user@host ~]# chkconfig php-fpm on
Cambiamos el propietario por nginx, limitamos el tiempo de ejecución de una petición php y aseguramos que solo se usen extensiones php validas.
[user@host ~]# vim /etc/php-fpm.d/www.conf 
;listen = 127.0.0.1:9000
listen = /var/run/php5-fpm.sock
;listen.allowed_clients = 127.0.0.1
;user = apache
;group = apache
user = nginx
group = nginx
request_terminate_timeout = 30s
security.limit_extensions = .php .php3 .php4 .php5 
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
Asegúrese de que exista este directorio "/var/lib/php/session/" ya que es donde se guardara las sesiones php y el directorio “/var/lib/php/tmp/” donde se alojaremos archivos temporales que se suban.
[user@host ~]# mkdir /var/lib/php
[user@host ~]# mkdir /var/lib/php/session
[user@host ~]# mkdir /var/lib/php/tmp/
[user@host ~]# chown nginx:nginx -R /var/lib/php/
[user@host ~]# chmod 750 -r /var/lib/php/session/
Creamos un archivo de llamado security.ini para PHP donde pondremos algunas configuraciones que reforzaran la seguridad de su sitio, ponga a consideración personal aplicarlas o modificar las variables de acuerdo a su servidor.
[user@host ~]#  vim /etc/php.d/security.ini 
; Ocultar version de PHP
expose_php=Off
; Ocultar errores
display_errors=Off
; Bloquear subidas de archivos
;file_uploads=Off
; ó limitar los archivos a subir
file_uploads=On
upload_max_filesize=1M
; Bloquear ejecucion remota via ftp,http
allow_url_fopen=Off
allow_url_include=Off
; Desactivar (Obsoleto a partir de PHP 5.4.0)
magic_quotes_gpc=Off
; Limita los paquetes POST, (Default 8M)
post_max_size=1M
; Control de recursos
max_execution_time =  30
max_input_time = 30
memory_limit = 8M
; Desactivar funciones que podrían ser explotadas
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source,phpinfo
; Directorio temporal
upload_tmp_dir = /var/lib/php/tmp/
; Limitar la ejecución a php en directorio
open_basedir = /home/www/ 
Iniciamos el servicio
[user@host ~]# service php-fpm start
Iniciando php-fpm:                                         [  OK  ]

Configuramos el vhost
[user@host ~]# vim /etc/nginx/sites-available/ejemplo.com.mx.conf 
server {
    listen       [IP]:80;
    server_name  www.ejemplo.com.mx ejemplo.com.mx;
    ## Deshabilitamos que imprima la version de NGINX ##
    server_tokens off;

    ## Registros del virtualhost ##
    access_log  /var/log/nginx/sites/ejemplo.access.log;
    error_log  /var/log/nginx/sites/ejemplo.error.log;

    ## Acceso solo por hostname valido ##
    if ( $host !~ ^(ejemplo.com.mx|www.ejemplo.com.mx)$ ) {
         return 444;
    }

    ## Metodos validos ##
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
         return 444;
    }

    location / {
     ## Los index validos, entre ellos el .php
        index  index.html index.htm index.php;

        ## Directorio absoluto
        root  /home/www/ejemplo.com.mx/public_html;

        ## Soporte PHP ##
        location ~ \.php$ {
                root            public_html;
                fastcgi_pass    unix:/var/run/php5-fpm.sock;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME  /home/www/ejemplo.com.mx/public_html$fastcgi_script_name;
                include         /etc/nginx/fastcgi_params;
        }

        ## Denegar accesos a archivos ocultos ##
        location ~ /\. { deny  all; }

        ## Bloquear logs de archivos estaticos ###
        location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
                access_log        off;
                log_not_found     off;
                expires           360d;
        }

    }

}

Habilitamos la configuración de nuestro sitio y reiniciamos el servicio
[user@host ~]# cd /etc/nginx/sites-enabled/
[user@host ~]# ln -s /etc/nginx/sites-available/ejemplo.com.mx.conf
[user@host ~]# service nginx restart

Soporte SSL 

Para soporte SSL agregamos la siguiente configuracion
[user@host ~]# vim /etc/nginx/sites-available/ejemplo.com.mx.conf 
server {
    ## Escucha en puerto 443
    listen      [IP]:443 ssl;

    ## Soporte SSL ##
    ssl_certificate     /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    ssl_prefer_server_ciphers on;
    ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_session_cache shared:SSL:2m;
    ssl_ciphers RC4:HIGH:!MD5:!aNULL:!DH:!EDH;

Creamos el directorio para nuestro certificado (5 años de vigencia, modifique la cantidad de días a su gusto) y la creamos dentro de la carpeta
[user@host ~]# mkdir /etc/nginx/ssl/
[user@host ~]# cd /etc/nginx/ssl/
[user@host ssl]# openssl genrsa -des3 -out server.key 2048
[user@host ssl]# openssl req -new -key server.key -out server.csr
[user@host ssl]# cp server.key server.key.com
[user@host ssl]# openssl rsa -in server.key.com -out server.key
[user@host ssl]# openssl x509 -req -days 1825 -in server.csr -signkey server.key -out server.crt

Abrimos el puerto 443 en el firewall y reiniciamos el servicio
[user@host ~]# vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
[user@host ~]# service iptables restart

Reiniciamos el servicio
[user@host ~]# service nginx restart

Configuración de logrotate 

Agregamos el directorio donde estamos poniendo nuestros logs de sitios en el archivo de configuración de logrotate de nginx.
[user@host ~]# vim /etc/logrotate.d/nginx 
/var/log/nginx/*.log /var/log/nginx/*/*.log {
        weekly
        missingok
        rotate 4
        compress
        delaycompress
        notifempty
        create 640 nginx nginx
        sharedscripts
        postrotate
                [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
        endscript
}

Soporte PROXY estilo apache 

Incluimos en un archivo de configuración separada los parámetros para proxy
[user@host ~]# touch /etc/nginx/proxy.conf 
[user@host ~]# vim /etc/nginx/proxy.conf 
proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

Configuración extra para los vhost que requieran el proxy
[user@host ~]# vim /etc/nginx/sites-available/ejemplo.com.mx.conf 
upstream srv1 {
  server [IP o Domain name]:80;
}
server {
    #...
    #...
    
    location /alproxy/ {
        proxy_pass http://srv1/;
        include /etc/nginx/proxy.conf;
    }
    
    #...
    #...
}

No hay comentarios.:

Publicar un comentario