我已经在虚拟机上安装了 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
之一是,它可让您检查套接字统计信息。您可以使用 查阅手册页,但长话短说,您需要运行。此调用利用了以下选项:iproute2
ss
man ss
ss -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),并且它绑定到80
HTTP 的默认端口,如您在上面链接的 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。
那么肯定是网络配置的问题...
现在我们可以确定三件事:
apache2
在跑。- 它正在监听端口 80。
- 默认站点已启用。
请记住,我们将包含的所有网络命令都将在虚拟机上运行,不是在主机上,除非我们明确声明我们想要在主机上运行命令。
这意味着错误很可能出在你的主机和虚拟机之间的网络配置上。首先,你不能使用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