SSL के साथ Tomcat को nginx प्रॉक्सी
मैंने इसे स्टैकओवरफ़्लो पर गलती से पोस्ट किया (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 "%r" %s %b" />
<Valve className="org.apache.catalina.valves.RemoteIpValve"
protocolHeader="X-Forwarded-Proto" />
...
वर्तमान स्थिति यह है कि जब मैं mydomain.com/api/docs पर जाता हूं, जहां स्वैगर चल रहा होता है, तो मुझे mydomain.com पर वापस भेज दिया जाता है या 500 या 502 त्रुटि मिलती है।
जवाब
ठीक है, इसलिए @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>
इसे इस्तेमाल करे:
location / {
try_files $uri @backend;
}
location @backend {
include proxy_params;
proxy_pass http://tomcat;
}
अगर मैं यहाँ उप डोमेन का उपयोग करके ऐसा कर रहा था तो मैं यह कैसे करूँगा।
- बैकएंड एपीआई के लिए एक 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 के लिए एक नया प्रमाणपत्र जारी करेंगे , इसलिए यह केवल फाइलों को ही अपडेट करेगा।