Apache और Node.js एक ही सर्वर पर


352

मैं नोड का उपयोग करना चाहता हूं क्योंकि यह तेज है, उसी भाषा का उपयोग करता हूं जिसका उपयोग मैं ग्राहक पक्ष पर कर रहा हूं, और यह परिभाषा द्वारा गैर-अवरुद्ध है। लेकिन जिस आदमी को मैंने फ़ाइल हैंडलिंग (बचत, संपादन, नाम बदलने, डाउनलोड करने, फ़ाइलों को अपलोड करने, आदि) के लिए कार्यक्रम लिखने के लिए काम पर रखा था, वह अपाचे का उपयोग करना चाहता है। तो, मुझे चाहिए:

  1. उसे नोड का उपयोग करने के लिए मना लें (वह उस पर थोड़ा जमीन दे रहा है)

  2. नोड में फ़ाइलों को अपलोड करने, डाउनलोड करने, नाम बदलने, सहेजने, आदि का पता लगाएं

  3. मुझे एक ही सर्वर पर अपाचे और नोड स्थापित करना होगा।

सबसे अनुकूल स्थिति कौन सी है, और मैं इसे कैसे लागू करूं?

जवाबों:


704

बड़ा सवाल!

PHP में कई वेबसाइट और फ्री वेब एप्स को लागू किया गया है जो अपाचे पर चलते हैं, बहुत से लोग इसका उपयोग करते हैं ताकि आप कुछ आसान तरीके से मैश कर सकें और इसके अलावा, यह स्टैटिक कंटेंट परोसने का एक नो-ब्रेनर तरीका है। नोड तेज, शक्तिशाली, सुरुचिपूर्ण और वी 8 की कच्ची शक्ति के साथ एक सेक्सी उपकरण है और बिना किसी निर्भरता के साथ एक फ्लैट स्टैक है।

मैं अपाचे की सहजता / लचीलापन भी चाहता हूं और फिर भी नोड.जेएस की किरकिरी और लालित्य, मैं दोनों क्यों नहीं कर सकता हूं ?

सौभाग्य से Apache में ProxyPass निर्देश के साथ httpd.confअपने Node.JS एप्लिकेशन के लिए किसी विशेष URL पर सभी अनुरोधों को पाइप करने के लिए बहुत मुश्किल नहीं है।

ProxyPass /node http://localhost:8000

इसके अलावा, सुनिश्चित करें कि निम्नलिखित पंक्तियों पर टिप्पणी नहीं की गई है ताकि आप सही प्रॉक्सी प्राप्त कर सकें और http अनुरोधों को पुनः सबमिट करें:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

फिर पोर्ट 8000 पर अपना नोड ऐप चलाएं!

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Apache!\n');
}).listen(8000, '127.0.0.1');

फिर आप /node/अपने url पर पथ का उपयोग करके सभी Node.JS लॉजिक का उपयोग कर सकते हैं , बाकी वेबसाइट को आपके मौजूदा PHP पृष्ठों को होस्ट करने के लिए Apache पर छोड़ा जा सकता है:

यहां छवि विवरण दर्ज करें

अब केवल एक चीज बची हुई है जो आपकी होस्टिंग कंपनी को इस कॉन्फ़िगरेशन के साथ चलने देती है !!!


6
यह एक शानदार जवाब था, बस प्रॉक्सी पास पर थोड़ी और जानकारी के साथ एक लिंक जोड़ना चाहता था जो मैं इस काम के लिए उपयोग करता था। टिप्पणियों की भी जाँच करें। boriskuzmanovic.wordpress.com/2006/10/20/…
एलेक्स

11
मैंने एक वर्चुअल होस्ट कंटेनर के अंदर "ProxyPass / 127.0.0.1:8000 " डालने का परीक्षण किया और एक नोड उदाहरण के लिए पूरे डोमेन समूह को सफलतापूर्वक रीडायरेक्ट करने में सक्षम था। मैंने अपाचे पर इसे एक्सेस करने के लिए सीधे नोड तक पहुंचने की गति की तुलना करने के लिए "टाइम वेट ..." के साथ परीक्षण किया। 30 जोड़ी परीक्षणों में, औसत अंतर लगभग 0.56ms था। अपाचे के माध्यम से और दोनों के लिए सबसे कम लोड समय 120ms था। उच्चतम लोड का समय प्रत्यक्ष के लिए 154ms और अपाचे के माध्यम से 164 था। महत्वपूर्ण अंतर नहीं है। अगर मेरे पास दो IP का लक्ज़री होता तो मैं Apache के माध्यम से रूट नहीं करता, लेकिन अब मैं Proxypass के साथ चिपकेगा
kaan_a

5
क्या यह प्रॉक्सी अपाचे से नोड के लिए अनुरोध नहीं करता है, जबकि यह नोड के गैर-अवरुद्ध प्रकृति के लाभों को दूर करता है?
ट्रेस

2
हाय @ बस्ज, मुझे न तो खुद वेबस्केट के लिए समर्थन स्थापित करने का अनुभव है। कहा जा रहा है कि, अपाचे 2.4.6 का उपयोग करने के साथ वेबस्कैट ट्रैफ़िक के लिए समर्थन करने के लिए प्रतीत होता है mod_proxy_wstunnel। मैं देख रहा हूं कि आपको अब अपना जवाब मिल गया है, दूसरों के लिए भी इसी समस्या के लिए कृपया देखें: serverfault.com/questions/616370/…
Steven de Salas

4
मैं इसे डेबियन आधारित वितरण पर कहां जोड़ूं? कोई httpd.conf फ़ाइल नहीं है।
संतति

63

यह सवाल सर्वर फाल्ट पर अधिक है लेकिन FWIW मैं कहूंगा कि Node.js के सामने अपाचे चलाना ज्यादातर मामलों में अच्छा दृष्टिकोण नहीं है।

Apache's ProxyPass बहुत सी चीज़ों के लिए कमाल है (जैसे कि साइट के हिस्से के रूप में Tomcat आधारित सेवाओं को उजागर करना) और यदि आपका Node.js ऐप केवल एक विशिष्ट, छोटी भूमिका कर रहा है या एक आंतरिक उपकरण है, जिसमें केवल सीमित संख्या में उपयोगकर्ता होने की संभावना है तो फिर इसे इस्तेमाल करना आसान हो सकता है ताकि आप इसे काम कर सकें और आगे बढ़ सकें, लेकिन यह यहाँ की तरह नहीं है।

यदि आप Node.js का उपयोग करने से प्राप्त होने वाले प्रदर्शन और पैमाने का लाभ उठाना चाहते हैं - और विशेष रूप से यदि आप किसी ऐसी चीज़ का उपयोग करना चाहते हैं जिसमें वेब सॉकेट जैसे लगातार संबंध बनाए रखना शामिल है - तो आप अपाचे और अपने नोड दोनों को चलाने से बेहतर हैं। अन्य बंदरगाहों पर js (जैसे कि लोकलहोस्ट पर अपाचे: 8080, स्थानीयहोस्ट पर Node.js: 3000) और उसके बाद nginx, वार्निश या हा प्रॉक्सी जैसे कुछ चलाना - और इस तरह से ट्रैफ़िक को रूट करना।

वार्निश या नगीनेक्स जैसी किसी चीज़ के साथ आप पथ और / या होस्ट के आधार पर ट्रैफ़िक रोक सकते हैं। वे दोनों बहुत कम सिस्टम संसाधनों का उपयोग करते हैं और बहुत अधिक स्केलेबल हैं जो समान कार्य करने के लिए अपाचे का उपयोग करते हैं।


13
इस उत्तर में अधिक उत्थान होना चाहिए। यह निश्चित रूप से बहुत बेहतर है अपाचे एक की तुलना में nginx प्रॉक्सी का उपयोग करने के लिए।
रीरिख

हां, लेकिन यह संसाधन गहन है
ओरेकल

1
क्या आपके पास अपने कथन का समर्थन करने के लिए कुछ संख्याएँ हैं जो nginx httpd से कम संसाधन गहन होगी?
RedShift

मैं हालांकि यह काफी नाटकीय नहीं है। यद्यपि मैं उत्तरों में लिंक न करने की कोशिश करता हूं क्योंकि लिंक नाजुक होते हैं, लेकिन आप Google के माध्यम से कुछ चर्चा और उदाहरण पा सकते हैं - जैसे help.dreamhost.com/hc/en-us/articles/…… Apache महान सॉफ्टवेयर है, लेकिन आमतौर पर यह एक नहीं है इस तरह एक संदर्भ में महान दृष्टिकोण।
इयॉन कॉलिन्स

यह उत्तर अच्छा लगता है, लेकिन फिर http से होकर Node.js तक कैसे पहुँचें क्योंकि यह पहले से ही Apache द्वारा लिया गया है?
पियरे

34


node serverसाथ चलने के लिए निर्देश apache2(v2.4.xx) server:

आपके Node.JS एप्लिकेशन के लिए किसी विशेष URL पर सभी अनुरोधों को पाइप करने के लिए निर्देशिका के CUSTOM.confअंदर फ़ाइल बनाएं /etc/apache2/conf-available, और बनाई गई फ़ाइल में निम्न पंक्ति जोड़ें:

ProxyPass /node http://localhost:8000/

8000 को पसंदीदा पोर्ट नंबर में बदलें node server
निम्नलिखित आदेश के साथ कस्टम कॉन्फ़िगरेशन सक्षम करें:

$> sudo a2enconf CUSTOM

CUSTOM बिना विस्तार के आपका नया बनाया गया नाम है, फिर proxy_httpकमांड के साथ सक्षम करें :

$> sudo a2enmod proxy_http

यह दोनों proxyऔर proxy_httpमॉड्यूल को सक्षम करना चाहिए । आप जाँच सकते हैं कि मॉड्यूल सक्षम है या नहीं:

$> sudo a2query -m MODULE_NAME

कॉन्फ़िगरेशन और मॉड्यूल सक्षम होने के बाद, आपको अपाचे सर्वर को पुनरारंभ करना होगा:

$> sudo service apache2 restart

अब आप नोड सर्वर को निष्पादित कर सकते हैं। सभी अनुरोधों को URL/nodeनोड सर्वर द्वारा नियंत्रित किया जाएगा।


एक जादू की तरह काम करता है! :)
कीस कोइनेन

15

एक सर्वर पर नोड और अपाचे चलाना तुच्छ है क्योंकि वे संघर्ष नहीं करते हैं। NodeJS जावास्क्रिप्ट सर्वर साइड को निष्पादित करने का एक तरीका है। असली दुविधा बाहर से नोड और अपाचे दोनों तक पहुँचने से आती है। जैसा कि मैंने देखा कि आपके पास दो विकल्प हैं:

  1. NacheJS को सभी मिलान अनुरोधों को प्रॉक्सी करने के लिए अपाचे को सेट करें, जो फ़ाइल अपलोडिंग और नोड में जो कुछ भी करेगा।

  2. अलग-अलग आईपी पर अपाचे और नोड रखें: पोर्ट संयोजन (यदि आपके सर्वर में दो आईपी हैं, तो एक आपके नोड श्रोता, दूसरे को अपाचे के लिए बाध्य किया जा सकता है)।

मुझे यह भी संदेह होने लगा है कि यह वह नहीं है जो आप वास्तव में खोज रहे हैं। यदि आपका अंतिम लक्ष्य आपके लिए Nodejs में अपना एप्लिकेशन लॉजिक लिखना है और कुछ "फाइल हैंडलिंग" भाग है जिसे आप एक ठेकेदार को ऑफ-लोड करते हैं, तो यह वास्तव में भाषा का एक विकल्प है, वेब सर्वर नहीं।


9

आप एक अलग दृष्टिकोण का उपयोग कर सकते हैं जैसे कि नोडजे के साथ एक रिवर्स प्रॉक्सी सर्वर लिखना जो अपाचे और अन्य सभी नोडज एप्लिकेशन को प्रॉक्सी कर सकता है।

पहले आपको अपाचे को पोर्ट 80 के अलावा किसी अन्य पोर्ट पर चलाने की जरूरत है। पूर्व: पोर्ट 8080

फिर आप निम्‍न के साथ रिवर्स प्रॉक्सी स्क्रिप्ट लिख सकते हैं:

var proxy = require('redbird')({port: 80, xfwd: false);

proxy.register("mydomain.me/blog", "http://mydomain.me:8080/blog");
proxy.register("mydomain.me", "http://mydomain.me:3000");

निम्नलिखित लेख इसे बनाने की पूरी प्रक्रिया का वर्णन करता है।

NODE JS REVERSE PROXY के साथ RUN APACHE - REDBIRD का उपयोग करना


2
ProxyPass /node http://localhost:8000/     
  • यह मेरे लिए तब काम आया जब मैंने httpd.conf के बजाय httpd-vhosts.conf में एंट्री की
  • मेरे पास XAMPP है जो मेरे वातावरण पर स्थापित है और 8080 पोर्ट पर चल रहे NodeJS आवेदक के साथ अपाचे पर सभी ट्रैफ़िक को हिट करने के लिए देख रहा था। http: // localhost / [name_of_the_node_application]

1

मैंने ऊपर दिए गए उत्तर को सर्टिफिकेट एसएसएल सर्टिफिकेट और कॉर्स एक्सेस-कंट्रोल-अलाउंस हेडर के साथ जोड़ दिया है और यह काम कर रहा है इसलिए मुझे लगा कि मैं परिणाम साझा करूंगा।

Apache httpd.conf फाइल के नीचे जोड़ा गया:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

Apache VirtualHost सेटिंग (PHP के लिए doc रूट, Apache और SSL सर्टिफिकेट के साथ है, जबकि नोड .js / socket.io साइट पोर्ट 3000 पर चलती है - और Apache से SSL सर्टिफिकेट का उपयोग करती है) इसके अलावा नोड को देखें। js साइट फ़ोल्डर के लिए प्रॉक्सी का उपयोग करती है / नोडज, सॉकेट.आईओ, और डब्ल्यूएस (वेबस्कैट):

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName www.example.com
    ServerAlias www.example.com
    DocumentRoot /var/html/www.example.com
    ErrorLog /var/html/log/error.log
    CustomLog /var/html/log/requests.log combined
    SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf

    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^socket.io          [NC]
    RewriteCond %{QUERY_STRING} transport=websocket [NC]
    RewriteRule /{.*}       ws://localhost:3000/$1  [P,L]

    RewriteCond %{HTTP:Connection} Upgrade [NC]
    RewriteRule /(.*) ws://localhost:3000/$1 [P,L]

    ProxyPass /nodejs http://localhost:3000/
    ProxyPassReverse /nodejs http://localhost:3000/

    ProxyPass /socket.io http://localhost:3000/socket.io
    ProxyPassReverse /socket.io http://localhost:3000/socket.io

    ProxyPass /socket.io ws://localhost:3000/socket.io
    ProxyPassReverse /socket.io ws://localhost:3000/socket.io

</VirtualHost>
</IfModule>

फिर मेरे नोड .js ऐप (app.js):

var express = require('express');
var app = express();
    app.use(function(req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "X-Requested-With");
        res.header("Access-Control-Allow-Headers", "Content-Type");
        res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
        next();
    });
var http = require('http').Server(app);
var io = require('socket.io')(http);

http.listen({host:'0.0.0.0',port:3000});

मैं एक IP4 श्रोता को मजबूर करता हूं, लेकिन यह वैकल्पिक है - आप स्थानापन्न कर सकते हैं:

http.listen(3000);

नोड.जेएस ऐप (app.js) कोड जारी है:

io.of('/nodejs').on('connection', function(socket) {
    //optional settings:
    io.set('heartbeat timeout', 3000); 
    io.set('heartbeat interval', 1000);

    //listener for when a user is added
    socket.on('add user', function(data) {
         socket.join('AnyRoomName');
         socket.broadcast.emit('user joined', data);
    });

    //listener for when a user leaves
    socket.on('remove user', function(data) {
         socket.leave('AnyRoomName');
         socket.broadcast.emit('user left', data);
    });

    //sample listener for any other function
    socket.on('named-event', function(data) {
         //code....
         socket.broadcast.emit('named-event-broadcast', data);
    });

    // add more listeners as needed... use different named-events...
});

अंत में, ग्राहक की ओर (नोडजेस के रूप में बनाया गया):

//notice the /nodejs path
var socket = io.connect('https://www.example.com/nodejs');

//listener for user joined
socket.on('user joined', function(data) {
    // code... data shows who joined...
});

//listener for user left
socket.on('user left', function(data) {
    // code... data shows who left...
});

// sample listener for any function:
socket.on('named-event-broadcast', function(data) {
    // this receives the broadcast data (I use json then parse and execute code)
    console.log('data1=' + data.data1);
    console.log('data2=' + data.data2);
});

// sample send broadcast json data for user joined:
socket.emit('user joined', {
    'userid': 'userid-value',
    'username':'username-value'
});

// sample send broadcast json data for user left 
//(I added the following with an event listener for 'beforeunload'):
// socket.emit('user joined', {
//     'userid': 'userid-value',
//     'username':'username-value'
// });

// sample send broadcast json data for any named-event:
socket.emit('named-event', {
    'data1': 'value1',
    'data2':'value2'
});

इस उदाहरण में जब JS लोड होता है, तो यह सॉकेट को "नाम-घटना" के रूप में भेज देगा, जो JSON में डेटा को नोड.js / socket.io सर्वर पर भेज देगा।

पथ / नोडज (क्लाइंट द्वारा जुड़ा हुआ) के तहत सर्वर पर आईओ और सॉकेट का उपयोग करना, डेटा को प्राप्त करता है फिर एक प्रसारण के रूप में इसे फिर से भेजता है। सॉकेट में कोई अन्य उपयोगकर्ता अपने श्रोता "नाम-घटना-प्रसारण" के साथ डेटा प्राप्त करेगा। ध्यान दें कि प्रेषक को अपना प्रसारण प्राप्त नहीं होता है।


0

मैं हाल ही में इस तरह के मुद्दे में भाग गया, जहां मुझे एक PHP आधारित कोडिग्निटर प्रोजेक्ट में websocket का उपयोग करके क्लाइंट और सर्वर के बीच संवाद करने की आवश्यकता है।

मैं में मेरी बंदरगाह (नोड एप्लिकेशन पर चल रहा है) जोड़कर इस समस्या का समाधान Allow incoming TCP portsऔरAllow outgoing TCP ports सूचियों ।

आप इन कॉन्फ़िगरेशन Firewall Configurationsको अपने सर्वर के WHM पैनल में पा सकते हैं ।


-1

मैं उसी जानकारी की तलाश में था। अंत में @Straseus द्वारा ऊपर दिए गए उत्तर के लिंक से उत्तर मिला

http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/

यहाँ पोर्ट 80 पर अपाचे वेबसाइट चलाने के लिए अंतिम समाधान है, पोर्ट 8080 पर नोड जेएस सेवा और उपयोग करें।

Apache वेबसाइट के DocumentRoot में, निम्नलिखित जोड़ें:

Options +FollowSymLinks -MultiViews

<IfModule mod_rewrite.c>

RewriteEngine on

# Simple URL redirect:
RewriteRule ^test.html$ http://arguments.callee.info:8000/test/ [P]

# More complicated (the user sees only "benchmark.html" in their address bar)
RewriteRule ^benchmark.html$ http://arguments.callee.info:8000/node?action=benchmark [P]

# Redirect a whole subdirectory:
RewriteRule ^node/(.*) http://arguments.callee.info:8000/$1 [P]

निर्देशिका स्तर पुनर्निर्देशित करने के लिए, उपर्युक्त लिंक (। +) नियम, जिसे 'नोड /' के बाद एक या अधिक वर्ण की आवश्यकता होती है। मुझे इसे (। *) में बदलना था जो मेरे सामान के काम करने के लिए शून्य या अधिक है।

लिंक @Straseus के लिए बहुत बहुत धन्यवाद


3
बस ध्यान दें कि [P] ध्वज को Apache की mod_proxyसक्षम होना आवश्यक है।
साइमन ईस्ट

यह अक्षम्य है। एक साधारण से अधिक रेवराईट इंजन का आह्वान क्यों करें ProxyPass?
माइकल Irigoyen

-2

मैं मान रहा हूं कि आप एक वेब ऐप बना रहे हैं क्योंकि आप अपाचे और नोड का उल्लेख करते हैं। त्वरित उत्तर - क्या यह संभव है - हाँ। क्या यह अनुशंसित है - नहीं। नोड बंडल्स यह स्वयं का वेबसर्वर है और अधिकांश वेबसाइटें पोर्ट 80 पर चलती हैं। मैं यह भी मान रहा हूं कि वर्तमान में कोई Apache प्लगइन नहीं है जो Nodejs द्वारा समर्थित है और मुझे यकीन नहीं है कि इसे बनाने के लिए वर्चुअल होस्ट बनाना सबसे अच्छा तरीका है। ये ऐसे सवाल हैं जिनका उत्तर डेवलपर्स को चाहिए, जो जॉयंट में अच्छे लोगों की तरह नॉडज बनाए रखते हैं।

बंदरगाहों के बजाय, नोड के टेक स्टैक का मूल्यांकन करना बेहतर होगा जो कि अन्य लोगों से पूरी तरह से अलग है और यही कारण है कि मैं इसे प्यार करता हूं लेकिन इसमें कुछ समझौते भी शामिल हैं जिन्हें आपको पहले से पता होना चाहिए।

आपका उदाहरण सीएमएस या एक साझाकरण वेब ऐप के समान है और ऐसे सैकड़ों बॉक्स एप्लिकेशन उपलब्ध हैं जो अपाचे पर ठीक चलेंगे। यहां तक ​​कि अगर आप किसी भी रेडीमेड समाधान को पसंद नहीं करते हैं, तो आप PHP / Java / Python में एक webapp लिख सकते हैं या इसे तैयार किए गए ऐप्स के एक जोड़े के साथ मिला सकते हैं और वे सभी अपाचे के एक उदाहरण के पीछे चलने के लिए डिज़ाइन किए गए और समर्थित हैं।

यह रुकने और सोचने का समय है कि मैंने अभी क्या कहा है।

अब आप यह तय करने के लिए तैयार हैं कि आप किस टेकस्टैक का उपयोग करने जा रहे हैं। यदि आपकी वेबसाइट एपाचे की आवश्यकता वाले हजारों तैयार किए गए ऐप में से किसी का भी उपयोग नहीं करेगी, तो नोड के लिए जाएं अन्यथा आपको पहले उन मान्यताओं को समाप्त करना होगा जो मैंने पहले बताए हैं।

अंत में, टेकस्टैक की आपकी पसंद किसी भी व्यक्तिगत घटक की तुलना में अधिक महत्वपूर्ण है।

मैं पूरी तरह से @Straseus से सहमत हूं कि अपलोड और डाउनलोड से निपटने के लिए नोड.जेएस फ़ाइल सिस्टम एपीआई का उपयोग करना अपेक्षाकृत तुच्छ है लेकिन लंबे समय में आप अपनी वेबसाइट से क्या चाहते हैं इसके बारे में अधिक सोचें और फिर अपना टेकस्टैक चुनें।

नोड की रूपरेखा सीखना अन्य रूपरेखाओं को सीखने की तुलना में आसान है, लेकिन यह रामबाण नहीं है। थोड़े अधिक प्रयास (जो अपने आप में एक सार्थक प्रयास हो सकता है) के साथ, आप किसी अन्य ढांचे को भी सीख सकते हैं। हम सभी एक-दूसरे से सीखते हैं और आप अधिक उत्पादक होंगे यदि आप एक छोटी टीम के रूप में काम कर रहे हैं, यदि आप अकेले काम कर रहे हैं और आपका बैकेंड तकनीकी कौशल भी तेजी से विकसित होगा। इसलिए, अपनी टीम के अन्य सदस्यों के कौशल को इतनी सस्ते में छूट न दें।

यह पोस्ट लगभग एक साल पुरानी है और संभावना है कि आपने पहले ही फैसला कर लिया है, लेकिन मुझे उम्मीद है कि मेरा शेख अगले व्यक्ति की मदद करेगा जो एक समान निर्णय से गुजर रहा है।

पढ़ने के लिए धन्यवाद।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.