Điểm:0

Cách khắc phục sự cố 400 Yêu cầu không hợp lệ "ứng dụng khách đã gửi phương thức không hợp lệ trong khi đọc dòng yêu cầu ứng dụng khách"

lá cờ cn

Tôi đã thiết lập nginx để chấm dứt kết nối SSL và chuyển tiếp các yêu cầu tới chương trình phụ trợ http. Máy khách thực hiện một số yêu cầu nền, một trong số đó không thành công với 400 yêu cầu sai bất cứ khi nào nó cố gắng đàm phán kết nối SSL. Nếu nó không cần thương lượng kết nối - ví dụ: nếu một yêu cầu nền khác vừa được đăng thành công, thì yêu cầu thành công. Kiểm tra tab mạng Chrome cho thấy không có sự khác biệt liên quan giữa yêu cầu thành công và yêu cầu không thành công. Hành trình của tôi được đăng ở đây trong báo cáo lỗi này, nhưng đây là những gì tôi đã có thể chắt lọc cho đến nay:

Kết nối SSL

Khi yêu cầu sự cố thành công, tôi có thể biết rằng không cần thương lượng kết nối SSL bằng cách xem tab Thời gian của yêu cầu mạng (trong Chrome): Thời gian - yêu cầu thành công

Mặt khác, bất cứ khi nào yêu cầu không thành công, tôi thấy rằng nó đã cố thương lượng kết nối SSL, như được thấy trong hình ảnh này: Thời gian - yêu cầu không thành công

Xử lý Nginx

Bằng cách kiểm tra nhật ký truy cập ứng dụng, tôi đã xác định rằng chính nginx trả về 400 yêu cầu sai lỗi chứ không phải ứng dụng HTTP.Khi yêu cầu không thành công, tất cả nhật ký nginx là nội dung POST còn hơn là phương thức HTTP và URL theo thông thường (Tôi chưa tùy chỉnh định dạng nhật ký nginx).

Tôi đã bật gỡ lỗi trong nhật ký lỗi nginx (với dòng error_log /var/log/nginx/error.log gỡ lỗi;). Điều này cho phép tôi xem điều gì đang diễn ra trong quá trình đàm phán SSL (mặc dù tôi không hiểu).

Như tôi đã đề cập ngắn gọn ở trên, có những yêu cầu nền khác thành công, mặc dù chúng chạy ít thường xuyên hơn. Sau khi bất kỳ yêu cầu nào thành công, tất cả các yêu cầu sẽ thành công trong một khoảng thời gian (cho đến khi chúng cần đàm phán kết nối SSL).

Ngoài ra, nếu tôi sử dụng Sao chép dưới dạng cURL chức năng từ Chrome và chạy yêu cầu dưới dạng yêu cầu cURL, nó luôn thành công. Lần duy nhất tôi quan sát thấy nó không thành công là khi trình duyệt đưa ra yêu cầu.

Nhật ký gỡ lỗi Nginx

Đây là bit có liên quan từ một yêu cầu SSL thành công trong nhật ký:

22/10/2021 20:37:59 [gỡ lỗi] 1858722#1858722: *441 miễn phí: 0000562A9F69F340
22/10/2021 20:37:59 [gỡ lỗi] 1858722#1858722: *438 http yêu cầu ngược dòng: "/api/method/frappe.core.doctype.log_settings.log_settings.has_unseen_error_log?"
22/10/2021 20:37:59 [gỡ lỗi] 1858722#1858722: *438 tiêu đề quy trình ngược dòng http
22/10/2021 20:37:59 [gỡ lỗi] 1858722#1858722: *438 malloc: 0000562A9F712CB0:131072
22/10/2021 20:37:59 [gỡ lỗi] 1858722#1858722: *438 recv: eof:0, avail:-1
22/10/2021 20:37:59 [gỡ lỗi] 1858722#1858722: *438 recv: fd:9 678 trên 131072
22/10/2021 20:37:59 [gỡ lỗi] 1858722#1858722: *438 Trạng thái proxy http 200 "200 OK"
22/10/2021 20:37:59 [gỡ lỗi] 1858722#1858722: *438 Tiêu đề proxy http: "Máy chủ: gunicorn"
... thêm tiêu đề proxy http ...
22/10/2021 20:37:59 [gỡ lỗi] 1858722#1858722: *438 tiêu đề proxy http đã hoàn tất
22/10/2021 20:37:59 [gỡ lỗi] 1858722#1858722: *438 tiêu đề bộ lọc xslt
22/10/2021 20:37:59 [gỡ lỗi] 1858722#1858722: *438 HTTP/1.1 200 OK
Máy chủ: nginx/1.18.0 (Ubuntu)
... Phản hồi HTTP

Đây là cuộc đàm phán thất bại:

22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 miễn phí: 0000562A9F69F340
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 trình xử lý yêu cầu chờ http
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 malloc: 0000562A9F69F340:1024
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 SSL_read: 812
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 SSL_read: -1
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 SSL_get_error: 2
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 kết nối tái sử dụng: 0
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 posix_memalign: 0000562A9F70CEB0:4096 @16
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 dòng yêu cầu quy trình http
22/10/2021 20:39:00 [thông tin] 1858722#1858722: *446 ứng dụng khách đã gửi phương thức không hợp lệ trong khi đọc dòng yêu cầu của ứng dụng khách, ứng dụng khách: 107.185.20.83, máy chủ: atlas-dev.ebs.llc, yêu cầu: "doctype= Error+Log&fields=%5B%22%60tabError+Log%60.%60name%60%22%2C%22%60tabError+Log%60.%60owner%60%22%2C%22%60tabError+Log%60.% 60creation%60%22%2C%22%60tabError+Log%60.%60modified%60%22%2C%22%60tabError+Log%60.%60modified_by%60%22%2C%22%60tabError+Log%60. %60_user_tags%60%22%2C%22%60tabError+Log%60.%60_comments%60%22%2C%22%60tabError+Log%60.%60_assign%60%22%2C%22%60tabError+Log%60 .%60_liked_by%60%22%2C%22%60tabError+Log%60.%60docstatus%60%22%2C%22%60tabError+Log%60.%60parent%60%22%2C%22%60tabError+Log% 60.%60parenttype%60%22%2C%22%60tabError+Log%60.%60parentfield%60%22%2C%22%60tabError+Log%60.%60idx%60%22%2C%22%60tabError+Log %60.%60method%60%22%2C%22%60tabError+Log%60.%60seen%60%22%5D&filters=%5B%5D&order_by=%60tabError+Log%60.%60modified%60+desc&start=0&page_length= 20&view=List&with_comment_count=true"
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 http hoàn tất yêu cầu: 400, "?" a:1, c:1
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 bộ đếm thời gian sự kiện del: 9: 337737968
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 http phản hồi đặc biệt: 400, "?"
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 http đặt nội dung hủy bỏ
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 tiêu đề bộ lọc xslt
22/10/2021 20:39:00 [gỡ lỗi] 1858722#1858722: *446 HTTP/1.1 400 Yêu cầu không hợp lệ
Máy chủ: nginx/1.18.0 (Ubuntu)
Ngày: Thứ Sáu, ngày 22 tháng 10 năm 2021 20:39:00 GMT
Loại nội dung: văn bản/html
Độ dài nội dung: 166
Kết nối: đóng

Dựa trên những gì tôi biết ít ỏi về nhật ký gỡ lỗi nginx (nghĩa là không có gì), đối với tôi, có vẻ như nginx hoán đổi phương thức HTTP và url cho phần thân trong quá trình đàm phán. Khi nó tìm kiếm phương thức HTTP, nó không còn nữa và nó bị nghẹt.

Cấu hình SSL Nginx

Thông tin phiên bản: nginx/1.18.0 (Ubuntu), Ubuntu 20.04 LTS Tôi đang sử dụng mặc định nginx.conf. Phần SSL của conf máy chủ trông như thế này:

nghe 443 ssl;

server_name [HOST];

gốc /opt/erpnext/băng ghế dự bị/trang web;

proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;

ssl_certificate /etc/letsencrypt/live/[HOST]/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/[HOST]/privkey.pem;
ssl_session_timeout 5 phút;
ssl_session_cache được chia sẻ:SSL:10m;
tắt ssl_session_tickets;
ssl_dập ghim vào;
ssl_stapling_verify bật;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
bật ssl_prefer_server_ciphers;

Có một chuyển hướng SSL ở cuối tệp và nginx được thiết lập để phục vụ máy chủ web HTTP dựa trên tệp phẳng trên cổng 8080 từ một cấu hình khác.

Làm cách nào để xác định nguyên nhân gây ra sự cố? Tôi biết rằng yêu cầu được hình thành đúng cách, bởi vì các yêu cầu giống hệt nhau đã thành công... cho đến khi nó cần thương lượng kết nối SSL. Cứu giúp?

dave_thompson_085 avatar
lá cờ jp
{voice='CrocodileDundee'} không phải thương lượng lại. Trong TLS 1.2 trở xuống, đàm phán lại cụ thể là một quá trình bắt tay mới để thay đổi các tham số bảo mật trên kết nối _hiện tại_. Tôi không nghĩ rằng bất kỳ trình duyệt nào đã từng khởi tạo nó, mặc dù các loại ứng dụng khách khác có thể hoặc ít nhất là có thể; sau một số lỗ hổng (dẫn đến nhiều hệ thống cấm hoặc chặn nó) và các bản vá lỗi (xem rfc5746) trong quá trình đàm phán lại TLS1.3 đã bị xóa hoàn toàn. ...
dave_thompson_085 avatar
lá cờ jp
... Những gì bạn có là OT1H (tái) sử dụng kết nối (và phiên) hiện có hoặc OTOH tạo kết nối mới, luôn sử dụng bắt tay/đàm phán ban đầu trong 1.2 hoặc chỉ là bắt tay (không cần phân biệt là ban đầu) trong 1.3; cái bắt tay này có thể và đối với một trình duyệt gần như chắc chắn sẽ sử dụng **resumption** của _session_ trước đó (trong 1.3 thực tế là một PSK có nguồn gốc từ phiên trước, để bảo mật về phía trước). Tuy nhiên, sửa tên không giúp giải quyết vấn đề của bạn, xin lỗi.
jobu1342 avatar
lá cờ cn
Vì vậy, bạn nói rằng nó đang đàm phán một kết nối mới, không phải đàm phán lại một kết nối cũ? Xin lỗi vì đã không sử dụng các thuật ngữ kỹ thuật cho nó - như bạn đoán, tôi không hiểu sâu về vấn đề này. Tất nhiên đó là lý do tại sao tôi đang tìm kiếm sự giúp đỡ!
dave_thompson_085 avatar
lá cờ jp
Chính xác! Việc không sử dụng các thuật ngữ kỹ thuật không hẳn là quá nhiều, mà là vô tình _dùng sai_ một thuật ngữ theo cách có thể dễ dàng đánh lạc hướng chính xác kiểu người mà bạn muốn giúp đỡ.
jobu1342 avatar
lá cờ cn
Tôi đã cập nhật câu hỏi - cảm ơn vì đã làm rõ!
jobu1342 avatar
lá cờ cn
Tôi vừa thực hiện một số thử nghiệm trên nhiều trình duyệt và thậm chí trên nhiều máy. không phải tất cả các trình duyệt đều bị lỗi, mặc dù tôi chưa phát hiện ra bất kỳ trình duyệt nào: FAIL: Google Chrome (Win10), Edge (Win10), Opera (Win10, bản cài đặt mới). Thành công: FireFox, Brave, Vivaldi, Google Chrome (Kubuntu 21.10), Google Chrome (Win10). Điều đáng chú ý là Google Chrome hoạt động hay không hoạt động tùy thuộc vào máy tính. Các thử nghiệm của tôi không đầy đủ, nhưng nó gợi ý một lỗi liên quan đến cài đặt cục bộ. Tôi sẽ cài đặt lại Chrome trên máy tính mục tiêu để xem nó có bắt đầu hoạt động không.
jobu1342 avatar
lá cờ cn
Vì vậy ... hóa ra phần mềm chống vi-rút của tôi đang hoạt động ở mức trung bình. Khi tôi tắt AV, tôi hoàn toàn không gặp phải vấn đề này.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.