2014-11-16 14 views
10

Tôi đã định cấu hình Nginx làm proxy đảo ngược đơn giản.Lỗi với IP và Nginx làm proxy ngược

Tôi chỉ sử dụng thiết lập cơ bản

location/{ 
    proxy_pass foo.dnsalias.net; 
    proxy_pass_header Set-Cookie; 
    proxy_pass_header P3P; 
} 

Vấn đề là sau một thời gian (vài ngày) các trang web sau nginx trở thành unaccessible. Indead nginx cố gắng gọi một ip xấu (các trang web phía sau nginx là ở nhà của tôi phía sau hộp của tôi và tôi là một bằng cách sử dụng một dyn-dns vì ip của tôi không phải là fixe). Dyn-dns này luôn hợp lệ (tôi có thể gọi trực tiếp trang web của tôi) nhưng vì lý do mơ hồ Nginx bị kẹt với điều đó ..

Vì vậy, như đã nói, nginx chỉ cho tôi 504 Cổng hết thời gian sau một thời gian. Có vẻ như lỗi xảy ra khi tôi thay đổi ip ở nhà. Dưới đây là một mẫu của bản ghi lỗi:

[error] ... upstream timed out (110: Connection timed out) while connecting to upstream, client: my.current.ip, server: myreverse.server.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://my.old 
.home.ip", host: "myreverse.server.com" 

Vì vậy, em biết tại sao nginx đang sử dụng ip thay cho DN?

Trả lời

23

Nếu giá trị proxy_pass không chứa biến, nginx sẽ phân giải tên miền để IP khi tải cấu hình và bộ nhớ cache cho đến khi bạn khởi động lại/tải lại nó. Điều này là khá dễ hiểu từ một quan điểm thực hiện.

Nhưng, trong trường hợp thay đổi bản ghi DNS động, điều này có thể không được mong muốn. Vì vậy, hai tùy chọn có sẵn tùy thuộc vào giấy phép bạn sở hữu hay không.

phiên bản thương mại (Nginx +)

Trong trường hợp này, sử dụng một khối thượng nguồn và chỉ định tên miền cần phải được giải quyết theo định kỳ sử dụng một trình giải quyết cụ thể. Bản ghi TTL có thể được ghi đè bằng tham số valid=time. Thông số resolve của chỉ thị server sẽ buộc DN phải được giải quyết định kỳ.

http {  

    resolver X.X.X.X valid=5s; 

    upstream dynamic { 
     server foo.dnsalias.net resolve; 
    } 

    server { 

     server_name www.example.com; 

     location/{ 
      proxy_pass http://dynamic; 
      ... 
     } 

    } 

} 

Tính năng này được thêm vào Nginx + 1.5.12.

Phiên bản cộng đồng (Nginx)

Trong trường hợp đó, bạn cũng sẽ cần trình phân giải tùy chỉnh như trong giải pháp trước. Nhưng để giải quyết giải pháp thượng nguồn không có sẵn, bạn cần phải sử dụng một biến trong chỉ thị proxy_pass của mình. Bằng cách đó nginx cũng sẽ sử dụng trình phân giải, tôn trọng thời gian lưu trữ được chỉ định với tham số valid. Ví dụ, bạn có thể sử dụng tên miền như là một biến:

http { 

    resolver X.X.X.X valid=5s; 

    server { 

     server_name www.example.com; 
     set $dn "foo.dnsalias.net"; 

     location/{ 
      proxy_pass http://$dn; 
      ... 
     } 

    } 

} 

Sau đó, bạn có thể sẽ cần thêm một chỉ thị proxy_redirect để xử lý chuyển hướng.

+0

Nghe hay đấy, tôi sẽ thử giải pháp này cho phản hồi sau đó. Cảm ơn rất nhiều. (phiên bản cộng đồng) – max54

+0

Tôi đã cố gắng sử dụng một số giải quyết nhưng không có gì hoạt động, tôi luôn nhận được 'recv() không thành công (111: Kết nối bị từ chối) trong khi giải quyết, giải quyết: X.X.X.X: 53' với X là địa chỉ IP khác nhau mà tôi đã thử. – max54

+0

(chỉnh sửa quá muộn) Tôi nên đặt chính xác gì vào trình phân giải? – max54

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