events {} http { server_tokens off; # Ничего не логируем по ru.ruzzy.dev: в URI bridge-страницы — capability, # в Sec-WebSocket-Protocol — токен сессии (требование tproxy-server). access_log off; map $http_upgrade $connection_upgrade { default upgrade; '' ""; } upstream tproxy_relay { server 127.0.0.1:8090; # tproxy-server (systemd), 8080 занят cadvisor keepalive 32; } server { listen 80; server_name ru.ruzzy.dev; location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { return 301 https://$host$request_uri; } } # Mode A из tproxy-server: relay — единственный шлюз хоста, он же отдаёт # публичный сайт (/srv/tproxy-site). Никаких отдельных location под сайт, # иначе ответы сайта и транспорта станут различимы для зондирования. server { listen 443 ssl; http2 on; server_name ru.ruzzy.dev; ssl_certificate /etc/letsencrypt/live/ru.ruzzy.dev/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ru.ruzzy.dev/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; gzip on; # Пачки uplink до 2 MiB; дефолтный 1 MiB ломает транспорт с 413. client_max_body_size 4m; location / { proxy_pass http://tproxy_relay; proxy_http_version 1.1; proxy_set_header Host $host; # Ровно один адрес: список relay отвергает. proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; # long poll relay — 25 с; не резать и не буферизовать. proxy_read_timeout 90s; proxy_send_timeout 90s; proxy_buffering off; proxy_request_buffering off; } } }