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>
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 主页。