Балансировка на php-fpm без промежуточных веб-серверов.


Tagged , ,

Часто при балансироваке сайтов на php используют связку: прокся-балансировщик на nginx и (nginx + php-fpm либо apache + mod_php) на нодах.

По работе попробовали настроить эту связку без использования nginx на нодах, т.е. запросы с балансировщика идут напрямую в php-fpm, тем самым сэкономив чуточку ресурсов.
В моем случае производится балансировка сайта на moodle и конфиг представленный ниже будет для его работы.

nginx на балансировщике:

upstream backend {
    server  10.1.2.3:9000;
    server  10.1.2.4:9000;
}


server {
    access_log /var/log/nginx/access_log;
    error_log /var/log/nginx/error_log;

    listen 443 ssl;
    server_name test-site.ru;
    
    ssl_certificate     /etc/nginx/ssl/test-site.ru.crt;
    ssl_certificate_key /etc/nginx/ssl/test-site.ru.key;

    location ~ /\. {
        deny all;
    }

    location / {
        if (-f /etc/nginx/tmp/maintenance.flag) {
            return 503;
        }

        index index.php;
        try_files $uri @moodle;
    }

    location @moodle {
        root /var/www/moodle/;
        fastcgi_split_path_info  ^(.+\.php)(.*)$;
        fastcgi_index            index.php;
        fastcgi_pass             backend;
        include         /etc/nginx/mime.types;
        include         fastcgi_params;
        fastcgi_param   PATH_INFO       $fastcgi_path_info;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 4k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }
}

Из конфига убрал какие-то специфические вещи. Просто общий вид. Сократить его можно засунув содержимое @moodle в location /. Но я решил оставить в таком виде.

php-fpm при этом настраивается почти стандартно, меняются только несколько опций в пуле:

listen = 10.1.2.3:9000 ; случаем на интерфейсе, доступном для балансировщика
listen.allowed_clients = 10.1.2.1 ; разрешаем коннектиться только балансеру
php_value[session.save_path] = "tcp://10.1.2.2:6379" ; храним php сессии в redis (нужно для корректной работы балансировки round robin + в настройках moodle надо внести изменения)

Остальные опции по вкусу.

Share:

No comments

RSS / trackback

Respond