Compare commits

..

2 Commits

Author SHA1 Message Date
perl 37e504fa40 update configs 2024-10-16 15:52:59 +03:00
perl 8315d59155 add req limits 2024-10-16 15:29:35 +03:00
23 changed files with 346 additions and 45 deletions

1
.dockerignore Normal file
View File

@ -0,0 +1 @@
**/*.md

8
.gitignore vendored
View File

@ -1,8 +1,10 @@
logs/* logs/*
ssl/* ssl/*
sites-enabled/* sites-enabled/*
!sites-enabled/reverse.conf.tplm project/*
!sites-enabled/reverse.conf.tmpl
!sites-enabled/http_redirect.conf !sites-enabled/http_redirect.conf
!sites-enabled/default.conf !sites-enabled/default.conf
!sites-enabled/reverse.conf.tplm.expanded !sites-enabled/reverse.conf.tmpl.expanded
!sites-enabled/upstreams.conf !sites-enabled/upstreams.conf.tmpl
!sites-enabled/static.conf.tmpl

View File

@ -0,0 +1,11 @@
FROM nginx:stable-alpine
COPY --chmod=0440 ["./locations", "/etc/nginx/locations"]
COPY --chmod=0440 ["./configuration", "/etc/nginx/configuration"]
COPY --chmod=0440 ["./error-pages", "/etc/nginx/error-pages"]
COPY --chmod=0755 ["./resources", "/var/www/html/resources"]
COPY --chmod=0440 ["./nginx_configs/nginx.conf", "/etc/nginx/nginx.conf"]
ARG CONT_IMG_VER
ENV CONT_IMG_VER=${CONT_IMG_VER:-v1.0.0}
CMD ["nginx", "-g", "daemon off;"]

View File

@ -0,0 +1,41 @@
# Для доставки сертификати в /etc/nginx/ssl/ использовать volume
#ARGS: SERVER_NAMES, CERT_FILE, CERT_KEY_FILE, CONT_IMG_VER
FROM nginx:stable-alpine
USER nginx
EXPOSE 80 443
#static site + http to https redirect server
COPY ./nginx_configs/nginx_static.conf /etc/nginx/nginx.conf
#set server name if arg not empty
ARG SERVER_NAMES
RUN if [ ! -z ${SERVER_NAMES} ]; then \
sed -i "s/server_name _;/server_name $SERVER_NAMES;/g" /etc/nginx/nginx.conf ;\
fi
#set certificate file name if arg not empty
ARG CERT_FILE
RUN if [ ! -z ${CERT_FILE} ]; then \
sed -i "s/ssl_certificate \/etc\/nginx\/ssl\/cert.pem;/ssl_certificate \/etc\/nginx\/ssl\/$CERT_FILE;/g" /etc/nginx/sites-enabled/static.conf ;\
fi
#set certificate key file name if arg not empty
ARG CERT_KEY_FILE
RUN if [ ! -z ${CERT_KEY_FILE} ]; then \
sed -i "s/ssl_certificate_key \/etc\/nginx\/ssl\/key.pem;/ssl_certificate_key \/etc\/nginx\/ssl\/$CERT_KEY_FILE;/g" /etc/nginx/sites-enabled/static.conf ;\
fi
#set container image version if arg not empty else 1.0.0
ARG CONT_IMG_VER
ENV CONT_IMG_VER=${CONT_IMG_VER:-v1.0.0}
#copy project files
COPY ./project /var/www/html/
CMD ["nginx", "-g", "daemon off;"]
#build string example
#docker build -f Dockerfiles/Dockerfile_staticsite -t static_site --no-cache --build-arg SERVER_NAMES=softsols.ru .
#check server_name in image
#docker run --rm -it -p 8084:443 -p 8083:80 static_site sh -c "cat /etc/nginx/sites-enabled/static.conf"

View File

@ -0,0 +1,8 @@
services:
reverse:
image: nginx:stable-alpine
container_name: reverse
hostname: reverse
restart: always
extra_hosts:
- "host.docker.internal=host-gateway"

View File

@ -0,0 +1,5 @@
networks:
services:
external: true
driver: bridge
name: services

View File

View File

@ -0,0 +1,2 @@
# Включения в блок http (nginx.conf)
include /etc/nginx/configuration/limit_req_zones.conf;

View File

@ -1,2 +1,3 @@
include configuration/compression.conf; include configuration/compression.conf;
include configuration/error_pages.conf; include configuration/error_pages.conf;
include configuration/limit_req.conf;

View File

@ -0,0 +1,2 @@
#limit_req zone=global_limits burst=10;
limit_req zone=global_limits burst=30 delay=8;

View File

@ -0,0 +1,32 @@
# Описание зон ограничения количества запросов
#Используем переменную NGINX $binary_remote_addr, которая содержит двоичное представление IP-адреса клиента.
#Это означает, что мы ограничиваем каждый уникальный IP-адрес частотой запросов, определенной третьим параметром rate.
#(Используем эту переменную, потому что она занимает меньше места, чем строковое представление IP-адреса клиента, $remote_addr).
#Информация о состоянии примерно для 16 000 IP-адресов занимает 1МБайт,
#поэтому созданная зона может хранить около 160 000 адресов.
#Тут частота не может превышать 10 запросов в секунду 10 request/second.
#NGINX фактически отслеживает запросы с точностью до миллисекунды,
#поэтому этот предел соответствует 1 запросу каждые 100 миллисекунд (мс).
#Запрос отклоняется, если он поступает менее чем через 100 мс после предыдущего разрешенного.
#Пример
#limit_req_zone $binary_remote_addr zone=global_limits:10m rate=10r/s;
#Директива limit_req_zone задает параметры ограничения скорости и зоны общей памяти,
#но на самом деле не ограничивает скорость запросов. Для этого нужно применить ограничение
#к определенному блоку location или server, включив туда директиву limit_req.
#Например
# server {
# location /login/ {
# limit_req zone=mylimit;
# proxy_pass http://my_upstream;
# }
# }
limit_req_zone $binary_remote_addr zone=global_limits:10m rate=20r/s;

40
control.sh Normal file
View File

@ -0,0 +1,40 @@
#!/bin/bash
#exec 0<data
#exec 1>out.log
#exec 2>logs/error.log
compose_file="docker-compose.yaml"
merge_file="docker-compose.limits.yaml"
root_folder=`pwd`
menu="
[1] up dev reverse
[2] restart dev reverse
[3] down dev reverse
[4] ps dev reverse
"
input=""
while true
do
echo "$menu"
echo -n "Select function № on enter q to exit:\n"
read input
if [ $input = "q" ]
then
break;
fi
case "$input" in
1) docker compose -f $compose_file -f $merge_file up -d;break ;;
2) docker compose -f $compose_file -f $merge_file down && \
docker compose -f $compose_file -f $merge_file up -d;break ;;
3) docker compose -f $compose_file -f $merge_file down;break ;;
4) docker compose -f $compose_file -f $merge_file ps;break ;;
*) echo "key not found"
esac
done
echo "end of the script"

View File

@ -0,0 +1,5 @@
services:
reverse:
cpu_count: 2
mem_limit: 256m
mem_reservation: 256m

View File

@ -1,28 +1,38 @@
name: reverse_dev
include:
- path:
- compose_extends/network.include.yaml
services: services:
reverse: reverse:
image: nginx:stable-alpine extends:
container_name: reverse file: compose_extends/docker-compose.base.yaml
hostname: reverse service: reverse
restart: always build:
extra_hosts: context: .
- "host.docker.internal=host-gateway" dockerfile: Dockerfiles/Dockerfile_devserver
args:
CONT_IMG_VER: "v1.0.0"
pull_policy: missing
volumes: volumes:
- "./nginx.conf:/etc/nginx/nginx.conf:ro"
- "./locations:/etc/nginx/locations:ro"
- "./configuration:/etc/nginx/configuration:ro"
- "./sites-enabled:/etc/nginx/sites-enabled:ro" - "./sites-enabled:/etc/nginx/sites-enabled:ro"
- "./error-pages:/etc/nginx/error-pages/"
- "./resources:/var/www/html/resources"
- "./ssl:/etc/nginx/ssl"
- "./logs:/var/log/nginx/"
networks:
local_net: {}
ports: ports:
- 80:80 - 80:80
- 443:443 - 443:443
networks: networks:
local_net: - services
external: true secrets:
driver: bridge - source: softsols_cert
name: services target: /etc/nginx/ssl/live/softsols.ru/fullchain.pem
- source: softsols_key
target: /etc/nginx/ssl/live/softsols.ru/privkey.pem
secrets:
softsols_cert:
name: softsols_cert
file: ./ssl/live/softsols.ru/fullchain.pem
external: false
softsols_key:
name: softsols_key
file: ./ssl/live/softsols.ru/privkey.pem
external: false

View File

@ -25,6 +25,10 @@ http {
error_log /var/log/nginx/error.log debug; error_log /var/log/nginx/error.log debug;
gzip on; gzip on;
#Include http includes
include /etc/nginx/configuration/_global_includes.conf;
include /etc/nginx/conf.d/*.conf; include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf; include /etc/nginx/sites-enabled/*.conf;
} }

View File

@ -1,4 +1,2 @@
# Репозиторий с конфигурцаицями WEB-сервера Nginx # Репозиторий с конфигурцаицями WEB-сервера Nginx
## Изначально Предназначен для использования в контейнере Docker ## Изначально Предназначен для использования в контейнере Docker
sites-enabled: Конфигурации виртуальных хостов (server) <BR>
configuration: Расширяющие конфиги

View File

@ -7,7 +7,10 @@ server {
ssl_certificate /etc/nginx/ssl/live/softsols.ru/fullchain.pem; ssl_certificate /etc/nginx/ssl/live/softsols.ru/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/softsols.ru/privkey.pem; ssl_certificate_key /etc/nginx/ssl/live/softsols.ru/privkey.pem;
# Просматриваемый каталог по умолчанию, корень сайта
root /var/www/html; root /var/www/html;
# Открываемый файл по умолчанию
index index.html index.htm; index index.html index.htm;
include configuration/_includes.conf; include configuration/_includes.conf;

View File

@ -2,17 +2,17 @@
#Для сложных маршрутов с регулярным выражением #Для сложных маршрутов с регулярным выражением
#Требует ресурсы на обработку регулярного выражения #Требует ресурсы на обработку регулярного выражения
# server { server {
# listen 80 default_server; listen 80 default_server;
# listen [::]:80 default_server; listen [::]:80 default_server;
# rewrite ^(.*) https://$host$1 permanent; rewrite ^(.*) https://$host$1 permanent;
# } }
#Не требует ресурсов для обработки запроса #Не требует ресурсов для обработки запроса
#Уязвим для атак через Host-заголовок #Уязвим для атак через Host-заголовок
server { #server {
listen 80; # listen 80 default_server;
listen [::]:80; # listen [::]:80 default_server;
server_name _; # server_name _;
return 301 https://$host$request_uri; # return 301 https://$host$request_uri;
} #}

View File

@ -0,0 +1,68 @@
# ПРИМЕР конфигурации для статичного сайта
server {
#ipv4
listen 443 ssl;
#ipv6
listen [::]:443 ssl;
#Разрешить использование http2;
http2 on;
#Доменное имя, по совпадению будет использована эта конфигурация
server_name resources.softsols.ru;
#Имя файла сертификата (путь)
ssl_certificate /etc/nginx/ssl/live/softsols.ru/fullchain.pem;
#Имя файла приватного(закрытого) ключа сертификата (путь)
ssl_certificate_key /etc/nginx/ssl/live/softsols.ru/privkey.pem;
#Версии TLS, TLS v1.0 и 1.1 отключены по причине древности
ssl_protocols TLSv1.2 TLSv1.3;
#Набор шифров для установления защищенного соединения (Только сильные шифры, запрет шифров без аутентификации, запрет хеш-флгортима md5)
ssl_ciphers HIGH:!aNULL:!MD5;
#Использование только шифров, предлагаемых сервером
ssl_prefer_server_ciphers on;
#Внешние зависимости
include configuration/_includes.conf;
#Основной location для сайта
#Все запросы, отправленные на корневой url сайта
location / {
#Корневой каталог
root /var/www/html/resources;
#Индексный файл, используется по умлочанию
index index.html;
#Логика обработки файлов и запросов
#Открывать файл(или каталог) из uri и, если нет, вернуть 404
#Предотвращает ситуацию, когда сервер может случайно передать что-то нежелательное, если запрашиваемый ресурс не существует
try_files $uri $uri/ =404;
}
#! Опционально
#кэширования для статических файлов(картинок, скриптов и т.д.)
#Бляха-муха, поясню:
# ~* - регистронезависимая регулярка
# \.(jpg|jpeg|png|gif|ico|css|js|svg)$ будет пременен ко всем файлам с соответствующими расширениями, например *.jpg$
#т.е. location нацелен на обработку статических данных, которые можно кэшировать
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg)$ {
#Сообщить клиенту (браузеру, прокси), что данные можно держать в кэше 30 дней
expires 30d;
#Добавляет возвращаемый заголовок Cache-Control управления кэшированием
#public - могут кешировать как браузеры, так и промежуточные прокси-серверы
#no-transform (промежуточные прокси-сервера и браузеры) не должны изменять содержимое файла (например, не должны перекодировать изображения)
#более гибкий и современный, чем Expires, и используется для более точного контроля кэширования.
add_header Cache-Control "public, no-transform";
#! Опционально
#Отключает ведение логов доступа для этих файлов.
access_log off;
}
}

View File

@ -1,7 +0,0 @@
# Использовать вместе с конфигурациями обратного прокси
#Round Robin - запросы чередуются между серверами
#Least Connections - запросы направятся к серверу с наименьшим числом подключений
#IP Hash - запросы одного клиента всегда направляются на один сервер

View File

@ -0,0 +1,75 @@
# Использовать вместе с конфигурациями обратного прокси
#Round Robin - запросы чередуются между серверами
upstream rr_backend {
server 127.0.0.1:8080 weight=5 max_fails=3 fail_timeout=60s;
server 10.9.0.9:80 weight=2 max_fails=3 fail_timeout=60s;
server google.com weight=3 max_fails=3 fail_timeout=60s;
server ya.ru backup;
keepalive 8;
#server [hostname, ip] [вес сервера] [максимальное кол-во неудачных подключений] [описано ниже]
#Weight. Чем больше вес, тем больше трафика будет направлено серверу
#fail_timeout. время, в течение которого должно произойти количество неудачных попыток(max_fails), чтобы сервер был помечен как недоступный
#keepalive. максимальное количество открытых подключений к серверам в группе
}
#Least Connections - запросы направятся к серверу с наименьшим числом подключений
upstream lc_backend {
least_conn;
server 127.0.0.1:8080;
server 10.9.0.9:80;
server google.com;
server ya.ru backup;
keepalive 8;
}
#IP Hash - запросы одного ip клиента всегда направляются на один сервер
upstream hi_backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
#!!! Сторонний модуль ngx_http_upstream_hash_module
#URL Hash - запросы одного url клиента всегда направляются на один сервер
upstream hu_backend {
hash $request_uri consistent; # Хешируем по URI запроса
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
#!!! Сторонний модуль nginx-sticky-module
#Sticky Sessions - привязка сессий
upstream ss_backend {
sticky;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
#пример блока server Sticky Sessions без модулей
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
location / {
set $backend "backend"; # Переменная для прокси
if ($cookie_route) {
set $backend "backend_$cookie_route";
}
proxy_pass http://$backend;
add_header Set-Cookie "route=$backend; Path=/";
}
}
}