FastDL для сервера CS 1.6

Для начала установим nginx:

Debian/Ubuntu:
apt update && apt upgrade
apt install nginx
CentOS/Fedora:
yum update && yum upgrade
yum install nginx

Далее переходим в nginx и удаляем стандартный конфиг:

cd /etc/nginx
rm -f sites-available/default && rm nginx.conf
nano nginx.conf

И используем следующий конфиг:

user root;
worker_processes  auto;
error_log  /var/log/nginx/error.log crit;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
    use epoll;
}
http {
    include       /etc/nginx/mime.types;
    access_log  off;
    sendfile        on;
    tcp_nopush     on;
    keepalive_timeout  15;
    tcp_nodelay        on;
    directio 5m;
    expires max;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    server {
        #listen 80;
        location / {
                root   /var/www/;
                index  index.html index.htm;
                set $limit_rate 5m; #ограничение скорости скачивания до 5мбайт
        }
        location ~ /(.*)/.*\.cfg { # запрещаем скачивать cfg файлы
                deny all;
        }
        location ~ /(.*)/addons/ { # запрещаем доступ к addons
                deny all;
        }
        location ~ /(.*)/logs/ { # запрещаем доступ к addons
                deny all;
        }
     }
}

Немного подробней о конфиге:

Начнём с директивы worker_processes. Если Nginx выполняет работу нагружающую процессор (например SSL или gzipping), то оптимально установить эту директиву в значение, равное количеству ядер процессора. Выигрыш при большем значении вы получите только в случае обработки очень большого количества статики.


# This number should be, at maximum, the number of CPU cores on your system.
worker_processes 24;

Также, директива worker_processes, умноженная на worker_connections из секции event, даст максимально возможное количество клиентов. 


# Determines how many clients will be served by each worker process.
worker_connections 4000;

Теперь разберёмся с логированием. Во-первых, оставим логирование только критических ошибок. 


# Only log critical errors.
error_log /var/log/nginx/error.log crit

Если вы совсем бесстрашны и хотите отключить логирование ошибок целиком, то помните, что error_log off вам не поможет. Вы просто получите весь лог в файле off. Для отключения логирования ошибок надо делать так:


# Fully disable log errors.
error_log /dev/null crit;

А вот логи доступа не так страшно отключить полностью.


# Disable access log altogether.
access_log off;

Или, хотя бы, включить буфер чтения / записи.


# Buffer log writes to speed up IO.
access_log /var/log/nginx/access.log main buffer=16k;

Для обработки подключений Nginx поддерживает ряд методов. Наиболее эффективным для Linuxявляется метод epoll.


# The effective method, used on Linux 2.6+, optmized to serve many clients with each thread.
use epoll;

Для того, чтобы Nginx пытался принять максимальное количество подключений, необходимо включить директиву multi_accept. Однако при слишком маленьком значении worker_connections, их лимит может быть очень быстро исчерпан.


# Accept as many connections as possible, after nginx gets notification about a new connection.
multi_accept on;

Директива sendfile активирует копирование данных между файловыми дескрипторами средствами ядра, что намного эффективнее связки read() + write(), которая требует обмена данными с пользовательским пространством.


# Sendfile copies data between one FD and other from within the kernel.
sendfile on;

После включения sendfile, можно заставить Nginx отправлять заголовки HTTP-ответов одним пакетом, а не отдельным частями.


# Causes nginx to attempt to send its HTTP response head in one packet,  instead of using partial frames.
tcp_nopush on;

Для keep-alive подключений можно выключить буферизацию (алгоритм Нейгла). Это будет полезно при частом запросе маленьких объёмов данных в режиме реального времени, без получения немедленного ответа, когда важна своевременная доставка данных. Классический пример — события наведения мышкой.


# Don't buffer data-sends (disable Nagle algorithm).
tcp_nodelay on;

И, конечно же, сжатие данных. Плюс — единственный и очевидный: уменьшение размера пересылаемого трафика. Минус — единственный и очевидный: не работает для MSIE 6 и ниже. Отключить сжатие для этих браузеров можно директивой gzip_disable, указав в качестве значения специальную маску “msie6”, которая соответствует регулярному выражению “MSIE [4-6]\.”, но работает быстрее


# Compression.
gzip on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
gzip_disable "msie6";

Далее создаём папку и прилинковываем файлы с папки cstrike к нашему серверу и перезапускаем nginx:

mkdir /var/www
ln -s /serv/cs_serv/cstrike /var/www/fastdl
/etc/init.d/nginx restart

Проверяем доступность файлов по ссылке:
http://IP/fastdl/maps/de_dust2.bsp

И добавляем в server.cfg следующие строки:
sv_downloadurl «http://IP/fastdl/»
sv_allowdownload 1