我在 VPS 中部署了一个 Spring Boot 应用程序。我将其打包为war
并通过 Tomcat 管理器进行部署(<IP>:<Tomcat port>/manager/html
)。
如果我使用 VPS 的 IP 访问端点,例如http://<IP>:<Tomcat port>/api/login
,它可以正常工作。但是,如果我通过域名访问它,例如 ,它不起作用http://example.com:<Tomcat port>/api/login
。更具体地说,我进入了(failed) net::ERR_CONNECTION_TIMED OUT
Chrome 开发者工具的网络选项卡。
通过其他方式,我知道域名正确指向 VPS 的 IP。我四处搜索并尝试了以下解决方案:
- 配置反向代理通过 Apache;
- 编辑
server.xml
,将localhost
所有部分替换为域名; - 更改 Spring 过滤器中的请求域。
但这些都不起作用。
我也尝试了链接问题中的 nginx 解决方案,但在我看来,nginx 从未在此 VPS 上运行过,因为它nginx -t
因 VPS 附带的设置而失败。
由于我有一个 React 应用程序也由这个 VPS 部署,所以我认为让 Tomcat 使用端口 80 不是一个选择。
由于我找不到任何其他解决方案,我该怎么办?
更新 1:apachectl -S
忘记按照描述添加输出阿帕奇-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 的过滤器。
答案1
您应该做的第一件事是捕获客户端的网络流量。您应该捕获正常工作和不正常工作两种情况下的流量。
然后比较两者,找出它们在哪些方面表现不同。很可能它们并不是同时访问同一个 IP 地址。
还有其他解释。如果两者都与同一 IP 建立连接并发送请求,但只有一个收到响应,则可能是服务器处理请求的时间更长,或者服务器产生更长的响应并触发 MTU 问题。
答案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
。