尝试让 Apache 工作

尝试让 Apache 工作

我已经在虚拟机上安装了 Ubuntu Server 20.4(使用 VirtualBox)。

我已经使用以下命令安装了一个 Apache 服务器:

sudo apt install apache2

从我在互联网上看到和读到的所有内容来看(例如,ubuntu 服务器上的 Apache Web 服务器:https://www.youtube.com/watch?v=eS_4o0QT9Ac&ab_channel=HelpfulTechVids,以及如何在 ubuntu 服务器上设置 apache:https://www.youtube.com/watch?v=Zj-_julzYuo&ab_channel=AlpineSecurity),每个人都说只要打开 chrome 并尝试 localhost,您就会看到您的 apache 服务器页面。当我尝试在 VM Host 上查看 apache 页面时,它没有出现。

我为客户机尝试了许多不同的 VM 网络设置:NAT、桥接适配器、仅主机适配器。没有用。

当我检查 VM Guest(ubuntu 服务器 20.04)上的状态时:

sudo systemctl status apache2

它说 apache 服务器正在运行,但我在主机的浏览器上看不到它。

有人已经尝试向我展示与此相关的先前问题:我如何从主机访问 Apache(在 VirtualBox 客户机上)?,但是尽管该用户可以进入客户机并加载 Firefox,并且可以看到他们的 Apache 运行正常,但我却不能。我只能通过终端使用 sudo systemctl status apache2 看到 apache 正在运行。但我无法在 Chrome 或 Firefox 上看到。它不会加载。

目前,我的网络设置为 NAT,这样我就可以从我的客户机访问互联网(我可以使用 ping google.com 并得到响应)。但我可以从主机的浏览器访问 127.0.0.1。

对于 ip addr,我得到了环回(inet 127.0.0.1)和 enp0s3,但它没有载波,链接以太。

-- 已编辑以澄清

答案1

尝试让 Apache 工作

嗨 LRL!根据您的问题描述,我们将讨论如何解决该问题。希望这对您有所帮助!

惯例:)

请注意,我们将交替apache2使用进程、服务或守护进程。我们个人赋予它们的含义是:

  • 过程:正在运行的程序/代码片段及其数据。从浏览器到内核,计算机中运行的任何程序都是进程。
  • 服务:提供某种功能(如打印机假脱机程序或数据库)的过程。
  • 守护进程:不是设计用来与用户直接交互的进程,无论是通过终端、图形用户界面(GUI)...

那么 apache 就是一个像任何其他进程一样的进程,它提供 HTTP 服务器作为服务,并且当我们通过*.conf文件配置它时,它的行为就像一个守护进程,但在它以常见方式运行时不会与它交互。有些人可能不同意我们的观点,但这就是我们将在以下讨论中使用的观点。

现在让我们开始做正事吧!

别忘了插座!

首先检查 HTTP 守护进程是否确实在监听。由于您可以ip addr毫无问题地运行,这意味着您已iproute2安装该套件。该套件只是一堆工具,可让您检索有关网络堆栈的信息并对其进行配置。您可以阅读更多相关信息这里以及查看它们与旧版本的关系。的捆绑工具net-tools之一是,它可让您检查套接字统计信息。您可以使用 查阅手册页,但长话短说,您需要运行。此调用利用了以下选项:iproute2ssman ssss -lt

  • -l:仅列出正在监听的套接字。这将消除系统为执行大量任务而保持打开的大量套接字。
  • -t:仅列出 TCP 端口。如末尾所示第1.4节HTTP/1.1 RFC此应用层协议运行在 TCP 传输协议上。因此,我们可以摆脱对不同底层协议的依赖,并使我们的输出更小。

在我们刚刚安装的系统上apache2,上述命令的输出是:

foo@coruscant~$ ss -lt
State           Recv-Q          Send-Q                   Local Address:Port                      Peer Address:Port          Process          
LISTEN          0               4096                     127.0.0.53%lo:domain                         0.0.0.0:*                              
LISTEN          0               5                            127.0.0.1:ipp                            0.0.0.0:*                              
LISTEN          0               511                                  *:http                                 *:*                              
LISTEN          0               5                                [::1]:ipp                               [::]:*

由于套接字存在于我们的机器上,因此我们关注的是Local Address:Port列出虚拟机监听套接字的列。您将看到第三行包含值*:http。这只是显示我们的套接字正在监听全部连接到机器的网络接口(我们可以运行带有 2 个 NIC 的服务器(网络接口Cards),并且它绑定到80HTTP 的默认端口,如您在上面链接的 RFC 中看到的那样。出于好奇,您可以尝试运行ss -ltn以防止ss为众所周知的端口分配特殊名称。您将在我们讨论的值中看到*:80而不是*:http。无论如何,我们可以看到 HTTP 套接字已启动并正在运行,并且我们的机器将接受发送到端口 80 的流量。如果您的输出没有显示此端口打开,请考虑使用恢复 Apache,sudo systemctl restart apache2因为这是 Web 服务器为客户端提供服务的条件。

只是为了完整性起见,您也可以nmap在您的机器上运行。网络地图是一个网络扫描器,可以提供有关主机的大量信息。您可以阅读其手册页,因为它是一个功能相当强大的工具,但您也可以nmap -A -p 80 localhost在 VM 内部运行以扫描 HTTP 端口。扫描结果将让您知道端口是否打开。启用-A版本发现但会减慢进程,因此您不妨尝试运行nmap -p 80 localhost,您还将知道端口是否打开。您可能已经猜到了,该-p 80选项将扫描限制为 HTTP 端口。请注意,如果您尚未nmap安装,则需要运行sudo apt install nmap以获取它。在安装之前运行也是一个好主意,sudo apt update以便您获得最新版本。尽管第二种选择是可行的,但对于手头的问题来说可能有点小题大做。我们认为无论如何还是应该提到它 :)。我们附上了我的 VM 的输出,以便您知道会发生什么:

foo@coruscant~$ nap -A -p 80 localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2020-11-09 11:46 GMT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000072s latency).
Other addresses for localhost (not scanned): ::1

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.43 seconds

apache 配置正确吗?

现在我们知道 HTTP 端口工作正常,让我们看一下 apache 的配置文件。与其他服务一样,apache 的配置位于 下/etc。您只需导航到/etc/apache2并检查感兴趣的各种文本文件。在我们的例子中,我们要检查默认站点是否已启用。为此,我们只需运行cat /etc/apache2/sites-enabled/000-default.conf。这应该输出类似以下内容:

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

我们最感兴趣的是,<VirtualHost *:80>它告诉我们我们确实在端口 80 上配置了一个服务器,并监听所有接口。此外,该DocumentRoot /var/www/html行还指出这是我们将查看以提供网页的目录。如果您好奇,可以运行cat /var/www/html/index.html。这index.html就是我们连接到它时 apache 正在服务的站点!

如果/etc/apache2/sites-enabled/000-default.conf文件不存在,则需要运行a2ensite 000-default.conf以启用站点。请注意,sudo根据您配置服务器权限的方式,可能需要在其前面添加这最后一条命令。该a2ensite脚本将只创建一个符号链接(就像我们ln -s/etc/apache2/sites-enabled中创建的指向 中的文件的符号链接一样/etc/apache2/sites-available)。这样,您可以定义多个“站点”,并在任何给定时间仅使用其中的子集。如果您运行,file /etc/apache2/sites-enabled/000-default.conf您确实会看到它只是一个符号链接 :P。

那么肯定是网络配置的问题...

现在我们可以确定三件事:

  1. apache2在跑。
  2. 它正在监听端口 80。
  3. 默认站点已启用。

请记住,我们将包含的所有网络命令都将在虚拟机上运行,不是在主机上,除非我们明确声明我们想要在主机上运行命令。

这意味着错误很可能出在你的主机和虚拟机之间的网络配置上。首先,你不能使用NAT配置虚拟机网络时,请将模式设置为 NAT。由于 NAT 的本质,除非您手动将端口转发到服务器,否则您将无法访问服务器。我们从未使用 VirtualBox 这样做过,甚至不知道是否可行,所以我们会避开它。

我个人建议你配置一下桥接适配器。这将使您的虚拟机加入主机 PC 所连接的任何 LAN,就像从网络拓扑的角度来看它是一台完全独立的机器一样。就好像您的主机和虚拟机通过桥接器连接一样,桥接器是第 2 层设备,不被位于第 3 层的 IP 协议考虑在内。您可以看到,如果您以这种方式配置虚拟机,它的网关将与主机的网关相同。您可以通过ip route | head -n 1 | awk '{print $3}'在两者中运行并查看是否获得相同的 IP 地址来检查,该地址大概是 LAN 中接入路由器的 IP。上一个命令仅使用 打印路由表ip route,使用 获取第一行(即默认路由)head -n 1,使用 打印第三个字(即网关地址)awk '{print $3}'。管道符|会将其左侧命令的输出重定向到其右侧命令的输入,以便我们可以以协调的方式使用多个命令。如果您想进行一些计算机科学考古学,这是一种“UNIXy”方式 :P。

如果两台电脑的网关相同,则应该能够ping从一个接口切换到另一个接口,反之亦然。为此,您需要知道虚拟机在 LAN 中的 IP。您可以通过运行ip addr并检查分配给您的 NIC 的 IP 来获取它。正如您所说的,接口名称enp0s3显示出来后,您应该会看到它旁边有一个 IPv4 地址。假设该地址是X.X.X.X,那么,如果您从主机运行,ping X.X.X.X您应该会得到回复。如果出于某种原因没有与接口关联的 IP,enp0s3只需在您的子网中查找与另一个子网关联的 IP:我无法猜测您是如何设置服务器的……

如果你没有收到回复,那么你需要检查虚拟机的网络配置,确保一切都设置正确。如果你的虚拟机有互联网连接,那么除了回送需要分配一个 IP 地址,因此您应使用该 IP 地址。如果上述操作后仍不起作用,请附上ip addr服务器上的完整输出以及虚拟机的完整网络配置(例如,通过屏幕截图)。

另一方面,如果 ping 成功,您只需在主机上打开浏览器并输入http://X.X.X.X,您就会看到 apache 的欢迎页面 :P。我只在我的计算机上运行的 VM 中尝试过此操作,因此您可能会遇到一些由于 HTTP 而导致的“此页面不安全”问题,具体取决于您在浏览器中指定 URL 的方式。http但是,如果您明确包含在 URL 中,则不会有任何问题。尽管如此,这些问题超出了问题的范围,因此如果发生这些问题,请考虑提出一个新问题。

祝你好运!

希望这个答案对您有帮助!如果有任何不清楚的地方,或者您发现任何类型/错误,请随时编辑答案或回复我以进一步帮助您。不过,ip addr如果您需要任何进一步的帮助,我还是想请您提供输出,因为我仍然不清楚您的服务器的网络设置是什么。

我相信你很快就会解决这个问题!:P

相关内容