我之前发过这个问题,但我觉得可能是我写得不够清楚。所以我删除了它,现在再次发布,并附上我能想到的尽可能多的信息。
我使用戴尔 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.com
。nslookup 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,或者您需要编辑hosts
LAN 设备的文件,以便通过 LAN 内的域名访问您的 (Web) 服务器。有关更多详细信息,请阅读以下参考资料:
答案3
经过大量的时间和研究,我终于搞清楚了。虽然存在很多问题,但主要的解决办法是,例如,<virtualhost 192.168.1.23 askubuntu.com:80>
这现在可以与多个虚拟主机配合使用。
我在通过端口 443 提供 http 服务时确实遇到了一些问题,还有其他问题。解决此问题后,我重新格式化了整个磁盘并重新安装了所有内容。
现在运行起来非常顺畅!
谢谢大家的帮助!