1. Instalar nginx

1.1 Elegir la versión estable

Compilamos e instalamos nginx para personalizar nuestros propios módulos, en una máquina CentOS 6.2 x86_64. Primero instalamos los paquetes de dependencias que faltan:

# yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel

Si estos paquetes no están disponibles en yum, se puede descargar el código fuente y compilarlo para instalarlo. Solo hay que tener en cuenta el directorio de instalación predeterminado al compilar, para asegurarse de que al instalar nginx se puedan encontrar esos archivos de bibliotecas dinámicas (ldconfig).

nginx 服务器安装及配置文件详解

desdehttp://nginx.org/en/download.htmlDescargue la versión estable nginx-1.6.3.tar.gz y descomprímala en /usr/local/src.

Para preparaciones posteriores, descargamos también 2 módulos de complementos:nginx_upstream_check_module-0.3.0.tar.gz— Comprobar el estado del servidor backend,nginx-goodies-nginx-sticky-module-ng-bd312d586752.tar.gz(Se recomienda renombrar el directorio a nginx-sticky-module-ng-1.2.5 después de descomprimir en /usr/local/src) — para el backend hacerbalanceo de cargaResolver el problema de sesión sticky (para usarlo junto con el módulo upstream_check se necesita aplicar un parche adicional, consultePráctica de configuración de balanceo de carga con nginx)。

Tenga en cuenta la compatibilidad de versiones entre los complementos y nginx. Por lo general, cuanto más nuevos sean los complementos, mejor; no es necesario perseguir las últimas versiones de nginx, la estabilidad es lo primero. La combinación nginx-1.4.7, nginx-sticky-module-1.1 y nginx_upstream_check_module-0.2.0 tampoco presenta problemas. sticky-1.1 con nginx-1.6 dio errores de compilación porque las actualizaciones no siguieron el ritmo. (Se puede usar directamente Tengine, que incluye estos módulos por defecto).

[root@cachets nginx-1.6.3]# pwd
/usr/local/src/nginx-1.6.3
[root@cachets nginx-1.6.3]# ./configure --prefix=/usr/local/nginx-1.6 --with-pcre /
> --with-http_stub_status_module --with-http_ssl_module /
> --with-http_gzip_static_module --with-http_realip_module /
> --add-module=../nginx_upstream_check_module-0.3.0
[root@cachets nginx-1.6.3]# make && make install

1.2 Explicación de las opciones de compilación comunes

La mayoría de los módulos comunes de nginx se instalan por defecto al compilar; los que comienzan con --without en ./configure --help están instalados por defecto.

  • --prefix=PATH: especifica el directorio de instalación de nginx. Por defecto /usr/local/nginx
  • --conf-path=PATH: establece la ruta del archivo de configuración nginx.conf. nginx permite iniciar con diferentes archivos de configuración mediante la opción -c en la línea de comandos. Por defecto esprefix/conf/nginx.conf
  • --user=name: establece el usuario de los procesos de trabajo de nginx. Después de la instalación, se puede cambiar la directiva user en cualquier momento en el archivo de configuración nginx.conf. El nombre de usuario predeterminado es nobody. --group=name es similar.
  • --with-pcre: establece la ruta del código fuente de la biblioteca PCRE. Si ya se instaló mediante yum, use --with-pcre para encontrar automáticamente los archivos de la biblioteca. Al usar --with-pcre=PATH, debe descargar el código fuente de la biblioteca pcre (versiones 4.4 – 8.30) desde el sitio web de PCRE y descomprimirlo; el resto lo completan ./configure y make de Nginx. Las expresiones regulares Perl se usan en la directiva location y en el módulo ngx_http_rewrite_module.
  • --with-zlib=PATH: especifica el directorio de descompresión del código fuente de zlib (versiones 1.1.3 – 1.2.5). Se necesita zlib cuando se usa el módulo de compresión de transferencia de red ngx_http_gzip_module, que está habilitado por defecto.
  • --with-http_ssl_module: módulo para usar el protocolo https. De forma predeterminada, este módulo no se construye. El requisito previo es que openssl y openssl-devel estén instalados.
  • --with-http_stub_status_module: se usa para monitorear el estado actual de Nginx
  • --with-http_realip_module: este módulo nos permite cambiar el valor de la dirección IP del cliente en los encabezados de solicitud del cliente (por ejemplo, X-Real-IP o X-Forwarded-For). Su importancia radica en que permite que los servidores backend registren la dirección IP original del cliente.
  • --add-module=PATH: agrega módulos externos de terceros, como nginx-sticky-module-ng o módulos de caché. Cada vez que se agrega un nuevo módulo, es necesario recompilar (Tengine no requiere recompilar al añadir un módulo nuevo).

A continuación se ofrece otra opción de compilación:

./configure /
> --prefix=/usr /
> --sbin-path=/usr/sbin/nginx /
> --conf-path=/etc/nginx/nginx.conf /
> --error-log-path=/var/log/nginx/error.log /
> --http-log-path=/var/log/nginx/access.log /
> --pid-path=/var/run/nginx/nginx.pid  /
> --lock-path=/var/lock/nginx.lock /   
> --user=nginx /
> --group=nginx /
> --with-http_ssl_module /
> --with-http_stub_status_module /
> --with-http_gzip_static_module /
> --http-client-body-temp-path=/var/tmp/nginx/client/ /
> --http-proxy-temp-path=/var/tmp/nginx/proxy/ /
> --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ /
> --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi /
> --with-pcre=../pcre-7.8
> --with-zlib=../zlib-1.2.3

1.3 Iniciar y detener nginx

## 检查配置文件是否正确
# /usr/local/nginx-1.6/sbin/nginx -t 
# ./sbin/nginx -V     # 可以看到编译选项
## 启动、关闭
# ./sbin/nginx        # 默认配置文件 conf/nginx.conf,-c 指定
# ./sbin/nginx -s stop
o  pkill nginx
## 重启,不会改变启动时指定的配置文件
# ./sbin/nginx -s reload
o  kill -HUP `cat /usr/local/nginx-1.6/logs/nginx.pid`

Por supuesto, también se puede gestionar nginx como un servicio del sistema: descargue nginx a /etc/init.d/, modifique las rutas dentro y luego otorgue permisos de ejecución.

# service nginx {start|stop|status|restart|reload|configtest}

1.4 Instalación con yum

Instalar el paquete rpm con yum es mucho más sencillo que compilar e instalar. Por defecto se instalan muchos módulos, pero la desventaja es que si más adelante desea instalar módulos de terceros, no hay forma de hacerlo.

# vi /etc/yum.repo.d/nginx.repo 
[nginx] 
name=nginx repo 
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ 
gpgcheck=0 
enabled=1

El resto se resuelve con yum install nginx; también se puede usar yum install nginx-1.6.3 para instalar una versión específica (siempre que vea que hay una versión correspondiente en packages; por defecto se instala la última versión estable).

2. Archivo de configuración nginx.conf

El archivo de configuración de Nginx se divide principalmente en cuatro partes: main (configuración global), server (configuración del host), upstream (configuración de servidores upstream, principalmente relacionada con proxy inverso y balanceo de carga) y location (configuración después de que la URL coincida con una ubicación específica). Cada parte contiene varias directivas. Las directivas establecidas en la parte main afectan a la configuración de todas las demás partes; las directivas de la parte server se usan principalmente para especificar el dominio, la IP y el puerto del host virtual; las directivas de upstream se usan para configurar una serie de servidores backend, establecer el proxy inverso y el balanceo de carga de los servidores backend; la parte location se usa para hacer coincidir las ubicaciones de la página web (por ejemplo, el directorio raíz "/", "/images", etc.). La relación entre ellos es: server hereda de main, location hereda de server; upstream no hereda directivas ni es heredado. Tiene sus propias directivas especiales y no necesita aplicarse en otros lugares.

Varios contextos de directivas compatibles actualmente con nginx:

2.1 General

El siguiente nginx.conf es un ejemplo simple de nginx actuando como servidor de proxy inverso en el frontend, manejando archivos estáticos como js, png, y reenviando solicitudes dinámicas como jsp a otros servidores tomcat:

user  www www;
worker_processes  2;
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    use epoll;
    worker_connections  2048;
}
http {
    include       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  logs/access.log  main;
    sendfile        on;
    # tcp_nopush     on;
    keepalive_timeout  65;
  # gzip压缩功能设置
    gzip on;
    gzip_min_length 1k;
    gzip_buffers    4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 6;
    gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;

  # http_proxy 设置
    client_max_body_size   10m;
    client_body_buffer_size   128k;
    proxy_connect_timeout   75;
    proxy_send_timeout   75;
    proxy_read_timeout   75;
    proxy_buffer_size   4k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size   64k;
    proxy_temp_file_write_size  64k;
    proxy_temp_path   /usr/local/nginx/proxy_temp 1 2;
  # 设定负载均衡后台服务器列表 
    upstream  backend  { 
              #ip_hash; 
              server   192.168.10.100:8080 max_fails=2 fail_timeout=30s ;  
              server   192.168.10.101:8080 max_fails=2 fail_timeout=30s ;  
    }
  # 很重要的虚拟主机配置
    server {
        listen       80;
        server_name  itoatest.example.com;
        root   /apps/oaapp;
        charset utf-8;
        access_log  logs/host.access.log  main;
        #对 / 所有做负载均衡+反向代理
        location / {
            root   /apps/oaapp;
            index  index.jsp index.html index.htm;
            proxy_pass        http://backend;  
            proxy_redirect off;
            # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

        }
        #静态文件,nginx自己处理,不去backend请求tomcat
        location  ~* /download/ {  
            root /apps/oa/fs;  

        }
        location ~ .*/.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$   
        {   
            root /apps/oaapp;   
            expires      7d; 
        }
           location /nginx_status {
            stub_status on;
            access_log off;
            allow 192.168.10.0/24;
            deny all;
        }
        location ~ ^/(WEB-INF)/ {   
            deny all;   
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
  ## 其它虚拟主机,server 指令开始
}

2.2 Explicación de las directivas comunes

2.2.1 Configuración global main

nginx tiene algunos parámetros en tiempo de ejecución que no están relacionados con funciones comerciales específicas (como el servicio http o el proxy de servicio de correo electrónico), por ejemplo, el número de procesos de trabajo, la identidad de ejecución, etc.

  • woker_processes 2
    En el nivel superior del archivo de configuraciónmainparte, el número de procesos de trabajo con rol de worker. El proceso master recibe y asigna las solicitudes a los workers para que las procesen. Este valor se puede establecer simplemente como el número de núcleos de CPU: grep ^processor /proc/cpuinfo | wc -l; también es el valor de auto. Si ssl y gzip están habilitados, es mejor establecerlo igual al número de CPU lógicas o incluso al doble, para reducir las operaciones de E/S. Si el servidor nginx también tiene otros servicios, se puede considerar reducir apropiadamente.
  • worker_cpu_affinity
    También se escribe enmainparte. En situaciones de alta concurrencia, configurando la afinidad de CPU se reduce la pérdida de rendimiento causada por la reconstrucción de contexto, como los registros, debido al cambio entre múltiples núcleos de CPU. Por ejemplo: worker_cpu_affinity 0001 0010 0100 1000; (cuatro núcleos).
  • worker_connections 2048
    Se escribe eneventsparte. El número máximo de conexiones que cada proceso worker puede manejar (iniciar) de forma concurrente (incluye todas las conexiones con el cliente o con los servidores proxy del backend). Cuando nginx actúa como servidor de proxy inverso, la fórmula de cálculo es: número máximo de conexiones = worker_processes * worker_connections / 4, por lo que aquí el número máximo de conexiones del cliente es 1024. Se puede aumentar incluso a 8192 sin problema, dependiendo de la situación, pero no debe superar el worker_rlimit_nofile mencionado más adelante. Cuando nginx actúa como servidor http, la fórmula se divide entre 2.
  • worker_rlimit_nofile 10240
    Se escribe enmainparte. Por defecto no está establecido; se puede limitar al máximo del sistema operativo, 65535.
  • use epoll
    Se escribe en la parte events. En el sistema operativo Linux, nginx usa por defecto el modelo de eventos epoll; gracias a esto, nginx es bastante eficiente en Linux. Además, Nginx utiliza el modelo de eventos eficiente kqueue, similar a epoll, en sistemas operativos OpenBSD o FreeBSD. Solo cuando el sistema operativo no admite estos modelos eficientes se utiliza select.

2.2.2 Servidor http

Algunos parámetros de configuración relacionados con la prestación del servicio http. Por ejemplo: si usar keepalive, si usar gzip para comprimir, etc.

  • sendfile on
    Activa el modo de transferencia de archivos de alta eficiencia. La directiva sendfile especifica si nginx llama a la función sendfile para enviar archivos, reduciendo los cambios de contexto del espacio de usuario al espacio del kernel. Para aplicaciones normales, se establece en on; si se usa para aplicaciones con carga pesada de E/S de disco, como descargas, se puede establecer en off para equilibrar la velocidad de procesamiento de E/S entre disco y red y reducir la carga del sistema.
  • keepalive_timeout 65: tiempo de espera de conexión persistente, en segundos. Este parámetro es muy sensible; se relaciona con el tipo de navegador, la configuración de tiempo de espera del servidor backend y la configuración del sistema operativo, y daría para otro artículo. Cuando se solicitan muchos archivos pequeños mediante conexiones persistentes, se puede reducir el coste de restablecer conexiones, pero si hay carga de archivos grandes y no se completa en 65 s, fallará. Si el tiempo se establece demasiado largo y hay muchos usuarios, mantener las conexiones durante mucho tiempo consumirá una gran cantidad de recursos.
  • send_timeout: se utiliza para especificar el tiempo de espera para responder al cliente. Este tiempo de espera se limita al tiempo entre dos actividades de conexión; si transcurre ese tiempo sin que el cliente tenga ninguna actividad, Nginx cerrará la conexión.
  • client_max_body_size 10m
    Permite el número máximo de bytes de un solo archivo solicitado por el cliente. Si hay que subir archivos grandes, establezca su valor límite.
  • client_body_buffer_size 128k
    El número máximo de bytes que el búfer del proxy utiliza para almacenar en búfer las solicitudes del cliente.
Módulo http_proxy:

Este módulo implementa la función de nginx como servidor proxy inverso, incluyendo la función de caché (ver tambiénel artículo)

  • proxy_connect_timeout 60
    Tiempo de espera de conexión entre nginx y el servidor backend (tiempo de espera de conexión del proxy)
  • proxy_read_timeout 60
    Después de una conexión exitosa, el tiempo de espera entre dos operaciones de respuesta exitosas con el servidor backend (tiempo de espera de recepción del proxy)
  • proxy_buffer_size 4k
    Configura, para que el servidor proxy (nginx) lea y guarde desde el realserver backend, elCabezatamaño del búfer de la información del usuario; el valor predeterminado es el mismo que el tamaño de proxy_buffers; de hecho, este valor de directiva se puede establecer un poco más pequeño.
  • proxy_buffers 4 32k
    El búfer proxy_buffers: nginx, para una única conexión, almacena en caché lasrespuestas del realserver backend; si las páginas web tienen un tamaño promedio inferior a 32k, se configura así.
  • proxy_busy_buffers_size 64k
    Tamaño del búfer en condiciones de alta carga (proxy_buffers*2)
  • proxy_max_temp_file_size
    Cuando proxy_buffers no puede contener el contenido de la respuesta del servidor backend, una parte se guardará en un archivo temporal en el disco duro. Este valor se utiliza para establecer el tamaño máximo del archivo temporal; el valor predeterminado es 1024M, y no tiene relación con proxy_cache. Si supera este valor, se transmitirá desde el servidor upstream. Establecerlo en 0 lo desactiva.
  • proxy_temp_file_write_size 64k
    Cuando la respuesta del servidor proxyado se almacena en caché en un archivo temporal, esta opción limita el tamaño de cada escritura en el archivo temporal. proxy_temp_path (se puede especificar en tiempo de compilación) indica en qué directorio se escribe.

proxy_pass y proxy_redirect, consulte la sección location.

Módulo http_gzip:
  • gzip on: activa la salida de compresión gzip para reducir la transmisión de red.
    • gzip_min_length 1k: establece el número mínimo de bytes de página permitidos para la compresión; el número de bytes de la página se obtiene del content-length del encabezado. El valor predeterminado es 20. Se recomienda establecer un valor mayor que 1k; con menos de 1k, es posible que al comprimir quede más grande.
    • gzip_buffers 4 16k: establece cuántas unidades de caché obtiene el sistema para almacenar el flujo de datos de los resultados de compresión gzip. 4 16k significa que se toma 16k como unidad y se solicita memoria según 4 veces el tamaño de los datos originales en unidades de 16k.
    • gzip_http_version 1.0: se utiliza para identificar la versión del protocolo http. Los navegadores antiguos no soportaban la compresión Gzip, por lo que los usuarios veían caracteres confusos; por eso se añadió esta opción para soportar versiones anteriores. Si utiliza el proxy inverso de Nginx y desea habilitar también la compresión Gzip, dado que la comunicación del extremo final es http/1.0, configúrelo como 1.0.
    • gzip_comp_level 6: nivel de compresión gzip; 1 tiene el menor nivel de compresión y la velocidad de procesamiento más rápida; 9 tiene el mayor nivel de compresión pero la velocidad de procesamiento más lenta (transmisión rápida pero consume bastante CPU).
    • gzip_types: comprime según el tipo MIME. Independientemente de si se especifica o no, el tipo "text/html" siempre se comprimirá.
    • gzip_proxied any: se habilita cuando Nginx actúa como proxy inverso; decide si se comprime o no el resultado devuelto por el servidor backend. La premisa para que coincida es que el servidor backend debe devolver un encabezado que contenga "Via".
    • gzip_vary on: está relacionado con el encabezado http; añade un encabezado Vary: Accept-Encoding a la respuesta, lo que permite que el servidor de caché del frontend almacene en caché las páginas comprimidas con gzip. Por ejemplo, usar Squid para almacenar en caché los datos comprimidos por Nginx.

2.2.3 Host virtual (server)

El servicio http admite varios hosts virtuales. Cada host virtual tiene un elemento de configuración server correspondiente, que contiene la configuración relacionada con ese host virtual. Al proporcionar servicios de proxy de correo, también se pueden crear varios server. Cada server se distingue por su dirección de escucha o puerto.

  • listen
    Puerto de escucha, por defecto 80; los menores de 1024 deben iniciarse como root. Puede adoptar formas como listen *:80, listen 127.0.0.1:80, etc.
  • server_name
    Nombre del servidor, como localhost, www.example.com; se puede hacer coincidir mediante expresiones regulares.
Módulo http_stream

Este módulo implementa el equilibrio de carga de las IP de los clientes hacia los servidores backend mediante un algoritmo de programación simple. Después de upstream se coloca el nombre del balanceador de carga; los realservers backend se organizan en {} en el formato host:port options;. Si solo hay un servidor backend al que se hace proxy, también se puede escribir directamente en proxy_pass.

2.2.4 location

En el servicio http, una serie de elementos de configuración que corresponden a ciertas URL específicas.

  • root /var/www/html
    Define la ubicación del directorio raíz web predeterminado del servidor. Si la URL de location coincide con un subdirectorio o archivo, root no tiene mucho efecto; generalmente se coloca dentro de la directiva server o bajo /.
  • index index.jsp index.html index.htm
    Define el nombre de archivo de acceso predeterminado en una ruta; generalmente se coloca junto con root.
  • proxy_pass http:/backend
    Redirige la solicitud a la lista de servidores definida por backend, es decir, el proxy inverso, correspondiente al balanceador de carga upstream. También se puede usar proxy_pass http://ip:port.
  • 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;
    Estos cuatro, por ahora, se configuran así; si se profundiza, cada uno involucra contenido muy complejo, que también se explicará en otro artículo.

En cuanto a la escritura de las reglas de coincidencia de location, se puede decir que es especialmente crítica y básica; consulte el artículoResumen de la configuración de location en nginx y escritura de reglas rewrite;

2.3 Otros

2.3.1 Control de acceso allow/deny

El módulo de control de acceso de Nginx se instala por defecto y su sintaxis es muy simple. Puede haber varios allow y deny para permitir o denegar el acceso de una IP o rango de IP; en cuanto se cumple cualquiera de las reglas, se detiene la coincidencia. Por ejemplo:

location /nginx-status {
  stub_status on;
  access_log off;
#  auth_basic   "NginxStatus";
#  auth_basic_user_file   /usr/local/nginx-1.6/htpasswd;
  allow 192.168.10.100;
  allow 172.29.73.0/24;
  deny all;
}

También solemos usar htpasswd de la herramienta httpd-devel para establecer una contraseña de inicio de sesión para las rutas de acceso:

# htpasswd -c htpasswd admin
New passwd:
Re-type new password:
Adding password for user admin
# htpasswd htpasswd admin    //修改admin密码
# htpasswd htpasswd sean    //多添加一个认证用户

Así se genera un archivo de contraseñas cifrado con CRYPT por defecto. Descomente las dos líneas de comentario de nginx-status mencionadas arriba y reinicie nginx para que surta efecto.

2.3.2 Listado de directorios autoindex

Nginx no permite listar el directorio completo por defecto. Si se necesita esta función, abra el archivo nginx.conf y añada autoindex on; en la sección location, server o http; también es recomendable añadir los otros dos parámetros:

  • autoindex_exact_size off; por defecto es on, y muestra el tamaño exacto del archivo en bytes. Al cambiarlo a off, muestra el tamaño aproximado del archivo en kB, MB o GB.
  • autoindex_localtime on;
    El valor predeterminado es off y la hora del archivo mostrada es la hora GMT. Al cambiarlo a on, la hora del archivo mostrada es la hora del servidor del archivo.
location /images {
  root   /var/www/nginx-default/images;
  autoindex on;
  autoindex_exact_size off;
  autoindex_localtime on;
}

Referencias