मेरे उपयोग के मामले में मैं फ्रंटएंड जावास्क्रिप्ट में कुछ एपीआई का उपयोग कर रहा हूं। ये एपीआई एंडपॉइंट पोर्ट 80 के अलावा अन्य पोर्ट नंबर का उपयोग करते हैं।

मेरा एप्लिकेशन फ़ोल्डर संरचना नीचे जैसा दिखता है,

app/
   view-events.js
   view.html

पोर्ट 80 और 8081 में क्रमशः दो सर्वर चल रहे हैं। domain.com/view/ एपीआई 80 से वापस कर दिया जाएगा। यह view-events.js कुछ एपीआई जैसे http://domain.com:8081/api/services/featured-data/ का उपयोग करता है।

इसलिए जब मैं http://www.domain.com/view/ को कॉल करता हूं तो पृष्ठ लोड होता है लेकिन http://domain.com:8081/api/services/featured-data/ के घटक लोड नहीं हो रहे हैं। यह केवल कुछ नेटवर्क [ज्यादातर कॉर्पोरेट नेटवर्क] में होता है। क्योंकि कुछ कॉर्पोरेट नेटवर्क में 80 के अलावा अन्य पोर्ट की अनुमति नहीं है।

मैं इस समस्या से कैसे छुटकारा पा सकता हूं?

क्या कोई इसमें मेरी मदद कर सकता है? धन्यवाद

0
Dany 20 जुलाई 2016, 09:50
ठीक है, यह मानते हुए कि आप उन कॉर्पोरेट नेटवर्क को नहीं बदल सकते हैं, आपको स्पष्ट रूप से पोर्ट 80 पर भी अपने एपीआई की सेवा करनी होगी।
 – 
Bergi
20 जुलाई 2016, 10:17

2 जवाब

सबसे बढ़िया उत्तर

ऐसा करने का सामान्य तरीका है किसी प्रकार का रिवर्स प्रॉक्सी (आमतौर पर Apache a> या nginx या HAProxy) पोर्ट 80 पर चल रहा है, और क्या यह अनुरोधों को उपयुक्त एपीआई तक रूट करता है (चूंकि पोर्ट पर केवल एक ही सेवा चल सकती है, उदाहरण के लिए आपका एपिस तब चलेगा 8081, 8082, आदि पर)। (यह एक सेवा के साथ भी सामान्य सेटअप है जो पोर्ट 80 पर नहीं चल रहा है, उदाहरण के लिए आप अक्सर 8080 पर चल रहे टॉमकैट के सामने अपाचे को 80 पर चल रहे पा सकते हैं)।

अपाचे के लिए उदाहरण .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>

और यहां ऐप और एपीआई [दो सर्वर] के लिए एक नमूना nginx conf है:

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;
  }
}
1
Dany 21 जुलाई 2016, 06:58
आपके उत्तर के लिए धन्यवाद। आप से मिली मदद मेरे लिए सच में सराहनीय है। मैंने अपनी चर्चा के आधार पर nginx से शुरुआत की। क्या आपके पास कोई nginx conf है? यह बहुत मददगार होगा। मैं nginx-reverse-proxy सेटअप का अनुसरण कर रहा हूं
 – 
Dany
20 जुलाई 2016, 11:37
मैंने अभी एक नमूना nginx conf जोड़ा है
 – 
Dany
21 जुलाई 2016, 05:12
अच्छा, खुशी हुई इससे मदद मिली
 – 
Dusan Bajic
22 जुलाई 2016, 11:05

सबसे अच्छा समाधान केवल सुरक्षित कारण के लिए, पोर्ट 80 में एपीआई को बदलना है।

यदि नहीं, तो आप इस प्रश्न को jsonp द्वारा हल कर सकते हैं। जब आप 8081 एपीआई पर कॉल करते हैं, तो आप वेब पेज से केवल एक क्रॉस-डोमेन कॉल करते हैं।

यदि आप तय करते हैं कि आप jsonp का उपयोग करते हैं, तो यहां विस्तृत समाधान है।

JQuery के बिना जावास्क्रिप्ट से JSONP अनुरोध कैसे करें?

जो थकाऊ है और आपको ऐसा करने का सुझाव नहीं देता है।

0
Community 23 मई 2017, 15:08
धन्यवाद कंगबिन। मैं दोनों सर्वरों को चलाने के लिए सिंगल ec2 इंस्टेंस का उपयोग कर रहा हूं। पोर्ट 80 पर चलने के लिए मुझे एक और उदाहरण लॉन्च करना होगा [जिसकी लागत अतिरिक्त है और यह अनावश्यक है। यह एक बहुत छोटा अनुप्रयोग है]। अन्यथा मुझे दोनों एपीआई के लिए एक ही सर्वर का उपयोग करने के लिए कोड बदलने की जरूरत है। ऐसा करने के लिए कोई और रास्ता नहीं है?
 – 
Dany
20 जुलाई 2016, 11:02
आपको स्थिति मिली। जैसा कि मैंने कहा, आप अपने 8081 एपीआई को 80 पर ले जा सकते हैं, या 8081 से डेटा प्राप्त करने के लिए केवल जेसनपी का उपयोग कर सकते हैं, जिसके लिए आपको अपनी 8081 एपीआई रिटर्न डेटा संरचना को संशोधित करने की आवश्यकता है। यह मेरा समाधान है, आशा है कि आपके लिए मददगार :)
 – 
kangbin
20 जुलाई 2016, 11:36