Tôi không phải là chuyên gia về nginx nhưng tôi đã sử dụng nó được một thời gian. Tôi đang phục vụ nhiều máy chủ ứng dụng web thông qua nginx dưới dạng proxy ngược.
Vấn đề: Tôi đang phục vụ trong thư mục con một ứng dụng Spring Boot, nginx đang chuyển hướng người dùng đến một miền hoàn toàn khác (server_name) khi truy cập trực tiếp vào thư mục con. Giả sử thư mục con là "/subdir", tôi cũng đang phục vụ một ứng dụng wordpress trong thư mục gốc, giả sử là "https://example.com".
- Ví dụ: nếu người dùng nhập "https://example.com/subdir/countries", nó sẽ ủy quyền chính xác cho ứng dụng Spring Boot và nó sẽ truy xuất danh sách quốc gia.
- Nhưng nếu người dùng nhập "https://example.com/subdir", nó sẽ hiển thị một ứng dụng khác nằm trong một tên miền khác (giả sử là https://another_example.com). Nhưng URL vẫn như cũ, người dùng vẫn ở "https://example.com/subdir" nhưng ứng dụng là một ứng dụng khác và nó sẽ thấy index.html của ứng dụng đó.
Cấu hình nginx cho ứng dụng wordpress và Spring Boot như sau:
người phục vụ {
nghe 80;
server_name example.com www.example.com;
trả lại 301 https://example.com$request_uri;
}
người phục vụ {
nghe 443 ssl;
server_name example.com www.example.com;
gốc /root/wordpress_example;
chỉ số index.php;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # được quản lý bởi Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # được quản lý bởi Certbot
bao gồm /etc/letsencrypt/options-ssl-nginx.conf; # được quản lý bởi Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # được quản lý bởi Certbot
vị trí = /favicon.ico { log_not_found tắt; truy cập_đăng xuất; }
vị trí = /robots.txt { log_not_found tắt; truy cập_đăng xuất; chấp nhận tất cả; }
vị trí ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
hết hạn tối đa;
log_not_found tắt;
}
địa điểm / {
try_files $uri $uri/ /index.php?$args;
}
vị trí ~ \.php$ {
bao gồm fastcgi_params;
bật fastcgi_intercept_errors;
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
vị trí /thư mục con/ {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect tắt;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
}
Và cấu hình nginx cho ứng dụng mà người dùng được chuyển hướng là:
người phục vụ {
nghe 80;
server_name another_example.com www.another_example.com;
trả lại 301 https://another_example.com$request_uri;
}
người phục vụ {
underscores_in_headers bật;
nghe 443 ssl;
server_name another_example.com www.another_example.com;
ssl_certificate /etc/letsencrypt/live/another_example.com/fullchain.pem; # được quản lý bởi Certbot
ssl_certificate_key /etc/letsencrypt/live/another_example.com/privkey.pem; # được quản lý bởi Certbot
bao gồm /etc/letsencrypt/options-ssl-nginx.conf; # được quản lý bởi Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # được quản lý bởi Certbot
lỗi_trang 404 /404.html;
vị trí = /404.html {
gốc /root/công khai/;
nội bộ;
}
địa điểm / {
gốc /root/công khai/;
chỉ số index.html;
}
vị trí ~* ^/(?:favicon|apple-touch-icon|android-chrome-|mstile-|safari-pinned-tab.svg|browserconfig.xml|mainfest.json) {
bí danh /root/public/icons/icon-48x48.png;
}
vị trí ^~ /hình ảnh {
bí danh /root/alimentacion;
try_files $uri $uri/ =404;
}
vị trí/xếp hạng {
proxy_pass http://xếp hạng;
proxy_http_version 1.1;
proxy_set_header Nâng cấp $http_upgrade;
proxy_set_header Kết nối "nâng cấp";
proxy_set_header Máy chủ lưu trữ $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
}
Tại sao lại chuyển hướng người dùng đến another_example.com khi truy cập trực tiếp vào đường dẫn "/subdir"?
Ứng dụng Spring Boot không có bất cứ thứ gì trong thư mục gốc, trong cục bộ khi bạn yêu cầu thư mục gốc của ứng dụng Khởi động mùa xuân trả về 404, đây có phải là sự cố không?
CHỈNH SỬA đầu ra nginx -T:
nginx: cú pháp file cấu hình /etc/nginx/nginx.conf là ok
nginx: file cấu hình /etc/nginx/nginx.conf kiểm tra thành công
# tập tin cấu hình /etc/nginx/nginx.conf:
người dùng gốc;
worker_processes tự động;
pid /run/nginx.pid;
bao gồm /etc/nginx/modules-enabled/*.conf;
sự kiện {
công_nhân kết_nối 768 ;
# đa_chấp vào ;
}
http {
##
# Cài đặt cơ bản
##
gửi tệp trên;
bật tcp_nopus;
bật tcp_nodelay;
keepalive_timeout 65;
loại_hash_max_size 2048;
server_tokens tắt;
client_max_body_size 180M; #Â cho phép khách hàng tải lên các tệp 180 MB
# server_name_hash_bucket_size 64;
# máy chủ_tên_trong_chuyển hướng tắt;
bao gồm /etc/nginx/mime.types;
ứng dụng default_type/octet-stream;
##
# Cài đặt SSL
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Bỏ SSLv3, tham khảo: POODLE
bật ssl_prefer_server_ciphers;
##
# Cài đặt ghi nhật ký
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Cài đặt Gzip
##
bật gzip;
bật gzip_vary;
gzip_proxied bất kỳ;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
văn bản gzip_types/văn bản thuần túy/ứng dụng css/ứng dụng json/văn bản javascript/ứng dụng xml/ứng dụng xml/xml+văn bản rss/javascript;
##
# Cân bằng tải
##
ngược dòng uv {
máy chủ cục bộ: 8081;
}
kiểm tra ngược dòng {
máy chủ cục bộ: 8087;
}
phụ trợ ngược dòng {
máy chủ cục bộ: 8085;
}
xếp hạng ngược dòng {
máy chủ cục bộ: 4000;
}
##
# Cấu hình máy chủ ảo
##
bao gồm /etc/nginx/conf.d/*.conf;
bao gồm /etc/nginx/sites-enabled/*;
}
# tệp cấu hình /etc/nginx/modules-enabled/50-mod-http-geoip.conf:
mô-đun load_module/ngx_http_geoip_module.so;
# tệp cấu hình /etc/nginx/modules-enabled/50-mod-http-image-filter.conf:
mô-đun load_module/ngx_http_image_filter_module.so;
# tệp cấu hình /etc/nginx/modules-enabled/50-mod-http-xslt-filter.conf:
mô-đun load_module/ngx_http_xslt_filter_module.so;
# tệp cấu hình /etc/nginx/modules-enabled/50-mod-mail.conf:
mô-đun load_module/ngx_mail_module.so;
# tệp cấu hình /etc/nginx/modules-enabled/50-mod-stream.conf:
mô-đun load_module/ngx_stream_module.so;
# tập tin cấu hình /etc/nginx/mime.types:
các loại {
văn bản/html html htm shtml;
văn bản/css css;
văn bản/xml xml;
hình ảnh/gif gif;
hình ảnh/jpeg jpeg jpg;
ứng dụng/javascript js;
ứng dụng/nguyên tử + nguyên tử xml;
ứng dụng/rss+xml rss;
văn bản/toán học mml;
văn bản/txt đơn giản;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
văn bản/x-thành phần htc;
hình ảnh/png png;
hình ảnh/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
hình ảnh/biểu tượng x ico;
hình ảnh/x-jng jng;
hình ảnh/x-ms-bmp bmp;
hình ảnh/svg+xml svg svgz;
hình ảnh/webp webp;
ứng dụng/phông chữ woff;
ứng dụng/java-archive jar chiến tai;
ứng dụng/json json;
ứng dụng/mac-binhex40 hqx;
tài liệu ứng dụng/msword;
ứng dụng/pdf pdf;
ứng dụng/tái bút ps eps ai;
ứng dụng/rtf rtf;
ứng dụng/vnd.apple.mpegurl m3u8;
ứng dụng/vnd.ms-excel xls;
ứng dụng/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
ứng dụng/vnd.wap.wmlc wmlc;
ứng dụng/vnd.google-earth.kml+xml kml;
ứng dụng/vnd.google-earth.kmz kmz;
ứng dụng/x-7z-nén 7z;
ứng dụng/x-ca cao cco;
ứng dụng/x-java-archive-diff jardiff;
ứng dụng/x-java-jnlp-tệp jnlp;
ứng dụng/x-makeself chạy;
ứng dụng/x-perl pl chiều;
ứng dụng/x-pilot prc pdb;
ứng dụng/x-rar-rar nén;
ứng dụng/x-redhat-gói-quản lý rpm;
ứng dụng/x-biển biển;
ứng dụng/x-shockwave-flash swf;
ứng dụng/x-stuffit ngồi;
ứng dụng/x-tcl tcl tk;
ứng dụng/x-x509-ca-cert der pem crt;
ứng dụng/x-xpinstall xpi;
ứng dụng/xhtml+xml xhtml;
ứng dụng/xspf+xml xspf;
ứng dụng/zip zip;
ứng dụng/octet-stream bin exe dll;
gỡ lỗi ứng dụng/octet-stream;
ứng dụng/octet-stream dmg;
ứng dụng/octet-stream iso img;
ứng dụng/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;
âm thanh/midi mid midi kar;
âm thanh/mpeg mp3;
âm thanh/ogg ogg;
âm thanh/x-m4a m4a;
âm thanh/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;
}
# tệp cấu hình /etc/letsencrypt/options-ssl-nginx.conf:
# Tệp này chứa các tham số bảo mật quan trọng. Nếu bạn sửa đổi tập tin này
# theo cách thủ công, Certbot sẽ không thể tự động cung cấp bảo mật trong tương lai
# cập nhật. Thay vào đó, Certbot sẽ in và ghi lại thông báo lỗi với đường dẫn đến
# tệp cập nhật mà bạn sẽ cần tham khảo khi cập nhật thủ công
# tập tin này.
ssl_session_cache được chia sẻ:le_nginx_SSL:1m;
ssl_session_timeout 1440m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
bật ssl_prefer_server_ciphers;
ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE- RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128- SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256: 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";
# tệp cấu hình /etc/nginx/sites-enabled/example:
người phục vụ {
nghe 80;
server_name example.com www.example.com;
trả lại 301 https://example.com$request_uri;
}
người phục vụ {
nghe 443 ssl;
server_name example.com www.example.com;
gốc /root/wordpress_example;
chỉ số index.php;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # được quản lý bởi Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # được quản lý bởi Certbot
bao gồm /etc/letsencrypt/options-ssl-nginx.conf; # được quản lý bởi Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # được quản lý bởi Certbot
vị trí = /favicon.ico { log_not_found tắt; truy cập_đăng xuất; }
vị trí = /robots.txt { log_not_found tắt; truy cập_đăng xuất; chấp nhận tất cả; }
vị trí ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
hết hạn tối đa;
log_not_found tắt;
}
địa điểm / {
try_files $uri $uri/ /index.php?$args;
}
vị trí ~ \.php$ {
bao gồm fastcgi_params;
bật fastcgi_intercept_errors;
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
vị trí /thư mục con/ {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect tắt;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
vị trí = /subdir {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect tắt;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
}
# tập tin cấu hình /etc/nginx/fastcgi_params:
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_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 $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# Chỉ PHP, bắt buộc nếu PHP được xây dựng với --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
# tệp cấu hình /etc/nginx/sites-enabled/another_example:
người phục vụ {
nghe 80;
server_name another_example.com www.another_example.com;
trả lại 301 https://another_example.com$request_uri;
}
người phục vụ {
underscores_in_headers bật;
nghe 443 ssl;
server_name another_example.com www.another_example.com;
ssl_certificate /etc/letsencrypt/live/another_example.com/fullchain.pem; # được quản lý bởi Certbot
ssl_certificate_key /etc/letsencrypt/live/another_example.com/privkey.pem; # được quản lý bởi Certbot
bao gồm /etc/letsencrypt/options-ssl-nginx.conf; # được quản lý bởi Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # được quản lý bởi Certbot
lỗi_trang 404 /404.html;
vị trí = /404.html {
gốc /root/công khai/;
nội bộ;
}
địa điểm / {
gốc /root/công khai/;
chỉ số index.html;
}
vị trí ~* ^/(?:favicon|apple-touch-icon|android-chrome-|mstile-|safari-pinned-tab.svg|browserconfig.xml|mainfest.json) {
bí danh /root/public/icons/icon-48x48.png;
}
vị trí ^~ /hình ảnh {
bí danh /root/alimentacion;
try_files $uri $uri/ =404;
}
vị trí/xếp hạng {
proxy_pass http://xếp hạng;
proxy_http_version 1.1;
proxy_set_header Nâng cấp $http_upgrade;
proxy_set_header Kết nối "nâng cấp";
proxy_set_header Máy chủ lưu trữ $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
}
CHỈNH SỬA VỚI GIẢI PHÁP:
Với sự giúp đỡ của @Tero Kilkanen và thử và sai, tôi đã tìm ra giải pháp:
vị trí /thư mục con/ {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect tắt;
}
vị trí = /subdir {
proxy_pass http://127.0.0.1:8080;
proxy_redirect tắt;
}
vị trí = /subdir/ {
proxy_pass http://127.0.0.1:8080;
proxy_redirect tắt;
}