Apache 虚拟主机问题还是 DNS 问题?

Apache 虚拟主机问题还是 DNS 问题?

我之前发过这个问题,但我觉得可能是我写得不够清楚。所以我删除了它,现在再次发布,并附上我能想到的尽可能多的信息。

我使用戴尔 Dimension 2400 的旧计算机部件创建了一台服务器。我安装了带有 Linux 4.15.0-72-generic 内核的 Ubuntu 16.04.6 LTS。我安装了 mysql-server、apache2、certbot、pyton3、python-apache-certbot、php7.0、ssh、vsftpd,然后将我安装所需的端口转发到内部 ip。(192.168.1.23)。

然后我在服务器上设置了一个 wordpress 网站。问题是我设置了虚拟主机文件(如下所示),但为了使网站正常运行,我必须使用网络内部 ip 来加载网站。


这是虚拟主机文件:

    <IfModule mod_ssl.c>
<VirtualHost 192.168.1.23:443>
        # 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/domain.com/public_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
ServerName domain.com
SSLCertificateFile /etc/letsencrypt/live/domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
~

请记住这是正在工作的虚拟主机。

当我将其更改为域名(domain.com:443)时,它不起作用。

(端口 80 上也存在同样的问题。)

我是否需要内部 DNS 或者其他什么?

我尝试安装 bind,但要么是我把它搞砸了,要么就是事实并非如此......或者两者兼而有之......老实说,我更倾向于两者兼而有之。

无论如何,我希望这些信息足够了,并且有人能够对此有所启发。我希望能够在这台服务器上托管另一个网站。

答案1

ServerName指令仅供 Apache 使用,用于了解其以哪个域运行(在某些情况下,它用于根据域区分多个 VirtualHost)。它对尝试解析域的客户端没有影响。

您需要进行哪些更改完全取决于您的设置。

如果您想使用域名,您仍然需要告诉客户端计算机它指向哪台 PC。这可以通过系统的文件来完成hosts(设置起来更容易,尤其是对于测试,但为每台计算机设置起来很麻烦),也可以通过您自己的 DNS 服务器来完成(设置起来有点困难,也不太容易正确,但最终会更灵活)。(如果您使用的是“官方”域名(而非您自己发明的域名),则不适用此规定。除非您想在本地网络中将 domain.com 解析为您的内部 IP。

要检查域名本身是否设置正确,请ifconfig -a通过类似以下页面检查服务器上的公共 IP(或通过 的本地 IP,具体取决于您的设置)ifconfig.co并将其与 或 返回的 IP 进行比较dig domain.comnslookup domain.com如果它们返回相同的 IP,则您的域名已正确设置为指向您的公共 IP。如果没有,您将不得不更改域名指向的位置,但我对此真的无能为力。

如果您想从公共互联网访问该页面,则必须担心 NAT。NAT(即“网络地址转换”)通过单个公共 IP 处理多个内部设备的通信(您的情况可能设置了类似的情况)。您的路由器目前不知道应该将端口 80/443 上的传入数据包发送到哪台计算机,这可能是导致问题的一个可能原因。要正确设置它,请搜索如何在特定路由器上设置“端口转发”,并将其设置为将端口 80 和 443 上的所有传入 TCP 数据包发送到本地网络中服务器上的同一端口。

您可能还需要注意 VirtualHost 指令,其中专门放置了您的本地 IP(尽管我无法想象这是您当前设置中的问题,其他原因更可能)。这基本上告诉 Apache 只监听该特定 IP 上的传入连接。设置 NAT 后,这应该没问题,因为请求被发送到您的本地网络接口。如果在完成其他步骤后仍然遇到问题,您可能需要尝试用星号替换该 IP 地址,使 Apache 监听所有接口。这将消除另一个(如果非常小)可能导致错误的原因。

答案2

ServerName指令用于定义虚拟主机将接受的默认域名(以及ServerAlias默认域名的同义词)。此外,您不需要在标记内指定网络接口 IP 添加器(或域名)<VirtualHost>,只要您没有任何特殊目标 - 即为通过不同服务器的 IP 地址访问的同一域名提供不同的内容等。

<IfModule mod_ssl.c>

    <VirtualHost _default_:443>

        ServerName example.com
        ServerAlias www.example.com www2.example.com

        # Other configuration directives...

    </VirtualHost>

</IfModule>

除非没有指向您服务器的公网 IP 地址的 FQDN,否则您需要设置本地 DNS,或者您需要编辑hostsLAN 设备的文件,以便通过 LAN 内的域名访问您的 (Web) 服务器。有关更多详细信息,请阅读以下参考资料:

答案3

经过大量的时间和研究,我终于搞清楚了。虽然存在很多问题,但主要的解决办法是,例如,<virtualhost 192.168.1.23 askubuntu.com:80>这现在可以与多个虚拟主机配合使用。

我在通过端口 443 提供 http 服务时确实遇到了一些问题,还有其他问题。解决此问题后,我重新格式化了整个磁盘并重新安装了所有内容。

现在运行起来非常顺畅!

谢谢大家的帮助!

相关内容