
¿Cómo puedo configurar que un host visitante utilice una ruta raíz específica en nginx?
El visitante con IP 1.1.1.1 utilizará
root /srv/web1
todos los demás visitantes utilizarán
root /srv/web2
Respuesta1
Si bien esta pregunta se responde fácilmente simplemente investigando un poco y leyendo la documentación (preferiblemente comenzando desde elGuía para principiantesy luegoCómo nginx procesa una solicitud), lo responderé de todos modos.
Supongo que tiene un servidor con más de una interfaz de red y dirección IP, donde la dirección 1.1.1.1 se asigna a una interfaz y otras direcciones a sus respectivas interfaces.
Nginx es muy flexible en este sentido, de hecho, siempre hay un server
bloque que se usa por defecto cuando nginx no puede coincidir con ningún otro bloque del servidor server_name
: ese es el primer server
bloque del archivo o el que especifica default_server
en su listen
directiva. . Y recuerda quepuedes especificar una IP en la listen
directiva.
Eso significa, en su caso:
server {
listen 80 default_server;
root /srv/web2;
[...]
}
server {
listen 1.1.1.1:80;
root /srv/web1;
[...]
}
Como puede ver en el ejemplo anterior, el primer server
bloque escucha en todas las interfaces en el puerto 80, mientras que el segundo bloque escucha solo en la interfaz 1.1.1.1, en el puerto 80. Por lo tanto, cualquiera que visite su sitio a través de la interfaz de red 1.1.1.1 recibirá archivos de /srv/web1, independientemente del campo Host en la solicitud HTTP (es decir, el nombre de dominio escrito en la barra de URL).
Se puede obtener otro comportamiento similar poniendo la dirección IP en la server_name
directiva, así:
server {
listen 80;
server_name 1.1.1.1;
[...]
}
* Tenga en cuenta que este último server
bloque solo detecta solicitudes a la dirección IP literal y no a nombres de dominio.
Espero que esto responda a su pregunta, pero la próxima vez proporcione información adicional sobre su configuración actual e investigue un poco.
Actualizar
Para obtener el comportamiento descrito puede utilizar elgeomódulocomo se explica enesta pregunta:
geo $client {
default web2;
1.1.1.1 web1;
}
server {
[...]
root /srv/$client;
[...]
}
Esta configuración utiliza elgeomódulo para establecer una variable ( $client
) basada en la dirección IP del cliente. Esa variable se establece en el valor predeterminadoweb2o el específicoweb1y luego se sustituye en la root
directiva.
Tenga en cuenta que la geo
directiva debe estar dentro del http
bloque y no server
en bloques; El fragmento anterior debería funcionar tal cual, pero no garantizo nada ya que no lo probé.