Nu sunt expert în nginx, dar îl folosesc de ceva vreme. Deservesc mai multe servere de aplicații web prin nginx ca proxy invers.
Problema: Servim într-un subdirector o aplicație Spring Boot, nginx redirecționează utilizatorul către un domeniu total diferit (nume_server) atunci când vizitează direct subdirectorul. Să presupunem că subdirectorul este „/subdir”, de asemenea, servesc o aplicație wordpress în rădăcină, să spunem că este „https://example.com”.
- Dacă, de exemplu, un utilizator introduce „https://example.com/subdir/countries” va trimite corect la aplicația Spring Boot și va prelua lista de țări.
- Dar dacă utilizatorul introduce „https://example.com/subdir” va afișa o altă aplicație diferită care se află într-un alt nume de domeniu (să spunem că este https://another_example.com). Dar URL-ul rămâne același, utilizatorul rămâne în „https://example.com/subdir”, dar aplicația este una diferită și va vedea index.html-ul acelei aplicații.
Configurația nginx pentru aplicația wordpress și Spring Boot este următoarea:
Server {
asculta 80;
server_name example.com www.example.com;
returnează 301 https://example.com$request_uri;
}
Server {
asculta 443 ssl;
server_name example.com www.example.com;
root /root/wordpress_example;
index index.php;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # gestionat de Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # gestionat de Certbot
includ /etc/letsencrypt/options-ssl-nginx.conf; # gestionat de Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # gestionat de Certbot
locație = /favicon.ico { log_not_found off; access_log off; }
locație = /robots.txt { log_not_found off; access_log off; permite tuturor; }
locație ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expira max;
log_not_found off;
}
Locație / {
try_files $uri $uri/ /index.php?$args;
}
locație ~ \.php$ {
include fastcgi_params;
fastcgi_intercept_errors activat;
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
locație /subdir/ {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect dezactivat;
dimensiunea_buffer_proxy 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
}
Și configurația nginx pentru aplicația în care utilizatorul este redirecționat este:
Server {
asculta 80;
nume_server another_example.com www.nother_example.com;
returnează 301 https://another_example.com$request_uri;
}
Server {
underscores_in_headers activate;
asculta 443 ssl;
nume_server another_example.com www.nother_example.com;
ssl_certificate /etc/letsencrypt/live/another_example.com/fullchain.pem; # gestionat de Certbot
ssl_certificate_key /etc/letsencrypt/live/another_example.com/privkey.pem; # gestionat de Certbot
includ /etc/letsencrypt/options-ssl-nginx.conf; # gestionat de Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # gestionat de Certbot
pagina de eroare 404 /404.html;
locație = /404.html {
root /root/public/;
intern;
}
Locație / {
root /root/public/;
index index.html;
}
locație ~* ^/(?:favicon|apple-touch-icon|android-chrome-|mstile-|safari-pinned-tab.svg|browserconfig.xml|mainfest.json) {
alias /root/public/icons/icon-48x48.png;
}
locație ^~ /imagini {
alias /root/alimentacion;
try_files $uri $uri/ =404;
}
locație/clasament {
proxy_pass http://ranking;
proxy_http_versiunea 1.1;
proxy_set_header Actualizare $http_upgrade;
proxy_set_header Conexiune „upgrade”;
proxy_set_header Gazdă $gazdă;
proxy_set_header X-Forwarded-Proto $schema;
proxy_set_header X-Forwarded-Port $server_port;
dimensiunea_buffer_proxy 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
}
De ce redirecționarea utilizatorului către another_example.com când accesează direct calea „/subdir”?
Aplicația Spring Boot nu are nimic în rădăcină, în local când solicitați rădăcina aplicației Spring Boot returnează 404, ar putea fi aceasta problema?
EDITați ieșirea nginx -T:
nginx: sintaxa fișierului de configurare /etc/nginx/nginx.conf este ok
nginx: fișierul de configurare /etc/nginx/nginx.conf testul a reușit
# fișier de configurare /etc/nginx/nginx.conf:
utilizator root;
worker_proceses auto;
pid /run/nginx.pid;
includ /etc/nginx/modules-enabled/*.conf;
evenimente {
conexiuni_muncitor 768;
# multi_accept on;
}
http {
##
# Setări de bază
##
sendfile activat;
tcp_nopush activat;
tcp_nodelay activat;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens dezactivat;
client_max_body_size 180M; #Â permite clientului să încarce fișiere de 180 MB
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
includ /etc/nginx/mime.types;
aplicație de tip_default/octet-stream;
##
# Setări SSL
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Eliminarea SSLv3, ref: POODLE
ssl_prefer_server_ciphers activat;
##
# Setări de înregistrare
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Setări Gzip
##
gzip on;
gzip_vary on;
gzip_proxied orice;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_versiunea 1.1;
gzip_types text/text simplu/aplicație css/aplicație json/text javascript/aplicație xml/aplicație xml/xml+text rss/javascript;
##
# Echilibrul de încărcare
##
în amonte uv {
server localhost:8081;
}
test în amonte {
server localhost:8087;
}
backend în amonte {
server localhost:8085;
}
clasament în amonte {
server localhost:4000;
}
##
# Configurații gazdă virtuală
##
includ /etc/nginx/conf.d/*.conf;
includ /etc/nginx/sites-enabled/*;
}
# fișier de configurare /etc/nginx/modules-enabled/50-mod-http-geoip.conf:
load_module modules/ngx_http_geoip_module.so;
# fișier de configurare /etc/nginx/modules-enabled/50-mod-http-image-filter.conf:
load_module modules/ngx_http_image_filter_module.so;
# fișier de configurare /etc/nginx/modules-enabled/50-mod-http-xslt-filter.conf:
load_module modules/ngx_http_xslt_filter_module.so;
# fișier de configurare /etc/nginx/modules-enabled/50-mod-mail.conf:
load_module modules/ngx_mail_module.so;
# fișier de configurare /etc/nginx/modules-enabled/50-mod-stream.conf:
load_module modules/ngx_stream_module.so;
# fișier de configurare /etc/nginx/mime.types:
tipuri {
text/html html htm shtml;
text/css css;
text/xml xml;
imagine/gif gif;
imagine/jpeg jpeg jpg;
aplicație/javascript js;
aplicație/atom+xml atom;
aplicație/rss+xml rss;
text/mathml mml;
text/txt simplu;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
imagine/png png;
imagine/tiff tif tiff;
imagine/vnd.wap.wbmp wbmp;
imagine/x-icoană ico;
imagine/x-jng jng;
imagine/x-ms-bmp bmp;
imagine/svg+xml svg svgz;
imagine/webp webp;
aplicație/font-woff woff;
aplicație/java-arhivă jar war ear;
aplicație/json json;
aplicație/mac-binhex40 hqx;
aplicație/msword doc;
cerere/pdf pdf;
aplicație/postscript ps eps ai;
aplicație/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.wap.wmlc wmlc;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
aplicație/x-7z-comprimat 7z;
aplicare/x-cacao cco;
application/x-java-archive-diff jardiff;
aplicație/x-java-jnlp-fișier jnlp;
aplicație/x-makeself rulează;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
aplicare/x-mare mare;
aplicație/x-shockwave-flash swf;
application/x-stuffit sit;
aplicație/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
aplicație/x-xpinstall xpi;
aplicație/xhtml+xml xhtml;
aplicație/xspf+xml xspf;
aplicare/zip zip;
aplicație/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
aplicație/octet-stream msi msp msm;
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
# fișier de configurare /etc/letsencrypt/options-ssl-nginx.conf:
# Acest fișier conține parametri importanți de securitate. Dacă modificați acest fișier
# manual, Certbot nu va putea oferi automat securitate viitoare
# actualizări. În schimb, Certbot va imprima și va înregistra un mesaj de eroare cu o cale către
# fișierul actualizat la care va trebui să vă referiți atunci când actualizați manual
# acest fișier.
ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers activat;
ssl_ciphers „ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256-SHA256-ECDSA-CEDHE256-ECDSA-CED3-ECDHE-ECDSA-AES128-GCM-SHA256 RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHAES-SHA256:ECDHE-ECDSA-SHA256: SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA256:-SHA DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES- CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";
# fișier de configurare /etc/nginx/sites-enabled/example:
Server {
asculta 80;
nume_server example.com www.example.com;
returnează 301 https://example.com$request_uri;
}
Server {
asculta 443 ssl;
nume_server example.com www.example.com;
root /root/wordpress_example;
index index.php;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # gestionat de Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # gestionat de Certbot
includ /etc/letsencrypt/options-ssl-nginx.conf; # gestionat de Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # gestionat de Certbot
locație = /favicon.ico { log_not_found off; access_log off; }
locație = /robots.txt { log_not_found off; access_log off; permite tuturor; }
locație ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expira max;
log_not_found off;
}
Locație / {
try_files $uri $uri/ /index.php?$args;
}
locație ~ \.php$ {
include fastcgi_params;
fastcgi_intercept_errors activat;
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
locație /subdir/ {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect dezactivat;
dimensiunea_buffer_proxy 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
locație = /subdir {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect dezactivat;
dimensiunea_buffer_proxy 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
}
# fișier de configurare /etc/nginx/fastcgi_params:
fastcgi_param QUERY_STRING $șir_interogare;
fastcgi_param REQUEST_METHOD $cerere_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $schemă;
fastcgi_param HTTPS $https dacă_nu_vide;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $adresă_la distanță;
fastcgi_param REMOTE_PORT $port_la distanță;
fastcgi_param SERVER_ADDR $adresa_server;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# Numai PHP, necesar dacă PHP a fost construit cu --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
# fișier de configurare /etc/nginx/sites-enabled/another_example:
Server {
asculta 80;
nume_server another_example.com www.nother_example.com;
returnează 301 https://another_example.com$request_uri;
}
Server {
underscores_in_headers activate;
asculta 443 ssl;
nume_server another_example.com www.nother_example.com;
ssl_certificate /etc/letsencrypt/live/another_example.com/fullchain.pem; # gestionat de Certbot
ssl_certificate_key /etc/letsencrypt/live/another_example.com/privkey.pem; # gestionat de Certbot
includ /etc/letsencrypt/options-ssl-nginx.conf; # gestionat de Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # gestionat de Certbot
pagina de eroare 404 /404.html;
locație = /404.html {
root /root/public/;
intern;
}
Locație / {
root /root/public/;
index index.html;
}
locație ~* ^/(?:favicon|apple-touch-icon|android-chrome-|mstile-|safari-pinned-tab.svg|browserconfig.xml|mainfest.json) {
alias /root/public/icons/icon-48x48.png;
}
locație ^~ /imagini {
alias /root/alimentacion;
try_files $uri $uri/ =404;
}
locație/clasament {
proxy_pass http://ranking;
proxy_http_versiunea 1.1;
proxy_set_header Actualizare $http_upgrade;
proxy_set_header Conexiune „upgrade”;
proxy_set_header Gazdă $gazdă;
proxy_set_header X-Forwarded-Proto $schema;
proxy_set_header X-Forwarded-Port $server_port;
dimensiunea_buffer_proxy 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
}
EDITARE CU SOLUȚIA:
Cu ajutorul lui @Tero Kilkanen și încercări și erori, am găsit soluția:
locație /subdir/ {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect dezactivat;
}
locație = /subdir {
proxy_pass http://127.0.0.1:8080;
proxy_redirect dezactivat;
}
locație = /subdir/ {
proxy_pass http://127.0.0.1:8080;
proxy_redirect dezactivat;
}