Optimizar un servidor Nginx 1/2

Optimizar un servidor Nginx.

Nginx es un servidor web con un pequeño, pero que destaca por su robustez ademas de que es muy rápido. En todas las comparativas existentes donde se enfrenta a otras alternativas, siempre queda en los primeros puestos, si no el primero.

Aparte de ser capaz de correr como servidor web, también puede trabajar como proxy HTTP inverso, reenviando las peticiones a los servidores o servidor principal.

Tal vez te interese leer este articulo donde se explica su instalación como proxy inverso, este otro donde se brindan unos consejos de seguridad en Nginx.

Ajustes Generales de servidor Nginx

Nginx usa un número fijo de procesos, cada uno de los cuales maneja las peticiones entrantes. La regla predeterminada es que debe operar un proceso por cada CPU-core que tenga el servidor.

Por ejemplo:

grep ^processor /proc/cpuinfo | wc -l

Ejemplo de salida:
# One worker per CPU-core.
worker_processes  4;

events {
    worker_connections  8096;
    multi_accept        on;
    use                 epoll;
}

worker_rlimit_nofile 40000;

http {
    sendfile           on;
    tcp_nopush         on;
    tcp_nodelay        on;
    keepalive_timeout  15;

    # Your content here ..
}

En este ejemplo también modificamos la regla worker_connection, que especifica cuántas conexiones puede manejar cada proceso de trabajo.

La cantidad máxima de conexiones que un servidor puede procesar, es el resultado de:

  • worker_processesworker_connections(= 32384 en nuestro ejemplo).

Hemos activado el multi_accept,de manera que nginx acepte al instante tantas conexiones como le sea posible, siempre estando limitado a la configuración del socket del kernel evidentemente .

Se recomienda el uso del epoll,ofrece un rendimiento superior.

Optimizar un servidor Nginx 1/2 1

 

Compresión en servidor Nginx

Aunque es prácticamente obligatorio activar gzip, ten en cuenta que esto implica la necesidad de uso de mas recursos del servidor.

En general, lo mejor es habilitarlo solo para los archivos de gran tamaño y evitar comprimir archivos que probablemente no se reducirán (imágenes, ejecutables, binarios, etc…).

Una configuración para un servidor de alto rendimiento, podría ser:

gzip  on;
gzip_vary on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
gzip_disable "MSIE [1-6]\.";

 

Configuración real

Todos los ejemplos propuestos son para un servidor de alto rendimiento, ahora vemos una configuración completa de Nginx para un VPS, normal.

nano /etc/nginx/nginx.conf

# Server globals
user                    nginx;
worker_processes        auto;
worker_rlimit_nofile    65535;
error_log               /var/log/nginx/error.log crit;
pid                     /var/run/nginx.pid;


# Worker config
events {
        worker_connections  1024;
        use                 epoll;
        multi_accept        on;
}


http {
    # Main settings
    sendfile                        on;
    tcp_nopush                      on;
    tcp_nodelay                     on;
    client_header_timeout           1m;
    client_body_timeout             1m;
    client_header_buffer_size       2k;
    client_body_buffer_size         256k;
    client_max_body_size            256m;
    large_client_header_buffers     4   8k;
    send_timeout                    180;
    keepalive_timeout               15 15;
    reset_timedout_connection       on;
    server_tokens                   off;
    server_name_in_redirect         off;
    server_names_hash_max_size      512;
    server_names_hash_bucket_size   512;


    # Log format
    log_format  main    '$remote_addr - $remote_user [$time_local] $request '
                        '"$status" $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
    log_format  bytes   '$body_bytes_sent';
    #access_log          /var/log/nginx/access.log main;
    access_log off;


    # Mime settings
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;


    # Compression
    gzip                on;
    gzip_comp_level     9;
    gzip_min_length     512;
    gzip_buffers        8 64k;
    gzip_types          text/plain text/css text/javascript text/js text/xml application/json application/javascript application/x-javascript application/xml application/xml+rss application/x-font-ttf image/svg+xml font/opentype;
    gzip_proxied        any;
    gzip_disable        "MSIE [1-6]\.";


    # Proxy settings
    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;
    proxy_pass_header   Set-Cookie;
    proxy_connect_timeout   90;
    proxy_send_timeout  90;
    proxy_read_timeout  90;
    proxy_buffers       32 4k;


    # Cloudflare https://www.cloudflare.com/ips
    set_real_ip_from   199.27.128.0/21;
    set_real_ip_from   173.245.48.0/20;
    set_real_ip_from   103.21.244.0/22;
    set_real_ip_from   103.22.200.0/22;
    set_real_ip_from   103.31.4.0/22;
    set_real_ip_from   141.101.64.0/18;
    set_real_ip_from   108.162.192.0/18;
    set_real_ip_from   190.93.240.0/20;
    set_real_ip_from   188.114.96.0/20;  
    set_real_ip_from   197.234.240.0/22;
    set_real_ip_from   198.41.128.0/17;
    set_real_ip_from   162.158.0.0/15;
    set_real_ip_from   104.16.0.0/12;
    set_real_ip_from   172.64.0.0/13;
    #set_real_ip_from   2400:cb00::/32;
    #set_real_ip_from   2606:4700::/32;
    #set_real_ip_from   2803:f800::/32;
    #set_real_ip_from   2405:b500::/32;
    #set_real_ip_from   2405:8100::/32;
    real_ip_header     CF-Connecting-IP;


    # SSL PCI Compliance
    ssl_session_cache   shared:SSL:10m;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers        "ECDHE-RSDHE-RxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxES256-SH:DHE-RSA-AE";


    # Error pages
    error_page          403          /error/403.html;
    error_page          404          /error/404.html;
    error_page          502 503 504  /error/50x.html;


    # Cache settings
    proxy_cache_path /var/cache/nginx levels=2 keys_zone=cache:10m inactive=60m max_size=1024m;
    proxy_cache_key "$host$request_uri $cookie_user";
    proxy_temp_path  /var/cache/nginx/temp;
    proxy_ignore_headers Expires Cache-Control;
    proxy_cache_use_stale error timeout invalid_header http_502;
    proxy_cache_valid any 1d;


    # Cache bypass
    map $http_cookie $no_cache {
        default 0;
        ~SESS 1;
        ~wordpress_logged_in 1;
    }


    # File cache settings
    open_file_cache          max=10000 inactive=30s;
    open_file_cache_valid    60s;
    open_file_cache_min_uses 2;
    open_file_cache_errors   off;


    # Wildcard include
    include             /etc/nginx/conf.d/*.conf;
}

ssl_ciphers,  debes dejarlo tal como lo tienes en tu servidor.

Este articulo consta de dos partes, «aquí, tienes el siguiente«, sobre como manejar las caches con Nginx.

Agregar comentario