SSL के साथ Tomcat को nginx प्रॉक्सी

Jan 29 2021

मैंने इसे स्टैकओवरफ़्लो पर गलती से पोस्ट किया (https://stackoverflow.com/questions/65942820/nginx-proxy-to-tomcat) और मैं इसे कुछ समाधान खोजने की उम्मीद में यहां डाल रहा हूं।

मैं दर्जनों ट्यूटोरियल्स से गुज़रा और मैं इसका पता नहीं लगा सकता (हालांकि यह बहुत बुनियादी होना चाहिए):

मेरे पास /var/www/mydomain.com में मेरा संकलित वाउ एप्लीकेशन है और मैं चाहता हूं कि इसे स्थिर सामग्री के रूप में साझा किया जाए।

मेरा बैकएंड 8080 पर सार्वजनिक एपीआई के साथ / एपीआई / कुछ ... यूआरएल पर टॉमकैट द्वारा चल रहा है। URL को "एपीआई" भाग सहित हार्डकोड किया गया है।

मैं nginx को प्रॉक्सी mydomain.com/api/something पर कॉन्फ़िगर करना चाहूंगा ... टॉमकैट के अनुरोध और बाकी को /var/www/mydomain.com से स्टेटिक रूप से परोसा जाएगा। सब कुछ एसएसएल के माध्यम से सेवा की।

मुझे कुछ और नहीं चाहिए।

क्या आप मुझे nginx और tomcat को कॉन्फ़िगर करने में मदद कर सकते हैं? धन्यवाद!

nginx config /etc/nginx/sites-available/mydomain.com

upstream tomcat {
    server 127.0.0.1:8080 fail_timeout=0;
}

server {
        listen 443 ssl default_server;
        #listen [::]:443 ssl default_server;

        root /var/www/mydomain.com;
        index index.html index.htm index.nginx-debian.html;

       server_name _ mydomain.com www.mydomain.com;

        location /api/ {
                include proxy_params;
                proxy_set_header Host $server_name; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://tomcat; } location / { try_files $uri $uri/ /index.html; } ssl_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/www.mydomain.com/privkey.pem; # managed by Certbot } server { if ($host = www.mydomain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = mydomain.com) { return 301 https://$host$request_uri;
    } # managed by Certbot


       listen 80 default_server;
        listen [::]:80 default_server;

       server_name _ mydomain.com www.mydomain.com;
   return 404; # managed by Certbot
}

(1) वैकल्पिक स्थान ब्लॉक जिसके साथ मैं प्रयोग कर रहा हूं

        location /api/ {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Proto https;
                proxy_pass http://localhost:8080/api/;
        }

(2) प्रवीण प्रेमरत्ने द्वारा सुझाया गया वैकल्पिक ब्लॉक।

इस तरह मुझे मिलता है "GET /api/docs HTTP/1.0" 302 -और स्थिर फाइलें भी काम करती हैं। / Api / डॉक्स पर जाने से domain:8443/api/docsमुझे जो मिलता है उसे रीडायरेक्ट करता है ERR_CONNECTION_REFUSED

        location /api/ {
                include proxy_params;
                proxy_pass http://tomcat;
        }

        location / {
                try_files $uri $uri/ /index.html;
        }

(3) उपडोमेन का उपयोग करके वैकल्पिक।

मैं उपडोमेन api.mydomain.com बनाने में सक्षम था और वहां से इंडेक्स पेज पर जाने के लिए (निम्नलिखित ब्लॉक जोड़कर) नगनेक्स को कॉन्फ़िगर करने में सक्षम था। कोई विचार नहीं है कि बाद में कैसे करें।

server {
        listen 443 ssl;

        root /var/www/www.mydomain.com; <- redundand I guess?
        index index.html index.htm index.nginx-debian.html; <- redundand I guess?

        server_name api.mydomain.com

        ssl_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/www.mydomain.com/privkey.pem; # managed by Certbot
}

Tomcat config server.xml

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               address="127.0.0.1"
               redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
   ...
   <Host name="localhost"  appBase="webapps"
         unpackWARs="true" autoDeploy="true">
      
      <Valve className="org.apache.catalina.valves.AccessLogValve" 
         directory="logs"
         prefix="localhost_access_log" suffix=".txt"
         requestAttributesEnabled="true"
         pattern="%h %l %u %t &quot;%r&quot; %s %b" />
        
      <Valve className="org.apache.catalina.valves.RemoteIpValve"
         protocolHeader="X-Forwarded-Proto" /> 
   ...    

वर्तमान स्थिति यह है कि जब मैं mydomain.com/api/docs पर जाता हूं, जहां स्वैगर चल रहा होता है, तो मुझे mydomain.com पर वापस भेज दिया जाता है या 500 या 502 त्रुटि मिलती है।

जवाब

1 TomášLeitl Feb 01 2021 at 01:45

ठीक है, इसलिए @Praveen Premaratne और @Piotr पी। करवास की मदद से और यह लेख मैं निम्नलिखित विन्यास के साथ आया:

"# सर्टिफिकेट द्वारा प्रमाणित" के साथ लाइनों में नहीं डालते हैं, जो सर्टिफिकेट, चेक द्वारा बनाए गए हैं https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04

etc / nginx / sites-available / mydomain.com

server {
    server_name    mydomain.com www.mydomain.com;

    root /var/www/mydomain.com;
    index index.html;

    access_log /var/log/nginx/mydomain-access.log;
    error_log /var/log/nginx/mydomain-error.log;

    location / {
        try_files $uri $uri/ /index.html;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/www.mydomain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = www.mydomain.com) { return 301 https://$host$request_uri; } # managed by Certbot if ($host = mydomain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    server_name    mydomain.com www.mydomain.com;
    listen 80;
    return 404; # managed by Certbot
}

/etc/nginx/sites-available/api.mydomain.com

server {
    server_name    api.mydomain.com;

    access_log /var/log/nginx/api-mydomain-access.log;
    error_log /var/log/nginx/api-mydomain-error.log;

    location / {
        proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:8080; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/www.mydomain.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = api.mydomain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name    api.mydomain.com;
    listen 80;
    return 404; # managed by Certbot
}

टॉमकैट सर्वर। xml

<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    address="127.0.0.1"
    proxyName="api.mydomain.com"
    proxyPort="80"/>

<Engine name="Catalina" defaultHost="localhost">

    <Realm className="org.apache.catalina.realm.LockOutRealm">
    ...
    </Realm>

    <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.RemoteIpValve"
            remoteIpHeader="x-forwarded-for"
            proxiesHeader="x-forwarded-by"
            protocolHeader="x-forwarded-proto" />

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="localhost_access_log" suffix=".txt"
            pattern="%h %l %u %t %r %s %b" />

  </Host>
</Engine>
fuero Jan 29 2021 at 20:01

इसे इस्तेमाल करे:

location / {
        try_files $uri @backend;
}
location @backend {
        include proxy_params;
        proxy_pass http://tomcat;
}
PraveenPremaratne Jan 29 2021 at 23:22

अगर मैं यहाँ उप डोमेन का उपयोग करके ऐसा कर रहा था तो मैं यह कैसे करूँगा।

  • बैकएंड एपीआई के लिए एक Nginx कॉन्फ़िगरेशन फ़ाइल बनाएँ
  • स्थैतिक वेब सामग्री के लिए Nginx कॉन्फ़िगरेशन फ़ाइल बनाएँ

स्टेटिक HTML Nginx फ़ाइल mydomain.com.nginx

server {
    server_name    mydomain.com;

    root /var/www/mydomain.com;
    index index.html;

    access_log /var/log/nginx/mydomain-access.log;
    error_log /var/log/nginx/mydomain-error.log;

    location / {
        try_files $uri $uri/ /index.html;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/www.mydomain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = mydomain.com) { return 301 https://$host$request_uri;
    } # managed by Certbot


    listen         80;
    server_name    mydomain.com;
    return 404; # managed by Certbot


}

API Nginx config फाइल api.mydomain.com.nginx

server {
    server_name    api.mydomain.com;

    access_log /var/log/nginx/api-mydomain-access.log;
    error_log /var/log/nginx/api-mydomain-error.log;

    location / {
        proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; proxy_redirect off; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/api.mydomain.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/api.mydomain.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = api.mydomain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen         80;
    server_name    app.mydomain.com;
    return 404; # managed by Certbot


}

आप इन्हें /etc/nginx/site-available/निर्देशिका में जोड़ सकते हैं और उन्हें सक्षम कर सकते हैं।

Ps: मैं SSL सामान को हटाकर उन्हें अद्यतन करने के लिए Certbot चलाऊँगा क्योंकि आप app.mydomain.com के लिए एक नया प्रमाणपत्र जारी करेंगे , इसलिए यह केवल फाइलों को ही अपडेट करेगा।