परिचय

जब मैंने Tomcat पर हमारा वित्तीय एप्लिकेशन बनाया, तो मैंने जल्दी ही सीखा कि Tomcat को सीधे सार्वजनिक इंटरनेट पर रखना एक अच्छा विचार नहीं था। यह शुरू में काम कर रहा था, लेकिन यह नाजुक था, इसे सुरक्षित करना मुश्किल था, और तैनाती के दौरान इसे सुचारू रूप से बनाए रखना लगभग असंभव था।

आखिरकार, मैंने Tomcat के सामने Nginx रखने का निर्णय लिया और Nginx को उन सभी चीजों को संभालने दिया जिनमें Tomcat अच्छा नहीं है, खासकर SSL समाप्ति, रखरखाव मोड, स्थिर फ़ाइल कैशिंग और आंतरिक बुनियादी ढांचे के विवरणों को छिपाना।

यह लेख उस सटीक सेटअप को समझाता है जिसका मैं आज उत्पादन में उपयोग करता हूँ। यह एक सामान्य गाइड नहीं है। यह विशेष रूप से उस वित्तीय प्रणाली के लिए लिखा गया है जिसे मैंने तैनात किया है, और इसमें वास्तविक कॉन्फ़िगरेशन और प्रत्येक निर्णय के पीछे का तर्क शामिल है।

मुझे Tomcat के सामने Nginx की आवश्यकता क्यों थी

1. Tomcat के पुनः आरंभ होने पर एक साफ रखरखाव पृष्ठ

एक वित्तीय प्रणाली में, हमें अक्सर तैनाती या रखरखाव के दौरान Tomcat को पुनः आरंभ करना पड़ता है। यदि Tomcat बंद है, तो उपयोगकर्ता को कभी भी कच्चा Tomcat 503 पृष्ठ नहीं देखना चाहिए जो सर्वर की जानकारी को उजागर करता है।

Nginx के साथ, उपयोगकर्ता हमेशा एक दोस्ताना रखरखाव पृष्ठ देखते हैं, भले ही Tomcat पूरी तरह से ऑफ़लाइन हो। Nginx 502 या 503 प्रतिक्रिया को पकड़ता है और एक स्थिर HTML पृष्ठ प्रदान करता है जिसे मैंने तैयार किया है।

2. Nginx पर SSL बहुत आसान है

Tomcat के अंदर SSL कॉन्फ़िगर करना अनावश्यक रूप से जटिल है। आपको प्रमाणपत्रों को एक Java कीस्टोर में परिवर्तित करना होता है, कनेक्टर का प्रबंधन करना होता है और कई प्रारूपों के साथ निपटना होता है।

Nginx के साथ, SSL सरल है। मुझे केवल दो फ़ाइलों, एक प्रमाणपत्र और एक निजी कुंजी की आवश्यकता होती है। Nginx HTTPS को समाप्त करता है, और Tomcat केवल लोकलहोस्ट से सामान्य HTTP प्राप्त करता है। प्रमाणपत्र नवीनीकरण और डिबगिंग भी आसान है।

3. Tomcat पूरी तरह से बाहरी दुनिया से छिपा हुआ है

सुरक्षा कारणों से, मैं नहीं चाहता कि Tomcat अपने पोर्ट या सर्वर की जानकारी को सार्वजनिक उपयोगकर्ताओं के लिए उजागर करे। Tomcat केवल 127.0.0.1:8080 पर सुनता है।

यदि कोई मेरे सर्वर को स्कैन करने की कोशिश करता है, तो वे यह नहीं पहचान सकते कि Tomcat बिल्कुल मौजूद है।

4. वित्तीय अनुमोदनों के लिए बड़े हेडर

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

इन बड़े हेडरों का समर्थन करने के लिए, मैंने Nginx को बड़े हेडर बफर की अनुमति देने के लिए कॉन्फ़िगर किया। इसके बिना, कुछ अनुरोध विफल हो जाते क्योंकि डिफ़ॉल्ट हेडर आकार बहुत छोटा है।

5. बड़े फ़ाइल अपलोड

उपयोगकर्ता अनुबंध, चालान और स्कैन किए गए दस्तावेज़ अपलोड करते हैं। मैंने Nginx में एक साफ अपलोड आकार सीमा निर्धारित की है ताकि बड़े फ़ाइलें Tomcat तक न पहुँचें जब तक कि वे पहले Nginx सत्यापन पास न करें।

6. तेज स्थिर सामग्री (CSS, JS, आइकन)

हालांकि Tomcat स्थिर फ़ाइलें सेवा कर सकता है, Nginx बहुत तेज है। मैंने स्थिर संपत्तियों के लिए कैशिंग सक्षम की है ताकि Nginx उन्हें सीधे सेवा कर सके बिना Tomcat को परेशान किए।

7. लंबे समय तक चलने वाले संचालन के लिए कस्टम टाइमआउट

एक वित्तीय प्रणाली में कुछ प्रक्रियाएँ अधिक समय लेती हैं, जैसे रिपोर्ट जनरेशन या बैच अनुमोदन।

Nginx मुझे प्रॉक्सी टाइमआउट पर पूर्ण नियंत्रण देता है ताकि उपयोगकर्ताओं को अप्रत्याशित 504 त्रुटियाँ न मिलें।

Nginx HTTPS कॉन्फ़िगरेशन जो मैं उपयोग करता हूँ

मैं इस फ़ाइल को यहाँ रखता हूँ:

/etc/nginx/sites-available/myapp_https

यहाँ वास्तविक कॉन्फ़िगरेशन है, लेख के लिए सरल बनाया गया लेकिन फिर भी सटीक।

server {
    listen 443 ssl;
    server_name finance.example.com;

    ssl_certificate     /opt/myapp/keystore/app.crt;
    ssl_certificate_key /opt/myapp/keystore/app.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_protocols TLSv1.2;
    ssl_prefer_server_ciphers on;

    large_client_header_buffers 4 65k;
    client_max_body_size 100m;

    error_page 502 503 = @maintenance;
    error_page 404 = @errors;

    access_log /opt/myapp/nginx/logs/access.log;
    error_log  /opt/myapp/nginx/logs/error.log;

    location / {
        proxy_set_header Host                $host;
        proxy_set_header X-Forwarded-Host    $host;
        proxy_set_header X-Forwarded-Server  $host;
        proxy_set_header X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto   https;

        proxy_pass http://127.0.0.1:8080;

        proxy_buffering off;
        proxy_buffer_size 128k;
        proxy_buffers 100 128k;

        proxy_connect_timeout 180;
        proxy_send_timeout    180;
        proxy_read_timeout    180;
        send_timeout          180;

        location ~* \.(css|js|jpg|gif|ico)$ {
            proxy_cache cache;
            proxy_cache_key   $host$uri$is_args$args;
            proxy_cache_valid 200 301 302 30m;
            expires 30m;
            proxy_pass http://127.0.0.1:8080;
        }
    }

    location = / {
        return 301 /myapp/;
    }

    location @maintenance {
        root /opt/myapp/nginx/www;
        rewrite ^ /maintenance.html break;
    }

    location @errors {
        root /opt/myapp/nginx/www;
        rewrite ^ /404.html break;
    }
}

यह प्रणाली का मूल है। Nginx SSL को संभालता है, ट्रैफ़िक को Tomcat को अग्रेषित करता है, जब Tomcat ऑफ़लाइन होता है तो रखरखाव पृष्ठ प्रदान करता है, स्थिर सामग्री को कैश करता है और आंतरिक नेटवर्क लेआउट की रक्षा करता है।

HTTP रीडायरेक्ट (पोर्ट 80)

मैंने सभी HTTP ट्रैफ़िक को HTTPS पर रीडायरेक्ट करने के लिए एक सरल कॉन्फ़िगरेशन जोड़ा।

/etc/nginx/sites-available/myapp_http
server {
    listen 80;
    server_name finance.example.com;
    return 301 https://$host$request_uri;
}

फोल्डर संरचना

मैं Nginx से संबंधित फ़ाइलों को एक समर्पित एप्लिकेशन फ़ोल्डर के अंदर रखता हूँ:

/opt/myapp/
    keystore/
    nginx/
        logs/
        www/

यह प्रमाणपत्रों, लॉग और स्थिर पृष्ठों का प्रबंधन करना आसान बनाता है।

Tomcat कॉन्फ़िगरेशन जो सेटअप को पूरा करता है

Tomcat के server.xml के अंदर, मैं Tomcat को लोकलहोस्ट से बाइंड करता हूँ ताकि इसे बाहर से एक्सेस न किया जा सके।

<Connector port="8080"
           address="127.0.0.1"
           maxHttpHeaderSize="65536"
           protocol="HTTP/1.1"
           connectionTimeout="20000"
           maxThreads="150"/>

मैं Tomcat को वास्तविक क्लाइंट IP और प्रोटोकॉल को समझने के लिए भी बनाता हूँ:

<Valve className="org.apache.catalina.valves.RemoteIpValve"
       remoteIpHeader="X-Forwarded-For"
       protocolHeader="X-Forwarded-Proto"
       protocolHeaderHttpsValue="https"/>

यह सुनिश्चित करता है कि प्रणाली सही क्लाइंट IP को लॉग करती है और HTTPS के लिए सही तरीके से व्यवहार करती है।

यह सेटअप वित्तीय प्रणाली के लिए क्यों अच्छा काम करता है

Tomcat के सामने Nginx रखने से पूरे सिस्टम को बहुत अधिक पेशेवर और स्थिर महसूस हुआ है। तैनातियों या पुनः आरंभ के दौरान, उपयोगकर्ताओं को कभी भी सामान्य Tomcat 503 पृष्ठों का सामना नहीं करना पड़ता। इसके बजाय, वे हमेशा एक साफ रखरखाव स्क्रीन देखते हैं, जो सिस्टम को विश्वसनीय बनाती है भले ही काम पर्दे के पीछे हो रहा हो।

Nginx पर SSL को संभालना भी सब कुछ सरल बनाता है। प्रमाणपत्रों का प्रबंधन, नवीनीकरण और डिबग करना आसान है, और Tomcat को अब HTTPS के साथ सीधे निपटना नहीं पड़ता। एक और लाभ सुरक्षा है। चूंकि Tomcat केवल लोकलहोस्ट पर सुनता है, यह बाहरी ट्रैफ़िक से पूरी तरह से छिपा हुआ है, जो स्कैनिंग और जांच के प्रयासों के एक पूरे वर्ग को समाप्त करता है।

प्रदर्शन में भी सुधार होता है। स्थिर फ़ाइलें जैसे CSS और JavaScript तेज़ी से लोड होती हैं क्योंकि Nginx उन्हें कैश कर सकता है, और अपलोड को Tomcat तक पहुँचने से पहले जांचा और सीमित किया जाता है। हमारे कुछ वित्तीय संचालन में बड़े हेडर या लंबे समय तक चलने वाले कार्य शामिल होते हैं, और Nginx मुझे बफर आकार और टाइमआउट पर पूर्ण नियंत्रण देता है, जिससे ये संचालन बिना किसी यादृच्छिक त्रुटियों के सुचारू रूप से चलते हैं।

यह सुनिश्चित करता है कि साइट अभी भी रखरखाव पृष्ठ के कारण पूर्वानुमानित रूप से प्रतिक्रिया करती है, भले ही Tomcat एक पल के लिए ऑफ़लाइन हो। वर्षों में, यह सेटअप अत्यंत ठोस साबित हुआ है। इसने वित्तीय एप्लिकेशन को कई रिलीज़ और बुनियादी ढांचे में बदलावों के दौरान लगभग शून्य डाउनटाइम प्राप्त करने में मदद की है, और यह उत्पादन ट्रैफ़िक को बिना किसी आश्चर्य के संभालना जारी रखता है।