Maison  >  Article  >  Opération et maintenance  >  Quels sont les concepts de base de Nginx

Quels sont les concepts de base de Nginx

WBOY
WBOYavant
2023-05-16 17:02:484457parcourir

Quels sont les concepts de base de Nginx

Qu'est-ce que Nginx ?

Nginx a été créé à l'origine en tant que serveur Web pour résoudre les problèmes de C10k. En tant que serveur Web, il peut servir vos données à des vitesses fulgurantes. Mais Nginx est plus qu'un simple serveur Web, vous pouvez également l'utiliser comme proxy inverse pour s'intégrer facilement à des serveurs en amont plus lents tels que Unicorn ou Puma. Vous pouvez répartir le trafic de manière appropriée (équilibreur de charge), diffuser du contenu multimédia, redimensionner dynamiquement les images, mettre en cache le contenu, etc. L'architecture de base de Nginx se compose d'un processus maître et de ses processus de travail. Le maître lit le fichier de configuration et gère le processus de travail, et le travailleur traite réellement la demande.

Commandes de base

Pour démarrer nginx, tapez simplement :

[sudo] nginx

Lorsque votre instance nginx est en cours d'exécution, vous pouvez la gérer en envoyant le signal correspondant :

[sudo] nginx -s signal

Signaux disponibles :

  • stop –

  • quitter – Arrêt progressif (attendre que le thread de travail termine le traitement)

  • recharger – Recharger le fichier de configuration

  • réouvrir –

    nginx fichier de configuration, l'emplacement par défaut inclut :

/etc/nginx/nginx.conf,

/usr/local/etc/nginx/nginx .conf, ou
  • /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 存储在第二张表,这意味着它比显式声明的慢一点。

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

🎜🎜Le fichier de configuration se compose des parties suivantes : 🎜🎜🎜🎜command&ndash ; paramètres, se terminant par un point-virgule 🎜🎜🎜
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
🎜🎜🎜Contexte - En morceaux, vous pouvez déclarer des instructions - similaires aux portées dans les langages de programmation 🎜🎜🎜
listen unix:/var/run/nginx.sock;
🎜🎜Types d'instructions 🎜🎜 🎜Il faut être prudent lors de l'utilisation la même directive pour fonctionner dans différents modèles d’héritage. Il existe trois types de directives, chacune avec son propre modèle d'héritage. 🎜🎜🎜Les directives normales🎜🎜🎜 n'ont que des valeurs uniques par contexte. De plus, il ne peut être défini qu’une seule fois dans le contexte actuel. Le remplacement de la valeur d'un parent dans un contexte enfant n'est valide que dans le contexte enfant actuel. 🎜
listen localhost:80;
listen netguru.co:80;
🎜🎜Array Directives🎜🎜🎜 L'ajout de plusieurs directives dans le même contexte ajoutera plusieurs valeurs au lieu d'une couverture complète. La définition d'une directive dans un contexte enfant remplacera la valeur dans le contexte parent. 🎜
# /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";
 }
}
🎜🎜Instructions d'action🎜🎜🎜L'action est une instruction pour changer les choses. En fonction des besoins du module, le comportement dont il hérite peut varier. Par exemple, la commande de réécriture sera exécutée tant qu'elle correspond : 🎜
server {
 listen 80;
 server_name netguru.co;
 root /var/www/netguru.co;
}
🎜Si l'utilisateur souhaite essayer d'obtenir /sample : 🎜🎜🎜🎜la réécriture du serveur sera exécutée et la réécriture de /sample vers /foobar🎜🎜🎜 🎜location /foobar correspondra à la première exécution de réécriture de 🎜🎜🎜🎜location, à la deuxième exécution de réécriture de /foobar à /foo🎜🎜🎜🎜location et à la réécriture de /foo à /bar🎜🎜🎜🎜return les instructions fournissent des comportements différents. :🎜
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
🎜Dans le cas ci-dessus, renvoyez 200 immédiatement. 🎜🎜🎜Traitement des demandes🎜🎜🎜Dans Nginx, vous pouvez spécifier plusieurs serveurs virtuels, chaque serveur virtuel est décrit avec le contexte du serveur{}. 🎜
location /foo/ {
 # ...}
🎜Cela indiquera à Nginx comment gérer les demandes entrantes. Lors de la vérification d'une combinaison de ports IP donnée, Nginx testera d'abord quel hôte virtuel a la directive d'écoute définie. 🎜🎜Ensuite, la valeur de la directive server_name détectera l'en-tête Host (qui stocke le nom de domaine hôte). 🎜🎜Nginx sélectionnera les hôtes virtuels dans l'ordre suivant : 🎜
    🎜🎜Hôtes de port IP correspondant à la directive sever_name🎜🎜🎜🎜Hôtes de port IP avec la balise default_server🎜🎜🎜 🎜 Définissez d'abord l'hôte du port IP 🎜🎜🎜🎜S'il n'y a pas de correspondance, refusez la connexion. 🎜🎜
🎜Par exemple, l'exemple suivant : la directive 🎜
/foo
/fooo
/foo123
/foo/bar/index.html
...
🎜🎜server_name 🎜🎜🎜la directive server_name accepte plusieurs valeurs. Il gère également la correspondance des caractères génériques et les expressions régulières. 🎜
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"
🎜En cas d'ambiguïté, nginx utilisera la commande suivante : 🎜
    🎜🎜Nom exact🎜🎜🎜🎜Le nom générique le plus long commence par un astérisque, par exemple "* .example. .org". 🎜🎜🎜🎜Le nom générique le plus long se termine par un astérisque, par exemple "mail.**" 🎜🎜🎜🎜 Faites d'abord correspondre l'expression régulière (dans l'ordre dans le fichier de configuration) 🎜🎜
🎜Nginx stockera trois A table de hachage qui stocke des noms spécifiques, des caractères génériques commençant par un astérisque et des caractères génériques se terminant par un astérisque. Si le résultat ne figure dans aucun tableau, les tests d'expression régulière seront effectués séquentiellement. 🎜🎜Il convient de rappeler que 🎜
=           - Exact match
^~          - Preferential match
~ && ~*     - Regex match
no modifier - Prefix match
🎜 est une abréviation de 🎜
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'
🎜 est un peu différent, .netguru.co est stocké dans une deuxième table, ce qui signifie qu'il est plus petit que celui explicitement déclaré Slow vers le bas. 🎜🎜🎜Commande écouter🎜🎜

在很多情况下,能够找到 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;
 }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer