Nginx proxy_pass 配置
我正在一个域上设置一个 Angular 应用,该应用需要访问另一个域上的 API。这似乎运行良好。在我的 services.js 中,我有一个 service.factory,其中包含:
return $resource('/api/user/:email/:password',....
通常,这个“$resource”只是同一服务器/域上的另一个位置。但是,由于 JavaScript 跨域的限制...实现这一壮举的一种方法是让 Web 服务器进行抓取。
从我对 Nginx 资源的阅读来看,这可以在服务器配置文件中完成。我相信“location”指令列表应该从复杂到简单。我想我已经尝试了以下代码的所有排列(“upstream”和“location”中有和没有尾部斜杠,各种不同的“proxy_set_...”配置等)。
我就是无法让它正常工作。在我的 error.log 中,Web 服务器正在寻找该文件但找不到它。这是正确的,因为路径实际上位于另一台(API)服务器上:
"2014/03/23 13:38:11 [error] 24529#0: *1 open() "/var/www/dev.mydomain.com/htdocs/api/user/[email protected]/asoetus" failed (2: No such file or directory), client:..."
我希望当 Nginx 看到对 URI dev.mydomain.com/api/user/:email/:password 的调用时(它实际上会去获取 api.saasdomain.com/api/user/:email/:password,它确实有效并返回 JSON 响应。实际上它应该获取 /api 目录中的任何内容,无论是 /user/ 还是 /book/ 或 /whatever/)。
nginx 错误日志中没有真正的错误,所以我猜 nginx 甚至没有监听 proxy_pass 调用。???(有一个 bind() 错误,但我有许多其他由 nginx 服务的服务器,只是找到,所以我将忽略此 bind() 错误以供讨论。)好的,我刚刚在 error_log 指令的末尾添加了 debug。以下是 debug nginx error.log 的输出http://freetexthost.com/30yxfss4r4
有什么想法吗?
在 /etc/nginx/conf.d/virtual.conf 文件中:
[snip]
upstream api_alias {
server api.saasdomain.com;
}
server {
listen 80;
server_name dev.mydomain.com;
access_log /var/www/dev.mydomain.com/logs/access.log;
error_log /var/www/dev.mydomain.com/logs/error.log;
location /api/ {
resolver 8.8.8.8;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://api_alias/;
proxy_ssl_session_reuse off;
proxy_set_header Host $host;
proxy_redirect off;
proxy_buffering off;
}
location / {
root /var/www/dev.mydomain.com/htdocs/;
index index.html;
}
[/snip]
答案1
在第 61 行或调试日志中,您会看到请求实际上是向远程服务器发出的,因为您缺少 /api/。尝试像这样设置 proxy_pass 指令:GET /user/[email protected]/aoeu HTTP/1.0
proxy_pass http://api_alias/api/;