Nginx
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
:
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:
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).
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:
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;
}
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;
}
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.
...
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
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:
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:
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)
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:
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:
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:
www-servers/nginx NGINX_MODULES_HTTP: geo geoip2
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:
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
:
...
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:
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
- Apache — un servidor Web eficiente y extensible. Es uno de los servidores Web más populares usados en Internet.
- Lighttpd — a fast and lightweight web server.
Recursos externos
- https://nginx.org/en/docs/beginners_guide.html - Una guía de nginx para principiantes. De ayuda para quéllos que apenas conocen nginx.
- https://nginx.com/resources/admin-guide/ - La guía de administración de ngnix. Ayuda para administradores web que trabajan en este área.
- http://wiki.nginx.org/Main - El wiki de nginx.
- https://github.com/h5bp/server-configs-nginx - Configuración H5BP de nginx.