怎样修复常见的 Nginx Web 服务器错误

Nginx 是当今非常流行的 Web 服务器。 本文将向您展示运行 Nginx Web 服务器时的一些常见错误以及可能的解决方案。 这不是一个完整的列表。 如果您在尝试了建议的解决方案后仍然无法修复错误,请检查您的 Nginx 服务器日志 /var/log/nginx/ 目录并在 Google 上搜索以调试问题。

无法连接/拒绝连接

如果您在尝试访问您的网站时看到以下错误:

Firefox can’t establish a connection to the server at www.example.com

或者

www.example.com refused to connect

可能是这样

  1. Nginx 没有运行. 您可以检查 Nginx 状态 sudo systemctl status nginx. 启动 Nginx sudo systemctl start nginx. 如果 Nginx 无法启动,请运行 sudo nginx -t 查看您的配置文件是否有问题。 并检查日记(sudo jounalctl -eu nginx) 找出它无法启动的原因。
  2. 防火墙阻止端口 80 和 443. 如果您在 Debian/Ubuntu 上使用 UFW 防火墙,请运行 sudo ufw allow 80,443/tcp 打开 TCP 端口 80 和 443。如果您在 RHEL/CentOS/Rocky Linux/AlmaLinux 上使用 Firewalld,请运行 sudo firewall-cmd --permanent --add-service={http,https}, 然后 sudo systemctl reload firewalld 打开 TCP 端口 80 和 443。
  3. Nginx 没有在正确的网络接口上侦听. 例如,Nginx 不会侦听服务器的公共 IP 地址。

404 未找到

找不到 nginx 404

404 未找到 意味着 Nginx 无法找到您的网络浏览器要求的资源。 原因可能是:

  1. 您的服务器上不存在 Web 根目录。 在 Nginx 中,web roor 目录是使用 root 指令,像这样: root /usr/share/nginx/linuxbabe.com/;. 确保您的网站文件(HTML、CSS、JavaScript、PHP)存储在正确的目录中。
  2. PHP-FPM 未运行。 您可以使用以下命令检查 PHP-FPM 状态 sudo systemctl status php7.4-fpm (Debian/Ubuntu) 或 sudo systemctl status php-fpm.
  3. 你忘了包括 try_files $uri /index.php$is_args$args; Nginx 服务器配置文件中的指令。 需要此指令来处理 PHP 代码。
  4. 您的服务器没有可用磁盘空间。 尝试释放一些磁盘空间。 您可以使用 ncdu 公用事业 (sudo apt install ncdu 或者 sudo dnf install ncdu) 找出哪些目录占用了大量磁盘空间。

403 禁地

此错误表示您无权访问请求资源。 可能的场景包括:

  • 网站管理员使用 IP 白名单或其他方法阻止对所请求资源的公开访问。
  • 该网站可能正在使用像 ModSecurity 这样的 Web 应用程序防火墙,它检测到入侵攻击,因此它阻止了请求。

当 403 forbidden 发生时,某些 Web 应用程序可能会显示不同的错误消息。 它可能会告诉您“安全连接失败”,而原因是相同的。

安全连接失败 nginx

500内部服务器错误

Nginx 500 内部服务器错误

这意味着 Web 应用程序中存在一些错误。 可能是这样

  1. 数据库服务器已关闭。 检查 MySQL/MariaDB 状态 sudo systemctl status mysql. 开始吧 sudo systemctl start mysql. 跑步 sudo journalctl -eu mysql 找出它无法启动的原因。 MySQL/MariaDB 进程可能因内存不足问题而被终止。
  2. 您没有将 Nginx 配置为使用 PHP-FPM,因此 Nginx 不知道如何执行 PHP 代码。
  3. 如果您的 Web 应用程序具有内置缓存,您可以尝试刷新应用程序缓存以修复此错误。
  4. 您的 Web 应用程序可能会生成自己的错误日志。 检查此日志文件以调试此错误。
  5. 您的 Web 应用程序可能具有调试模式。 打开它,您将在网页上看到更详细的错误消息。 比如你可以通过设置在Modoboa邮件服务器托管平台开启调试模式 DEBUG = True 在里面 /srv/modoboa/instance/instance/settings.py 文件。

Nginx 显示默认页面

欢迎来到 Nginx

如果您尝试设置 Nginx 虚拟主机,并且当您在 Web 浏览器中键入域名时,会显示默认的 Nginx 页面,它可能是

  • 你没有使用真实的域名 server_name Nginx 虚拟主机中的指令。
  • 您忘记重新加载 Nginx。

页面没有正确重定向

Firefox 将此错误显示为 The page isn’t redirecting properly. 谷歌浏览器将此错误显示为 www.example.com redirected you too many times.

Firefox 页面没有正确重定向

这意味着您已多次配置 Nginx 重定向。 例如,您可能添加了一个不必要的 return 301 指令中的 https server 块将 HTTP 重定向到 HTTPS 连接。

如果你已经设置了页面缓存如 Nginx FastCGI 缓存,则需要清除你的服务器页面缓存。

504网关超时

这意味着像 PHP-FPM/MySQL/MariaDB 这样的上游无法足够快地处理请求。 您可以尝试重新启动 PHP-FPM 来临时修复错误,但最好开始调整 PHP-FPM/MySQL/MariaDB 以获得更快的性能。

内存大小耗尽

如果您在 Nginx 错误日志中看到以下行,则表示 PHP 已达到 128MB 内存限制。

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 57134520 bytes)

您可以编辑 php.ini 文件 (/etc/php/7.4/fpm/php.ini) 并增加 PHP 内存限制。

memory_limit = 512M

然后重启PHP7.4-FPM。

sudo systemctl restart php7.4-fpm

如果错误仍然存​​在,则可能是您的 Web 应用程序中存在错误的 PHP 代码,这些代码占用了大量 RAM。

PR_END_OF_FILE_ERROR

  1. 您将 Nginx 配置为将 HTTP 请求重定向到 HTTPS,但 Nginx 中没有服务器块来处理 HTTPS 请求。
  2. 也许 Nginx 没有运行?
  3. 有时,主要的 Nginx 二进制文件正在运行,但由于各种原因,工作进程可能会失败并退出。 检查 Nginx 错误日志(/var/log/nginx/error.log) 进行调试。

PHP-FPM 上游超时

有些人可以在 Nginx 错误日志文件中找到以下错误(在 /var/log/nginx/)。

[error] 7553#7553: *2234677 upstream timed out (110: Connection timed out) while reading response header from upstream

可能的解决方案:

  1. 重新启动 PHP-FPM。
  2. 升级内存。

资源暂时不可用

有些人可以在 Nginx 错误日志文件中找到以下错误(在 /var/log/nginx/)。

connect() to unix:/run/php/php7.4-fpm.sock failed (11: Resource temporarily unavailable)

这通常意味着您的网站有大量访问者,而 PHP-FPM 无法处理大量请求。 您可以调整 PHP-FPM 子进程的数量,使其可以处理更多的请求。

编辑您的 PHP-FPM www.conf 文件。 (文件路径因您的 Linux 发行版而异。)

sudo /etc/php/7.4/fpm/pool.d/www.conf

默认子进程配置如下:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

以上配置意味着

  • PHP-FPM 动态创建子进程。 没有固定数量的子进程。
  • 它最多创建 5 个子进程。
  • PHP-FPM 启动时启动 2 个子进程。
  • 至少有 1 个空闲进程。
  • 最多有 3 个空闲进程。

默认值基于没有太多资源的服务器,例如只有 1GB RAM 的服务器。 如果您有一个高流量网站,您可能希望增加子进程的数量,以便它可以处理更多请求。

pm = dynamic
pm.max_children = 20
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 12

确保您有足够的 RAM 来运行更多子进程。 保存并关闭文件。 然后重新启动 PHP-FPM。 (您可能需要更改版本号。)

sudo systemctl restart php7.4-fpm

要监控 PHP-FPM 的运行状况,您可以启用状态页面。 在 PHP-FPM 中找到以下行 www.conf 文件。 请注意以下

;pm.status_path = /status

删除分号以启用 PHP-FPM 状态页面。 然后重新启动 PHP-FPM。

sudo systemctl restart php7.4-fpm

然后编辑您的 Nginx 虚拟主机文件。 添加以下几行。 这 allowdeny 指令用于限制访问。 只有列入白名单的 IP 地址才能访问状态页面。

location ~ ^/(status|ping)$ {
        allow 127.0.0.1;
        allow your_other_IP_Address;
        deny all;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
        #fastcgi_pass 127.0.0.1:9000;
        fastcgi_pass   unix:/run/php/php7.4-fpm.sock;
}

保存并关闭文件。 然后测试 Nginx 配置。

sudo nginx -t

如果测试成功,请重新加载 Nginx 以使更改生效。

sudo systemctl reload nginx

示例 PHP-FPM 状态页面。

Nginx PHP-FPM 状态页面

PHP-FPM www.conf 文件对每个参数的含义给出了很好的解释。

PHP-FPM 状态页面请求缓慢

如果 PHP-FPM 非常繁忙并且无法立即处理请求,它会将这个请求排入队列。 默认情况下,最多可以有 511 个待处理请求,由 listen.backlog 范围。

listen.backlog = 511

如果您在 PHP-FPM 状态页面上看到以下值,则表示从未有请求放入队列,即您的 PHP-FPM 可以快速处理请求。

listen queue:         0
max listen queue:     0

如果有 511 队列中的待处理请求,这意味着您的 PHP-FPM 非常繁忙,因此您应该增加子进程的数量。

您可能还需要更改 Linux 内核 net.core.somaxconn 设置,它定义了 Linux 上套接字文件允许的最大连接数,例如 PHP-FPM Unix 套接字文件。 默认情况下,它的值为 128 在内核 5.4 之前和 4096 从内核 5.4 开始。

[email protected]:~$ sysctl net.core.somaxconn
net.core.somaxconn = 128

如果您运行的是高流量网站,则可以使用大值。 编辑 /etc/sysctl.conf 文件。

sudo nano /etc/sysctl.cnf

添加以下两行。

net.core.somaxconn = 20000
net.core.netdev_max_backlog = 65535

保存并关闭文件。 然后应用设置。

sudo sysctl -p

同一个网站的两个虚拟主机文件

如果你跑 sudo nginx -t 并查看以下警告。

nginx: [warn] conflicting server name "example.com" on [::]:443, ignored
nginx: [warn] conflicting server name "example.com" on 0.0.0.0:443, ignored

这意味着有两个虚拟主机文件包含相同的 server_name 配置。 不要为一个网站创建两个虚拟主机文件。

对等方重置 PHP-FPM 连接

Nginx 错误日志文件显示以下消息。

recv() failed (104: Connection reset by peer) while reading response header from upstream

这可能是由重新启动 PHP-FPM 引起的。 如果是你自己手动重启的,那么你可以忽略这个错误。

Cloudflare 错误

如果您的网站在 Cloudflare CDN(内容交付网络)后面运行,这里有一些常见错误和解决方案。

521 Web 服务器已关闭

  • Nginx 没有运行。
  • 您没有在防火墙中打开 TCP 端口 80 和 443。
  • 您更改了服务器 IP 地址,但忘记更新 Cloudflare 中的 DNS 记录。

页面没有正确重定向

如果您在 SSL/TLS 应用程序上的 SSL 设置设为 Flexible,但您的源服务器配置为将 HTTP 请求重定向到 HTTPS,您的 Nginx 服务器通过加密连接将响应发送回 Cloudflare。 由于 Cloudflare 需要 HTTP 流量,因此它不断重新发送相同的请求,从而导致重定向循环。 在这种情况下,您需要使用 Full (strict) Cloudflare 设置中的 SSL/TLS 选项。

Cloudflare SSL TLS 完全严格

包起来

我希望本文能帮助您修复常见的 Nginx Web 服务器错误。 与往常一样,如果您发现这篇文章有用,请订阅我们的免费时事通讯以获取更多提示和技巧🙂