Назад | Перейти на главную страницу

504 таймаут шлюза при доступе по имени хоста, но не по IP

Я использую Amazon EC2 с эластичной балансировкой нагрузки. В моем веб-приложении конечные пользователи, подключающиеся к app.myapp.com, получают ошибку тайм-аута шлюза 504 при выполнении определенных операций, таких как преобразование документа в PDF. В противном случае все приложение работает нормально.

Однако НЕТ ОШИБКИ при подключении к одному из серверов напрямую через IP-адрес и выполнении того же действия. Никогда.

В записях DNS моего регистратора я уже сделал запись CNAME, которая указывает app.myapp.com на мое DNS-имя Elastic Load Balancer, а затем за этим сидят экземпляры моих серверов. Примечание: точная проблема все еще возникает, даже когда я прекращаю использовать балансировщик нагрузки и указываю настройки DNS так, чтобы app.myapp.com перешел непосредственно на IP-адрес одного из моих серверов.

Суть в том, что эта операция, хотя URL-адреса жестко не запрограммированы, истекает при подключении к приложению через имя хоста >>, но никогда не происходит при подключении через IP-адрес. В течение нескольких месяцев я перепробовал практически все возможные способы устранения неполадок. Готов попробовать что-нибудь.

Резюме: что могло вызвать тайм-аут шлюза 504 при выполнении запросов с именем хоста, но не с IP?

ЗАПИСЬ МОИ СООТВЕТСТВУЮЩИЕ 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>

Добавить ServerName в вашей конфигурации VirtualHost с именем хоста, которое вы хотите использовать.

Починил это. В тандеме работали две основные проблемы, которые привели к этому ....

Основная проблема 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-адрес, который хосты Указанный файл существовал по адресу 42.139.126.191, хотя на самом деле на этом IP-адресе ничего не существовало, и, следовательно, «тайм-аут шлюза 504».

Еще одно, что я решил сделать: Вместо того, чтобы просто удалить проблемную третью строку, была добавлена ​​новая третья строка (см. Ниже), потому что мы решили, что нет причин направлять трафик на DNS-сервер только для того, чтобы этот DNS-сервер указывал обратно на тот же сервер, на котором был запрос. отправлено из (между прочим, туда и обратно). Регистратор, имеющий полномочия DNS - а хост находится в другой стране, действительно не имеет никакого смысла - поэтому избегайте этого, если можете.

Поэтому я добавил другую третью строку, чтобы обойти это (но мне, вероятно, следует сбросить мой старый регистратор и в любом случае использовать Amazon Route53):

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