Конечные точки Spring работают с IP, но не с именем домена. Как исправить?
У меня есть приложение Spring Boot, развернутое в VPS. Я упаковал это как war
и развернул его через менеджер Tomcat (<IP>:<Tomcat port>/manager/html
).
Это работает, если я получаю доступ к конечным точкам, используя IP-адрес VPS, такой как http://<IP>:<Tomcat port>/api/login
, Тем не менее, это не работает, если я обращаюсь к нему по имени домена, например http://example.com:<Tomcat port>/api/login
, Более конкретно я получаю (failed) net::ERR_CONNECTION_TIMED OUT
на вкладке "Сеть" в Chrome Developer Tools.
Другими словами, я знаю, что домен правильно указывает на IP-адрес VPS. Я искал вокруг и пробовал следующие решения:
- Настроить обратный прокси через Apache;
- редактировать
server.xml
, заменяяlocalhost
по доменному имени везде; - Измените домен запроса в фильтре Spring.
Но ничего из этого не сработало.
Я также попробовал решение nginx из связанного вопроса, но мне кажется, что nginx никогда не работал на этом VPS, так как он не работает nginx -t
с настройкой, которая пришла с VPS.
Поскольку у меня есть приложение React, которое также разворачивается этим VPS, я думаю, что использование Tomcat для порта 80 не вариант.
Так как я не могу найти никакого другого решения, что я могу сделать?
Обновление 1: забыл добавить apachectl -S
вывод согласно описанию apache-2.4 (анонимный):
[Fri Sep 21 13:42:06.248978 2018] [proxy_html:notice] [pid 29712] AH01425: I18n support in mod_proxy_html requires mod_xml2enc. Without it, non-ASCII characters in proxied pages are likely to display incorrectly.
VirtualHost configuration:
<VPS IP>:8080 example.com (/home/<user>/conf/web/example.com.apache2.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex fcgid-pipe: using_defaults
Mutex watchdog-callback: using_defaults
Mutex proxy-balancer-shm: using_defaults
Mutex rewrite-map: using_defaults
Mutex fcgid-proctbl: using_defaults
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/var/run/apache2/" mechanism=default
Mutex mpm-accept: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33
Обновление 2: приложение React перестало работать. Я последовал совету nginx -t
, исправил, перезапустил и снова начал работать. Есть шанс, что я сломал что-то, связанное с этим, пытаясь реализовать обратный прокси-сервер, поэтому, вероятно, не обращайте внимания на приведенный выше комментарий.
Обновление 3: также забыл о попытке изменить фильтр Spring.
2 ответа
В конце концов мне удалось заставить это работать, но я изменил так много вещей, что не помню, что именно сделал.
Но я знаю, что это как-то связано с nginx и Apache. По сути, вы оставите Spring таким, какой он есть, и сконфигурируете те, которые получают соединения до Spring, чтобы они правильно получали и перенаправляли их туда, где Spring сопоставлен (т.е. localhost).
Я думаю, что это настройка nginx, чтобы заставить его работать:
/etc/apache2/sites-enabled/domain.com.conf
server {
server_name domain.com;
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:<spring_port>;
}
}
Узнайте ваш основной файл nginx с nginx -t
, отредактируйте этот файл и добавьте include /etc/apache2/sites-enabled/domain.com.conf
внутри http
часть.
Первое, что вы должны сделать, это перехватить сетевой трафик на стороне клиента. Вы должны захватывать трафик для случая, когда он работает и где он не работает.
Затем сравните эти два, чтобы узнать, в какой момент они ведут себя по-разному. Вполне вероятно, что они оба не обращаются к одному и тому же IP-адресу.
Возможны и другие объяснения. Если оба устанавливают соединение с одним и тем же IP-адресом и отправляют запрос, но только один получает ответ, это может быть связано с тем, что либо серверу требуется больше времени для обработки запроса, либо сервер выдает более длинный ответ и вызывает проблему MTU.