如何解决Linux服务器上的常见网站问题

每个人都跑成一个点或另一个与他们的网站的问题。本指南将帮助您解决一些常见问题,让您的网站重新运行。

介绍

每个人都有问题与他们的网络服务器或网站在同一时间或另一个。 当遇到问题,哪些组件是可能的罪魁祸首时,学习在哪里查看将帮助您快速修复这些问题,减少挫折。

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

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

虽然偶尔会出现一些非典型的问题,但是当您尝试让您的网站正常运行时,您会遇到的绝大多数问题都属于非常可预测的范围。

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

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

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

下面,我们将介绍每种情况,以确保您的服务配置正确。

检查日志

在盲目尝试跟踪问题之前,请尝试检查Web服务器和任何相关组件的日志。 这些通常会在/var/log具体到服务的子目录。

举例来说,如果你有一个Apache服务器在Ubuntu服务器上运行,默认情况下日志将被保存在/var/log/apache2 检查此目录中的文件以查看正在生成什么类型​​的错误消息。 如果你有一个给你的麻烦,可能会在未来保持其日志的数据库后端/var/log为好。

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

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

您的Web服务器是否已安装?

您需要正确地服务您的网站的第一件事是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,你可以键入this。 再次,如果您以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

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

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

您的DNS设置是否指向正确的地点?

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

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

host -t A example.com
example.com has address 93.184.216.119

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

host -t AAAA example.com
example.com has IPv6 address 2606:2800:220:6d:26bf:1447:1097:aa7

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

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

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

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

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

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin admin@example.com
    DocumentRoot /var/www/html
. . .

这个虚拟主机配置为域端口80上的要求作出反应example.com

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

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    root /usr/share/nginx/html;
    index index.html index.htm;
    server_name example.com www.example.com;
. . .

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

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

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

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

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

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin admin@example.com
    DocumentRoot /var/www/html
. . .

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

在Nginx的中, root指令配置同样的事情:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    root /usr/share/nginx/html;
    index index.html index.htm;
    server_name example.com www.example.com;
. . .

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

您的Web服务器服务正确的索引文件?

如果您的文档根是正确的,当您访问您的网站或您的网站上的目录位置时,您的索引页没有正确提供,您可能会错误地配置了索引。

当访问者请求目录时,通常您的服务器将要给它们一个索引文件。 这通常是一个index.html文件或index.php根据您的配置文件。

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

<Directory /var/www/html>
    DirectoryIndex index.html index.php
</Directory>

这意味着,在提供服务的目录时,Apache会寻找一个名为index.html第一,并尝试以服务index.php作为一个备份,如果没有找到的第一个文件。

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

在Nginx的,这是否是被称为指令index ,它是这样使用:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    root /usr/share/nginx/html;
    index index.html index.htm;
    server_name example.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中可以这样限制:

<Directory /usr/share>
    AllowOverride None
    Require all denied
</Directory>

此行告诉Web服务器不要让任何人访问此目录的内容。 在Apache 2.2及以下版本中,这将是这样写的:

<Directory /usr/share>
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

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

在Nginx的,这些限制将采取何种形式的deny指示,将位于服务器块或主配置文件:

location /usr/share {
    deny all;
}

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

如果你的网站依赖于一个数据库后端像MySQL,PostreSQL,MongoDB等,你需要确保它是启​​动和运行。

您可以使用与检查Web服务器是否正在运行相同的方法。 再次,我们可以搜索正在运行的进程,然后选择我们正在查找的进程的名称:

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

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

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

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

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

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

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

mysql -u DB_USER_value -pDB_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处理器的部分。 这应该是几乎相同,不管你的分布。

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

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

如果您已达到自行解决问题的能力,并需要一些帮助(来自朋友,通过打开支持票等),您将通过提供日志文件和错误消息更快地获得更多相关帮助。 经验丰富的管理员可能会有一个好的想法,如果你给他们他们需要的信息,正在发生什么。

结论

希望这些故障排除提示能够帮助您跟踪并解决管理员在尝试让其网站正常运行时遇到的一些常见问题。

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

作者:Justin Ellingwood