SSL ile Tomcat'e nginx proxy'si
Bunu yanlışlıkla stackoverflow'da yayınladım (https://stackoverflow.com/questions/65942820/nginx-proxy-to-tomcat) ve ben de bir çözüm bulma umuduyla onu buraya koyuyorum.
Düzinelerce öğreticiden geçtim ve aşağıdakileri çözemiyorum (oldukça basit olsa da):
/Var/www/mydomain.com'da derlenmiş vue uygulamam var ve statik içerik olarak paylaşılmasını istiyorum.
Arka ucum, / api / something ... URL'lerinde genel API'larla tomcat tarafından 8080'de çalışıyor. URL'ler, "api" bölümü dahil olmak üzere kodlanmıştır.
Nginx'i mydomain.com/api/something için proxy yapacak şekilde yapılandırmak istiyorum ... tomcat ve geri kalan istekleri /var/www/mydomain.com adresinden statik olarak sunulacak. Her şey SSL ile sunuldu.
Aslında başka hiçbir şeye ihtiyacım yok.
Bunu başarmak için nginx ve tomcat'i yapılandırmama yardım edebilir misin? Teşekkür ederim!
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) Denediğim alternatif konum bloğu
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) Praveen Premaratne tarafından önerilen alternatif blok.
Bu şekilde alırım "GET /api/docs HTTP/1.0" 302 -
ve statik dosyalar da çalışır. / Api / docs konumuna gitmek, domain:8443/api/docs
aldığım yere yönlendirmeyi sağlıyor ERR_CONNECTION_REFUSED
.
location /api/ {
include proxy_params;
proxy_pass http://tomcat;
}
location / {
try_files $uri $uri/ /index.html;
}
(3) Alt alan adı kullanan alternatif.
Api.mydomain.com alt alan adını oluşturabildim ve oradan indeks sayfasına gitmek için nginx'i yapılandırabildim (aşağıdaki bloğu ekleyerek). Daha sonra vekaleten nasıl yapılacağı hakkında hiçbir fikrim yok.
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 yapılandırma 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" />
...
Mevcut durum, swagger'ın çalışması gereken mydomain.com/api/docs adresine gittiğimde, mydomain.com'a geri yönlendiriliyor veya 500 veya 502 hatası alıyorum.
Yanıtlar
Tamam, @Praveen Premaratne ve @Piotr P. Karwasz'ın yardımıyla ve bu makalede aşağıdaki yapılandırmayı buldum:
"# Certbot tarafından yönetiliyor" satırları koymayın, bunlar certbot tarafından oluşturulur, kontrol edin 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
}
Tomcat server.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>
Bunu dene:
location / {
try_files $uri @backend;
}
location @backend {
include proxy_params;
proxy_pass http://tomcat;
}
Bunu alt etki alanları yaklaşımını kullanarak yapacak olsaydım, işte bunu nasıl yapardım.
- Arka uç API'si için bir Nginx yapılandırma dosyası oluşturun
- Statik web içeriği için bir Nginx yapılandırma dosyası oluşturun
Statik HTML Nginx dosyası
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 yapılandırma dosyası
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
}
Bunları /etc/nginx/site-available/
dizine ekleyebilir ve etkinleştirebilirsiniz.
Ps: SSL öğelerini kaldırır ve app.mydomain.com için yeni bir sertifika vermeniz gerektiğinden , onları güncellemek için Certbot'u çalıştırırdım , böylece yalnızca dosyaların kendisini güncellerdi