常见的 Nginx 语法错误

简介

NGINX是一种流行的Web服务器,可以托管互联网上许多大型和高流量的站点。在设置Nginx Web服务器时,您通常会创建一个带有配置详细信息的域块,以确保您的站点可以处理传入的请求。设置Nginx时的一个常见错误涉及配置文件中的语法,并确保它有效。

本指南中的示例是在Ubuntu 22.04服务器上测试的,但应该适用于大多数Nginx安装,因为它主要在标准化配置文件中进行处理。目录和路径可能略有不同。

在本教程中,您将了解Nginx配置文件中可能出现的语法错误、如何检查错误以及如何更正错误。

查看您的Nginx错误日志

本教程中提供的错误和解决方案是常见情况,但不是详尽的。由于语法错误破坏了Nginx认可的有效语句的结构,因此以下错误仅是Nginx如何响应的指导原则。通常,一个错误可以级联到另一个错误中,错误可能是更大或独立问题的症状。您的具体情况和设置可能会有所不同。

请注意,您可以随时参考Nginx错误日志来查看运行列表:

1sudo cat /var/log/nginx/error.log

本教程稍后将介绍如何分解和理解Nginx错误消息的各个部分。

测试配置文件中的错误

出于本教程的目的,我们将参考一个在配置文件中出现各种错误的Nginx域块示例。这些错误旨在演示如何更正它们。通常,要验证是否存在任何语法错误,可以运行以下命令:

1sudo nginx -t

如果没有错误,您的输出将返回以下消息:

1nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
2nginx: configuration file /etc/nginx/nginx.conf test is successful

如果出现错误,您将收到一条消息,指明发生错误的确切文件和代码行,以及需要解决的特定语法问题。

识别Nginx配置文件中的结构语法错误--分号、花括号和参数

使用Nginx时可能遇到的常见错误之一与缺少字符或不正确的语法结构有关。Nginx的配置文件主要围绕_指令_,并且这些指令必须以特定的方式声明。否则,您的配置文件将在结构上无效。

指令可以分为两种不同的类型,每种类型都有特定的语法。可以有包含指令名称和参数的简单指令,并以分号结尾。也可以有类似于单个指令的_BLOCK指令,但它们由大括号{}分隔,甚至可以包含其中的其他块。

当指令的结构不正确时,Nginx将无法将其识别为您想要的指令,并可能导致以下错误。

Nginx的参数无效错误

当涉及到正确的结构和语法时,Nginx配置文件是非常特殊的。事实上,您的语法可能出现的一个问题与分号有关。例如,考虑以下错误消息:

1[emerg] invalid parameter "root" in /etc/nginx/sites-enabled/example.com:5
2nginx: configuration file /etc/nginx/nginx.conf test failed

在解决本例中的问题之前,您应该了解Nginx的错误消息的组成部分。错误消息中有某些提示有助于确定错误原因。在本例中,[Emerg]代表紧急,代表与您的系统不稳定有关的错误消息。在这种情况下,这意味着Nginx遇到了一个阻碍其工作的问题。

此错误消息进一步标识了可以找到此错误的位置。请记住,在Nginx设置中,您将有一个符号链接到/etc/nginx/nginx.conf的自定义配置文件。例如,如果你按照我们的指南[如何在Ubuntu22.04上安装ngix],步骤5 ](https://andsky.com/tech/tutorials/how-to-install-nginx-on-ubuntu-22-04# step-5-setting-up-server-blocks-recommended)具体演示了这一点。配置文件中出现错误的确切行如下:/etc/nginx/ites-Enabled/Example.com:5。您还了解到该文件中有一个无效参数根``。

现在您已经掌握了在哪里查找错误的信息,您可以继续并使用首选的文本编辑器打开该文件。这里,我们将使用nan

<$>[备注] 注意: 如果您不确定,通常可以在/etc/nginx/目录中找到所有配置文件。在我们的教程中阅读更多关于其他重要的ngix文件和directories的了解。 <$>

1sudo nano /etc/nginx/sites-available/example.com

进入后,找到错误消息所指的行`5‘。该行在以下内容中突出显示:

 1[label /etc/nginx/sites-available/example.com]
 2server {
 3        listen 80;
 4        listen [::]:80;
 5
 6       root /var/www/example.com/html
 7        index index.html index.htm index.nginx-debian.html;
 8
 9        server_name example.com www.example.com;
10
11        location / {
12                try_files $uri $uri/ =404;
13        }
14}

现在,这里发生的错误可能并不明显。如果您从错误消息中回想起来,会发现其中有一个参数无效。需要提醒的是,参数是您提供给Nginx指令的参数。/var/www/example.com/html是本场景中提供的参数,但该参数无效。语法结构中缺少一个字符,在本例中,行尾缺少分号。

您可能注意到,该文件中的许多其他行也以分号结尾。当一行包含指令时,任何时候都必须使用分号。这个特定的例子是root指令,它指定在搜索文件时将使用的根目录。拥有这个根指令对于Nginx能够找到特定的URL路径是必要的。我们将在后面的部分讨论指令的重要性。

简而言之,您可以通过在该行的末尾添加分号来修复此错误,以确保指令有效。您的更新如下:

1[label /etc/nginx/sites-available/example.com]
23
4       root /var/www/example.com/html;
5        index index.html index.htm index.nginx-debian.html;
6
7

完成更新后,保存并关闭文件。如果你使用的是nano,你可以通过按CTRL + X,然后按YENTER来实现。

您可以通过运行sudo nginx-t命令来验证您的语法错误是否已修复。

Nginx的意外}``错误

Nginx语法结构可能发生的另一个常见错误是花括号{ }。与没有指定如何更正无效参数的上一个错误不同,此错误显式提供了错误的原因:

1nginx: [emerg] unexpected "}" in /etc/nginx/sites-enabled/example.com:15
2nginx: configuration file /etc/nginx/nginx.conf test failed

此错误消息是另一种[Emerg]类型,并在第15行指示与前面相同的配置文件中有意外的大括号。使用您首选的文本编辑器打开此文件,其内容如下:

 1[label /etc/nginx/sites-available/example.com]
 2server {
 3        listen 80;
 4        listen [::]:80;
 5
 6       root /var/www/example.com/html;
 7        index index.html index.htm index.nginx-debian.html;
 8
 9        server_name example.com www.example.com;
10
11        location / {
12                try_files $uri $uri/ =404;
13       }

此文件末尾突出显示的是花括号}。乍一看,可能不清楚问题是什么,因为似乎存在意想不到的‘}’。仔细检查,实际上在那个花括号之后有一个缺失的花括号。在Nginx配置文件中,适当数量的大括号很重要,因为它指示特定块的打开和关闭。如果聚焦,您会发现文件末尾的大括号实际上是下面嵌套的Location`块的右大括号:

1[label /etc/nginx/sites-available/example.com]
23
4 location / {
5                try_files $uri $uri/ =404;
6       }
7
8

如果您进一步查看配置文件的内容,就会发现缺少右大括号的是server块。Nginx_SERVER BLOCK_很重要,因为它提供了配置细节,让Nginx能够识别哪个虚拟服务器将处理它收到的各种请求。需要注意的是,位置块嵌套在服务器块中,因为服务器块优先处理传入的请求。考虑到这一切,您可以在文件末尾添加右大括号来完成服务器块。该文件的内容现在如下所示:

 1[label /etc/nginx/sites-available/example.com]
 2server {
 3        listen 80;
 4        listen [::]:80;
 5
 6        root /var/www/example.com/html;
 7        index index.html index.htm index.nginx-debian.html;
 8
 9        server_name example.com www.example.com;
10
11        location / {
12                try_files $uri $uri/ =404;
13        }
14}

记住完成后保存并关闭该文件。运行sudo nginx-t确认此语法错误已解决。

Nginx的非法主机错误

下一个错误与前两个错误不同,因为该错误源于提供给指令的格式错误的参数。虽然以分号结束行,并用}结束每个花括号{]来处理配置文件的整体结构,但参数是自定义输入,可以根据设置的需要而变化。

应该注意的是,在这种情况下,host是受影响的指令,但任何指令都可能受到此错误的影响,因为提供了无效的参数。错误消息将相应更改。提供有效的参数可确保您避免类似以下情况的错误:

1[emerg] invalid host in "[::]80" of the "listen" directive in /etc/nginx/sites-enabled/example.com:3
2nginx: configuration file /etc/nginx/nginx.conf test failed

本例中的紧急错误说明为您的主机设置的端口80‘指令无效。此错误消息进一步标识了可以找到此错误的位置以及配置文件中的确切行:/etc/nginx/ites-Enabled/Example.com:3。现在您已经掌握了在哪里查找错误的信息,您可以继续并使用首选的文本编辑器打开该文件。进入后,找到错误消息所指的行3‘。该行在以下内容中突出显示:

 1[label /etc/nginx/sites-available/example.com]
 2server {
 3        listen 80;
 4        listen [::]80;
 5
 6        root /var/www/example.com/html;
 7        index index.html index.htm index.nginx-debian.html;
 8
 9        server_name example.com www.example.com;
10
11        location / {
12                try_files $uri $uri/ =404;
13        }
14}

方括号中的两个冒号表示IPv6表示法,即0.0.0.0,如果方括号后面没有额外的冒号,则无法绑定到端口80。因此,listen指令将不起作用,因为如果没有冒号,就不清楚您希望服务器监听哪个端口。

简而言之,这里发生的具体语法错误是方括号[::]后面缺少冒号,使参数本身无效。添加缺少的冒号后,文件中的代码片段将如下所示:

1[label /etc/nginx/sites-available/example.com]
2server {
3        listen 80;
4        listen [::]:80;
5

更新此行后,请确保保存并关闭文件,然后运行sudo nginx-t验证此语法错误是否已更正。

总体而言,当收到这些与参数、分号或花括号{}相关的语法错误时,建议您密切关注[Emerg]消息中提供的确切位置和详细信息。

识别Nginx配置文件中的指令误用关键字

除了缺少冒号或大括号可能导致的语法错误外,还可能出现错误,例如与配置文件中的指令关联的关键字拼写错误。我们在上一节中简要地提到了指令,但在这里让我们重新讨论它们。

Nginx的未知指令错误

如前所述,Nginx配置文件的基础是建立在指令上的。Nginx有plethora of directives可供选择,但在配置文件中需要一些主要的指令。但是,指令本身可能会发生错误,特别是如果关键字没有完全按照它应该的那样编写。以下是您可能收到的错误消息的示例:

1nginx: [emerg] unknown directive "serve_name" in /etc/nginx/sites-enabled/example.com:8
2nginx: configuration file /etc/nginx/nginx.conf test failed

此错误标识配置文件中第8行的未知指令Serve_name。当您使用首选文本编辑器打开配置文件时,您的内容将列出以下内容:

 1[label /etc/nginx/sites-available/example.com]
 2server {
 3        listen 80;
 4        listen [::]:80;
 5
 6        root /var/www/example.com/html;
 7        index index.html index.htm index.nginx-debian.html;
 8
 9        serve_name example.com www.example.com;
10
11        location / {
12                try_files $uri $uri/ =404;
13        }
14}

在本例中,触发的错误是由于server_name指令中的server拼写错误造成的。在这种情况下,缺少一个r,因此,这个单一的指令无法识别。这是一个严重的错误,因为server_name指令提供了特定的服务器名称,服务器块在收到请求时将引用该名称。如果此指令没有正确运行,则无法完成请求。这可能是一个看起来很小的打字错误,但它破坏了语法,并导致错误。您可以将配置文件中的此代码段更新为以下内容:

1[label /etc/nginx/sites-available/example.com]
23
4        server_name example.com www.example.com;
5
6

保存并关闭该文件后,可以使用sudo nginx-t命令验证它是否正常工作。

Nginx的指令在此不被允许错误

现在,假设您的同一指令有一个错误,但这一次消息如下:

1nginx: [emerg] "server" directive is not allowed here in /etc/nginx/sites-enabled/example.com:8
2nginx: configuration file /etc/nginx/nginx.conf test failed

您可能会注意到,尽管此错误发生在与前一个错误相同的位置,但此消息中详细说明了问题的原因。因此,重要的是要了解错误消息的含义。与前面有关UNKNOWN指令的错误消息不同,该错误指出不允许``SERVER指令。您可以使用首选的文本编辑器打开配置文件以检查其内容:

 1[label /etc/nginx/sites-available/example.com]
 2server {
 3        listen 80;
 4        listen [::]:80;
 5
 6        root /var/www/example.com/html;
 7        index index.html index.htm index.nginx-debian.html;
 8
 9        server name example.com www.example.com;
10
11        location / {
12                try_files $uri $uri/ =404;
13        }
14}

在这里,单词服务器拼写正确,但指令本身并不是缺少下划线分隔符的服务器_名称‘指令的确切措辞。因此,server`被认为是重复的,错误消息中指出这是不允许的。这与我们前面讨论的单一指令和块指令之间的区别有关。

此处触发的错误是因为单个指令服务器名仅读取server,因此与文件开头的第一个server块指令冲突。这是一个棘手的语法错误,在块指令和嵌套的单个指令之间可能会出现这种错误,因为配置文件中的Nginx具有分层结构。您可以通过添加下划线_来更正此错误,以正确表示server_name的准确指令关键字:

1[label /etc/nginx/sites-available/example.com]
23
4        server_name example.com www.example.com;
5
6

进行此更正后,保存并关闭该文件。然后使用sudo nginx-t检查语法是否有效。除非您的配置文件中存在其他错误,否则应返回`语法正常‘消息。

<$>[备注] 注意: 对于Nginx配置文件,行距或行距的大小有一定的灵活性,不会引发任何错误。但是,任何与指令明确相关的内容都将返回错误,因为准确的措辞或语法结构是正常运行所必需的。 <$>

最后要记住的是,如果您的配置文件包含多个错误,则您收到的错误消息将按连续顺序一次只返回一个。这意味着,如果您收到关于一个问题的错误消息,请更正它,然后再次运行语法检查命令,下一个错误将在您的输出中返回。在纠正所有错误之前,这种情况将继续发生。

现在,您已经了解了配置文件中的特定指令可能出现的其他语法错误。需要注意的是,所有这些示例都是在终端环境中表示的。如果您愿意,可以选择使用代码编辑器,如Visual Studio Code),它可以检查并突出显示代码中的错误,而不会触发多个错误消息,允许您一次更正它们,或者在早期完全避免它们。

结论

在本教程中,您了解了Nginx的常见语法错误以及如何纠正它们。尽管您可能会遇到许多Nginx语法错误,但这些示例为最常见的语法错误提供了一些可能性和解决方案。如果你有兴趣了解更多关于Nginx配置文件的信息,你可以查看我们的教程。你也可以通过我们的taged Community page查看Nginx上的其他内容,或者跳转到学习如何在Ubuntu 22.04上安装Nginx

Published At
Categories with 技术
Tagged with
comments powered by Disqus