如何排除 Linux 服务器上常见的网站问题

介绍

每個人都會有問題與他們的網頁伺服器或網站在某個時候。 了解在遇到問題時要看哪裡,以及哪些組件是可能的罪魁祸首,將有助於您盡快和強力地解決這些問題。

在本指南中,您将了解如何解决这些问题,以便您可以备份和运行您的网站。

哪些类型的问题是典型的?

当你试图让你的网站运行时,你会遇到的大多数问题属于可预测的频谱。

我们将在下面的部分更深入地讨论这些问题,但目前,这里有一个检查清单:

  • 您的 Web 服务器是否已安装?
  • 您的 Web 服务器是否运行?
  • 您的 Web 服务器配置文件的语法是否正确?
  • 您配置的端口是否开放(不被防火墙阻止)?
  • 您的 DNS 设置是否引导您到正确的位置?
  • 文档根指向您的文件位置?
  • 您的 Web 服务器是否服务正确的索引文件?
  • 文件和目录结构的权限和所有权是否正确?
  • 您是否通过配置文件限制访问?
  • 如果您有数据库后端,它正在运行?
  • 您的网站

这些是管理员在网站不正常工作时遇到的一些常见问题,通常可以通过查看不同组件的日志文件并引用浏览器中显示的错误页面来缩小具体问题。

下面,我们将探讨这些场景,以便您可以确保您的服务配置正确。

查看日志

在盲目尝试追踪问题之前,请尝试检查您的 Web 服务器和任何相关组件的日志,这些日志通常位于服务特定的子目录中。

例如,如果您有一个 Apache 服务器在 Ubuntu 服务器上运行,默认情况下,日志将保存在 /var/log/apache2. 检查此目录中的文件以查看正在生成什么样的错误消息。

如果您尝试访问网页并收到错误,错误页面也可能包含线索(虽然不像日志文件中的行一样具体)。

使用搜索引擎试图找到相关信息,可以向您指向正确的方向。在许多情况下,将您的日志的片段直接粘贴到搜索引擎中,以找到相同问题的其他示例有助于进一步解决问题。

您的 Web 服务器已安装?

在某些情况下,您的网页可能会直接由Docker容器或其他应用程序提供服务,并且您实际上不需要安装专用网页服务器,但大多数部署仍将包括至少一个。

大多数人会在到达这一点之前安装服务器,但有些情况下,在执行其他包操作时,您可能会意外卸载服务器。

如果您在 Ubuntu 或 Debian 系统上,需要安装 Apache Web 服务器,您可以键入:

1sudo apt-get update
2sudo apt-get install apache2

在这些系统中,Apache过程被称为apache2

如果您正在运行 Ubuntu 或 Debian 并且想要使用 Nginx 网页服务器,则可以输入:

1sudo apt-get update
2sudo apt-get install nginx

在这些系统中, Nginx 过程被称为nginx

如果您正在运行 RHEL、Rocky Linux 或 Fedora,并且需要使用 Apache Web 服务器,您可以键入:

1sudo dnf install httpd

在这些系统中,Apache过程被称为httpd

如果您正在运行 RHEL、Rocky Linux 或 Fedora 并且想要使用 Nginx,您可以输入此信息。

1sudo dnf install nginx

在这些系统中, Nginx 过程被称为nginx。不同于 Ubuntu,在安装在这些基于 RPM 的发行版后, Nginx 不会自动启动。

您的 Web 服务器在运行吗?

现在你确定你的服务器已安装,它正在运行吗?

有很多方法可以找出服务是否正在运行,一个非常跨平台的方法是使用netstat命令。

使用plunt旗帜运行netstat会告诉您在服务器上使用端口的所有流程. 若要了解有关运行netstat的更多信息,请参阅How To Use Top, Netstat, Du, & Other Tools to Monitor Server Resources(https://andsky.com/tech/tutorials/how-to-use-top-netstat-du-other-tools-to-monitor-server-resources)。

1sudo netstat -plunt | grep nginx
1[secondary_label Output]
2tcp 0 0 0.0.0.0:80 0.0.0.0:*               LISTEN 15686/nginx: master
3tcp6 0 0 :::80                   :::*                    LISTEN 15686/nginx: master

您可以将nginx更改为您的服务器上的 Web 服务器流程的名称. 如果您看到一个类似上面的行,这意味着您的流程正在运行. 如果您没有得到任何输出,这意味着您查询了错误的流程或您的 Web 服务器正在运行。

如果您的 Web 服务器不运行,您可以使用您的 Linux 发行版的 init system 启动它. 设计在背景下运行的大多数软件将在安装后与 init 系统注册,因此您可以通过程序启动和停止它。

例如,您可以通过键入以下方式启动nginx服务:

1sudo systemctl start nginx

如果您的 Web 服务器启动,您可以用netstat再次检查,以确认一切都是正确的。

您的 Web 服务器配置文件的语法正确吗?

如果您的 Web 服务器无法启动,这通常表明您的配置文件需要一些关注。

系统服务的配置文件通常位于名为过程本身的 /etc/ 目录的子目录中。

例如,您可以通过键入Ubuntu上的Apache的主要配置目录:

1cd /etc/apache2

在 RHEL、Rocky 和 Fedora 上,Apache 配置目录也反映了该过程的 RHEL 名称:

1cd /etc/httpd

配置将分布在许多不同的文件中。当尝试或失败启动服务时,它通常会产生错误,指向配置文件和第一个发现问题的行。

这些 Web 服务器中的每一个都提供了验证文件配置语法的方法。

如果您正在使用Apache,您可以使用apache2ctlapachectl命令来检查配置文件的语法错误:

1apache2ctl configtest
1[secondary_label Output]
2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
3Syntax OK

Syntax OK本质上意味着没有阻止服务器运行的重大错误,此前打印的每条消息都是小错误或警告,在这种情况下,无法可靠地确定服务器的完全合格域名反映了尚未配置域名的服务器上的非盒子Apache设置,但该服务器仍然可以通过其IP地址访问。

如果你有一个 Nginx 网页服务器,你可以通过键入执行类似的测试:

1sudo nginx -t
1[secondary_label Output]
2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
3nginx: configuration file /etc/nginx/nginx.conf test is successful

如果您在 `/etc/nginx/nginx.conf ( Nginx 配置中常见的错误) 中的配置行末尾删除半图,则会收到这样的消息:

1sudo nginx -t
1[secondary_label Output]
2nginx: [emerg] invalid number of arguments in "tcp_nopush" directive in /etc/nginx/nginx.conf:18
3nginx: configuration file /etc/nginx/nginx.conf test failed

存在无效的论点数量,因为 Nginx 正在寻找一个半字符号来结束陈述. 如果它找不到一个,它会下降到下一行,并将其解释为最后一行的进一步论点。

您可以运行这些测试,以便在您的文件中找到语法问题. 修复它所引用的问题,直到您可以让文件通过测试。

您配置的端口是否已打开?

一般情况下,网页服务器在 80 端口上运行 HTTP 网页流量,并使用 443 端口进行 TLS/SSL 加密的 HTTPS 流量。

您可以通过从本地机器运行netcat来测试您的服务器是否有开放的端口。

您需要使用远程服务器的IP地址,并告诉它要检查哪个端口,如下:

1[environment local]
2nc -z 111.111.111.111 80

这将检查端口 80 是否在服务器上在 111.111.111.111 打开. 如果打开,命令将立即返回.如果没有打开,命令将不断尝试建立连接,但没有成功。

如果您的 Web 端口无法访问,请查看您的防火墙配置,您可能需要打开端口 80 或端口 443。

你的DNS设置是否引导你到正确的位置?

如果您可以通过其 IP 地址访问您的网站,但不是通过您已设置的域名,则可能需要查看您的 DNS 设置。

为了让访问者通过域名访问您的网站,您应该有一个AAAAA记录,指向您的服务器的IP地址在DNS设置中。

1host -t A example.com
1[secondary_label Output]
2example.com has address 93.184.216.119

如果您需要检查AAAA记录(对于IPv6连接),您可以输入:

1host -t AAAA example.com
1[secondary_label Output]
2example.com has IPv6 address 2606:2800:220:6d:26bf:1447:1097:aa7

请记住,您对 DNS 记录所做的任何更改都可能需要一些时间来传播,取决于您的域名注册商。有时使用一个网站(如 https://www.whatsmydns.net/)来检查您的 DNS 更改在全球范围内何时生效(通常是半个小时左右)。

如果您正在使用 DigitalOcean,您可以在这里学习 如何为您的域配置 DNS 设置

确保您的配置文件也正确处理您的域名

如果您的 DNS 设置正确,您可能还需要检查您的 Apache 虚拟主机文件或 Nginx 服务器封锁文件,以确保它们已配置为响应您的域的请求。

在Apache中,您的虚拟主机文件可能看起来像这样:

1[label /etc/apache2/sites-enabled/000-default.conf]
2<VirtualHost *:80>
3    ServerName example.com
4    ServerAlias www.example.com
5    ServerAdmin admin@example.com
6    DocumentRoot /var/www/html
7. . .

此虚拟主机已配置为响应用于域 example.com 的端口 80 上的任何请求。

Nginx中的类似片段可能看起来像这样:

1[label /etc/nginx/sites-enabled/default]
2server {
3    listen 80 default_server;
4    listen [::]:80 default_server ipv6only=on;
5    root /usr/share/nginx/html;
6    index index.html index.htm;
7    server_name example.com www.example.com;
8. . .

这两个块配置为响应相同的默认类型的请求。

文档根指向您的文件的位置吗?

另一个考虑是您的 Web 服务器是否指向正确的文件位置。

Apache 中的每个虚拟服务器或 Nginx 中的服务器块都配置为指向特定端口或本地目录,如果配置不正确,则当您尝试访问页面时,服务器会发出错误消息。

在Apache中,文件根是通过DocumentRoot指令配置的:

1[label /etc/apache2/sites-enabled/default]
2<VirtualHost *:80>
3    ServerName example.com
4    ServerAlias www.example.com
5    ServerAdmin admin@example.com
6    DocumentRoot /var/www/html
7. . .

这个行告诉Apache,它应该在/var/www/html目录中搜索该域的文件,如果你的文件被保存在其他地方,你将不得不修改这个行,以指向正确的位置。

在 Nginx 中,指令配置了相同的东西:

1[label /etc/nginx/sites-enabled/default]
2server {
3    listen 80 default_server;
4    listen [::]:80 default_server ipv6only=on;
5    root /usr/share/nginx/html;
6    index index.html index.htm;
7    server_name example.com www.example.com;
8. . .

在此配置中, Nginx 在 /usr/share/nginx/html 目录中搜索该域的文件。

您的 Web 服务器是否提供正确的索引文件?

如果您的文档根是正确的,而您的索引页面在访问您的网站或网站上的目录位置时没有得到正确的服务,则可能您的索引配置不正确。

根据您的 Web 应用程序的复杂性,许多 Web 服务器仍然会默认服务 index 文件. 这通常是index.html文件或index.php文件,取决于您的配置。

在Apache中,您可能会在虚拟主机文件中找到一个行,该行将明确配置用于特定目录的索引顺序,如下:

1[label /etc/apache2/sites-enabled/default]
2<Directory /var/www/html>
3    DirectoryIndex index.html index.php
4</Directory>

这意味着,当目录被服务时,Apache将首先搜索一个名为index.html的文件,并尝试将index.php作为备份,如果第一个文件无法找到。

您可以通过编辑mods-enabled/dir.conf文件来设置将用于整个服务器的索引文件的顺序,这将为服务器设置默认值。

在 Nginx 中,这样做的指令被称为索引,它是这样使用的:

1[label /etc/nginx/sites-enabled/default]
2server {
3    listen 80 default_server;
4    listen [::]:80 default_server ipv6only=on;
5    root /usr/share/nginx/html;
6    index index.html index.htm;
7    server_name example.com www.example.com;
8. . .

许可证和所有权设置正确吗?

为了 Web 服务器能够正确地服务文件,它必须能够读取文件并访问存储的目录,这可以通过文件和目录的权限和所有权来控制。

要读取文件,包含内容的目录必须可以读取和执行由与 Web 服务器相关联的用户帐户。在 Ubuntu 和 Debian 上,Apache 和 Nginx 作为用户www-data运行,该用户是www-data组的一员。

在 RHEL、Rocky 和 Fedora 上,Apache 在一个名为apache的用户下运行,该用户属于apache组, Nginx 在一个名为nginx的用户下运行,该用户属于nginx组。

考虑到这一点,您可以查看您正在托管的文件和文件夹:

1ls -l /path/to/web/root

目录应该是可读和可执行的网络用户或组,文件应该是可读的,以便读取内容. 为了上传,写或修改内容,目录还必须是可写的,文件也需要可写的。

要更改文件的所有权,您可以使用chown:

1sudo chown user_owner:group_owner /path/to/file

您可以通过-R标志来更改一个目录的所有权和其下面的所有文件:

1sudo chown -R user_owner:group_owner /path/to/file

有关权限的更多信息,请参阅 An Introduction to Linux Permissions

您是否正在通过配置文件限制访问?

您的 Web 服务器设置也可能被配置为拒绝从您试图服务的文件访问。

在Apache中,这将被配置在该网站的虚拟主机文件中,或通过位于目录本身的.htaccess 文件。

在这些文件中,可以通过几种不同的方式限制访问。

1[label /etc/apache2/sites-enabled/default]
2<Directory /usr/share>
3    AllowOverride None
4    Require all denied
5</Directory>

在 Nginx 中,这些限制将采取否定指令的形式,并位于您的服务器块或主要配置文件中:

1[label /etc/nginx/sites-enabled/default]
2location /usr/share {
3    deny all;
4}

如果你有一个数据库后端,它是否正在运行?

如果您的网站依赖数据库后端,如MySQL,PostgresSQL,MongoDB等,您需要确保它是可用的。

您可以这样做,就像您检查网络服务器是否正在运行一样. 再次,您可以通过netstatgrep搜索运行过程:

1sudo netstat -plunt | grep mysql
1[secondary_label Output]
2tcp 0 0 127.0.0.1:3306 0.0.0.0:*         LISTEN 3356/mysqld

正如你所看到的,该服务在这个机器上运行,请确保您在搜索它时知道您的服务的名称。

查看数据库的文档,以查找它运行的默认端口(MySQL 默认为 3356),或检查您的配置文件。

如果您有数据库后端,您的网站可以成功连接吗?

如果您正在解决数据库备份问题,下一步是查看是否可以正确连接,这通常意味着检查网站读到的文件以查找数据库信息。

例如,对于WordPress网站,数据库连接设置存储在一个名为wp-config.php的文件中,您需要检查DB_NAME,DB_USERDB_PASSWORD是否正确,以便您的网站可以连接到数据库。

您可以通过在命令行上手动尝试连接到数据库来测试文件是否具有正确的信息。

1mysql -u DB_USER_value -pDB_PASSWORD_value DB_NAME_value

如果您无法使用文件中找到的值连接,则可能需要更改数据库的访问权限。

如果其他一切都失败,请再次检查日志

检查日志实际上应该是您的第一步,但在要求更多帮助之前也是一个很好的最后一步。

如果您已经到达了解决问题能力的尽头,并且需要一些帮助,您将通过提供日志文件和错误消息来获得更相关的帮助更快。

结论

希望这些故障排除技巧可以帮助您追踪并修复一些管理员在尝试让他们的网站运行时所面临的更常见问题。

如果您有任何额外的提示来检查和解决问题的方法,请在评论中与其他用户分享。

Published At
Categories with 技术
comments powered by Disqus