Главная  /  Заметки   /  FastCGI (Nginx + PHP-FPM) для 1С-Битрикс

FastCGI (Nginx + PHP-FPM) для 1С-Битрикс

Плюс режима работы PHP FastCGI (Nginx + PHP-FPM) заключается в высокой производительности и главное быстрого отклика, а именно среднее время отклика занимает 0.0100-0.0150, при рекомендованных битриксом 0.0330(естественно все зависит от вашего сервера). Оценка производительности в битриксе взлетала больше 100(опять же, все зависит от уже имеющейся нагрузка на сервер и его железа). Я буду запускать FastCGI (Nginx + PHP-FPM) с ISPmanager на CentOS 7, но конфиг должен подойти и для других.

Итак, приступим к настройке:

  • Зайдите под root в ISPmanager.
  • Настройки > Возможности > Альтернативная версия PHP 7.2 (выберете для себя сами актуальную версию PHP, конечно, желательно не ниже 7 — ведь уже 2019 год как никак) и выберете ISPsystem PHP 7.2 для PHP-FPM.
  • Домены > WWW домены > Режим работы PHP выбираем FastCGI (Nginx + PHP-FPM).

некоторые мелочи я мог упустить, но сложностей быть не должно на данном этапе.

Теперь, наш сайт 1C-Bitrix должен работать в режиме FastCGI, откройте его и проверьте, есть ли у вас ошибки.

  • У меня переставали отображаться некоторые фото, папки и даже полностью не открывалась главная страница — для этого вам нужно выставить права на такие файлы 644 и на папки 744 или можно на все сразу — правда потом нужно в битриксе перепроверить права на папки, некоторым нужны 777.
  • Открывает ли у вас другие страницы? Категории, новости, админку, работает ли сайт с композитом и так далее. Если вы получаете ошибки 404 Not Found Nginx 1.14.1 или 403 Forbidden, еще встречал File not found то вам нужно читать дальше.

Так как FastCGI не использует htaccess, нужно указать правильные пути и вообще режим работы нашего битрикса.
Для этого:

  • Заходим опять в ISPmanager под root, открываем Домены > WWW-домены > выбираем и нажимаем > Конфиг (у меня был включен SSL). Скопируйте весь конфиг себе в блокнот, он еще будет нужен.
  • Вставьте мой тестовый конфиг:

XXX.XXX.XXX.XXX:XX — заменяем на свое из listen
moy_site.ru — заменяем на свой сайт
и обязательно прочитайте комментарии внутри конфига и поменяйте на свое

server {
    server_name moy_site.ru www.moy_site.ru;
        return 301 https://$server_name$request_uri;
    charset off;
    index index.php index.html;
    disable_symlinks if_not_owner from=$root_path;
    include /etc/nginx/vhosts-includes/*.conf;
    include /etc/nginx/vhosts-resources/moy_site.ru/*.conf;
    access_log /var/www/httpd-logs/moy_site.ru.access.log;
    error_log /var/www/httpd-logs/moy_site.ru.error.log notice;
    ssi on;
    return 301 https://$host:443$request_uri;
    set $root_path /var/www/barmen/data/www/moy_site.ru;
    root $root_path;
    gzip on;
    gzip_comp_level 7;
    gzip_disable "msie6";
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
    location / {
        location ~ [^/]\.ph(p\d*|tml)$ {
            try_files /does_not_exists @php;
        }
        location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
            expires 7d;
        }
    }
    listen XXX.XXX.XXX.XXX:80;
    location @php {
        fastcgi_index index.php;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f [email protected]_site.ru";
        fastcgi_pass unix:/var/www/php-fpm/barmen.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }
}
server {
        listen XXX.XXX.XXX.XXX:443 ssl http2;
        ssi on;
        gzip on;
        gzip_comp_level 7;
        gzip_disable "msie6";
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

        server_name moy_site.ru www.moy_site.ru;
            ssl_certificate "/var/www/httpd-cert/barmen/moy_site.ru_le1.crtca";
            ssl_certificate_key "/var/www/httpd-cert/barmen/moy_site.ru_le1.key";
            ssl_ciphers EECDH:+AES256:-3DES:RSA+AES:!NULL:!RC4;
            ssl_prefer_server_ciphers on;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            add_header Strict-Transport-Security "max-age=31536000;";
            ssl_dhparam /etc/ssl/certs/dhparam4096.pem;
        charset off;
        #disable_symlinks if_not_owner from=$root_path;
        index index.php;
        root $root_path;
        set $root_path /var/www/barmen/data/www/moy_site.ru;
        set $php_sock unix:/var/www/php-fpm/barmen.sock;
        access_log /var/www/httpd-logs/moy_site.ru.access.log;
        error_log /var/www/httpd-logs/moy_site.ru.error.log notice;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        client_max_body_size 1024M;
        client_body_buffer_size 4M;

        #кому не надо убирать у домена www это не пишем. между http:// и test.ru убрать пробел, парсер дурит 🙂
        if ($host = 'www.moy_site.ru' ) {
              rewrite ^(.*)$ https://moy_site.ru$1 permanent;
        }
        location / {
                try_files       $uri $uri/ @bitrix;
        }

        location ~* /upload/.*\.(php|php3|php4|php5|php6|phtml|pl|asp|aspx|cgi|dll|exe|shtm|shtml|fcg|fcgi|fpl|asmx|pht|py|psp|rb|var)$ {
                types {
                        text/plain text/plain php php3 php4 php5 php6 phtml pl asp aspx cgi dll exe ico shtm shtml fcg fcgi fpl asmx pht py psp rb var;
                }
        }

        location ~ \.php$ {
                try_files       $uri @bitrix;
                fastcgi_pass    $php_sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f [email protected]_site.ru";
                include fastcgi_params;
        }
        location @bitrix {
                fastcgi_pass    $php_sock;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root/bitrix/urlrewrite.php;
                fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f [email protected]_site.ru";
        }
        location ~* /bitrix/admin.+\.php$ {
                try_files       $uri @bitrixadm;
                fastcgi_pass    $php_sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f [email protected]_site.ru";
                include fastcgi_params;
        }
        location @bitrixadm{
                fastcgi_pass    $php_sock;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root/bitrix/admin/404.php;
                fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f [email protected]_site.ru";
        }

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }
        #
        # block this locations for any installation
        #

        # ht(passwd|access)
        location ~* /\.ht  { deny all; }

        # repositories
        location ~* /\.(svn|hg|git) { deny all; }

        # bitrix internal locations
        location ~* ^/bitrix/(modules|local_cache|stack_cache|managed_cache|php_interface) {
          deny all;
        }

        # upload files
        location ~* ^/upload/1c_[^/]+/ { deny all; }

        # use the file system to access files outside the site (cache)
        location ~* /\.\./ { deny all; }
        location ~* ^/bitrix/html_pages/\.config\.php { deny all; }
        location ~* ^/bitrix/html_pages/\.enabled { deny all; }

        # Intenal locations
        location ^~ /upload/support/not_image   { internal; }

        # Cache location: composite and general site
        location ~* @.*\.html$ {
          internal;
          # disable browser cache, php manage file
          expires -1y;
          add_header X-Bitrix-Composite "Nginx (file)";
        }

        # Player options, disable no-sniff
        location ~* ^/bitrix/components/bitrix/player/mediaplayer/player$ {
          add_header Access-Control-Allow-Origin *;
        }

        # Accept access for merged css and js
        location ~* ^/bitrix/cache/(css/.+\.css|js/.+\.js)$ {
          expires 30d;
          error_page 404 /404.html;
        }

        # Disable access for other assets in cache location
        location ~* ^/bitrix/cache              { deny all; }

        # Use nginx to return static content from s3 cloud storage
        # /upload/bx_cloud_upload/<schema>.<backet_name>.<s3_point>.amazonaws.com/<path/to/file>
        location ^~ /upload/bx_cloud_upload/ {
          location ~ ^/upload/bx_cloud_upload/(http[s]?)\.([^/:]+)\.(s3|s3-us-west-1|s3-eu-west-1|s3-ap-southeast-1|s3-ap-northeast-1)\.amazonaws\.com/(.+)$ {
                internal;
                resolver 8.8.8.8;
                proxy_method GET;
                proxy_set_header    X-Real-IP               $remote_addr;
                proxy_set_header    X-Forwarded-For         $proxy_add_x_forwarded_for;
                proxy_set_header    X-Forwarded-Server      $host;
                #proxy_max_temp_file_size 0;
                proxy_pass $1://$2.$3.amazonaws.com/$4;
          }
          location ~* .*$       { deny all; }
        }
        # Static content
        location ~* ^/(upload|bitrix/images|bitrix/tmp) {
          expires 30d;
        }

        location  ~* \.(css|js|gif|png|jpg|jpeg|ico|ogg|ttf|woff|eot|otf)$ {
          error_page 404 /404.html;
          expires 30d;
        }

        location = /404.html {
                access_log off ;
        }

}

Сохраните. Теперь проверьте сайт на работоспособности и там где были ошибки, должно было все заработать.

Занимаюсь сайтами с 2005 года, начинал еще с narod.ru и ucoz :-)

1 Комментарий
  • Дмитрий
    03.02.2019

    Пользователя «barmen» заменить на своего

    Reply
Оставить комментарий
Нажимая кнопку «Отправить», я принимаю пользовательское соглашение и подтверждаю, что ознакомлен и согласен с политикой конфиденциальности этого сайта.