Chuyển proxy Nginx đến proxy ngược
Tôi khá mới với nginx và bị mắc kẹt với cấu hình hiện tại.
Tôi cũng đã kiểm tra ssl - nginx có chuyển hướng , nginx làm proxy cho ứng dụng web , nginx proxy_pass , ghi lại proxy nginx và một bài đăng khác liên quan đến câu hỏi của tôi .
Tôi cũng đã xem xét một số bài viết khác mà không giúp tôi ngay bây giờ. Tôi đã không đọc tất cả khoảng 21500 bài đăng về các chủ đề nginxvà proxy.
Google cũng không hướng tôi đến giải pháp.
Thiết lập hiện tại là:
[CMS (Plone in LAN)]<--->[Reverse-Proxy (Apache / http://oldsite.foo)]
Đây là thiết lập trang web cũ. Về cơ bản, chúng tôi cần thiết kế lại CMS. Nhưng nó đã phát triển với rất nhiều phụ thuộc và các mô-đun tự viết bởi ít nhất hai nhà phát triển (những người chưa bao giờ gặp nhau). Nó sẽ là một nhiệm vụ chỉ trong một năm để thay thế nó đúng cách. Cũng có một số thứ kỳ lạ trong cấu hình Apache, vì vậy chúng tôi không thể tránh sử dụng Apache vào lúc này.
Thật không may, chúng tôi cần thiết kế lại quang học càng sớm càng tốt.
Vì vậy, chúng tôi nảy ra ý tưởng sử dụng Diazo / XSLT trong Nginx để thiết kế lại trang web cũ và hiển thị cho người đánh giá của chúng tôi một số kết quả.
Do đó, tôi thử thiết lập sau:
[Plone]<--->[Apache]<--->[Proxy (XSLT in Nginx / https://newsite.foo)]
Đây là xslt_for_oldsitetệp cấu hình của tôi (Cache-Control chỉ tắt để gỡ lỗi):
add_header Cache-Control no-cache;
server {
server_name newsite.foo;
server_tokens off;
listen b.b.b.b:80;
return 301 https://$server_name$request_uri;
access_log /var/log/nginx/newsite.port80.access.log;
error_log /var/log/nginx/newsite.port80.error.log;
}
server {
server_name newsite.foo;
server_tokens off;
listen b.b.b.b:443 ssl;
access_log /var/log/nginx/newsite.port443.access.log;
error_log /var/log/nginx/newsite.port443.error.log;
ssl_certificate /etc/ssl/certs/nginx.crt;
ssl_certificate_key /etc/ssl/private/nginx.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5:!ADH:!AECDH;
ssl_session_cache shared:SSL:5m;
proxy_http_version 1.1;
#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_set_header Connection "";
# proxy_ignore_headers Expires;
# proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-forwarded-host $host;
sub_filter_types *;
sub_filter_once off;
sub_filter "http://oldsite.foo" "https://newsite.foo";
location / {
proxy_pass http://oldsite.foo/;
proxy_redirect off;
#proxy_redirect http://oldsite.foo/ https://newsite.foo/;
proxy_set_header Host $host;
}
}
Nếu tôi khởi động trình duyệt của mình để kết nối với http://oldsite.foo sau đó nó tải:
- 1 tài liệu HTML từ oldsite
- 3 tệp CSS từ oldsite
- 9 tệp JS từ oldsite
- 10 tệp đồ họa từ oldsite
Nhưng nếu tôi sử dụng trình duyệt của mình để lấy https://newsite.foo sau đó nó tải:
- 1 tài liệu HTML từ newsite
- chỉ có 5 tệp đồ họa từ oldsite (yêu cầu trực tiếp từ trình duyệt của tôi)
- mọi thứ khác đều thiếu
Trong khi tài liệu HTML nhận được wget https://newsite.foo -o index.htmlcó tất cả các liên kết được sửa đổi thành https://newsite.foo(thay thế chính xác http://oldsite.foobằng https://newsite.foo), trình duyệt hiển thị tất cả các liên kết chưa được sửa đổi: http://oldsite.foothay vì https://newsite.foo.
Tôi nhận được tiêu đề máy chủ sau với curl -I https://newsite.foo:
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 11 Sep 2020 10:28:15 GMT
Content-Type: text/html
Connection: keep-alive
Accept-Ranges: none
Accept-Ranges: bytes
X-Varnish: 1216306480
Age: 0
Via: 1.1 varnish
Set-Cookie: I18N_LANGUAGE="de"; Path=/
Via: 1.1 oldsite.foo
Vary: Accept-Encoding
Cache-Control: no-cache
Tôi đã chơi xung quanh add_header, proxy_set_headervà proxy_redirect. Tôi cũng đã thử
location ~* .* {
proxy_pass http://oldsite.foo$request_uri;
proxy_redirect off;
proxy_set_header Host $host;
}
nhưng không có thay đổi nào của tôi thay đổi hành vi của nginx mà nó chuyển hướng các yêu cầu GET đến http://oldsite.foo và hiển thị các câu trả lời như thể chúng đến từ https://newsite.foo .
Tôi không có câu trả lời cho những câu hỏi này:
- Tại sao trình duyệt của tôi vẫn kết nối với http://oldsite.foo? Nó sẽ kết nối vớihttps://newsite.foo .
- Tại sao các liên kết trong HTML khác nhau giữa phiên bản từ
wgetvà trình duyệt của tôi? - Tại sao hơn một nửa trang web không đến được với trình duyệt https://newsite.foo?
- Làm thế nào tôi có thể sửa lỗi này?
Có ai ngoài đó có thể chỉ cho tôi đúng hướng không?
Cảm ơn trước. Ít nhất cảm ơn bạn đã đọc bài viết của tôi.
Trân trọng.
Trả lời
Trong khi đó tôi đã tìm ra giải pháp.
Apache đã gửi dữ liệu được nén và sub_filter không thể xử lý nó (xem tài liệu chính thức: sub_filter ).
Thật vậy, tôi đã cố gắng tránh điều này bằng cách sử dụng proxy_set_header Accept-Encoding "";nhưng nó không hoạt động. Lý do là phần này phải được đặt trong bối cảnh vị trí .
Do đó, cấu hình chính xác cho Ubuntu 20.04 LTS, Nginx 1.14.0 tại thời điểm viết bài (2020-09-15) là:
...
server {
server_name newsite.foo;
server_tokens off;
listen b.b.b.b:443 ssl;
access_log /var/log/nginx/newsite.port443.access.log;
error_log /var/log/nginx/newsite.port443.error.log;
ssl_certificate /etc/ssl/certs/nginx.crt;
ssl_certificate_key /etc/ssl/private/nginx.key;
# Double check and modify this part BEFORE using in production:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5:!ADH:!AECDH;
ssl_session_cache shared:SSL:5m;
location / {
proxy_http_version 1.1;
proxy_set_header Accept-Encoding ""; # MUST be written HERE in this context!
proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://oldsite.foo;
proxy_redirect off;
sub_filter_types text/html text/css text/javascript; # If unsure you may use '*'
sub_filter_once off;
sub_filter http://oldsite.foo https://newsite.foo;
}
...
Cảm ơn adrianTNT đã chỉ ra phần quan trọng cho tôi (xem chi tiết còn thiếu ).