Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Was sind die Grundkonzepte von Nginx?

Was sind die Grundkonzepte von Nginx?

WBOY
WBOYnach vorne
2023-05-16 17:02:484525Durchsuche

Was sind die Grundkonzepte von Nginx?

Was ist Nginx?

Nginx wurde ursprünglich als Webserver entwickelt, um die Probleme von C10k zu lösen. Als Webserver kann er Ihre Daten mit rasender Geschwindigkeit bereitstellen. Aber Nginx ist mehr als nur ein Webserver, Sie können ihn auch als Reverse-Proxy verwenden, um ihn problemlos in langsamere Upstream-Server wie Unicorn oder Puma zu integrieren. Sie können den Datenverkehr entsprechend verteilen (Load Balancer), Medien streamen, die Größe von Bildern dynamisch ändern, Inhalte zwischenspeichern und mehr. Die grundlegende Nginx-Architektur besteht aus einem Master-Prozess und seinen Worker-Prozessen. Der Master liest die Konfigurationsdatei und verwaltet den Worker-Prozess, und der Worker verarbeitet die Anforderung tatsächlich.

Grundlegende Befehle

Um Nginx zu starten, geben Sie einfach Folgendes ein:

[sudo] nginx

Wenn Ihre Nginx-Instanz ausgeführt wird, können Sie sie verwalten, indem Sie das entsprechende Signal senden:

[sudo] nginx -s signal

Verfügbare Signale:

  • Stop – Schnelles Herunterfahren

  • Beenden – ordnungsgemäßes Herunterfahren (warten Sie, bis der Arbeitsthread abgeschlossen ist)

  • nginx Konfigurationsdatei, der Standardspeicherort umfasst:
  • /etc/nginx/nginx.conf,
  • /usr/local/etc/nginx/nginx .conf, oder

/usr/local/nginx/conf/nginx.conf

    Die Konfigurationsdatei besteht aus den folgenden Teilen:
  • /etc/nginx/nginx.conf,

  • /usr/local/etc/nginx/nginx.conf,或

  • /usr/local/nginx/conf/nginx.conf

配置文件的由下面的部分构成:

  • 指令 – 可选项,包含名称和参数,以分号结尾

gzip on;
  • 上下文 – 分块,你可以声明指令 – 类似于编程语言中的作用域

worker_processes 2; # 全局上下文指令http {              # http 上下文   gzip on;        # http 上下文中的指令 server {          # server 上下文   listen 80;      # server 上下文中的指令 }
}

指令类型

当使用相同的指令在不同的继承模型中进行操作时,必须小心谨慎。有三种类型的指令,每种都有自己的继承模型。

普通指令

在每个上下文仅有唯一值。而且,它只能在当前上下文中定义一次。在子级上下文中覆盖父级的值只在当前子级上下文中有效。

gzip on;
gzip off; # 非法,不能在同一个上下文中指定同一普通指令2次server {
 location /downloads {
   gzip off;
 }

 location /assets {
   # gzip is on here }
}

数组指令

在同一上下文中添加多条指令,将添加多个值,而不是完全覆盖。在子级上下文中定义指令将覆盖给父级上下文中的值。

error_log /var/log/nginx/error.log;
error_log /var/log/nginx/error_notive.log notice;
error_log /var/log/nginx/error_debug.log debug;

server {
 location /downloads {
   # 下面的配置会覆盖父级上下文中的指令   error_log /var/log/nginx/error_downloads.log;
 }
}

行动指令

行动是改变事情的指令。根据模块的需要,它继承的行为可能会有所不同。例如 rewrite 指令,只要是匹配的都会执行:

server {
 rewrite ^ /foobar;

 location /foobar {
   rewrite ^ /foo;
   rewrite ^ /bar;
 }
}

如果用户想尝试获取 /sample:

  • server的rewrite将会执行,从 /sample rewrite 到 /foobar

  • location /foobar 会被匹配

  • location的第一个rewrite执行,从/foobar rewrite到/foo

  • location的第二个rewrite执行,从/foo rewrite到/bar

return 指令提供的是不同的行为:

server {
 location / {
   return 200;
   return 404;
 }
}

在上述的情况下,立即返回200。

处理请求

在 Nginx 内部,你可以指定多个虚拟服务器,每个虚拟服务器用 server{} 上下文描述。

server {
 listen      *:80 default_server;
 server_name netguru.co;

 return 200 "Hello from netguru.co";
}

server {
 listen      *:80;
 server_name foo.co;

 return 200 "Hello from foo.co";
}

server {
 listen      *:81;
 server_name bar.co;

 return 200 "Hello from bar.co";
}

这将告诉 Nginx 如何处理到来的请求。在检查给定的 IP 端口组合时,Nginx 会先测试哪个虚拟主机有设置 listen 指令。

然后,server_name 指令的值将检测 Host 头(存储着主机域名)。

Nginx 将会按照下列顺序选择虚拟主机:

  1. 匹配sever_name指令的IP-端口主机

  2. 拥有default_server标记的IP-端口主机

  3. 首先定义的IP-端口主机

  4. 如果没有匹配,拒绝连接。

例如下面的例子:

Request to foo.co:80     => "Hello from foo.co"Request to www.foo.co:80 => "Hello from netguru.co"Request to bar.co:80     => "Hello from netguru.co"Request to bar.co:81     => "Hello from bar.co"Request to foo.co:81     => "Hello from bar.co"

server_name 指令

server_name指令接受多个值。它还处理通配符匹配和正则表达式。

server_name netguru.co www.netguru.co; # exact matchserver_name *.netguru.co;              # wildcard matchingserver_name netguru.*;                 # wildcard matchingserver_name  ~^[0-9]*\.netguru\.co$;   # regexp matching

当有歧义时,nginx 将使用下面的命令:

  1. 确切的名字

  2. 最长的通配符名称以星号开始,例如“* .example.org”。

  3. 最长的通配符名称以星号结尾,例如“mail.**”

  4. 首先匹配正则表达式(按照配置文件中的顺序)

Nginx将存储三个哈希表,用于存储具体名称、以星号开头的通配符和以星号结尾的通配符。如果结果不在任何表中,则将按顺序进行正则表达式测试。

值得谨记的是

server_name .netguru.co;

是一个来自下面的缩写

server_name  netguru.co  www.netguru.co  *.netguru.co;

有一点不同,.netguru.co 存储在第二张表,这意味着它比显式声明的慢一点。

listencommand&ndash ; Optional, enthält Namen und Parameter, die mit einem Semikolon enden

🎜🎜
listen 127.0.0.1:80;
listen 127.0.0.1;    # by default port :80 is usedlisten *:81;
listen 81;           # by default all ips are usedlisten [::]:80;      # IPv6 addresseslisten [::1];        # IPv6 addresses
🎜🎜🎜Kontext – In Blöcken können Sie Anweisungen deklarieren – ähnlich wie Bereiche in Programmiersprachen 🎜🎜🎜
listen unix:/var/run/nginx.sock;
🎜🎜Anweisungstypen 🎜🎜 🎜Bei der Verwendung ist Vorsicht geboten die gleiche Anweisung, um in verschiedenen Vererbungsmodellen zu arbeiten. Es gibt drei Arten von Anweisungen, jede mit ihrem eigenen Vererbungsmodell. 🎜🎜🎜Normale Anweisungen🎜🎜🎜 haben nur eindeutige Werte pro Kontext. Außerdem kann es im aktuellen Kontext nur einmal definiert werden. Das Überschreiben des Werts eines übergeordneten Elements in einem untergeordneten Kontext ist nur im aktuellen untergeordneten Kontext gültig. 🎜
listen localhost:80;
listen netguru.co:80;
🎜🎜Array-Anweisungen🎜🎜🎜 Durch das Hinzufügen mehrerer Anweisungen im selben Kontext werden mehrere Werte anstelle einer vollständigen Abdeckung hinzugefügt. Das Definieren einer Direktive in einem untergeordneten Kontext überschreibt den Wert im übergeordneten Kontext. 🎜
# /etc/nginx/nginx.confevents {}                   # events context needs to be defined to consider config validhttp {
server {
   listen 80;
   server_name  netguru.co  www.netguru.co  *.netguru.co;

   return 200 "Hello";
 }
}
🎜🎜Handlungsanweisung🎜🎜🎜Handlung ist eine Anweisung, Dinge zu ändern. Abhängig von den Anforderungen des Moduls kann das von ihm übernommene Verhalten variieren. Beispielsweise wird der Rewrite-Befehl ausgeführt, solange er übereinstimmt: 🎜
server {
 listen 80;
 server_name netguru.co;
 root /var/www/netguru.co;
}
🎜Wenn der Benutzer versuchen möchte, /sample abzurufen: 🎜🎜🎜🎜Der Rewrite-Befehl des Servers wird ausgeführt und von /sample nach /foobar🎜🎜🎜 umgeschrieben 🎜location /foobar wird mit der ersten Rewrite-Ausführung von 🎜🎜🎜🎜location, der zweiten Rewrite-Ausführung von /foobar nach /foo🎜🎜🎜🎜location und der Rewrite-Ausführung von /foo nach /bar🎜🎜🎜🎜return abgeglichen Anweisungen bieten unterschiedliche Verhaltensweisen. :🎜
netguru.co:80/index.html     # returns /var/www/netguru.co/index.htmlnetguru.co:80/foo/index.html # returns /var/www/netguru.co/foo/index.html
🎜Im obigen Fall 200 sofort zurückgeben. 🎜🎜🎜Anfragen bearbeiten🎜🎜🎜Innerhalb von Nginx können Sie mehrere virtuelle Server angeben. Jeder virtuelle Server wird mit server{}-Kontext beschrieben. 🎜
location /foo/ {
 # ...}
🎜Dadurch wird Nginx mitgeteilt, wie mit eingehenden Anfragen umzugehen ist. Bei der Überprüfung einer bestimmten IP-Port-Kombination testet Nginx zunächst, auf welchem ​​virtuellen Host die Listen-Direktive festgelegt ist. 🎜🎜Dann erkennt der Wert der server_name-Direktive den Host-Header (in dem der Host-Domänenname gespeichert ist). 🎜🎜Nginx wählt virtuelle Hosts in der folgenden Reihenfolge aus: 🎜
    🎜🎜IP-Port-Hosts, die der Sever_Name-Direktive entsprechen🎜🎜🎜🎜IP-Port-Hosts mit dem Tag „default_server“🎜🎜🎜 🎜 Definieren Sie zuerst den IP-Port-Host. 🎜🎜🎜🎜Wenn es keine Übereinstimmung gibt, verweigern Sie die Verbindung. 🎜🎜
🎜Zum Beispiel das folgende Beispiel: 🎜
/foo
/fooo
/foo123
/foo/bar/index.html
...
🎜🎜server_name-Direktive 🎜🎜🎜server_name-Direktive akzeptiert mehrere Werte. Es verarbeitet auch Wildcard-Matching und reguläre Ausdrücke. 🎜
server {
 listen 80;
 server_name netguru.co;
 root /var/www/netguru.co;

 location / {
   return 200 "root";
 }

 location /foo/ {
   return 200 "foo";
 }
}
netguru.co:80   /       # => "root"netguru.co:80   /foo    # => "foo"netguru.co:80   /foo123 # => "foo"netguru.co:80   /bar    # => "root"
🎜Bei Unklarheiten verwendet Nginx den folgenden Befehl: 🎜
    🎜🎜Genauer Name🎜🎜🎜🎜Der längste Platzhaltername beginnt mit einem Sternchen, z. B. „* .example“. .org". 🎜🎜🎜🎜Der längste Platzhaltername endet mit einem Sternchen, z. B. „mail.**“ 🎜🎜🎜🎜 Passen Sie den regulären Ausdruck zuerst an (in der Reihenfolge in der Konfigurationsdatei) 🎜🎜
🎜Nginx speichert drei A Hash-Tabelle, die bestimmte Namen, Platzhalter, die mit einem Sternchen beginnen, und Platzhalter, die mit einem Sternchen enden, speichert. Wenn das Ergebnis in keiner Tabelle enthalten ist, werden die regulären Ausdruckstests nacheinander durchgeführt. 🎜🎜Es sei daran erinnert, dass 🎜
=           - Exact match
^~          - Preferential match
~ && ~*     - Regex match
no modifier - Prefix match
🎜 eine Abkürzung von 🎜
location /match {
 return 200 'Prefix match: matches everything that starting with /match';
}

location ~* /match[0-9] {
 return 200 'Case insensitive regex match';
}

location ~ /MATCH[0-9] {
 return 200 'Case sensitive regex match';
}

location ^~ /match0 {
 return 200 'Preferential match';
}

location = /match {
 return 200 'Exact match';
}
/match/    # => 'Exact match'/match0    # => 'Preferential match'/match2    # => 'Case insensitive regex match'/MATCH1    # => 'Case sensitive regex match'/match-abc # => 'Prefix match: matches everything that starting with /match'
🎜 ist und etwas anders ist. .netguru.co wird in einer zweiten Tabelle gespeichert, was bedeutet, dass sie kleiner ist als die explizit als langsam deklarierte Tabelle runter. 🎜🎜🎜listen-Befehl🎜🎜

在很多情况下,能够找到 listen 指令,接受IP:端口值

listen 127.0.0.1:80;
listen 127.0.0.1;    # by default port :80 is usedlisten *:81;
listen 81;           # by default all ips are usedlisten [::]:80;      # IPv6 addresseslisten [::1];        # IPv6 addresses

然而,还可以指定 UNIX-domain 套接字。

listen unix:/var/run/nginx.sock;

你甚至可以使用主机名

listen localhost:80;
listen netguru.co:80;

但请慎用,由于主机可能无法启动 nginx,导致无法绑定在特定的 TCP Socket。

最后,如果指令不存在,则使用 *:80

最小化配置

有了这些知识 – 我们应该能够创建并理解运行 nginx 所需的最低配置。

# /etc/nginx/nginx.confevents {}                   # events context needs to be defined to consider config validhttp {
server {
   listen 80;
   server_name  netguru.co  www.netguru.co  *.netguru.co;

   return 200 "Hello";
 }
}

root, location, 和 try_files 指令

root 指令

root 指令设置请求的根目录,允许 nginx 将传入请求映射到文件系统。

server {
 listen 80;
 server_name netguru.co;
 root /var/www/netguru.co;
}

根据给定的请求,指定 nginx 服务器允许的内容

netguru.co:80/index.html     # returns /var/www/netguru.co/index.htmlnetguru.co:80/foo/index.html # returns /var/www/netguru.co/foo/index.html

location 指令

location指令根据请求的 URI 来设置配置。location [modifier] path

location /foo/ {
 # ...}

如果没有指定修饰符,则路径被视为前缀,其后可以跟随任何东西。

以上例子将匹配

/foo
/fooo
/foo123
/foo/bar/index.html
...

此外,在给定的上下文中可以使用多个 location 指令。

server {
 listen 80;
 server_name netguru.co;
 root /var/www/netguru.co;

 location / {
   return 200 "root";
 }

 location /foo/ {
   return 200 "foo";
 }
}
netguru.co:80   /       # => "root"netguru.co:80   /foo    # => "foo"netguru.co:80   /foo123 # => "foo"netguru.co:80   /bar    # => "root"

Nginx还有一些修饰符可以用于连接location。因为每个修饰符都有自己的优先级,所以它们会影响 location 模块在使用时的行为。

=           - Exact match
^~          - Preferential match
~ && ~*     - Regex match
no modifier - Prefix match

Nginx 会先检查精确匹配。如果找不到,我们会找优先级最高的。如果之前的匹配尝试失败,正则表达式会按照出现的顺序逐个进行测试。至少,最后一个前缀匹配将被使用。

location /match {
 return 200 'Prefix match: matches everything that starting with /match';
}

location ~* /match[0-9] {
 return 200 'Case insensitive regex match';
}

location ~ /MATCH[0-9] {
 return 200 'Case sensitive regex match';
}

location ^~ /match0 {
 return 200 'Preferential match';
}

location = /match {
 return 200 'Exact match';
}
/match/    # => 'Exact match'/match0    # => 'Preferential match'/match2    # => 'Case insensitive regex match'/MATCH1    # => 'Case sensitive regex match'/match-abc # => 'Prefix match: matches everything that starting with /match'

try_files 指令

尝试不同的路径,找到一个路径就返回。

try_files $uri index.html =404;

所以对于 /foo.html 请求,它将尝试按以下顺序返回文件:

  1. $uri ( /foo.html )

  2. index.html

  3. 如果什么都没找到则返回 404

有趣的是,如果我们在服务器上下文中定义 try_files,然后定义匹配的所有请求的 location —— try_files 将不会执行。

这是因为在服务器上下文中定义的 try_files 是它的 pseudo-location,这是最不可能的位置。因此,location/的定义将比pseudo-location更为明确。

server {
 try_files $uri /index.html =404;

 location / {
 }
}

因此,你应该避免在 server 上下文中出现 try_files:

server {
 location / {
   try_files $uri /index.html =404;
 }
}

Das obige ist der detaillierte Inhalt vonWas sind die Grundkonzepte von Nginx?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen