2016-07-20 3 views
0

私の使用例では、フロントエンドのjavascriptでいくつかのAPIを使用しています。これらのAPIエンドポイントはポート80どのネットワークからでも別のポートを使ってapiにアクセスするには?

以外の別のポート番号を使用して私のアプリケーションのフォルダ構造は以下のように見える、それぞれポート80と8081で実行している2台のサーバーが

app/ 
    view-events.js 
    view.html 

があります。 domain.com/view/ apiは80から返されます。このview-events.jsは、http://domain.com:8081/api/services/featured-data/のようないくつかのAPIを使用します。

http://www.domain.com/view/と呼ぶと、ページはロードされますが、http://domain.com:8081/api/services/featured-data/のコンポーネントはロードされません。これは少数のネットワーク[主に企業ネットワーク]でのみ発生します。一部の企業ネットワークでは80以外のポートは許可されていないためです。

どうすればこの問題を解決できますか?

誰かが私にこれを手伝ってもらえますか?ありがとう

+0

さて、あなたがそれらを変更することはできませんと仮定企業ネットワークでは、明らかにポート80でもAPIを提供する必要があります。 – Bergi

答えて

1

これを行うには、通常の方法では、ポート80上で実行されているリバースプロキシ(通常はApacheまたはnginxまたはHAProxy)のいくつかの種類を持っていることであり、唯一のサービスがポート上で実行することができますので、それは(適切なAPIにリクエストを敗走していますあなたのapisは8081、8082などで実行されます)。 (これはポート80で動作していない1つのサービスでも一般的な設定です。たとえば8080上で実行されているTomcatの前でApacheが80で動作していることがよくあります。

Apacheの例の.confは次のようになります。

<VirtualHost *:80> 
    ServerName example.com 

    DocumentRoot /var/www/html/static-html-for-example.com-if-needed 

    <Directory /var/www/html/static-html-for-example.com-if-needed> 
    Options +Indexes 
    Order allow,deny 
    Allow from all 
    </Directory> 

    #LogLevel debug 
    ErrorLog logs/error_log 
    CustomLog logs/access_log common 

    ProxyPass  /api1 http://127.0.0.1:8081/api1 
    ProxyPassReverse /api1 http://127.0.0.1:8081/api1 

    ProxyPass  /api2 http://127.0.0.1:8082/api2 
    ProxyPassReverse /api2 http://127.0.0.1:8082/api2 

    # backend api even does not have to be on the same server, it just has to be reachable from Apache 
    ProxyPass  /api3 http://10.10.101.16:18009/api3 
    ProxyPassReverse /api3 http://10.10.101.16:18009/api3 
</VirtualHost> 

そしてここでは、アプリやAPIのサンプルnginxのconfにある[2台のサーバ]:

upstream app { 
    server 127.0.0.1:9090; 
    keepalive 64; 
} 

upstream api { 
    server 127.0.0.1:8081; 
    keepalive 64; 
} 

# 
# The default server 
# 
server { 
    listen 80; 
    server_name _; 

    location /api { 
    rewrite /api/(.*) /$1 break; 
    proxy_pass http://api; 
    proxy_redirect off; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-NginX-Proxy true; 
    real_ip_header  X-Forwarded-For; 
     real_ip_recursive on; 
    #proxy_set_header Connection ""; 
    #proxy_http_version 1.1; 
    } 

    location /{ 
    rewrite /(.*) /$1 break; 
    proxy_pass http://app; 
    proxy_redirect off; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-NginX-Proxy true; 
    real_ip_header  X-Forwarded-For; 
     real_ip_recursive on; 
    #proxy_set_header Connection ""; 
    #proxy_http_version 1.1; 
    } 

    # redirect not found pages to the static page /404.html 
    error_page 404 /404.html; 
    location = /404.html { 
    root /usr/share/nginx/html; 
    } 

    # redirect server error pages to the static page /50x.html 
    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
    root /usr/share/nginx/html; 
    } 
} 
+0

あなたの答えをありがとう。私は本当にあなたの助けに感謝します。私は、私たちの議論に基づいてnginxを使い始めました。あなたが持っているnginxのconfはありますか?非常に役に立ちます。私は[nginx-reverse-proxy](https://www.nginx.com/resources/admin-guide/reverse-proxy/)の設定に従っています – Dany

+0

サンプルnginx confを追加しました – Dany

+0

nice、glad this helped –

0

ベストソリューションは、安全な理由から、ポート80でapiを変更することです。

もしそうでなければ、あなたはjsonpによってこの問題を解決できます。 8081 APIを呼び出すと、ウェブページからクロスドメインコールを行うだけです。

jsonpを使用することを決定した場合は、ここをクリックしてください。面倒であり、あなたがそう示唆してい

How to make a JSONP request from Javascript without JQuery?

+0

ありがとうございます。私は両方のサーバーを実行するために単一ec2インスタンスを使用しています。ポート80で実行するには別のインスタンスを起動する必要があります[余分な費用と不要です。それは非常に小さなアプリケーションです]。他の賢明なのは、両方のAPIに同じサーバーを使用するようにコードを変更する必要があるということです。これを行う他の方法はありますか? – Dany

+0

あなたに状況があります。私が言ったのと同じように、あなたはあなたの8081 apiを80に移動することができます。または、単に8081からデータを取得するためにjsonpを使用してください。8081 apiリターンデータ構造を変更する必要があります。それは私の解決です、あなたに役立つことを願って:) – kangbin

関連する問題