Elastic LoadBalancingでAmazonEC2を使用しています。私のWebベースのアプリケーションでは、エンドユーザーがapp.myapp.comに接続すると、ドキュメントをPDFに変換するなどの特定の操作を実行すると、504ゲートウェイタイムアウトエラーが発生します。それ以外の場合、アプリケーション全体は正常に機能しています。
ただし、IPアドレスを介してサーバーの1つに直接接続し、同じアクションを実行する場合、エラーは発生しません。決して。
レジストラのDNSエントリで、app.myapp.comがElastic Load Balancer DNS名を指すCNAMEレコードをすでに作成しており、サーバーインスタンスがその背後にあります。注:ロードバランサーの使用を停止し、DNS設定を指定して、app.myapp.comがいずれかのサーバーのIPアドレスに直接アクセスするようにしても、正確な問題が発生します。
要するに、この操作は、URLがハードコーディングされていなくても、ホスト名>>を介してアプリケーションに接続するとタイムアウトになりますが、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>
使用するホスト名を使用して、VirtualHost構成にServerName
属性を追加します。
修正しました。これを引き起こした2つのコア問題が連携して動作していました。
コアの問題1: Ubuntuの/ etc/hostsファイルを見ると、編集した記憶がありませんでしたが、問題が明らかになりました。 3行目は、存在しないサーバーへのルーティングでした。その理由を本当に知りたいと思います。この3行目は削除されました:
127.0.0.1 localhost
127.0.1.1 ubuntu-server
42.139.126.191 app.myapp.com
コアの問題2:すべてのリンクは相対的であるため、上記のhostsファイルの問題は問題ではありません。しかし、何らかの理由で、PDF生成ツールは相対リンクのみを使用しますが、ドメインを指定する必要があるコード行があり、それがコード内のどこかにあることを私に教えてくれましたホストファイルが42.139.126.191に存在すると言った完全なURLの書き換えを行うと、実際にはそのIPには何も存在しなかったため、「504ゲートウェイのタイムアウト」が発生しました。
私がやろうと決めたもう1つのこと:問題のある3行目を削除する代わりに、DNSサーバーのみにトラフィックをルーティングする理由がないと判断したため、新しい3行目(以下を参照)が追加されましたそのDNSサーバーが、要求の送信元と同じサーバーを指すようにします(ちなみに、国際ラウンドトリップ)。 DNS権限を持つレジストラ(およびホストが別の国にあること)はまったく意味がないため、可能であればこれを避けてください。
そこで、これを回避するために別の3行目を追加しました(ただし、古いレジストラをダンプして、とにかくAmazonのRoute53を使用する必要があります)。
127.0.0.1 localhost
127.0.1.1 ubuntu-server
127.0.0.1 app.myapp.com