问题描述
前后端分别部署在不同的服务器中,它们的访问域名不一致,前端访问域名是front.my.com,后端访问域名是server.my.com。为了解决跨域问题,前端调用后端接口通过nginx反向代理实现。
nginx配置
server{
listen 80;
server front.my.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location ^~ /api/ {
rewrite '^/api/(.*)' /$1 break;
proxy_pass http://server.my.com;
}
}
接口调用
通过反向代理调用接口:http://front.my.com/api/getUserData
报错信息
nginx报错:502 Bad Gateway
通过日志查看详细报错信息:
epoll_wait() reported that client prematurely closed connection, so upstream connection is closed too while sending request to upstream …
而且发现仅发出一次请求,日志中却无故出现了多条请求记录,因此猜测是nginx死循环造成。
问题分析
调用后端接口时(http://front.my.com/api/getUserData),front.my.com反向代理到server.my.com的url。server.my.com带请求头"front.my.com",又去请求front.my.com这个域名,造成了死循环。
解决办法
方式一:注释掉标记1处proxy_set_header Host $host;的代码
方式二:添加标记2处的代码
server{
listen 80;
server front.my.com;
#标记1-方式1
# proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location ^~ /api/ {
rewrite '^/api/(.*)' /$1 break;
proxy_pass http://server.my.com;
#标记2-方式2
proxy_set_header Host "server.my.com"; #host配置成后端服务器访问域名
}
}