如何对Linux服务器上的常见站点问题进行故障排除

来自菜鸟教程
跳转至:导航、​搜索

介绍

每个人都会时不时地遇到他们的网络服务器或网站的问题。 了解遇到问题时该去哪里以及哪些组件可能是罪魁祸首,这将帮助您快速解决这些问题,减少挫败感。

在本指南中,我们将讨论如何解决这些问题,以便您可以正常启动和运行您的网站。

什么类型的问题是典型的?

虽然偶尔可能会出现一些非典型问题,但您在尝试启动和运行站点时会遇到的绝大多数问题都属于非常可预测的范围。

我们将在下面的部分中更深入地讨论这些,但现在,这里有一个简单的项目清单:

  • 你的网络服务器安装了吗?
  • 网络服务器是否正在运行?
  • 您的 Web 服务器配置文件的语法是否正确?
  • 您配置的端口是否打开(未被防火墙阻止)?
  • 您的 DNS 设置是否将您引导到正确的位置?
  • 文档根目录是否指向您文件的位置?
  • 您的 Web 服务器是否提供正确的索引文件?
  • 文件和目录结构的权限和所有权是否正确?
  • 您是否通过配置文件限制访问?
  • 如果您有数据库后端,它是否正在运行?
  • 您的站点能否成功连接到数据库?
  • 您的 Web 服务器是否配置为将动态内容传递给脚本处理器?

这些是管理员在站点无法正常工作时遇到的一些常见问题。 通过查看不同组件的日志文件并参考浏览器中显示的错误页面,通常可以缩小确切的问题范围。

下面,我们将逐一介绍这些场景,以确保您的服务配置正确。

检查日志

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

例如,如果您在 Ubuntu 服务器上运行 Apache 服务器,则默认情况下日志将保存在 /var/log/apache2 中。 检查此目录中的文件以查看正在生成什么样的错误消息。 如果您有一个给您带来麻烦的数据库后端,那么它的日志也可能会保留在 /var/log 中。

其他要检查的事情是进程本身是否在服务启动时给您留下错误消息。 如果您尝试访问网页并遇到错误,则错误页面也可能包含线索(尽管不如日志文件中的行具体)。

使用搜索引擎尝试查找可以为您指明正确方向的相关信息。 以下步骤可以帮助您进一步排除故障。

您的 Web 服务器安装了吗?

您需要正确地为您的网站提供服务的第一件事是网络服务器。

大多数人在达到这一点之前已经安装了服务器,但是在某些情况下,您可能在执行其他包操作时实际上意外地卸载了服务器。

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

sudo apt-get update
sudo apt-get install apache2

在这些系统上,Apache 进程称为 apache2

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

sudo apt-get update
sudo apt-get install nginx

在这些系统上,Nginx 进程被称为 nginx

如果您正在运行 CentOS 或 Fedora 并希望使用 Apache Web 服务器,您可以输入这个。 如果您以 root 身份登录,则可以删除“sudo”:

sudo yum install httpd

在这些系统上,Apache 进程被称为 httpd

如果你正在运行 CentOS 或 Fedora 并想使用 Nginx,你可以输入这个。 同样,如果您以 root 身份登录,请删除“sudo”:

sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
sudo yum install nginx

在这些系统上,Nginx 进程被称为 nginx

您的 Web 服务器是否正在运行?

现在您确定您的服务器已安装,它是否正在运行?

有很多方法可以确定服务是否正在运行。 一种相当跨平台的方法是使用 netstat 命令。

这将告诉您使用服务器上端口的所有进程。 然后我们可以 grep 作为我们正在寻找的进程的名称:

sudo netstat -plunt | grep apache2

tcp6       0      0 :::80           :::*            LISTEN      2000/apache2

您应该将“apache2”更改为您服务器上的 Web 服务器进程的名称。 如果您看到与上面类似的一行,则表示您的进程已启动并正在运行。 如果你没有得到任何输出,这意味着你查询了错误的进程或者你的 web 服务器没有运行。

如果是这种情况,您可以使用您的发行版的首选方法启动它。 例如,在 Ubuntu 上,您可以通过键入以下命令启动 Apache2 服务:

sudo service apache2 start

在 CentOS 上,您可能会输入如下内容:

sudo /etc/init.d/httpd start

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

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

如果您的 Web 服务器拒绝启动,这通常表明您的配置文件需要注意。 Apache 和 Nginx 都需要严格遵守它们的指令语法才能读取文件。

这些服务的配置文件通常位于以进程本身命名的 /etc/ 目录的子目录中。

因此,我们可以通过键入以下命令进入 Ubuntu 上 Apache 的主配置目录:

cd /etc/ apache2

以类似的方式,CentOS 上的 Apache 配置目录也反映了该进程的 CentOS 名称:

cd /etc/ httpd

配置将分布在许多不同的文件中。 如果您的服务无法启动,它通常会将您指向配置文件和第一次发现问题的行。 检查该文件是否有错误。

这些 Web 服务器中的每一个还为您提供检查文件配置语法的能力。

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

apache2ctl configtest

AH00558: 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
Syntax OK

正如您在上面看到的,我们收到了一条关于我们配置中的详细信息的信息性消息,但没有错误。 这很好。

如果您有 Nginx Web 服务器,您可以通过键入以下命令运行类似的测试:

sudo nginx -t

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

如您所见,此过程也会检查您的语法。 如果我们从文件中的一行中删除一个结束分号(Nginx 配置的常见错误),您将收到如下消息:

sudo nginx -t 

nginx: [emerg] invalid number of arguments in "tcp_nopush" directive in /etc/nginx/nginx.conf:18
nginx: configuration file /etc/nginx/nginx.conf test failed

参数数量无效,因为 Nginx 寻找分号来结束语句。 如果它没有找到,它会下降到下一行并将其解释为最后一行的进一步参数。

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

您配置的端口是否打开?

通常,Web 服务器在端口 80 上运行正常的 Web 流量,并使用端口 443 进行使用 TLS/SSL 加密的流量。 为了让您正确访问该站点,必须使这些端口可访问。

您可以使用本地计算机上的 netcat 来测试您的服务器是否打开了端口。

您只需要使用服务器的 IP 地址并告诉它您要检查的端口,如下所示:

sudo nc -z 111.111.111.111 80

这将检查 111.111.111.111 的服务器上的端口 80 是否打开。 如果它是打开的,该命令将立即返回。 如果是not打开,该命令会不断尝试建立连接,不成功。 您可以通过在终端窗口中按 CTRL-C 来停止此过程。

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

您的 DNS 设置是否将您定向到正确的位置?

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

为了让访问者通过其域名访问您的站点,您应该在 DNS 设置中有一条“A”或“AAAA”记录指向您服务器的 IP 地址。 您可以通过运行以下命令查询域的“A”记录:

主机 -t 一个example.com
 例子.com 地址为 93.184.216.119

返回给您的行应该与您的服务器的 IP 地址相匹配。 如果您需要检查“AAAA”记录(用于 IPv6 连接),您可以键入:

主机 -t AAAA example.com
  example.com的 IPv6 地址为 2606:2800:220:6d:26bf:1447:1097:aa7

请记住,您对 DNS 记录所做的任何更改都需要很长时间才能传播。 更改后,您可能会收到与这些查询不一致的结果,因为您的请求通常会到达尚未全部更新的不同服务器。

如果您使用的是 DigitalOcean,您可以在此处了解 如何为您的域 配置 DNS 设置。

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

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

在 Apache 中,虚拟主机文件的部分可能如下所示:

服务器名称 example.com 服务器别名 www.example.com  ServerAdmin 管理员 @例子 .com DocumentRoot /var/www/html 。 . . 

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

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

服务器 { 听 80 default_server; 听 [::]:80 default_server ipv6only=on; 根 /usr/share/nginx/html; 索引 index.html 索引.htm; 服务器名称例子.com  www.example.com  ;  . . . 

该块被配置为响应我们上面讨论的相同类型的请求。

文档根目录是否指向您文件的位置?

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

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

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

服务器名称例子.com 服务器别名 www.example.com  ServerAdmin 管理员 @例子 .com DocumentRoot /var/www/html 。 . . 

这一行告诉 Apache 它应该在 /var/www/html 目录中查找该域的文件。 如果您的文件保存在其他地方,则必须修改此行以指向正确的位置。

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

服务器 { 听 80 default_server; 听 [::]:80 default_server ipv6only=on; 根 /usr/share/nginx/html; 索引 index.html 索引.htm; 服务器名称例子.com  www.example.com  ;  . . . 

在此配置中,Nginx 在 /usr/share/nginx/html 目录中查找此域的文件。

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

如果您的文档根目录是正确的,并且当您访问您的站点或站点上的某个目录位置时未正确提供索引页面,则您的索引可能配置不正确。

当访问者请求目录时,通常您的服务器会希望给他们一个索引文件。 这通常是 index.html 文件或 index.php 文件,具体取决于您的配置。

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

DirectoryIndex index.html index.php

这意味着在服务目录时,Apache 将首先查找名为 index.html 的文件,如果未找到第一个文件,则尝试提供 index.php 作为备份。

您可以通过编辑 mods-enabled/dir.conf 文件来设置用于为整个服务器提供索引文件的顺序,该文件将为服务器设置默认值。 如果您的服务器未提供索引文件,请确保您的目录中有一个与文件中的选项之一匹配的索引文件。

在 Nginx 中,执行此操作的指令称为 index,它的用法如下:

服务器 { 听 80 default_server; 听 [::]:80 default_server ipv6only=on; 根 /usr/share/nginx/html; 索引 index.html 索引.htm; 服务器名称例子.com  www.example.com  ;  . . . 

权限和所有权设置是否正确?

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

要读取文件,包含内容的目录必须是 Web 服务器进程可读和可执行的。 用于运行 Web 服务器的用户名和组名因发行版而异。

在 Ubuntu 和 Debian 上,Apache 和 Nginx 都以用户 www-data 运行,该用户是 www-data 组的成员。

在 CentOS 和 Fedora 上,Apache 在一个名为 apache 的用户下运行,该用户属于 apache 组。 Nginx 在名为 nginx 的用户下运行,该用户是 nginx 组的一部分。

使用此信息,您可以查看构成站点内容的目录和文件:

ls -l /path/to/web/root

目录应该是 Web 用户或组可读和可执行的,并且文件应该是可读的以便读取内容。 为了上传、写入或修改内容,目录还必须是可写的,文件也必须是可写的。 但是要非常小心地将目录设置为可写,因为这可能会带来安全风险。

要修改文件的所有权,您可以这样做:

sudo chown user_owner : group_owner /path/to/file

这也可以对目录进行。 您可以通过传递 -R 标志来更改目录及其下所有文件的所有权:

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

您可以在此处了解有关 Linux 权限 的更多信息。

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

您的配置可能设置为拒绝您尝试提供的文件的访问。

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

在这些文件中,可以通过几种不同的方式限制访问。 在 Apache 2.4 中可以像这样限制目录:

AllowOverride 无要求全部拒绝

这一行告诉网络服务器不要让任何人访问这个目录的内容。 在 Apache 2.2 及更低版本中,它会这样写:

AllowOverride None命令拒绝,允许拒绝所有

如果您为包含您尝试访问的内容的目录找到这样的指令,这将阻止您成功。

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

位置 /usr/share {全部拒绝;  }

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

如果您的站点依赖于 MySQL、PostreSQL、MongoDB 等数据库后端。 您需要确保它已启动并正在运行。

您可以使用与检查 Web 服务器是否正在运行相同的方式来执行此操作。 同样,我们可以搜索正在运行的进程,然后选择我们要查找的进程的名称:

 sudo netstat -plunt |  grep mysql
  tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 3356/ mysql d

如您所见,该服务正在这台机器上运行。 确保在搜索服务时知道运行服务的名称。

如果您知道,另一种方法是搜索您的服务运行的端口。 查看您的数据库的文档以找到它运行的默认端口或检查您的配置文件。

如果您有数据库后端,您的站点能否成功连接?

如果您正在对数据库后端问题进行故障排除,下一步要查看您是否可以正确连接。 这通常意味着检查您的站点读取的文件以找出数据库信息。

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

您可以通过尝试使用以下方式手动连接到数据库来测试文件是否具有正确的信息:

mysql -u DB_USER_value -p DB_PASSWORD_value DB_NAME_value

如果您无法使用在文件中找到的值进行连接,则可能需要创建正确的帐户和数据库或修改数据库的访问权限。

您的 Web 服务器是否配置为将动态内容传递给脚本处理器?

如果您使用的是数据库后端,那么几乎可以肯定您使用的是 PHP 之类的编程语言来处理对动态内容的请求、从数据库中获取信息并呈现结果。

如果是这种情况,您需要确保您的 Web 服务器配置正确,以便将请求传递给脚本处理器。

在 Apache 中,这通常意味着确保已安装并启用 mod_php5。 您可以在 Ubuntu 或 Debian 上通过键入:

sudo apt-get update
sudo apt-get install php5 libapache2-mod-php5
sudo a2enmod php5

对于 CentOS/Fedora 系统,您必须输入:

sudo yum install php php-mysql
sudo service httpd restart

在 Nginx 中,这有点复杂。 Nginx 没有可以启用的 PHP 模块,因此我们需要确保在我们的配置中安装并启用了 php-fpm

在 Ubuntu 或 Debian 服务器上,通过键入以下命令确保已安装组件:

sudo apt-get update
sudo apt-get install php5-fpm php5-mysql

在 CentOS 或 Fedora 上,您可以通过键入:

sudo yum install php-fpm php-mysql

由于 PHP 处理器不是 Nginx 的一部分,因此您需要告诉它显式传递 PHP 文件。 按照本指南的第四步学习 如何配置 Nginx 以将 PHP 文件传递给 php-fpm 。 您还应该查看第三步中处理配置 PHP 处理器的部分。 无论您的发行版如何,这应该几乎相同。

如果所有其他方法都失败,请再次检查日志

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

如果您自己的故障排除能力已达到极限并需要一些帮助(来自朋友、通过打开支持票等),您将通过提供日志文件和错误消息更快地获得更多相关帮助。 如果您向他们提供他们需要的信息,有经验的管理员可能会对正在发生的事情有一个很好的了解。

结论

希望这些故障排除技巧能够帮助您追踪并解决管理员在尝试启动和运行网站时面临的一些更常见的问题。

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

贾斯汀·艾林伍德