通过主机名访问时出现 504 网关超时,但通过 IP 访问时则不会发生

通过主机名访问时出现 504 网关超时,但通过 IP 访问时则不会发生

我正在使用带有 Elastic Load Balancing 的 Amazon EC2。在我的基于 Web 的应用程序中,最终用户在执行某些操作(例如将文档转换为 PDF)时,连接到 app.myapp.com 时会收到 504 网关超时错误。否则,整个应用程序正常运行。

但是,当通过 IP 地址直接连接到其中一个服务器并执行相同操作时,不会出现任何错误。永远不会。

在我的注册商的 DNS 条目中,我已经创建了一个 CNAME 记录,该记录将 app.myapp.com 指向我的 Elastic Load Balancer DNS 名称,然后我的服务器实例位于其后面。注意:即使我停止使用负载均衡器并指向 DNS 设置,以便 app.myapp.com 直接转到我的其中一台服务器的 IP 地址,同样的问题仍然会发生。

最重要的是,虽然没有硬编码 URL,但当您通过主机名 >> 连接到应用程序时,此操作会超时,但通过 IP 地址连接时永远不会发生。几个月来,我尝试了几乎所有我能想到的故障排除步骤。愿意尝试任何方法。

概括:当使用主机名而不是 IP 发出请求时,什么可能导致 504 网关超时?

我的相关 VHOSTS 条目:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www/application/public
    <Directory /var/www/application/public>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            Allow from all
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} -s [OR]
            RewriteCond %{REQUEST_FILENAME} -l [OR]
            RewriteCond %{REQUEST_FILENAME} -d
            RewriteRule ^.*$ - [NC,L]
            RewriteRule ^.*$ index.php [NC,L]
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
            AllowOverride None
            Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
            Order allow,deny
            Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, cri$
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

答案1

在您的 VirtualHost 配置中添加一个ServerName您想要使用的主机名的属性。

答案2

已修复。有两个核心问题同时发生,导致了此问题……

核心问题1:当我查看 Ubuntu 的 /etc/hosts 文件时,尽管我不记得曾经编辑过它,但问题还是显而易见。第三行路由到一个不存在的服务器,我真希望知道为什么。第三行被删除了:

127.0.0.1 localhost
127.0.1.1 ubuntu-server
42.139.126.191 app.myapp.com

核心问题2:由于所有链接都是相对的,因此上述 hosts 文件的问题根本不重要。但出于某种原因,即使 PDF 生成工具仅使用相对链接,也有一行代码需要您指定域,这让我意识到代码中的某个地方正在对完整 URL 进行重写,hosts 文件称该 URL 存在于 42.139.126.191,但实际上该 IP 上不存在任何内容,因此出现“504 网关超时”错误。

我决定再做一件事:我们没有直接删除有问题的第三行,而是添加了新的第三行(见下文),因为我们认为没有必要将流量路由到 DNS 服务器,而该 DNS 服务器又会指向发送请求的同一服务器(顺便说一下,这是一次国际往返)。注册商拥有 DNS 权限——而主机位于不同的国家/地区,这确实毫无意义——所以如果可以的话,请避免这种情况。

因此我添加了第三行来解决这个问题(但无论如何我可能应该放弃我的旧注册商并使用亚马逊的 Route53):

127.0.0.1 localhost
127.0.1.1 ubuntu-server
127.0.0.1 app.myapp.com    

相关内容