मेरे उपयोग के मामले में मैं फ्रंटएंड जावास्क्रिप्ट में कुछ एपीआई का उपयोग कर रहा हूं। ये एपीआई एंडपॉइंट पोर्ट 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 के अलावा अन्य पोर्ट की अनुमति नहीं है।
मैं इस समस्या से कैसे छुटकारा पा सकता हूं?
क्या कोई इसमें मेरी मदद कर सकता है? धन्यवाद
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;
}
}
सबसे अच्छा समाधान केवल सुरक्षित कारण के लिए, पोर्ट 80 में एपीआई को बदलना है।
यदि नहीं, तो आप इस प्रश्न को jsonp द्वारा हल कर सकते हैं। जब आप 8081 एपीआई पर कॉल करते हैं, तो आप वेब पेज से केवल एक क्रॉस-डोमेन कॉल करते हैं।
यदि आप तय करते हैं कि आप jsonp का उपयोग करते हैं, तो यहां विस्तृत समाधान है।
JQuery के बिना जावास्क्रिप्ट से JSONP अनुरोध कैसे करें?
जो थकाऊ है और आपको ऐसा करने का सुझाव नहीं देता है।