Популярные WEB сервера и заметки о них (apache/httpd, nginx)

Сравнение WEB можно посмотреть тут

  • nginx; tengine (alibaba nginx) – по сути community industry standard, особенно в высокопроизводительных решениях.
  • apache – данный блог на apache, проблем из-за этого не было. Лично у меня к нему даже несколько большее доверие т.к. он как поддерживался, так и поддерживается Apache Foundation, в отличии от NGINX, из которого ушел основатель.
  • IIS до сих пор популярен и поддерживается Microsoft. IIS (Internet Information Services) — самый распространенный веб сервер на платформах Windows. Его используют 89% российских компаний, по данным сервиса BI.ZONE TDR. Такая востребованность делает IIS привлекательной целью для злоумышленников, поэтому защита веб сервера должна быть приоритетом для отделов кибербезопасности и IT.

При совместном использовании apache + NGINX: apache обычно используется для отдачи статики, NGINX для динамики.

 

basic auth

Самая простая/базовая (очевидно) аутентификация клиента сервером. На запрос аутентификации креды отсылаются закодированными (не зашифрованными/захешированными) base64. При использовании HTTPS имеет смысл (т.к. эти данные шифруются), иначе использовать опасно. При использовании закодированные данные передаются в каждом запросе т.е. после автентификации браузер кеширует их и добавляет в последующем к каждому запросу.

The BA mechanism does not provide confidentiality protection for the transmitted credentials. They are merely encoded with Base64 in transit and not encrypted or hashed in any way. Therefore, basic authentication is typically used in conjunction with HTTPS to provide confidentiality.

Because the BA field has to be sent in the header of each HTTP request, the web browser needs to cache credentials for a reasonable period of time to avoid constantly prompting the user for their username and password. Caching policy differs between browsers.

 

Apache
  • https://httpd.apache.org/docs/2.4/mod/prefork.html
  • https://httpd.apache.org/docs/2.4/mod/mpm_common.html#maxconnectionsperchild
  • apache, как и многие другие службы запускается от отдельного пользователя, это делает дополнительный эшелон защиты в сравнении если бы выдавалась какая то общая УЗ или тем более root, кроме того apache позволяет использовать разные пользователи для каждого виртуального хоста (хостеры)!

Конфигурация apache для поддержки более 1000 одновременных сессий. Протестировал – работает корректно (создается много параллельных процессов apache).

<IfModule prefork.c>
ServerLimit 1000 # Declares the maximum number of running Apache processes
StartServers 20 # The number of processes to start initially when starting the Apache daemon
MinSpareServers 20 # Minimum number of idle child server processes
MaxSpareServers 50 # Maximum number of idle child server processes
MaxRequestWorkers 5000 # The maximum number of simultaneous client connections (maximum amount of requests that can be served simultaneously)
MaxConnectionsPerChild 10000 # Limit on the number of connections that an individual child server will handle during its life
</IfModule>

Если есть подписка на redhat – можно конфиг посмотреть у них жадных.

Redhat lol
https://access.redhat.com/solutions/1279903 
SUBSCRIBER EXCLUSIVE CONTENT

Пример настроенного основного домена сайта (ServerName) и редиректа со всех других (ServerAlias) + сертификат letsencrypt для SSL (VirtualHost *:443).

nano /etc/apache2/sites-enabled/000-default-le-ssl.conf
<VirtualHost *:443>
ServerName weril.ru
Include /etc/letsencrypt/options-ssl-apache.conf
ServerAlias redkin.net
ServerAlias weril.me
SSLCertificateFile /etc/letsencrypt/live/weril.ru/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/weril.ru/privkey.pem
</VirtualHost>

nano /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
RewriteEngine on
RewriteCond %{SERVER_NAME} =redkin.net [OR]
RewriteCond %{SERVER_NAME} =weril.me
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
Nginx
vim.tiny /etc/nginx/nginx.conf
http {
  client_max_body_size 10M;
  • server_name в конфигурации nginx определяет IP/FQDN сервера, если там указан один IP/FQDN, а запрос приходит на другой – сервер будет отвечать дефолтным конфигом, а не указанным.
  • Nginx можно собрать с флагом debug для глубокой отладки, часть доп. дебага (напр. для QUIC) включается за счет раскоментирования опций define в /event/quic/ngx_event_quic_connection.h файле
 Build nginx with debug support [9] and check the debug log.
      It should contain all details about connection and why it
      failed. All related messages contain "quic " prefix and can
      be easily filtered out.

Конфиг, как в случае apache, редактируется в тексте. После модификации нужно перезагружать сервер.

vi /etc/nginx/conf.d/00_site_some_site.ru.conf
service nginx restart

Задание адреса на прослушивание в конфиге.

server {
listen 172.17.1.246:80;

Редирект.

(nginx, vpn) Пример прокси nginx модулем libnginx-mod-stream (непосредственно как в статье лучше не делать т.к. публичный прокси – это небезопасно):

1. Настраиваем подобие SNI-прокси через nginx
Устанавливаем nginx и модуль ngx_stream_core_module, который поможет нам проксировать трафик на основе SNI.
apt install nginx libnginx-mod-stream
Редактируем конфигурационный файл nginx:
nano /etc/nginx/nginx.conf
Вставляем следующий блок (вне блока http):
stream { 
log_format proxy '$remote_addr [$time_local] ' 
'$protocol $status $bytes_sent $bytes_received ' 
'$session_time "$ssl_preread_server_name"'; 

access_log /var/log/nginx/stream-access.log proxy; 
error_log /var/log/nginx/stream-error.log; 

server { 
resolver 1.1.1.1 ipv6=off; 
listen 443; 
ssl_preread on; 
proxy_pass $ssl_preread_server_name:443; 
proxy_connect_timeout 10s; 
proxy_timeout 30s; 
} 
}
Сохраняем конфиг и проверяем, что с ним нет проблем:
nginx -t
nginx -s reload
Если всё в порядке (можно на всякий случай проверить через systemctl status nginx), то это уже можно использовать на клиентах на уровне файла hosts:
Просто прописать IP VPS и домен, который мы хотим пускать через него.
В случае с Twitch(сами потоки будут идти напрямую к серверам твича, мы проксируем только запросы, которые используются твичом для получения m3u плейлиста) для разблокировки качества достаточно прописать следующее (где 1.2.3.4 — IP вашего VPS):
1.2.3.4 usher.ttvnw.net 
1.2.3.4 gql.twitch.tv
После перезапуска браузера (если в его настройках указан системный DNS провайдер, а не сторонний) качество выше 720p станет доступным. (Скорей всего понадобится так же очистить кэш DNS, как это сделать зависит от вашей ОС)

Конфиг простого производительного nginx сервера 4 cpu, 3 gb ram, 20 gb hdd с запуском всего из специальной директории /root/nginx-portable (в задаче 4 ((сгенерировано ИИ; не использовать в production – как минимум user root))

mkdir /root/nginx-portable/conf/
cd /root/nginx-portable/conf/
openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365 -subj "/C=RU/ST=Moscow/L=Moscow/O=LRPerfTest/OU=IT/CN=localhost"

# Основные системные параметры
vim.tiny /root/nginx-portable/nginx.conf
user root;
worker_processes 4;    # Используем 4 процесса (если указать auto - выберется исходя из количества ядер CPU)
worker_cpu_affinity 0001 0010 0100 1000;   # Привязываем процессы к перечисленным ядрам CPU (0-1-2-3) (если указать auto - nginx сам привяжен последовательно процессы к ядрам)
pid /root/nginx-portable/logs/nginx.pid;
worker_rlimit_nofile 65535;    # Увеличивает лимит открытых дескрипторов файлов

events {
   worker_connections 4096;    # 1024 на каждое ядро (итого 4096)
   use epoll;# Эффективный метод обработки событий в Linux
   multi_accept on;   # Принимать несколько соединений за раз
}

http {
   include mime.types;
   default_type application/octet-stream;

   # Оптимизация передачи данных
   sendfile on;       # Прямая передача данных из ядра без копирования
   tcp_nopush on;     # Отправка заголовков одним пакетом
   tcp_nodelay on;    # Отключает задержку при отправке мелких пакетов

   # Тайм-ауты (уменьшены для высвобождения ресурсов)
   keepalive_timeout 30;       # Время удержания соединения
   send_timeout 10;   # Лимит времени на передачу ответа клиенту

   # Сжатие Gzip (ускоряет загрузку для клиента)
   gzip on;
   gzip_comp_level 5;
   gzip_types text/plain text/css application/javascript application/json image/svg+xml;

   # Кэширование информации об открытых файлах (важно для HDD)
   open_file_cache max=2000 inactive=20s;
   open_file_cache_valid 30s;
   open_file_cache_min_uses 2;

   server {
      listen 80;
      listen 443 ssl;

      server_name localhost;
      root /root/nginx-portable/html;

      # Пути к сертификатам
      ssl_certificate     /root/nginx-portable/conf/cert.pem;
      ssl_certificate_key /root/nginx-portable/conf/key.pem;

      # Оптимизация SSL (внутри server или http)
      ssl_session_cache shared:SSL:10m;
      ssl_session_timeout 1d;    # Время жизни сессии

      # Современные протоколы
      ssl_protocols TLSv1.2 TLSv1.3;
      ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
      ssl_prefer_server_ciphers off;

      location / {
   index index.html;
      }

      # Логи
      access_log /root/nginx-portable/logs/access.log combined buffer=32k;
      error_log /root/nginx-portable/logs/error.log crit;
   }

}

Конфиг простейшего upload сервера ((частично ИИ generated)).

vim.tiny /etc/nginx/sites-enabled/default
server {
   listen 80;
   server_name localhost;

   # Set maximum body size for the upload (((без него NGINX 413 Request Entity Too Large)))
   client_max_body_size 100M;

   # Sets the document root for the entire server block ((поиск именно в этой директории запрашиваемых файлов))
   root /var/www/html;

   location /upload/ {
      # Directory where files will be stored
      alias /nginx_files/;

      # Configure WebDAV methods (allow PUT and DELETE)
      dav_methods PUT DELETE MKCOL COPY MOVE;

      # Specify a temporary path for the client body
      client_body_temp_path /tmp/upload_tmp;

      # Automatically create intermediate directories
      create_full_put_path on;

      # Set file permissions (e.g., group read/write, all read)
      dav_access group:rw all:r;
   }
}
service nginx stop
service nginx start
mkdir /nginx_files/
sudo chown -R www-data:www-data /nginx_files/
IT monsters
Интересно, VK, как и yandex и многие другие нагруженные ресурсы, в том числе внутренние у компаний, в основном используют nginx, но есть, судя по всему, и apache. У youtube отдается свой собственный YouTubeFrontEnd.
Request URL:https://queuev4.vk.com/im467
Cache-Control:no-store
Connection:keep-alive
Content-Length:126
Content-Type:text/javascript; charset=UTF-8
Date:Wed, 31 Aug 2016 19:13:50 GMT
Pragma:no-cache
Server:Apache
Request URL:https://vk.com/al_im.php
cache-control:no-store
content-encoding:gzip
content-length:1838
content-type:text/plain; charset=windows-1251
date:Wed, 31 Aug 2016 19:13:24 GMT
pragma:no-cache
server:nginx

Leave a Reply