HAPROXY Frontend Cur Session никогда не уменьшается
Мы получили странное поведение с haproxy для одного сайта: текущие сеансы внешнего интерфейса никогда не уменьшаются.
Таким образом, ограничения достигаются через 3 или 4 дня, и мы должны перезапустить haproxy для сброса активных соединений.
Backend-серверы - это простой nginx с php7. Вот haproxy conf:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 666 level user
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 50000
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
ssl-default-bind-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
ssl-default-bind-options no-tls-tickets no-sslv3
ssl-default-server-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
tune.ssl.default-dh-param 2048
defaults
log global
mode http
option httplog
option dontlognull
option dontlog-normal
option forwardfor
option redispatch
retries 3
compression algo gzip
compression type text/html text/plain text/css text/javascript application/javascript
timeout connect 4s
timeout client 10s
timeout server 30s
timeout http-keep-alive 500
timeout http-request 30s
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend splash-frontend
mode http
maxconn 20000
bind xx.xx.xx.xx:80
redirect scheme https code 301 if !{ ssl_fc }
bind xx.xx.xx.xx:443 ssl crt /etc/haproxy/certs/splash.domain.net.pem alpn h2,http/1.1
default_backend splash-backend
http-response set-header Strict-Transport-Security max-age=15768000
backend splash-backend
balance roundrobin
mode http
server splash1 xx.xx.xx.xx:443 check inter 1000 ssl verify none
server splash2 xx.xx.xx.xx:443 check inter 1000 ssl verify none
server splash3 xx.xx.xx.xx:443 check inter 1000 ssl verify none
Затем nginx conf для серверов:
user www-data www-data;
worker_processes 2;
pid /var/run/nginx.pid;
worker_rlimit_nofile 1024;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 512;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile "on";
tcp_nopush "on";
tcp_nodelay "on";
keepalive_timeout "5";
access_log "/var/log/nginx/access.log";
error_log /var/log/nginx/error.log error;
server_tokens off;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
upstream php-handler {
server 127.0.0.1:9000;
}
server {
listen 80;
listen 443 default ssl http2;
server_name splash.domain.net;
root /var/www/domain.net/splash;
include /etc/nginx/ssl.conf;
include /etc/nginx/errors.conf;
error_log syslog:server=xx.xx.xx.xx:11514 notice;
access_log syslog:server=xx.xx.xx.xx:11514,tag=nginx,severity=info;
location / {
index index.php;
try_files $uri $uri/ /index.php?$uri&$args;
}
location ~* \.(img|css|js|jpg|jpeg|gif|png|map)$ {
deny all;
}
location ~ \.php$ {
fastcgi_pass php-handler;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
proxy_cache off;
expires -1;
}
}
}
И наконец, источник веб-страницы:
<?php $redirectURL = isset($_GET['loginurl']) && $_GET['loginurl'] ? $_GET['loginurl'] : 'http://captiveportal.domain.net'; ?>
<!doctype html>
<html>
<head>
<title>Chargement...</title>
<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Pragma" content="no-cache">
<meta name="viewport" content="width=device-width, user-scalable=no">
<noscript><meta http-equiv="refresh" content="3; url=<?php echo $redirectURL; ?>"></noscript>
<style>html{width: 100%;height: 100%;}body {margin: 0 auto;padding: 20px;width: auto;overflow-y: none;font-family: 'Open Sans',sans-serif;font-weight: 400;color: #777;text-align: center;}a {text-decoration: none;color: #777;}.content {padding: 15px;overflow: hidden;}.centered {position: absolute;top: 50%;left: 50%;transform: translateY(-50%) translateX(-50%);}.load-wrap{text-align: center;}.radio {display: inline-block;width: 180px;height: 180px;}</style>
<script type="text/javascript">function onLoad() { window.setTimeout( function(){ window.location = "<?php echo $redirectURL; ?>"; }, 2000 ); }</script>
</head>
<body onload="onLoad();">
<div class="content">
<a href="<?php echo $redirectURL; ?>">
<div class="centered">
<h3>Loading ...</p>
</div>
</a>
</div>
</body>
</html>
Наш контекст заключается в том, что пользователи находятся за захваченным порталом, и процесс таков:
1 - Запросы пользователей в Интернет перехватываются порталом авторизации и перенаправляются на всплывающую страницу, описанную выше.
2a. Если начальная страница запускается с помощью браузера, на веб-сайте портала можно использовать javascript или мета-редирект, чтобы пользователи могли принимать условия и подключаться к Интернету.
2b - Если заставка запрашивается фоновым или неинтерактивным приложением, процесс останавливается здесь
У нас нет проблем с другими веб-сайтами, которыми мы управляем с помощью haproxy, но наша заставка постоянно увеличивает количество текущих соединений, и это реальная проблема. Мы перепробовали много вещей, но безуспешно: - опция server-http-close - опция forceclose
Без эффектов на этой веб-странице! Нам нужна помощь, потому что, вероятно, есть одна вещь, которую мы не понимаем. У кого-нибудь есть идея?