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?