Web 服务器的工作原理

首先,浏览器向服务器发送请求。

服务器从我们那里获取请求的文件或者页面,并将其映射到来自服务器的相应文件。
服务器将文件连同一些信息(如 MIME 类型、内容长度和其他有用信息)一起发送回浏览器。

有时,请求的文件是静态页面(如 HTML 页面)或者动态页面(如 PHP、Java、Perl 或者任何其他服务器端语言)。

例如,当我们键入 www.yourDomain.com 时,浏览器会向 DNS 服务器查询计算机的 IP 地址:www.yourDomain.com。

一旦浏览器收到来自 DNS 的响应,它就会在端口 80 上启动 TCP 连接并请求默认网页,然后服务器将此页面发送给我们,仅此而已。

Apache Web 服务器故障排除

如果我们修改了 httpd.conf 文件并重新启动或者重新加载 Apache Web 服务器,但它不起作用,那么我们输入了错误的配置。
但是,这并不是我们需要对 Apache 进行故障排除的唯一情况。
我们可以查看 Apache 日志以了解服务是如何工作的,以便我们可以诊断问题并解决它。

Apache 的两个主要日志文件是 error_log 和 access_log 文件。

你可以在这些文件中找到

/var/log/apache2/

如果我们使用基于 Debian 的发行版,请使用目录。

access_log 文件包含对 Apache Web 服务器的每个请求以及有关客户端请求该资源的详细信息。

error_log 文件包含 Apache Web 服务器的错误。

我们可以使用 tail 命令查看日志文件:

$ tail -f /var/log/httpd/error_log

Apache 进程所有权

我们从 Linux 进程管理中知道,每个进程都继承其父进程的权限。

除了设置了 SETUID 位的应用程序之外,这个事实对于所有进程都是正确的;它们从所有者而不是父进程继承权限。
/bin/su 就是一个很好的例子。

如果普通用户运行/bin/su程序,它不会继承adam的权限,而是作为root用户运行它。

由于 Apache Web 服务器需要绑定端口 80,这需要 root 权限。

绑定80端口后,Apache可以以普通用户身份运行,只读取有权限读取的文件。

根据我们使用的 Linux 发行版,用户可能是以下之一:

nobody、www、apache、www-data 或者 daemon。

User 选项

User 选项指定 Web 服务器将用于响应请求的用户 ID。

User www-data

Group 选项

Group 选项指定 Apache Web 服务器将用于读取文件的组。

Group www-data

对于使用 CGI 或者 PHP 脚本等可执行脚本的站点,安全性非常重要。

我们将使用的用户将有权读取和写入服务器上所有站点的内容。

但是我们要确保只有特定站点的成员才能阅读他们的站点。

这非常重要,因为如果攻击者破坏了网站,他将能够读取所有文件。

如何解决这个文件

suEXEC 支持

一种流行的方法是使用 suEXEC。
suEXEC 是一个以 root 权限运行的程序,它使 CGI 程序以特定用户的用户和组 ID 运行,而不是 Apache 服务器用户。

我们可以像这样在每个虚拟主机上指定用户:

<VirtualHost www.example.com>
 SuExecUserGroup adam adamGroup
</VirtualHost>
Linux Web 服务器 (Apache) 的安装、配置和故障排除

Web 服务器是一个通过 HTTP 协议处理请求的系统,我们从服务器请求一个文件,它以请求的文件进行响应,这可能会让我们意识到 Web 服务器不仅适用于 Web。

Linux Web 服务器实现

有许多 Linux Web 服务器实现可供我们使用:

  • Apache服务器
  • nginx
  • Lighttpd
  • Apache Tomcat
  • Monkey HTTP Daemon(特别用于嵌入式系统)

有更多 Linux Web 服务器,但此列表是最常用的 Web 服务器。

最常用的 Web 服务器是 Apache 和 Nginx。

在这篇文章中,我们将在 Linux 上安装和配置 Apache 服务器。

配置 Apache Web 服务器

我们可以在 Apache 中的根目录

/var/www/html

添加文件。

请记住确保放置在该目录中的任何文件或者目录都是世界可读的。

默认索引页面是 index.html。

Apache 配置文件位于

/etc/httpd/conf/

目录。

在 Ubuntu 等基于 Debian 的系统上,我们可以在以下位置找到它

/etc/apache2/apache2.conf

文件。

服务器根(ServerRoot)选项

此选项指定 Apache Web 服务器的配置文件夹。
在基于 Red Hat 的发行版上,ServerRoot 选项是 /etc/httpd/ 目录。
在 Debian 发行版上, ServerRoot 选项是 /etc/apache2/ 。

ServerRoot /etc/httpd

Listen选项

Listen 选项指定 Apache Web 服务器将用于等待传入连接的端口。

此选项的默认值对于非安全连接为 80,对于安全连接为 443.

如果服务器上有多个 IP 地址,则可以使用“侦听”选项指定应侦听连接的 IP。

我们可以指定 80 以外的其他端口,只需确保它未被使用即可。

我们可以在相同的硬件上运行多个 HTTP 服务器,每个服务器都在一个唯一的端口上。

当服务器在非标准端口(例如端口 8080)上运行时,它将要求像这样明确声明端口号:

www.example.com:8080

Listen 80

服务器名称(ServerName)选项

此选项指定向访问者显示的 Web 服务器的主机名。

ServerName FQDN

文档根(DocumentRoot)选项

DocumentRoot 选项定义将包含将提供的文件的路径。

默认路径是 /var/www/html 。

DocumentRoot /var/www/html

MaxRequestWorkers 选项

此选项设置服务器将接收的最大并发连接数。

加载模块选项

我们使用此选项将模块加载到 Apache Web 服务器中。

有很多这样的 Apache 模块:

mod_cgid :此模块使用 Apache Web 服务器运行 CGI 脚本。

mod_ssl :通过 SSL 和 TLS 协议提供安全连接。

mod_userdir :此模块允许我们提供来自用户特定目录的内容。

如果要禁用加载特定模块,可以注释包含该模块的加载模块行。

或者,如果我们使用基于 Debian 的发行版,例如 Ubuntu,则可以使用以下命令:

$ a2enmod modulename

a2enmod 启用该模块。

$ a2dismod modulename

此命令禁用模块。

所有这些命令所做的就是在下面创建一个符号链接

/etc/apache2/mods-enabled

如果我们使用 a2dismod,符号链接将被删除。

如果启用或者禁用模块,则必须重新加载或者重新启动 Apache Web 服务器。

LoadModule mod_cgid.so

Include选项

此选项允许我们包含其他配置文件。

我们可以存储不同虚拟域的所有配置,Apache 将在运行时包含它们。

Include filePath

用户目录选项

此选项指定将包含可通过 Web 服务器访问的文件的目录。
该目录通常是 public_html 及其在用户主目录中的位置。

例如,如果我们有一个用户 adam,他想要通过 Apache Web 服务器提供他的 Web 内容。

首先,我们在他的主目录下创建一个 public_html 文件夹。

然后设置 public_html 文件夹的权限:

$ chmod 644 public_html

现在,如果我们放置一个 index.html 文件,它将可以通过浏览器访问,如下所示:

http://你的主机名/~亚当

UserDir public_html

别名(Alias)选项

此选项指定 DocumentRoot 位置之外且需要由 Apache Web 服务器提供服务的文件的位置。

就像我们在 DocumentRoot 之外有文件一样,我们希望访问者可以使用它们。

Alias URL_Path Actual_Path

错误日志(ErrorLog)选项

此选项指定 Apache Web 服务器的错误日志文件。

ErrorLog /var/log/httpd/error_log

虚拟主机选项

此选项允许我们在同一台服务器上托管多个网站。

这个想法是根据请求的主机名提供内容。

为主机 www.example.com 设置虚拟主机。
首先,在 /etc/httpd/conf/httpd.conf 文件中创建一个 VirtualHost 选项。

并像这样指定 DocumentRoot 和 ServerName:

<VirtualHost www.example.com>
 ServerAdmin jack@onitroad
 DocumentRoot /home/adam/public_html
 ServerName www.example.com
 ErrorLog /var/log/users/adam/error_log
</VirtualHost>

请记住,ServerName 选项必须可通过 DNS 解析。

虚拟主机类型

我们可以在 Apache Web 服务器中定义两种类型的虚拟主机:

  • 基于名称的虚拟主机
  • 基于 IP 的虚拟主机

NameVirtualHost 指令定义了哪些地址可以是虚拟主机;星号 (*) 表示此服务器上的任何名称或者地址。
你可以这样写:

NameVirtualHost *
<VirtualHost *>
 ServerName www.example.com
 DocumentRoot "/home/user1/public_html/"
</VirtualHost>
<VirtualHost *>
 ServerName www.example2.com
 DocumentRoot "/ home/user2/public_html/"
</VirtualHost>

如果我们有多个 IP 地址并且想要使用 SSL 证书,则该网站必须位于专用 IP 地址上。
我们可以像这样编写基于 IP 的虚拟主机:

<VirtualHost 192.168.1.2>
 ServerName www.example.com
 DocumentRoot "/home/user1/public_html/"
</VirtualHost>
<VirtualHost 192.168.1.3>
 ServerName www.example2.com
 DocumentRoot "/ home/user2/public_html/"
</VirtualHost>

安装 Apache 网络服务器

我们可以使用以下命令在基于 Red Hat 的发行版上安装 Apache 服务器:

$ dnf -y httpd

或者,如果我们使用的是基于 Debian 的发行版,我们可以像这样安装它:

$ apt-get -y install apache2

Apache Web 服务器服务在基于 Red Hat 的发行版(如 CentOS)上称为 httpd,而在基于 Debian 的发行版中称为 apache2.

如果我们使用像 iptables 这样的防火墙,则应该为端口 80 添加规则。

$ iptables -I INPUT 1 -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

或者,如果我们使用的是 firewalld,则可以使用以下命令:

$ firewall-cmd --add-port=80/tcp

要启动服务并在启动时启用它:

$ systemctl start httpd
$ systemctl enable httpd

我们可以使用以下命令检查服务是否正在运行:

$ systemctl status httpd

现在打开浏览器并访问 http://localhost 或者
如果我们使用的是 IP v6,使用 http://[::1]/ ,
我们会看到 HTML 主页。

日期:2020-07-15 11:16:48 来源:oir作者:oir