Điều chỉnh Nginx khắc phục lỗi 504 Gateway Time-out, Upload tập tin lớn, Proxy,…

0
1151
(Last Updated On: Th12 13, 2018)

Chào các bạn, Nginx là một máy chủ Web mặc dù sinh sau đẻ muộn so với nhiều Web Server khác nhưng tỏ ra là người có “võ”. Có thể cấu hình để phục vụ với lượt truy cập đồng thời lớn, phục vụ các tập tin tĩnh khá tốt. Chưa kể cách thiết lập cấu hình khá uyển chuyển và đơn giản (mới đầu có thể bạn thấy hơi phức tạp nhưng hiểu sơ sơ rồi thì cấu hình khá dễ dàng so với một số Web Server khác, cá nhân mình thấy như vậy).

Tuy nhiên, ngay sau khi cài đặt thì chẳng hạn như Apache bạn có thể sử dụng ngay hoặc cấu hình tùy chỉnh ít hơn so với Nginx. Đối với máy chủ Web mới này bạn cần phải “Tuning” nó một chút.

Chỉ cần tinh chỉnh một chút thôi, Nginx sẽ trở thành máy chủ Web tốt nhất mọi thời đại.

Trước tiên là lỗi 504 Gateway Timeout, lỗi này chủ yếu là do phản hồi giữa các máy chủ (Proxy đến máy chủ chính) hoặc ngay cả máy chủ gốc hết thời gian chờ nên hiện lỗi này lên, chúng ta chỉ cần bằng cách khắc phục kéo dài thời gian chờ lên:

Đối với Nginx + FastCGI (php-fpm):

Bạn kéo dài thời gian thi hành PHP lên (tập tin php.ini – chẳng hạn /etc/php/7.0/fpm/php.ini):

max_execution_time = 300

Tiếp tục đến tập tin www.conf trong PHP-FPM (thường là /etc/php/7.0/fpm/pool.d/www.conf – đối với PHP 7.0):

request_terminate_timeout = 300

Hoặc là:

request_terminate_timeout = 0

Bây giờ đến tập tin cấu hình Nginx Virtual host:

fastcgi_read_timeout 300;

Khi đó tựa như thế này:

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
        #       # With php7.0-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
        #       # With php7.0-fpm:
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
                fastcgi_read_timeout 300;
        }

Các bạn chú ý rằng ở phân trên đây chính là cấu hình cho máy chủ chính, không thông qua Proxy nào cả. Trường hợp đối với một máy chủ Proxy thì chúng ta cấu hình thế này trong tập tin nginx.conf (/etc/nginx/nginx.conf):

proxy_connect_timeout       600;
proxy_send_timeout          600;
proxy_read_timeout          600;
send_timeout                600;

Sau khi cấu hình các thiết lập, các bạn đừng quên kiểm tra lại có đúng không bằng cách dùng lệnh:

nginx -t

Nếu tất cả ổn thì chỉ cần reload lại nginx:

service nginx reload

Hoặc khởi động lại cũng được:

service nginx restart

Cấu hình Nginx để Upload tập tin có kích thước lớn:

Thêm vào tập tin Virtual host:

proxy_max_temp_file_size 10000m;

Khi đó ta có tập tin Virtual host trông như thế này:

upstream mediaserver  {
        server srv.vngeek.com;
}
server {
	listen 80 default_server;
	listen [::]:80 default_server ipv6only=on;
	proxy_max_temp_file_size 10000m;	
	root /usr/share/nginx/html;
	index index.html index.htm;

	# Make site accessible from http://localhost/
	server_name vngeek.com;
	location / {
		proxy_pass  http://backend;
		}
	}

Còn ở tập tin nginx.conf (/etc/nginx/nginx.conf):

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;
	fastcgi_read_timeout 2400;
	client_max_body_size 10000m;
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 7200;
	types_hash_max_size 2048;

Và ta có tập tin trông như thế này:

http {

	##
	# Basic Settings
	##
	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;
	fastcgi_read_timeout 2400;
	client_max_body_size 10000m;
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 7200;
	types_hash_max_size 2048;
	# server_tokens off;

	server_names_hash_bucket_size 512;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# Logging Settings
	##

Các bạn có thể tải về các tập tin mà mình đính kèm bên dưới nhé.

nginx-proxy-virtualhost

nginx.conf (Proxy)

P/S: Giả sử các cách trên đây đều không giúp được bạn, có thể là do cấu hình tường lửa đã ngăn kết nối từ Proxy đến hoặc là do SELinux.

Bạn có thể disable tường lửa:

disable ufw

Trên Ubuntu 16.04, bạn có thể thực hiện:

apt install policycoreutils

Sau đó:

setsebool -P httpd_can_network_connect true

Chúc các bạn thành công!

Bình luận