Difference between revisions of "Webservers/nginx"

From Ever changing code
Jump to navigation Jump to search
Line 1: Line 1:
= Nginx =
= Nginx =
== Features ==
* conditionals - <code>if</code>
* Go-To's - <code>rewrite</code>
* Case statements - <code>map</code> and <code>geo</code>
* inheritance of context configurations
== [https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms server context] match order ==
== [https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms server context] match order ==
For the <code>server {}</code> context selection nginx algorithm takes only 2 directives into account <code>listen</code> and <code>server_name</code>.
For the <code>server {}</code> context selection nginx algorithm takes only 2 directives into account <code>listen</code> and <code>server_name</code>.

Revision as of 18:57, 4 August 2020

Nginx

Features

  • conditionals - if
  • Go-To's - rewrite
  • Case statements - map and geo
  • inheritance of context configurations

server context match order

For the server {} context selection nginx algorithm takes only 2 directives into account listen and server_name. server {

   listen 80;
   server_name *.example.com;
   . . .

}


Matching listen directive

At first listen directive is parsed, during this step any "incomplete" directives are added with default values

  • no-ip -> set with 0.0.0.0
  • no-port -> set with port :80


The listen directive can be set to:

  • An IP address/port combo.
  • A lone IP address which will then listen on the default port 80.
  • A lone port which will listen to every interface on that port.
  • The path to a Unix socket


The most accurate listen directive match gets chosen.


Matching server_name directive

If there are multiple the same listen directives, then server_name is being parsed in this order:

  • exact match host header from the request
  • leading wildcard (indicated by a * at the beginning of the name in the config). If multiple matches are found, the longest match will be used to serve the request.
  • trailing wildcard (indicated by a server name ending with a * in the config). If multiple matches are found, the longest match will be used to serve the request.
  • using regular expressions (indicated by a ~ before the name). The first server_name with a regular expression that matches the “Host” header will be used to serve the request.
  • selects the default_server block for that IP address and port part of listen directive. There can be only one default_server declaration per each IP address/port combination.
  • First block, for an IP address/port combo, this will either be the first block in the configuration or the block that contains the default_server option as part of the listen directive (which would override the first-found algorithm).


server {
    listen 80 default_server;
    server_name example.com;
    . . .
}
server {
    listen 80;
    server_name ~^(subdomain|set|www|host1).*\.example\.com$;
    . . .
}
server {
    listen 80;
    server_name www.example.*;
    . . .
}
server {
    listen 80;
    server_name *.org;
    . . .
}

References