tải lên gấp đôi
Kể từ khi chúng ta chuyển từ một cá thể Apache đơn giản sang một môi trường cân bằng tải, đôi khi có những vấn đề với các yêu cầu POST được lặp lại. Chúng tôi đang chạy nginx như proxy ngược. Nội dung tĩnh đang được phục vụ bởi chính nginx và nội dung động được phục vụ từ hai phụ trợ Apache.
Tôi đã kiểm tra rằng đó không phải là lỗi giao diện / người dùng. Một ví dụ nhỏ: tải lên hình ảnh đơn giản sẽ dẫn đến hình ảnh được tải lên hai lần. Yêu cầu / POST không được gửi hai lần bằng cách nhấp đúp hoặc lỗi người dùng. Tôi không tìm thấy bất kỳ bằng chứng nào cho thấy trình duyệt đang gửi yêu cầu hai lần, vì vậy sự nghi ngờ của tôi nằm ở phía máy chủ. (Lưu ý rằng đây chỉ là sự nghi ngờ.) Hầu hết các yêu cầu này là nội bộ, có nghĩa là chúng là của nhân viên, vì vậy tôi có thể xác minh cách chúng đến.
Điều duy nhất 'sai' tôi có thể tìm thấy là nginx sẽ ghi lại 499
lỗi trong những trường hợp này. Tuy nhiên, tôi không chắc chắn nếu đây là nguyên nhân hay chỉ là tác động (phụ) của vấn đề. (Tôi biết rằng 499 không phải là trạng thái http mặc định, đó là trạng thái nginx có nghĩa là "máy khách có kết nối đóng")
yêu cầu
Các yêu cầu POST lặp đi lặp lại gần như tất cả các yêu cầu có thể mất một lúc. Ví dụ tôi đang hiển thị ở đây là một ví dụ tải lên hình ảnh đơn giản, nhưng tập lệnh thực hiện một số nội dung trong nền (hình ảnh phải được chuyển đổi thành các định dạng / kích thước khác nhau và phải được phân phối cho cả hai máy chủ, v.v.).
nhật ký
Một ví dụ là việc tải lên một hình ảnh. nginx sẽ ghi lại một '499' và một yêu cầu 200, nhưng Apache đang nhận (và xử lý!) hai yêu cầu.
Apache
[17:17:37 +0200] "POST ***URL** HTTP/1. 0" 200 9045
[17:17:47 +0200] "POST ***URL** HTTP/1. 0" 200 20687
nginx
[17:17:47 +0200] "POST ***URL** HTTP/1.1" 499 0
[17:17:52 +0200] "POST ***URL** HTTP/1.1" 200 5641
Nghi ngờ
Dường như với tôi rằng các video tải lên lớn hơn / chậm hơn phải chịu đựng điều này nhiều hơn, vì vậy tôi nghi ngờ thời gian chờ. Tôi đã cố gắng đọc lên lỗi 499: kết luận dường như đó là "kết nối máy khách đóng". Đó có thể là trường hợp nền, nhưng tôi không chắc điều này có nghĩa là yêu cầu thứ hai sẽ được đưa ra và chắc chắn không có gì giống như "trình duyệt đóng của người dùng" đang diễn ra.
Hiện tại nó có vẻ giúp phá vỡ các yêu cầu POST chậm hơn (nếu có nhiều việc phải làm, chỉ cần khiến người dùng chọn 1 và POST lần thứ hai cho lần khác), nhưng điều này có thể làm giảm khả năng xảy ra. Không chắc.
Đây rõ ràng là một giải pháp tạm thời. Nếu đó là thời gian chờ, tôi cần tìm ra nơi và tăng các con số tương ứng, nhưng tôi không chắc tại sao thời gian chờ lại gây ra hành vi này: Tôi nghi ngờ một thông báo "tốt, đã sai", không lặp lại.
Câu hỏi
Tôi đang tìm hiểu xem quá trình / tình huống nào có thể khiến POST bị lặp lại. Tất nhiên, bất kỳ "không chắc chắn tại sao, nhưng nó sẽ được khắc phục bằng cách tăng thời gian chờ này" cũng rất tuyệt.
cấu hình nginx
NGINX.conf
user nginx;
worker_processes 2;
worker_rlimit_nofile 10240;
error_log /var/log/nginx/error.log error;
pid /var/run/nginx.pid;
events {
multi_accept on;
worker_connections 4096;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nodelay off;
client_max_body_size 30m;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
thú nhận
Tôi đã loại bỏ một số dòng dành riêng cho IP trong các geo
phần, cũng như các SSL
biến thể, để giữ cho nó đơn giản. Nếu cần tôi có thể thay thế chúng, nhưng nó sẽ chuyển sang geo
phần bổ sung cho các phụ trợ ssl, và các tệp ngược dòng và conf tương ứng.
geo $backend {
default apache-backend;
}
upstream apache-backend {
ip_hash;
server SERVER1 max_fails=3 fail_timeout=30s weight=2;
server SERVER2 max_fails=3 fail_timeout=30s weight=3;
}
conf.d / somestring.conf
limit_conn_zone $binary_remote_addr zone=somestring:10m;
server {
listen ip1:80;
listen ip2:80;
server_name name.tld www.name.tld;
root PATH
access_log PATH/name.log main;
location / {
proxy_pass http://$backend;
}
//*some more locations**//
gzip on;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_proxied any;
gzip_min_length 1100;
gzip_buffers 16 8k;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
}
conf.d / proxy.conf
proxy_set_header Accept-Encoding "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_buffering on;
proxy_read_timeout 90;
proxy_buffer_size 32k;
proxy_buffers 8 32k;
proxy_busy_buffers_size 32k;
proxy_temp_file_write_size 32k;
nginx
có thể làm điều này, tôi rất muốn nghe suy nghĩ của bạn. Tôi sẽ đăng cài đặt nginx một chút! (Tôi không muốn thực hiện một này "đây là bãi rác của tất cả các thiết lập ngẫu nhiên tôi có thể tìm thấy" câu hỏi, và như tôi hy vọng tôi đã giải thích, tôi đang cố gắng để tìm ra những gì một phần của chuỗi có thể phải chịu trách nhiệm)