Tengo nginx funcionando con una aplicación Ruby / Sinatra y todo está bien. Sin embargo, ahora estoy tratando de tener una segunda aplicación ejecutándose desde el mismo servidor y noté algo extraño. Primero, aquí está mi nginx.conf:
pid /tmp/nginx.pid;
error_log /tmp/nginx.error.log;
events {
worker_connections 1024;
accept_mutex off;
}
http {
default_type application/octet-stream;
access_log /tmp/nginx.access.log combined;
sendfile on;
tcp_nopush on;
tcp_nodelay off;
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 500;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/xml text/css
text/comma-separated-values
text/javascript application/x-javascript
application/atom+xml;
upstream app {
server unix:/var/www/app/tmp/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 80;
client_max_body_size 4G;
server_name FAKE.COM;
keepalive_timeout 5;
root /var/www/app/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app;
break;
}
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /var/www/app/public;
}
}
}
68,0-1 B
Observe cómo server_name
está configurado para que FAKE.COM
el servidor responda a todos los hosts que llegan a ese servidor a través de otros nombres de dominio. ¿Cómo puedo hacer que ese servidor en particular responda solo a las solicitudes FAKE.COM
?
listen fake.com | something.com:80
comando filtra, noserver_name
.Respuestas:
El primer bloque de servidor en la configuración de nginx es el predeterminado para todas las solicitudes que llegan al servidor para el que no hay un bloque de servidor específico.
Entonces, en su configuración, suponiendo que su dominio real es REAL.COM, cuando un usuario escribe eso, se resolverá en su servidor, y dado que no hay un bloqueo de servidor para esta configuración, el bloque de servidor para FAKE.COM es el primero bloque de servidor (solo bloque de servidor en su caso) procesará esa solicitud.
Esta es la razón por la cual las configuraciones adecuadas de Nginx tienen un bloque de servidor específico para los valores predeterminados antes de seguir con otros para dominios específicos.
etc.
** EDITAR **
Parece que algunos usuarios están un poco confundidos con este ejemplo y piensan que está limitado a un solo archivo conf, etc.
Tenga en cuenta que lo anterior es un ejemplo simple para que el OP se desarrolle según sea necesario.
Personalmente utilizo archivos conf de vhost separados con esto como tal (CentOS / RHEL):
/etc/nginx/conf.d/
contendrá domain_1.conf, domain_2.conf ... domain_n.conf que se incluirá después del bloque del servidor en el archivo nginx.conf principal, que siempre será el primero y siempre será el predeterminado a menos que se anule con el servidor predeterminado directiva en otro lugar.El orden alfabético de los nombres de los archivos conf para los otros servidores se vuelve irrelevante en este caso.
Además, esta disposición ofrece mucha flexibilidad, ya que es posible definir múltiples valores predeterminados.
En mi caso específico, tengo a Apache escuchando en el puerto 8080 solo en la interfaz interna y proxy los scripts PHP y Perl a Apache.
Sin embargo, ejecuto dos aplicaciones separadas que devuelven enlaces con ": 8080" en el html de salida adjunto, ya que detectan que Apache no se está ejecutando en el puerto 80 estándar e intento "ayudarme".
Esto causa un problema porque los enlaces se vuelven inválidos ya que no se puede acceder a Apache desde la interfaz externa y los enlaces deben apuntar al Puerto 80.
Resuelvo esto creando un servidor predeterminado para el Puerto 8080 para redirigir tales solicitudes.
Como nada en los bloques de servidor normales escucha en el Puerto 8080, el bloque de servidor predeterminado de redireccionamiento maneja de manera transparente tales solicitudes en virtud de su posición en nginx.conf.
De hecho, tengo cuatro de esos bloques de servidores y este es un caso de uso simplificado.
fuente
Debe tener un servidor predeterminado para capturar todo , puede devolver
404
o mejor no responder en absoluto (ahorrará algo de ancho de banda) devolviendo,444
que es una respuesta HTTP específica de nginx que simplemente cierra la conexión y no devuelve nadafuente
server_name _;
que no tenía en versiones anteriores para nginx, pero funcionó. Ahora, para las versiones más nuevas de nginx, parece que necesita elserver_name _;
. Gracias444
, y en mi opinión, una solución mucho más limpia que devolver un código de error.No pude resolver mi problema con ninguna de las otras respuestas. Resolví el problema comprobando si el host coincidía y devolví un 403 si no era así. (Tenía un sitio web aleatorio que apuntaba al contenido de mis servidores web. Supongo que secuestraría el rango de búsqueda)
fuente
Para responder a su pregunta, nginx elige el primer servidor si no hay coincidencia. Ver documentación :
Ahora, si desea tener un servidor predeterminado que, por ejemplo, responda con 404 a todas las solicitudes, a continuación, le mostramos cómo hacerlo:
Tenga en cuenta que debe especificar el certificado / clave (que puede ser autofirmado), de lo contrario, todas las conexiones SSL fallarán, ya que nginx intentará aceptar la conexión usando este default_server y no encontrará cert / key.
fuente
server_name _;
ni siquiera es necesario.Hay pocas formas de especificar el servidor predeterminado.
Primera forma : especifique el servidor predeterminado primero en la lista, si mantiene las configuraciones de su servidor en un archivo de configuración, como Dayo mostró anteriormente.
Segunda forma (mejor) Más flexible: proporcione
default_server
parámetros para lalisten
instrucción, por ejemplo:Más información aquí: Nginx doc / Listen
De esta forma es más útil cuando mantiene las configuraciones del servidor en archivos separados y no desea nombrar alfabéticamente esos archivos.
fuente
Pequeño comentario para responder:
si tiene varios hosts virtuales en varias IP en varios archivos de configuración en sitios disponibles /, el dominio "predeterminado" para IP se tomará del primer archivo por orden alfabético.
Y, como dijo Pavel, hay un argumento de "servidor_de_determinado" para la directiva "escuchar" http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
fuente