Nginx

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Nginx and the translation is 100% complete.


nginx es un pequeño y robusto servidor web de alto rendimiento que puede actuar también como servidor proxy reverso. Es una buena alternativa a servidores populares como Apache y lighttpd.

Instalación

Antes de instalar el paquete www-servers/nginx, primero revise bien los ajustes USE para nginx.

Expansión de los ajustes USE

Nginx usa módulos para mejorar sus características. Con el propósito de simplificar el mantenimiento de esta aproximación modular, la ebuild de nginx usa ajustes USE expandidos (USE_EXPAND) a fin de establecer que módulos deben ser instalados.

  • Módulos referentes a HTTP son activados a través de la variable NGINX_MODULES_HTTP
  • Módulos referentes al Email son activados a través de la variable NGINX_MODULES_MAIL
  • Módulos de terceros son activados a través de la variable NGINX_ADD_MODULES

Estas variables pueden ser establecidas en /etc/portage/make.conf. Sus descripciónes se encuentran en /var/db/repos/gentoo/profiles/desc/nginx_modules_http.desc y /var/db/repos/gentoo/profiles/desc/nginx_modules_mail.desc.

Por ejemplo, para activar el módulo fastcgi:

ARCHIVO /etc/portage/make.conf
NGINX_MODULES_HTTP="fastcgi"

Lo anterior va a sobrescribir el valor por defecto de NGINX_MODULES_HTTP y restablecer este a fastcgi. Para activar el módulo fastcgi sin sobrescribir el valor por defecto de NGINX_MODULES_HTTP, las siguientes notaciones de ajustes USE pueden ser especificadas en /etc/portage/package.use:

ARCHIVO /etc/portage/package.use
www-servers/nginx NGINX_MODULES_HTTP: fastcgi

Ajustes USE

USE flags for www-servers/nginx Robust, small and high performance http and reverse proxy server

+http Enable HTTP core support
+http-cache Enable HTTP cache support
+http2 Enable HTTP2 module support
+pcre2 Enable support for pcre2
aio Enables file AIO support
debug Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces
http3 Enable HTTP3 module support
ktls Enable Kernel TLS offload (kTLS)
libatomic Use libatomic instead of builtin atomic operations
pcre Add support for Perl Compatible Regular Expressions
pcre-jit Enable JIT for pcre
rtmp NGINX-based Media Streaming Server
selinux !!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur
ssl Enable HTTPS module for http. Enable SSL/TLS support for POP3/IMAP/SMTP for mail.
test Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently)
threads Add threads support for various packages. Usually pthreads
vim-syntax Pulls in related vim syntax scripts

Emerge

Con los ajustes USE establecidos, puede instalar www-servers/nginx:

root #emerge --ask www-servers/nginx

Verificación de la instalación

La configuración por defecto de Nginx establece un servidor virtual con la raiz en /var/www/localhost/htdocs. Sin embargo debido al bug #449136, la ebuild de Nginx solamente va a crear el fichero /var/www/localhost sin el archivo índice. Para hacer funcionar la configuración predeterminada, cree el directorio /var/www/localhost/htdocs y un archivo índice simple:

root #mkdir /var/www/localhost/htdocs
root #echo '¡Hola mundo!' > /var/www/localhost/htdocs/index.html

El paquete de Nginx instala e inicializa la rutina del servicio, permitiendo a les administradores parar, iniciar o reiniciar el servicio. Corra el siguiente comando para iniciar el servicio Nginx:

root #/etc/init.d/nginx start

Para verificar que Nginx esta corriendo correctamente, apunte un explorador web a la dirección http://localhost o use una heramienta web de línea de comandos como curl:

user $curl http://localhost

Configuración

La configuración de Nginx es manejada a través del archivo /etc/nginx/nginx.conf.

Acceso a un solo sitio

El siguiente ejemplo muestra el acceso a un solo sitio web, sin capacidades dinámicas (como PHP).

ARCHIVO /etc/nginx/nginx.confConfiguración por defecto de Gentoo
user nginx nginx;
worker_processes 1;

error_log /var/log/nginx/error_log info;

events {
    worker_connections 1024;
    use epoll;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main
        '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $bytes_sent '
        '"$http_referer" "$http_user_agent" '
        '"$gzip_ratio"';

    client_header_timeout 10m;
    client_body_timeout 10m;
    send_timeout 10m;

    connection_pool_size 256;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 2k;
    request_pool_size 4k;

    gzip off;

    output_buffers 1 32k;
    postpone_output 1460;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    keepalive_timeout 75 20;

    ignore_invalid_headers on;

    index index.html;

    server {
        listen 127.0.0.1;
        server_name localhost;

        access_log /var/log/nginx/localhost.access_log main;
        error_log /var/log/nginx/localhost.error_log info;

        root /var/www/localhost/htdocs;
    }
}

Acceso a múltiples sitios

Es posible aprovechar la directriz include "incluir" para repartir la configuración en múltiples archivos:

ARCHIVO /etc/nginx/nginx.confConfiguración multisitio
user nginx nginx;
worker_processes 1;

error_log /var/log/nginx/error_log info;

events {
    worker_connections 1024;
    use epoll;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main
        '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $bytes_sent '
        '"$http_referer" "$http_user_agent" '
        '"$gzip_ratio"';

    client_header_timeout 10m;
    client_body_timeout 10m;
    send_timeout 10m;

    connection_pool_size 256;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 2k;
    request_pool_size 4k;

    gzip off;

    output_buffers 1 32k;
    postpone_output 1460;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    keepalive_timeout 75 20;

    ignore_invalid_headers on;

    index index.html;

    include /etc/nginx/conf.d/*.conf;
}
ARCHIVO /etc/nginx/conf.d/local.confAnfitrion simple
server {
    listen 127.0.0.1;
    server_name localhost;

    access_log /var/log/nginx/localhost.access_log main;
    error_log /var/log/nginx/localhost.error_log info;

    root /var/www/localhost/htdocs;
}
ARCHIVO /etc/nginx/conf.d/local-ssl.confAnfitrion SSL simple
server {
    listen 443 ssl;
    server_name host.tld;
    ssl_certificate /etc/ssl/nginx/host.tld.pem;
    ssl_certificate_key /etc/ssl/nginx/host.tld.key;
}

Soporte de PHP

Añada las siguientes líneas a la configuración de Nginx para habilitar el soporte de PHP. En este ejemplo Nginx se comunica con el proceso de PHP via puerto UNIX.

ARCHIVO /etc/nginx/nginx.confHabilitar soporte de PHP
...
http {
...
    server {
    ...
        location ~ \.php$ {
            # Probar rutinas no existentes arroja el error 404
            # Sin esta línea, Nginx va a enviar ciegamente cualquier petición que termine en.php a php-fpm
            try_files $uri =404;
            include /etc/nginx/fastcgi.conf;
            fastcgi_pass unix:/run/php-fpm.socket;
        }
    }
}

Para habilitar esta configuración, PHP necesita ser compilado con el Soporte de Administrador de Procesos FastCGI (dev-lang/php), el cual es invocado con el ajuste USE fpm:

root #echo "dev-lang/php fpm" >> /etc/portage/package.use

Reconstruya PHP activando el ajuste USE fpm:

root #emerge --ask dev-lang/php
Nota
La comunicación mediante un puerto UNIX es la configuración recomendada

Para PHP 7.0 Y nuevas versiones de PHP, use la siguiente configuración:

ARCHIVO /etc/php/fpm-php7.1/fpm.d/www.confCorrer PHP con soporte puerto UNIX
listen = /run/php-fpm.socket
listen.owner = nginx

Establezca la zona horaria en el archivo de php-fpm php.ini. Sustituya el texto <PONER_LA_ZONA_HORARIA_AQUÍ> en la caja de archivos de abajo con la zona horaria apropiada:

ARCHIVO /etc/php/fpm-php5.5/php.iniConfigurar la zona horaria en php.ini
date.timezone = <PONER_LA_ZONA_HORARIA_AQUÍ>

Inicialice el demonio php-fpm:

root #/etc/init.d/php-fpm start

Añada php-fpm al nivel de ejecución por defecto:

root #rc-update add php-fpm default

Vuelva a cargar nginx con la nueva configuración:

root #/etc/init.d/nginx reload

Alternativamente, para systemd:

root #systemctl enable php-fpm@7.1
root #systemctl start php-fpm@7.1

Lista de acceso a direcciones IP

El siguiente ejemplo expone como acceder a una URL particular (en este caso solo a /nginx_status):

  • ciertos anfitriones (p.ej. 192.0.2.1 127.0.0.1)
  • y direcciónes IP (p.ej. 198.51.100.0/24)
ARCHIVO /etc/nginx/nginx.confHabilitar y configurar las listas de acceso por IP para la página /nginx_status
http {
    server { 
            location /nginx_status {
                     stub_status on;
                     allow 127.0.0.1/32;
                     allow 192.0.2.1/32;
                     allow 198.51.100.0/24;
                     deny all;
             }
     }
}

Autenticación básica

Nginx permite limitar el acceso a los recursos validando el nombre de usuario y la contraseña:

ARCHIVO /etc/nginx/nginx.confHabilitar y configurar la autenticación de usuarios para la localización /
http {
    server { 
            location / {
                   auth_basic           "Authentication failed";
                   auth_basic_user_file conf/htpasswd;
             }
     }
}

El archivo htpasswd puede ser creado usando:

user $openssl passwd

Geolocación usando GeoIP2

El módulo GeoIP2 hace uso de las bases de datos GeoIP2 de Maxmind o similares. El uso de Maxmind ya es compatible con Gentoo usando net-misc/geoipupdate. Sin embargo, es necesario registrar una cuenta a fin de obtener y descargar una clave licenciada y base de datos gratuitas.

Descargar bases de datos Maxmind GeoIP2

Una vez la cuenta es creada, instale y configure geoipupdate:

root #emerge --ask net-misc/geoipupdate

Ingrese la cuenta y clave de licencia:

ARCHIVO /etc/GeoIP.confAñada su información de cuenta
AccountID YOURID
LicenseKey YOURKEY
EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country

Luego, se deben descargar las bases de datos:

root #geoipupdate

Para recibir futuras actualizaciones automáticamente, agregue este comando a un cronjob semanal o temporizador systemd.

Añada el soporte de GeoIP2 en Nginx

Para habilitar módulos y reconstruir Nginx:

ARCHIVO /etc/portage/package.use/nginxAñada los módulos a Nginx
www-servers/nginx NGINX_MODULES_HTTP: geo geoip2
Nota
El módulo geoip solamente soporta la base de datos clasica de GeoIP.

Reconstruya nginx con los módulos de terceros habilitados:

root #emerge --ask www-servers/nginx

Una vez Nginx ha sido recompilado, apuntelo a las bases de datos y variables de GeoIP2:

ARCHIVO /etc/nginx/nginx.confApuntar a las bses de datos y valores de GeoIP2
http {
...
    geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
        auto_reload 5m;
        $geoip2_metadata_city_build metadata build_epoch;
        $geoip2_data_city_name city names en;
        $geoip2_data_city_geonameid city geoname_id;
        $geoip2_data_continent_code continent code;
        $geoip2_data_continent_geonameid continent geoname_id;
        $geoip2_data_continent_name continent names en;
        $geoip2_data_country_geonameid country geoname_id;
        $geoip2_data_country_code iso_code;
        $geoip2_data_country_name names en;
        $geoip2_data_country_is_eu is_in_european_union;
        $geoip2_data_location_accuracyradius location accuracy_radius;
        $geoip2_data_location_latitude location latitude;
        $geoip2_data_location_longitude location longitude;
        $geoip2_data_location_metrocode location metro_code;
        $geoip2_data_location_timezone location time_zone;
        $geoip2_data_postal_code postal code;
        $geoip2_data_rcountry_geonameid registered_country geoname_id;
        $geoip2_data_rcountry_iso registered_country iso_code;
        $geoip2_data_rcountry_name registered_country names en;
        $geoip2_data_rcountry_is_eu registered_country is_in_european_union;
        $geoip2_data_region_geonameid subdivisions 0 geoname_id;
        $geoip2_data_region_iso subdivisions 0 iso_code;
        $geoip2_data_region_name subdivisions 0 names en;
    }

    geoip2 /usr/share/GeoIP/GeoLite2-ASN.mmdb {
        auto_reload 5m;
        $geoip2_data_autonomous_system_number autonomous_system_number;
        $geoip2_data_autonomous_system_organization autonomous_system_organization;
    }
...
}

La opción auto_reload permitirá actualizar la base de datos sin reiniciar Nginx.

Para que los valores de GeoIP2 aparezcan en la aplicación PHP, asígnelos como valores de fastcgi_param:

ARCHIVO /etc/nginx/fastcgi.confAgregue soporte de GeoIP2 a PHP
...
fastcgi_param GEOIP2_CITY_BUILD_DATE $geoip2_metadata_city_build;
fastcgi_param GEOIP2_CITY $geoip2_data_city_name;
fastcgi_param GEOIP2_CITY_GEONAMEID $geoip2_data_city_geonameid;
fastcgi_param GEOIP2_CONTINENT_CODE $geoip2_data_continent_code;
fastcgi_param GEOIP2_CONTINENT_GEONAMEID $geoip2_data_continent_geonameid;
fastcgi_param GEOIP2_CONTINENT_NAME $geoip2_data_continent_name;
fastcgi_param GEOIP2_COUNTRY_GEONAMEID $geoip2_data_country_geonameid;
fastcgi_param GEOIP2_COUNTRY_CODE $geoip2_data_country_code;
fastcgi_param GEOIP2_COUNTRY_NAME $geoip2_data_country_name;
fastcgi_param GEOIP2_COUNTRY_IN_EU $geoip2_data_country_is_eu;
fastcgi_param GEOIP2_LOCATION_ACCURACY_RADIUS $geoip2_data_location_accuracyradius;
fastcgi_param GEOIP2_LATITUDE $geoip2_data_location_latitude;
fastcgi_param GEOIP2_LONGITUDE $geoip2_data_location_longitude;
fastcgi_param GEOIP2_LOCATION_METROCODE $geoip2_data_location_metrocode;
fastcgi_param GEOIP2_LOCATION_TIMEZONE $geoip2_data_location_timezone;
fastcgi_param GEOIP2_POSTAL_CODE $geoip2_data_postal_code;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_GEONAMEID $geoip2_data_rcountry_geonameid;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_ISO $geoip2_data_rcountry_iso;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_NAME $geoip2_data_rcountry_name;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_IN_EU $geoip2_data_rcountry_is_eu;
fastcgi_param GEOIP2_REGION_GEONAMEID $geoip2_data_region_geonameid;
fastcgi_param GEOIP2_REGION $geoip2_data_region_iso;
fastcgi_param GEOIP2_REGION_NAME $geoip2_data_region_name;

fastcgi_param GEOIP2_ASN $geoip2_data_autonomous_system_number;
fastcgi_param GEOIP2_ASN_ORG $geoip2_data_autonomous_system_organization;

Módulos de terceros

Descargue el código fuente del módulo de terceros y muévalo a /usr/src. Compile manualmente el módulo Nginx seleccionado y luego agrega la siguiente línea a /etc/portage/make.conf:

ARCHIVO /etc/portage/make.confAgregar módulo de terceros
NGINX_ADD_MODULES="/usr/src/nginxmodule"

Reconstruya nginx con el módulo de terceros habilitado:

root #emerge --ask www-servers/nginx

Uso

Control del servicio

OpenRC

Iniciar el servidor web Nginx:

root #rc-service nginx start

Parar el servidor web Nginx:

root #rc-service nginx stop

Agregue Nginx al nivel de ejecución predeterminado para que el servicio inicie automáticamente al reiniciar el sistema:

root #rc-update add nginx default

Recargar la configuración de nginx sin perder conexiones:

root #rc-service nginx reload

Reiniciar el servicio nginx:

root #rc-service nginx restart

systemd

Iniciar el servidor web Nginx:

root #systemctl start nginx

Parar el servidor web Nginx:

root #systemctl stop nginx

Verificar el estado del servicio:

root #systemctl status nginx

Habilitar el servicio para que inicie automáticamente al reiniciar el sistema:

root #systemctl enable nginx

Recargar la configuración de nginx sin perder conexiones:

root #systemctl reload nginx

Reiniciar el servicio Nginx:

root #systemctl restart nginx

Resolución de problemas

Al encontrar inconvenientes, los siguientes comandos pueden ayudar a solucionar la situación.

Validar configuración

Verifique que la configuración de nginx en ejecución no tenga errores:

root #/usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Al ejecutar nginx con la opción -t, se validará el archivo de configuración sin realmente iniciar el demonio nginx. Utilice la opción -c con la ruta completa al archivo para probar los archivos de configuración en ubicaciones que no sean las predeterminadas.

Verificar que los procesos esten corriendo

Compruebe si los procesos nginx se están ejecutando:

user $ps aux | egrep 'nginx|PID'
  PID TTY      STAT   TIME COMMAND
26092 ?        Ss     0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
26093 ?        S      0:00 nginx: worker proces

Verificar las direcciones y puertos de enlace

Verifique que el demonio nginx esté escuchando en el puerto TCP correcto (como 80 para HTTP o 443 para HTTPS):

root #ss -tulpn | grep :80
tcp   LISTEN 0      0          0.0.0.0:80         0.0.0.0:*    users:(("nginx",pid=6253,fd=52),("nginx",pid=6252,fd=52))

Ver también

Recursos externos