2015-10-19 18 views
6

Tôi muốn ủy quyền yêu cầu đến một máy chủ khác bằng proxy_pass trong khi xóa tiền tố đường dẫn phù hợp. Tôi tin rằng một cách để làm điều này là như sau;NGINX proxy_pass xóa tiền tố đường dẫn & giải quyết DNS

location /a/ { 
    proxy_pass https://website.com/ 
} 

Ví dụ: yêu cầu đến http://localhost/a/b.html sẽ được ủy quyền tới https://website.com/b.html.

Theo tôi biết vấn đề với điều này trong các phiên bản phi thương mại trên NGINX là bản ghi DNS A cho website.com sẽ được tải và được lưu trữ vĩnh viễn khi khởi động. Tôi đã nhìn thấy một kỹ thuật để giải quyết vấn đề này bằng cách sử dụng một biến như $request_uri trong chỉ thị proxy_pass, do đó buộc NGINX phải phân giải lại DNS theo TTL của bản ghi.

Ví dụ:

location /a/ { 
    rewrite ^/a/(.*) /$1 break; 
    proxy_pass https://website.com/$request_uri 
} 

Thật không may, có vẻ như ở trên không hoạt động vì dường như vẫn truyền/a/tiền tố lên thượng nguồn.

Về cơ bản tất cả những gì tôi muốn đạt được ở đây là ủy quyền một yêu cầu trong khi xóa tiền tố đường dẫn sao cho các bản ghi DNS không được lưu vào bộ nhớ cache mãi mãi.

Cảm ơn.

Trả lời

11

Tôi không chắc chắn nơi bạn đã nhìn thấy nó, nhưng chỉ cần sử dụng cụ thể $request_uri chắc chắn sẽ không kỳ diệu làm cho nginx giải quyết các tên miền cho bạn động.

Có lẽ những gì được đề xuất là sử dụng các biến, chẳng hạn như $uri (biến khác), giả định rằng khi các biến được sử dụng, thì tên miền được giải quyết riêng lẻ mỗi lần, không có bộ nhớ đệm? Tôi không xác nhận hoặc phủ nhận xem giả định đó có đúng hay không, nhưng sau đây ít nhất sẽ loại bỏ /a cho bạn.

location /a/ { 
    rewrite ^/a/(.*) /$1 break; 
    proxy_pass https://website.com/$uri$is_args$args; 
} 

(Lưu ý rằng nếu nó thực sự thực hiện không để cache tên miền, sau đó bạn cũng có thể muốn chạy một trình giải quyết tại địa phương, nếu không, độ trễ thêm và thời gian chết của DNS cung cấp hosting của bạn ngay lập tức sẽ ảnh hưởng đến trang web của bạn , chưa kể đến giới hạn truy vấn DNS có thể có của máy chủ của họ.)


Có lẽ giải pháp tốt hơn là định kỳ khởi động lại nginx để tự động nhận các thay đổi trong DNS? Ví dụ: nginx -s reload hoặc kill -HUP? Như được giải thích trong http://nginx.org/en/docs/beginners_guide.html#controlhttp://nginx.org/en/docs/control.html#reconfiguration, nginx không bao giờ ngừng xử lý bất kỳ yêu cầu nào trong quá trình tải lại, vì vậy nó phải là một hoạt động an toàn; và nó rất có thể sẽ dẫn đến DNS bị xóa.

+0

Cảm ơn bạn đã trả lời, tôi sẽ kiểm tra ngày hôm nay và nếu nó hoạt động tốt, tôi sẽ đánh dấu câu trả lời này được chấp nhận. Tôi đã tìm thấy lời khuyên trước đây về giải pháp [ở đây] (http://gc-taylor.com/blog/2011/11/10/nginx-aws-elb-name-resolution-resolvers). Tôi khá tự tin rằng điều này đã có hiệu quả "dự định" như xa như giải quyết DNS đi, bởi vì trước đây mà không có điều này thượng nguồn sẽ không còn có sẵn mỗi vài ngày hoặc lâu hơn và tôi sẽ cần phải khởi động lại. Tôi đã có nó chạy như thế này trong hơn 3 tháng nay không có khởi động lại và tôi đã không gặp phải bất kỳ vấn đề DNS kể từ khi thực hiện thay đổi đó. –

+0

Ồ, vâng, nếu nginx giữ một bộ nhớ cache trong 5 phút của tất cả các tên máy chủ nó giải quyết trong sự hiện diện của bất kỳ biến nào trong proxy_pass, điều đó sẽ có ý nghĩa; nó thậm chí còn được ghi lại theo cách đó, nhưng nó không rõ ràng lắm! học mỗi ngày! :-) vì vậy, tôi đoán ở trên sẽ hoạt động và bạn thậm chí nên xóa '/' sau '.com', ví dụ: phải là'.com $ uri' – cnst

+0

Vì vậy, các thử nghiệm sơ bộ dường như hoạt động tốt với đề xuất ban đầu của bạn 'viết lại ^/a /(.*)/$ 1 ngắt; proxy_pass https://website.com/$uri$is_args$args;) 'nhưng không ok với chỉ' .com $ uri' (các tham số truy vấn không được truyền đến thượng nguồn. Tôi sẽ gắn bó với đề xuất đầu tiên. cho các câu trả lời! –

Các vấn đề liên quan