简体   繁体   English

在nginx上托管静态angular2应用程序并将http请求代理到后端api

[英]Hosting static angular2 app on nginx and proxying http requests to backend api

How do I get angular2 routes to work and proxy http requests to a rest api on another machine? 如何让angular2路由工作并将http请求代理到另一台机器上的rest api?

I have an angular2 web application on an nginx server which serves the static html files. 我在nginx服务器上有一个angular2 web应用程序,它提供静态html文件。 I have a separate rest api hosted on a different machine with a different IP address. 我在另一台具有不同IP地址的计算机上托管了一个单独的rest api。 I have set the location to / in my nginx config file to allow the angular2 routes to work correctly. 我已将位置设置为/在我的nginx配置文件中,以允许angular2路由正常工作。 I have also added a location /api/ which i hoped would intercept any api requests and proxy them to my backend api. 我还添加了一个位置/ api /我希望拦截任何api请求并将它们代理到我的后端api。

My nginx conf with proxy set to http://swapi.co for test purposes. 我的nginx conf代理设置为http://swapi.co用于测试目的。

events {
  worker_connections  4096;  ## Default: 1024
}

http {
  server {
    listen       80;
    server_name  localhost;

    root   /usr/share/nginx/html;
    index  index.html index.htm;
    include /etc/nginx/mime.types;

    location / {
         # If you want to enable html5Mode(true) in your angularjs app for pretty URL
         # then all request for your angularJS app will be through index.html
         try_files $uri /index.html;
    }

    # /api will server your proxied API that is running on same machine different port
    # or another machine. So you can protect your API endpoint not get hit by public directly
    location /api/ {
        proxy_pass http://swapi.co;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    #Static File Caching. All static files with the following extension will be cached for 1 day
    location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1d;
    }
  } 
}

My angular2 service 我的angular2服务

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class Service {

  private url: string = '/api/people/';
  constructor (private http: Http) {}

  getPeople () {
    return this.http.get(this.url)
                  .map(res => res.json());
  }
}

Any help would be much appreciated. 任何帮助将非常感激。

Got it to proxy requests correctly in my development environment. 得到它在我的开发环境中正确代理请求。 Added to the http block and pointed proxy pass to the upstream api value 添加到http块并指向代理传递给上游api值

upstream api {
  server 192.168.0.15:9998;
}

Complete config: 完整配置:

events {
  worker_connections  4096;  ## Default: 1024
}

http {

  # Change this depending on environment
  upstream api {
    server 192.168.0.1:9998;
  }

  server {
    listen       80;
    server_name  localhost;

    root   /usr/share/nginx/html;
    index  index.html index.htm;
    include /etc/nginx/mime.types;

    location / {
      # If you want to enable html5Mode(true) in your angularjs app for pretty URL
      # then all request for your angularJS app will be through index.html
      try_files $uri /index.html;
    }

    # /api will server your proxied API that is running on same machine different port
    # or another machine. So you can protect your API endpoint not get hit by public directly
    location /api {
      proxy_pass http://api;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection 'upgrade';
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    #Static File Caching. All static files with the following extension will be cached for 1 day
    location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
      expires 1d;
    }
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM