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;
    }