2014-10-30 13 views
10

Tôi có một dự án Django chạy phía sau Nginx và Gunicorn. Một trong những ứng dụng tương tác với các thiết bị mạng sử dụng Exscript, lần lượt sử dụng Paramiko. Một số thiết bị không hoạt động bình thường khi chúng ở đằng sau Gunicorn.Gunicorn có thể gây ra sự cố với exscript/paramiko không?

Mã chính xác tương tự sẽ hoạt động tốt từ bên trong vỏ django-admin. Nó cũng sẽ hoạt động nếu tôi khởi chạy máy chủ django tích hợp, nhưng tôi vẫn gặp lỗi nếu tôi bỏ qua nginx và kết nối trực tiếp với Gunicorn.

Tôi đã thử di chuyển chức năng này sang nhiệm vụ cần tây, nó có cùng vấn đề chính xác, nhưng chỉ sau Gunicorn.

Tôi đã viết một tập lệnh bằng cách sử dụng các phần mở rộng django hoạt động từ dòng lệnh, nhưng sẽ thất bại nếu được gọi qua tiến trình con. Nhưng chỉ sau Gunicorn.

Các thiết bị bị lỗi tất cả dường như là F5 LTM và có vẻ như bộ đệm trên đối tượng exscript đang được sửa đổi bằng cách nào đó. Nếu tôi phải đoán tôi sẽ nói rằng Gunicorn, và Exscript/Paramiko đang bằng cách nào đó bước vào bộ nhớ của nhau, hoặc có lẽ Gunicorn đang thiết lập một số biến môi trường mà Exscript đang chọn.

Trong mọi trường hợp, tôi hoàn toàn bối rối và sẽ đánh giá cao bất kỳ hướng dẫn nào về cách khắc phục sự cố này.

+0

Bạn đã cài đặt paramiko bằng cách nào? Với gói hệ điều hành? Với pip? Bạn có sử dụng virtualenv không? Bạn có chắc chắn gunicorn sử dụng cùng một paramiko như dòng lệnh của bạn? –

+0

Parimiko được cài đặt với pip, và chỉ trong virtualenv mà gunicorn đang sử dụng. Ý tưởng tốt mặc dù. –

+2

Nếu bạn vẫn gặp sự cố, hãy chú ý xem [loại runner] nào (http://gunicorn-docs.readthedocs.org/en/latest/run.html#commonly-used-arguments) bạn đang sử dụng trong gunicorn? Khi bạn nói nó thất bại, bạn có thể xây dựng chính xác những gì xảy ra, (một ngoại lệ, quá trình treo cứng, vv)? – tutuDajuju

Trả lời

1

Tổng đoán, nhưng có lẽ điều này sẽ hữu ích khi gỡ lỗi. Về cơ bản, hãy đảm bảo bạn đã loại bỏ tất cả bộ đệm đầu ra, thường có thể ẩn những gì thực sự xảy ra khi phân lớp nhiều khung công tác lớn (như bạn đang làm ở đây).

Đảm bảo rằng bạn vô hiệu hóa tất cả bộ đệm đầu ra bằng Python, cho cả quy trình máy chủ web của bạn và cho bất kỳ quy trình công nhân nào (thiết lập PYTHONUNBUFFERED là cách dễ dàng để đảm bảo rằng không có tập lệnh python nào có đệm, ít nhất là trên các chức năng thư viện chuẩn).

Thiết bị đầu cuối cũng có thể giới thiệu bộ đệm giúp gỡ lỗi đặc biệt khó khăn. Cân nhắc việc chuyển đổi your command thành stdbuf -o0 -e0 your command để vô hiệu hóa bộ đệm trên stdout và stderr (your command vẫn có thể bật lại chúng, nhưng hầu hết các chương trình đều không).

+0

Được thăng hạng vì đó là điều mà tôi không cân nhắc trước đó, nhưng chúng tôi đã kết thúc bằng cách sử dụng thư viện f5. –

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