在本教程中,我们将具体讨论 Linux Web 服务器或 Apache Web 服务器,以及如何安装和配置它以向其他人提供您的内容。
Web 服务器是一个通过 HTTP 协议处理请求的系统,您向服务器请求一个文件,它会响应所请求的文件,这可能会让您知道 Web 服务器不仅仅用于 Web。
Web服务器嵌入在打印机、路由器等设备中,当你打开路由器配置页面时,其背后就有一个Web服务器。
当您打开打印机配置页时,其背后还有一个网络服务器在服务您的请求,因此网络服务器无处不在。
网络服务器如何工作
首先,您的浏览器向服务器发送请求。
服务器从您那里获取所请求的文件或页面,并将其映射到服务器上的相应文件。服务器将文件发送回浏览器,并附带一些信息,例如 MIME 类型、内容长度和其他有用信息。
有时,请求的文件是静态页面(如 HTML 页面)或动态页面(如 PHP、Java、Perl 或任何其他服务器端语言)。
例如,当您输入 www.yourDomain.com 时,浏览器会查询DNS服务器关于计算机的 IP 地址:www.yourDomain.com。一旦浏览器收到 DNS 的响应,它就会在端口 80 上启动 TCP 连接并请求默认网页,然后服务器将此页面发送给您,仅此而已。
Linux Web 服务器实现
有许多 Linux Web 服务器实现可供您使用:
- 阿帕奇服务器
- Nginx
- Lighttpd
- 阿帕奇雄猫
- Monkey HTTP Daemon(特别用于嵌入式系统)
Linux Web 服务器还有更多,但此列表是最常用的 Web 服务器。
最常用的 Web 服务器是 Apache 和 Nginx。
在这篇文章中,我们将使用阿帕奇服务器有几个原因:
我们将在 Linux 上安装和配置 Apache 服务器,但首先让我们回顾一下 HTTP 协议基础知识的一些基础知识。
了解 HTTP
当您向 Web 服务器请求文件或页面时,客户端首先通过端口 80 连接到服务器。连接成功后,客户端将 HTTP 命令(也称为方法)发送到服务器。该命令包含一个请求标头,其中包含有关客户端的信息。
要在 chrome 中查看这些请求标头,请打开 chrome devtools,然后打开网络面板并访问 google.com 并检查请求标头,您应该看到如下内容:
请求标头还包括有关客户端的信息,例如用户代理和接受的格式。
Web 服务器可以通过请求标头发送附加信息。例如,如果您单击将打开另一个网站的链接,则标题将包含推荐网站。
完全接收到请求标头后,服务器将响应所请求的文件或页面以及响应标头。
响应标头包括有关接收到的内容、其类型和其他信息的信息。
您可以从浏览器网络面板检查响应标头。
安装 Apache 网络服务器
您可以使用以下命令在基于 Red Hat 的发行版上安装 Apache 服务器:
$ dnf -y httpd
或者,如果您使用基于 Debian 的发行版,则可以像这样安装:
$ apt-get -y install apache2
Apache Web 服务器服务称为httpd在基于 Red Hat 的发行版(如 CentOS)上,虽然它被称为apache2在基于 Debian 的发行版中。
如果您使用 iptables 等防火墙,您应该添加规则对于端口 80。
$ iptables -I INPUT 1 -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
或者如果你是使用防火墙,您可以使用以下命令:
$ firewall-cmd --add-port=80/tcp
要启动您的服务并在启动时启用它:
$ systemctl start httpd
$ systemctl enable httpd
您可以使用以下命令检查您的服务是否正在运行:
$ systemctl status httpd
现在打开浏览器并访问http://localhost orhttp://[::1]/如果您使用的是 IP v6,并且安装顺利,您应该会看到 HTML 主页。
配置 Apache Web 服务器
您可以将文件添加到 Apache
/var/www/html
顶级页面的目录。
只需记住确保放置在该目录中的任何文件或目录都是世界可读的。
默认索引页是index.html。
Apache 配置文件位于
/etc/httpd/conf/
目录。
在基于 Debian 的系统(例如 Ubuntu)上,您可以在以下位置找到它:
/etc/apache2/apache2.conf
file.
我们无法在一篇文章中讨论 Apache 的每个选项,但我们将讨论最重要的选项。
您将它们称为选项或指令。
服务器根选项
此选项指定 Apache Web 服务器的配置文件夹。在基于 Red Hat 的发行版上,ServerRoot 选项是/etc/httpd/目录。在 Debian 发行版上,ServerRoot 选项是/etc/apache2/.
ServerRoot /etc/httpd
收听选项
Listen 选项指定 Apache Web 服务器将用于等待传入连接的端口。
该选项的默认值为80 对于不安全的连接和443用于安全连接。
如果您的服务器上有多个 IP 地址,您可以使用“侦听”选项指定应侦听连接的 IP。
您可以指定 80 以外的其他端口,只需确保它未被使用即可。
您可以在同一硬件上运行许多 HTTP 服务器,每个服务器都在一个唯一的端口上。
当服务器在非标准端口(例如端口 8080)上运行时,将需要明确声明端口号,如下所示:
www.example.com:8080
Listen 80
服务器名称选项
此选项指定向访问者显示的 Web 服务器的主机名。
ServerName FQDN
文档根选项
DocumentRoot 选项定义包含要提供的文件的路径。
默认路径是 /var/www/html 。
DocumentRoot /var/www/html
MaxRequestWorkers 选项
该选项设置服务器将接收的最大并发连接数。
加载模块选项
我们使用此选项将模块加载到 Apache Web 服务器中。
有很多类似这样的 Apache 模块:
mod_cgid:该模块使用 Apache Web 服务器运行 CGI 脚本。
mod_ssl:通过 SSL 和 TLS 协议提供安全连接。
mod_用户目录:此模块允许您提供用户特定目录中的内容。
如果要禁用加载特定模块,可以注释包含该模块的 Load module 行。
或者,如果您使用基于 Debian 的发行版(例如 Ubuntu),则可以使用以下命令:
$ a2enmod modulename
a2enmod 启用该模块。
$ a2dismod modulename
该命令用于禁用该模块。
所有这些命令所做的就是在下面创建一个符号链接
/etc/apache2/mods-enabled
如果您使用 a2dismod,符号链接将被删除。
如果启用或禁用模块,则必须重新加载或重新启动 Apache Web 服务器。
LoadModule mod_cgid.so
包含选项
此选项允许您包含其他配置文件。
您可以存储不同虚拟域的所有配置,Apache 将在运行时包含它们。
Include filePath
用户目录选项
此选项指定包含可通过 Web 服务器访问的文件的目录。该目录通常是 public_html ,它位于用户的主目录中。
例如,如果您有一个用户 adam,他希望通过 Apache Web 服务器提供其 Web 内容。
首先,我们在他的主目录下创建一个public_html文件夹。
然后设置public_html文件夹的权限:
$ chmod 644 public_html
现在,如果我们放置一个index.html文件,则可以通过浏览器访问它,如下所示:
http://您的主机名/~adam
UserDir public_html
别名选项
此选项指定 DocumentRoot 位置之外且需要由 Apache Web 服务器提供服务的文件的位置。
就像您在 DocumentRoot 之外有文件一样,并且您希望访问者可以使用它们。
Alias URL_Path Actual_Path
错误日志选项
此选项指定 Apache Web 服务器的错误日志文件。
ErrorLog /var/log/httpd/error_log
虚拟主机选项
此选项允许您在同一服务器上托管多个网站。
这个想法是根据请求的主机名提供内容。
为主机 www.example.com 设置虚拟主机。首先,创建一个VirtualHost选项/etc/httpd/conf/httpd.conf file.
并指定 DocumentRoot 和 ServerName,如下所示:
<VirtualHost www.example.com>
ServerAdmin admin@example.com
DocumentRoot /home/adam/public_html
ServerName www.example.com
ErrorLog /var/log/users/adam/error_log
</VirtualHost>
请记住,ServerName 选项必须可通过 DNS 解析。
这些是最常用的 Apache 选项。
虚拟主机类型
您可以在 Apache Web 服务器中定义两种类型的虚拟主机:
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 进程所有权
我们从Linux进程管理每个进程都从其父进程继承其权限。
这一事实对于除设置了 SETUID 位的应用程序之外的所有进程都是如此;它们从所有者而不是父进程继承权限。 /bin/su 就是一个很好的例子。
如果普通用户运行 /bin/su 程序,它不会继承 adam 的权限,而是以 root 用户身份运行它。
由于Apache Web服务器需要绑定80端口,而这需要root权限。
绑定到80端口后,Apache可以以普通用户身份运行,并且只读取有权限读取的文件。
基于您使用的 Linux 发行版,用户可以是以下之一:
nobody、www、apache、www-data 或 daemon。
我推迟了为 Apache 引入另外两个选项,直到达到这一点。
用户选项
用户选项指定 Web 服务器将用来应答请求的用户 ID。
User www-data
组选项
Group 选项指定 Apache Web 服务器将用于读取文件的组。
Group www-data
对于使用可执行脚本(例如 CGI 或 PHP 脚本)的站点来说,安全性非常重要。
您将使用的用户将拥有读写权限服务器上所有站点的内容。但我们希望确保只有特定站点的成员才能阅读其站点。
这非常重要,因为如果攻击者破坏了您的网站,他将能够读取所有文件,因为 Apache 用户有权执行此操作。
那么如何解决这个问题呢?
苏执行支持
一种流行的方法是使用 suEXEC。 suEXEC 是一个以 root 权限运行的程序,它使 CGI 程序以特定用户的用户和组 ID 运行,而不是以 Apache 服务器用户的身份运行。
您可以像这样指定每个虚拟主机上的用户:
<VirtualHost www.example.com>
SuExecUserGroup adam adamGroup
</VirtualHost>
就这么简单。
阿帕奇认证
您可能希望将某些部分限制为特定访问者。它就像一个受密码保护的目录。
在Apache中,您可以存储名为的身份验证信息文件.htpasswd 文件。
您可以使用 htpasswd 命令来执行此操作。
首先,使用 htpasswd 命令创建 .htpasswd 文件:
$ htpasswd -c /home/adam/.htpassswd myuser
第一次运行 htpasswd 时需要 -c 选项,但是当您需要添加更多用户时,不应该使用 -c,因为它会覆盖文件。
然后在public_html文件夹中创建一个.htaccess文件并写入以下内容:
<Location /vip>
AuthName "test"
AuthType Basic
AuthUserFile /home/adam/.htpasswd
Order deny,allow
require valid-user
</Location>
AuthName 是必需的,您可以使用任何您想要的字符串。
AuthType Basic 表示您正在使用 htpasswd 样式的用户文件。
AuthUserFile 指向包含 htpasswd 命令生成的密码的文件。
Order 行表示 Apache 必须默认拒绝访问,并且只允许 htpasswd 文件中指定的用户访问。
require 指令意味着允许 .htpasswd 文件中的任何用户。
Apache Web 服务器故障排除
如果您修改了 httpd.conf 文件并重新启动或重新加载 Apache Web 服务器,但它不起作用,那么您输入了错误的配置。然而,这并不是您需要对 Apache 进行故障排除的唯一情况。您可以查看 Apache 日志以了解该服务如何工作,以便诊断问题并解决它。
Apache 的两个主要日志文件是错误日志 and 访问日志 files.
您可以在以下位置找到这些文件
/var/log/apache2/
目录(如果您使用的是基于 Debian 的发行版)。
access_log 文件包含对 Apache Web 服务器的每个请求以及有关客户端请求该资源的详细信息。
error_log 文件包含 Apache Web 服务器的错误。
您可以使用尾部命令查看日志文件:
$ tail -f /var/log/httpd/error_log
我建议您查看Linux 系统日志服务器了解更多有关日志记录的信息。