load_module /usr/lib/nginx/modules/libngx_module.so;

user www-data;
worker_processes  auto;
worker_rlimit_nofile 8192;

include /etc/nginx/modules-enabled/*.conf;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections 4096;
	use epoll;
	multi_accept on;
}

http {		
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
	
    log_format fastpanel '[$time_local] $host $server_addr $remote_addr $status $body_bytes_sent $request_time $request $http_referer $http_user_agent';
	
	# Кастомный формат с JA3/JA4
	log_format combined_ja3 '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $http_x_ja3_hash $http_x_ja4_fingerprint';
	
	access_log  /var/log/nginx/access.log fastpanel;
    sendfile        on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/fastpanel2-sites/*/*.conf;
    include /etc/nginx/sites-enabled/*.conf;

    server_names_hash_bucket_size 128;
	
# Будет отправлять заголовки и начало файла в одном пакете
    tcp_nopush          on;
    tcp_nodelay         on;
	
    # Будет ждать 65 секунд перед закрытием keepalive соединения
    keepalive_timeout  65;
	# Максимальное количество keepalive запросов от одного клиента
	keepalive_requests 100;
	# Если клиент перестал читать отвечать, Nginx будет сбрасывать соединение с ним
	reset_timedout_connection on;
	# Будет ждать 10 секунд тело запроса от клиента, после чего сбросит соединение
	client_body_timeout 10;
	# Если клиент прекратит чтение ответа, Nginx подождет 10 секунд и сбросит соединение
    send_timeout 10;
	
    types_hash_max_size 2048;
	
#Увеличение времени ожидания запроса в NGINX =========================

	proxy_read_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
	
#Избавляемся от сообщения upstream response is buffered to a temporary file в логах nginx
#1)нужно подбирать размер буферов таким образом, что бы ответы бэкенда помещались целиком
#2)отключить буферизацию в файл ( proxy_max_temp_file_size 0; ):

#proxy_buffering on; # по умолчанию
#proxy_buffer_size 4k;
#proxy_buffers 32 4k; # до 132K + ядерные буфера
#proxy_max_temp_file_size 0;
	
#GZIP ================================================================
	
	#https://nginx.org/ru/docs/http/ngx_http_gzip_module.html
	
    gzip  on;
	
	# Устанавливает минимальное количество байт необходимое для сжатия. Если запрос занимает менее 256 байт, то мы не будем сжимать его, так как это будет замедлять общий процесс обработки запроса.
    gzip_min_length 256;
	
	# Включает поиск предварительно сжатых файлов. Этот парамет требует предварительного сжатия файлов, но не позволяет использовать максимально возможную степень сжатия
	# http://nginx.org/ru/docs/http/ngx_http_gzip_static_module.html
	gzip_static on;
	
	#Задаёт число и размер буферов, в которые будет сжиматься ответ. По умолчанию размер одного буфера равен размеру страницы. В зависимости от платформы это или 4K, или 8K.
    gzip_buffers 64 8k;
	
	# Устанавливает степень сжатия данных. Возможное значение от 1 до 9. 9 - самый медленный, но на выходе данные с самым маленьким объемом.
    gzip_comp_level 5;
	
    #gzip_http_version 1.1;
	
	# Позволяет или запрещает сжатие ответа на основе запроса/ответа. Мы установим его как any, чтобы сжимать и все запросы.
    gzip_proxied any;
	
	gzip_disable "msie6";
	
	# Будет сжимать все файлы с перечисленными типами
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/x-font-woff image/png image/gif image/jpeg image/jpg image/webp;
	
	# КЭШИРОВАНИЕ ======================
	
	# Определяет максимальное количество файлов, информация о которых будет содержаться в кеше
	open_file_cache max=200000 inactive=20s;
	
	# Определяет через какое время информация будет удалена из кеша
    open_file_cache_valid 30s;
	
	# Будет кешировать информацию о тех файлах, которые были использованы хотя бы 2 раза
    open_file_cache_min_uses 2;
	
	# Будет кешировать информацию об отсутствующих файлах
    open_file_cache_errors on;
	
	# БУФЕРИЗАЦИЯ ======================
	client_body_buffer_size 1024k;
	client_header_buffer_size 16k;
	
	#Принимает два значения, разделенных пробелами: максимальное число и размер буферов для чтения большого заголовка запроса клиента.
	#Значение размера буфера всегда должно быть меньше client_body_buffer_size, иначе возникнет ошибка 414 (Request-URI Too Large).
	#Также оно должно быть меньше client_header_buffer_size. В противном случае вернется ошибка 400 (Bad Request).
	large_client_header_buffers 10 128k;
	
	client_max_body_size 512M;
}

