Tôi đang chạy một máy chủ nginx hoạt động như một proxy cho một ổ cắm unix ngược dòng, như thế này:
upstream app_server {
server unix:/tmp/app.sock fail_timeout=0;
}
server {
listen ###.###.###.###;
server_name whatever.server;
root /web/root;
try_files $uri @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
}
Đổi lại, một số quy trình máy chủ ứng dụng sẽ loại bỏ các yêu cầu /tmp/app.sock
khi chúng có sẵn. Máy chủ ứng dụng cụ thể được sử dụng ở đây là Unicorn, nhưng tôi không nghĩ điều đó có liên quan đến câu hỏi này.
Vấn đề là, dường như chỉ qua một lượng tải nhất định, nginx không thể nhận được yêu cầu qua ổ cắm với tốc độ đủ nhanh. Không quan trọng tôi thiết lập bao nhiêu quy trình máy chủ ứng dụng.
Tôi đang nhận được một loạt các thông báo này trong nhật ký lỗi nginx:
connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream
Nhiều yêu cầu dẫn đến mã trạng thái 502 và những yêu cầu không mất nhiều thời gian để hoàn thành. Các nginx viết hàng đợi stat dao động khoảng 1000.
Dù sao, tôi cảm thấy như mình đang thiếu một cái gì đó rõ ràng ở đây, bởi vì cấu hình đặc biệt này của nginx và máy chủ ứng dụng là khá phổ biến, đặc biệt là với Unicorn (thực tế đây là phương pháp được đề xuất). Có bất kỳ tùy chọn kernel linux nào cần được thiết lập, hoặc một cái gì đó trong nginx không? Bất kỳ ý tưởng về làm thế nào để tăng thông lượng cho ổ cắm ngược dòng? Một cái gì đó rõ ràng là tôi đang làm sai?
Thông tin bổ sung về môi trường:
$ uname -a
Linux servername 2.6.35-32-server #67-Ubuntu SMP Mon Mar 5 21:13:25 UTC 2012 x86_64 GNU/Linux
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
$ unicorn -v
unicorn v4.3.1
$ nginx -V
nginx version: nginx/1.2.1
built by gcc 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
TLS SNI support enabled
Các chỉnh sửa kernel hiện tại:
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 16777216 16777216 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.route.flush = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.core.somaxconn = 8192
net.netfilter.nf_conntrack_max = 524288
Cài đặt Ulimit cho người dùng nginx:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ulimit -n
nói 65535
.
ulimit
, cụ thể số lượng tệp đang mở chưa?