2013-06-24 30 views
7

Target:Làm thế nào để kiểm tra ủy quyền nginx timeouts

Tôi muốn kiểm tra tất cả các thông số thời gian chờ Proxy Nginx trong kịch bản rất đơn giản. Cách tiếp cận đầu tiên của tôi là tạo ra máy chủ HTTP thực sự đơn giản và đặt một số timeout:

  1. giữa lắng nghe và chấp nhận để kiểm tra proxy_connect_timeout
  2. giữa chấp nhận và đọc để kiểm tra proxy_send_timeout
  3. giữa đọc và gửi cho kiểm tra proxy_read_timeout

test:

1) mã Server (python): cấu hình

import socket 
import os 
import time 
import threading 

def http_resp(conn): 
    conn.send("HTTP/1.1 200 OK\r\n") 
    conn.send("Content-Length: 0\r\n") 
    conn.send("Content-Type: text/xml\r\n\r\n\r\n") 

def do(conn, addr): 
    print 'Connected by', addr 
    print 'Sleeping before reading data...' 
    time.sleep(0) # Set to test proxy_send_timeout 
    data = conn.recv(1024) 
    print 'Sleeping before sending data...' 
    time.sleep(0) # Set to test proxy_read_timeout 
    http_resp(conn) 
    print 'End of data stream, closing connection' 
    conn.close() 

def main(): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    s.bind(('', int(os.environ['PORT']))) 
    s.listen(1) 
    print 'Sleeping before accept...' 
    time.sleep(130) # Set to test proxy_connect_timeout 
    while 1: 
     conn, addr = s.accept() 
     t = threading.Thread(target=do, args=(conn, addr)) 
     t.start() 

if __name__ == "__main__": 
    main() 

2) Nginx:

tôi đã mở rộng cấu hình mặc định Nginx bằng cách thiết lập một cách rõ ràng proxy_connect_timeout và thêm proxy_pass trỏ đến địa phương của tôi Máy chủ HTTP:

location/{ 
     proxy_pass http://localhost:8888; 
     proxy_connect_timeout 200; 
    } 

3) Obse rvation:

proxy_connect_timeout - Mặc dù cài đặt nó vào 200s và ngủ chỉ 130 giữa lắng nghe và chấp nhận Nginx trả 504 sau ~ 60 mà có thể là do mặc định proxy_read_timeout giá trị. Tôi không hiểu cách proxy_read_timeout có thể ảnh hưởng đến kết nối ở giai đoạn sớm như vậy (trước khi chấp nhận). Tôi mong đợi 200 ở đây. Vui lòng giải thích!

proxy_send_timeout - Tôi không chắc chắn nếu cách tiếp cận của tôi để kiểm tra proxy_send_timeout là đúng - tôi nghĩ rằng tôi vẫn không hiểu thông số này một cách chính xác. Sau khi tất cả, sự chậm trễ giữa chấp nhận và đọc không bắt buộc proxy_send_timeout.

proxy_read_timeout - có vẻ như khá đơn giản. Cài đặt độ trễ giữa đọc và ghi thực hiện công việc.

Vì vậy, tôi đoán giả định của mình sai và có lẽ tôi không hiểu đúng thời gian chờ proxy_connect và proxy_send. Một số có thể giải thích cho họ bằng cách sử dụng thử nghiệm trên nếu có thể (hoặc sửa đổi nếu được yêu cầu).

Trả lời

4

Theo the docs thời gian chờ kết nối không được vượt quá 75 giây, điều này có thể giải thích tại sao thời gian chờ kết thúc sớm hơn mong đợi của bạn. Không tích cực, tuy nhiên. Tôi chưa bao giờ thực sự làm việc với thư viện ổ cắm python mức thấp để nó có thể chấp nhận kết nối vào pool ở mức thấp trước khi bạn thực sự gọi s.accept() trong chương trình của bạn.

Gửi thời gian chờ hoạt động bằng cách đo thời gian giữa hai đoạn dữ liệu hướng đến máy chủ ngược dòng. Vì bạn đang gửi toàn bộ câu trả lời trong một đoạn, tôi đoán trong quá trình triển khai của bạn, bạn sẽ nhấn lại lần nữa, thay vì gửi thời gian chờ.Nếu bạn gửi một đoạn, sau đó chờ quá thời gian chờ gửi để gửi phần còn lại của phản hồi và đóng kết nối, bạn nên nhấn thời gian chờ gửi.

+0

Có, bạn đúng về giới hạn proxy_connect_timeout 75 giây. Dù sao, tôi cũng đã cố gắng thiết lập proxy_connect_timeout đến 30s và lắng nghe/chấp nhận chậm trễ đến 50 - tôi nhận được 200, đó là một chút bất ngờ !!! Khi tôi tăng độ trễ lên 65 và đặt proxy_read_timeout thành 75 giây, tôi nhận được 504 sau 60 giây. – mkorszun

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