Chào các bạn, mình đã gặp phải một vấn đề rất nan giải khi thực hiện cấu hình cho trang Video của VnGeek (địa chỉ https://video.vngeek.com).
Trang Video của VnGeek.com sử dụng mã nguồn YouPHPTube.
Và với chính mã nguồn này thì khi hoạt động sẽ có trang Streamer và Encoder. Tức là người dùng sẽ tải tập tin lên trang Encoder (có nhiệm vụ Encode Video sang định dạng cần thiết sau đó tải lên trang Streamer). Và tất nhiên sẽ không có vấn đề xảy ra nếu như mình không cấu hình Proxy cho hệ thống.
Tức là thay vì nội dung phải đi qua lại giữa Streamer và Encoder là 2 lần thì bây giờ trở thành 4 lần.
Dưới đây là khi không sử dụng Proxy:
Tuy nhiên mọi việc sẽ thay đổi một chút nếu sử dụng Proxy (Proxy cho cả Encoder và Streamer):
Dưới đây là cấu hình của Proxy:
Streamer:
server {
listen 80;
server_name video.vngeek.com;
location / {
client_body_temp_path /tmp/;
client_body_in_file_only clean;
client_body_buffer_size 1M;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Host $remote_addr;
proxy_pass http://server.vngeek.com;
proxy_connect_timeout 3000;
proxy_send_timeout 3000;
proxy_read_timeout 3000;
send_timeout 3000;
client_max_body_size 1000M;
proxy_max_temp_file_size 1000M;
}
}
Encoder:
server {
listen 80;
server_name encoder.vngeek.com;
location / {
client_body_temp_path /tmp/;
client_body_in_file_only clean;
client_body_buffer_size 1M;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Host $remote_addr;
proxy_pass http://server.vngeek.com;
proxy_connect_timeout 3000;
proxy_send_timeout 3000;
proxy_read_timeout 3000;
send_timeout 3000;
client_max_body_size 1000M;
proxy_max_temp_file_size 1000M;
}
}
Sở dĩ mình có cấu hình:
client_body_temp_path /tmp/;
client_body_in_file_only clean;
client_body_buffer_size 1M;
Bởi vì sẽ có nhiều tập tin với kích thước lớn cho nên các tập tin này sẽ được lưu tạm trên ổ cứng (ở thư mục /tmp) và có buffer_size là 1MB. Đối với client_body_in_file_only mình thiết lập clean tức là sẽ tự động xóa tập tin này đi khi gửi thành công đến máy chủ đích.
Tất nhiên mình cũng có cấu hình trên máy chủ đích đối với tập tin Virtual host (máy chủ được Proxy trỏ đến):
client_max_body_size 2G;
proxy_max_temp_file_size 10000m;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log combined;
location / {
client_max_body_size 2G;
proxy_max_temp_file_size 10000m;
Tương tự với tập tin nginx.conftrên máy chủ đích:
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
proxy_max_temp_file_size 10000m;
proxy_connect_timeout 6000;
proxy_send_timeout 6000;
proxy_read_timeout 6000;
send_timeout 6000;
client_header_timeout 2400;
client_body_timeout 2400;
client_max_body_size 10000m;
Tuy nhiên, lỗi vẫn xảy ra mặc dù mình đã cấu hình khá đầy đủ cho Nginx có thể gửi, nhận những tập tin lớn. Trên tập tin php.ini:
max_execution_time = 7200
max_input_time = 7200
memory_limit = 2048M
post_max_size = 2048M
upload_max_filesize = 2048M
Nhưng vẫn xuất hiện lỗi khi Upload tập tin lớn. Mình đã thử với tập tin với 2MB, 16MB, 64MB đều có vẻ ổn. Nhưng cứ thử tập tin 96MB là xuất hiện lỗi. Đọc các file Log đều không phát hiện ra. Và cuối cùng mình phát hiện đó là có xuất hiện kết nối bị mất giữa chừng đối với Proxy và máy chủ đích (Streamer và Encoder).
Nguyên nhân là vì:
- Máy chủ đặt tại nhà cung cấp ở Việt Nam
- Proxy thì từ một nhà cung cấp dịch vụ VPS giá rẻ ở tận… Pháp
Và với kết nối giữa chính mình là một Client, kết nối đến Proxy cũng khá chậm, mà tập tin phải mất đến một lần sang Pháp, rồi lại về Việt Nam,… chính vì thế kết nối gián đoạn là điều hoàn toàn xảy ra.
Tất nhiên với cấu hình (tại máy chủ Proxy):
proxy_temp_path /var/cache/nginx/tmp;
proxy_buffer_size 512k;
proxy_buffers 32 4m;
proxy_busy_buffers_size 25m;
proxy_temp_file_write_size 10m;
Giúp cho Nginx có thể lưu dữ liệu vào thư mục lưu trữ tạm (temp) qua đó gửi Request đi và hạn chế sự mất kết nối giữa chừng, cũng không thể khắc phục triệt để vấn đề này.
Và, cuối cùng là hướng giải quyết:
Sử dụng Proxy có địa điểm gần với máy chủ đích hoặc có kết nối mạng thật sự ổn định.
Và mình đã khắc phục được vấn đề:
Chúc các bạn thành công!