Nginx常见错误排查:提升网站稳定性的终极指南

引言

解决Nginx错误有多种方法。请记住,这些故障排除方法只是一个起点,通常需要进一步调查才能诊断问题的根本原因。在您阅读本教程时,错误本身将提供关键信息,帮助您找到解决方案。

本教程将概述以下常用于在多数Linux发行版中进行Nginx故障排除的命令:

  • sudo cat /var/log/nginx/error.log: 用于打印包含错误列表及其详细信息的日志。
  • sudo nginx -t: 用于检查配置文件中的语法错误。
  • systemctl status nginx: 用于检查Nginx服务是活动还是非活动状态。

您将学习更多关于这些命令以及如何使用它们来解决各种Nginx错误的内容。

使用错误日志进行故障排除

当您从Nginx收到错误时,并不总是清楚问题可能是什么。因此,一个错误可能与更大的问题或完全不同的问题相关。这取决于您的具体情况,设置可能会有所不同。为了获取Nginx错误的完整概述,请运行以下命令以接收正在进行的列表:

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

您必须以特权用户身份运行此命令。我们推荐使用启用了sudo权限的用户,而不是root用户。cat命令代表“连接”(concatenate),用于读取文件的内容并将其打印在终端输出中。在这种情况下,cat正在读取和打印/var/log/nginx/error.log文件的内容。当您运行此命令时,输出将返回一个错误列表。请记住,如果没有错误,您的提示符将保持空白。以下是一个错误日志的示例:

2022/11/28 23:58:22 [emerg] 168641#168641: invalid host in "[::]443" of the "listen" directive in /etc/nginx/sites-enabled/test.do-community.com:12
2022/11/28 23:59:44 [emerg] 168664#168664: invalid number of arguments in "root" directive in /etc/nginx/sites-enabled/test.do-community.com:4
2022/11/29 00:00:19 [emerg] 168701#168701: "server" directive is not allowed here in /etc/nginx/sites-enabled/test.do-community.com:6

此错误日志输出提供了有关您遇到的具体错误的关键信息。日志条目的第一部分详细描述了错误发生的日期和时间以及错误消息的类型。在本例中,这是[emerg](紧急)类型的消息。日志条目的最后一个组件包括错误消息本身以及(如果适用的话)可找到该错误消息的文件和具体行号。

总的来说,如果您想进一步了解可能出现的错误,查阅Nginx错误日志是很有帮助的。

检查语法错误

在Nginx中,最常见的错误之一与配置文件中的语法有关。无论是缺少字符还是语法结构不正确,如果语法不正确,它将无法正常工作。这是因为配置文件由各种指令组成,必须正确声明,否则它们将是无效的。为了检查是否有语法错误,请运行以下命令:

  1. sudo nginx -t

这个命令应该由特权用户运行,我们推荐使用启用了sudo权限的用户而不是root用户。另外,-t标志表示在实际运行之前会对文件进行测试。如果您的语法正确,您将收到以下输出:

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

如果不是这样的话,您将会收到一个类似我们分享的关于错误日志的示例的错误信息。下面是您的输出在发生语法错误时可能返回的内容:

[emerg] invalid host in "[::]443" of the "listen" directive in /etc/nginx/sites-enabled/test.do-community.com:12
nginx: configuration file /etc/nginx/nginx.conf test failed

我们建议始终运行此语法检查命令以验证您的配置文件中是否缺少或无效的内容。此外,在进行任何配置更改后,您应该始终运行sudo systemctl reload nginx命令。这将重新加载Nginx并应用您所做的任何更改。

使用systemctl status nginx进行故障排除

在排除Nginx错误时的另一个选择是验证此服务在您的系统上是否正常运行。可能是安装不完整,或者服务还未启动。您可以通过systemd init系统进行以下状态检查来检查Nginx服务是否活动:

  1. systemctl status nginx

如果您的服务正在运行,它会显示为活动状态(在您的输出中显示为“运行中”)。

 nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enable>
     Active: active (running) since Tue 2022-11-29 16:37:49 UTC; 29s ago
       Docs: man:nginx(8)
    Process: 2679 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_proce>
    Process: 2680 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (c>
   Main PID: 2787 (nginx)
      Tasks: 2 (limit: 1116)
     Memory: 3.3M
        CPU: 32ms
     CGroup: /system.slice/nginx.service
             ├─2787 "nginx: master process /usr/sbin/nginx -g daemon on; master>
             └─2790 "nginx: worker process"

如果您的服务没有运行,输出将显示为不活动(“已停止”)。

○ nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enable>
     Active: inactive (dead) since Tue 2022-11-29 16:42:27 UTC; 1s ago
   Duration: 4min 38.006s
       Docs: man:nginx(8)
    Process: 2679 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_proce>
    Process: 2680 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (c>
    Process: 2915 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/>
   Main PID: 2787 (code=exited, status=0/SUCCESS)
        CPU: 39ms

如果发生这种情况,可能需要再次重启您的Nginx服务。您可以使用以下命令来进行操作:

  1. sudo systemctl restart nginx

之后,您可以运行systemctl status nginx来验证您的服务是否已经恢复活动状态。如果您对了解更多关于这些基本管理命令的内容感兴趣,请阅读我们的教程,在教程中我们讨论了如何管理Nginx进程。

其他故障排除提示

这是文章《如何排除常见的Nginx错误?》的第2部分(共2部分)。

即使我们只讨论了三种查找Nginx错误的方法,以下还有一些示例是特定于防火墙和配置设置的。

调整防火墙设置

当你设置Nginx时,你的服务器默认监听端口80用于HTTP流量。如果你没有打开这个端口来接收这些请求,那么你的网站将无法正常工作。根据你使用的发行版,调整防火墙设置的方法可能会有所不同。下面以Uncomplicated Firewall(ufw)为例来说明。为了确认端口是否已经打开,你可以使用以下命令来检查状态。

  1. sudo ufw status

再次强调,您需要一个具有特权的用户,建议使用启用了sudo权限的用户而不是root用户。如果您的输出返回以下内容,表示您已经打开了适当的端口80,具体来说是列出了Nginx HTTP配置文件:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

如果需要打开额外的端口,比如443端口来允许HTTPS流量,那么您可以将规则添加到列表中。

  1. sudo ufw allow 'Nginx HTTPS'

另外,您可以使用单个配置文件“Nginx Full”同时添加这两条规则。

  1. sudo ufw allow 'Nginx Full'

为了验证您的端口是否开放,请再次运行 `sudo ufw status`,如果它们被列出,则表示准备就绪。您也可以检查您的网络浏览器,确保服务器正常运行。

检查配置文件

如果你正在使用Nginx Web服务器,并且按照我们的教程安装了Nginx,那么你可能已经设置好了服务器块,特别是为了提供你想要的HTML内容,你应该设置一个针对你的站点的配置块。以下是一个服务器块的示例,包含了你的域名的配置详情。

您的域名的配置文件位于`/etc/nginx/sites-available/your_domain`。

server {
       listen 80;
         listen [::]:80;

       root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

当您正在添加或更新配置文件时,请记得在完成操作后保存。如果您使用的是Nano文本编辑器,可以按下 `CTRL + X`,`Y`,然后按下 `ENTER` 来保存。解决配置文件中的任何问题的主要方法是运行之前提到的语法检查 `sudo nginx -t`,并通过使用 `sudo systemctl restart nginx` 重新启动Nginx来启用这些更改。

您可以随时使用您偏爱的文本编辑器打开配置文件来评估它,例如以下方式:

  1. sudo nano /etc/nginx/sites-available/your_domain

请记住,您在该文件中的任何指令必须是准确的,否则您将收到一个无效的错误提示。

结论

本教程为您提供了一个快速参考指南,以便您可以解决在使用Nginx时可能遇到的常见错误。正如您可能记得的那样,这些命令为诊断问题提供了第一步,但您可能需要进一步调查错误。如果您对某些错误感到不确定,您可以始终通过检查Nginx错误日志来获取关于每个错误的详细条目。如果您对一些常见Nginx错误的更全面解释感兴趣,您可以阅读以下教程。

  • 常见的Nginx语法错误
  • 常见的Nginx连接错误
  • Nginx SSL证书和HTTPS重定向错误
bannerAds