Общие Вопросы По Настройке Серверов

Товарищи, как бы дописать слэш к УРЛ? Сейчас урл\ и урл одинаково доступны. Дубли ведь! Схема nginx-appache.

Судя по всему, нет. Модуль Redis для PHP поддерживает работу с UNIX-сокетами, правда в коде класса app/Tygh/Backend/Cache/Redis.php явно жёстко указан порт 6379/tcp по умолчанию. Выход для вас — забиндить сервис на 127.0.0.1, если вы беспокоитесь за доступ к сервису извне.

Спасибо

Здравствуйте.

Проконсультируйте пожалуйста по настройкам сервера.

Виртуальный сервер - 4 ядра, 4 Gb оперативки, SSD диск 150Gb. Настраивался с помощью ansible скрипта (но тогда он ещё был с 2 ядрами и 2Gb оперативки, потом апгрейдили и вручную правили некоторые конфиги).
Мультивендор 4.3.9
Nginx 1.10.3 + PHP 7.0.15 + MariaDB 5.5.52

Необходимо загрузить на витрину около 600000 товаров. Импортируем через csv файл разбив где-то по 100000 товаров в каждом файле. Первый файл загрузился часа за 3, но остальные грузятся по полдня.
Основная база в Myisam, в slow-log сыпется очень много запросов.

Сделали копию основной базы, создали тестовую витрину на том же сервере, перевели таблицы в innodb, добавили в конфиги настройки. В slow-log с тестовой базы записей никаких не попало, но загрузка также остаётся очень долгая.

Конфиг mysql сейчас приобрёл такой вид после чтения различных источников:

; Automatically generated via Ansible (Gleb E Goncharov )
;     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN

[client]
port = 3306
socket = /var/lib/mysql/mysql.sock

[mysqld_safe]
socket = /var/lib/mysql/mysql.sock
nice = 0

[mysqld]
user = mysql
bind-address = 0.0.0.0
pid = /var/run/mysqld/mysqld.pid
socket = /var/lib/mysql/mysql.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp

skip-name-resolve
skip-external-locking
low-priority-updates

log-queries-not-using-indexes

interactive_timeout = 28800
wait_timeout = 28800
connect_timeout = 10
net_read_timeout = 30
net_write_timeout = 30

key_buffer = 64M
max_allowed_packet = 128M
myisam-recover = BACKUP
query_cache_type = 1
query_cache_limit = 8M
query_cache_size = 128M

max_connections = 32
sort_buffer_size = 8M
read_buffer_size = 256K
read_rnd_buffer_size = 2M
join_buffer_size = 8M
thread_stack = 192K
thread_cache_size = 8

innodb_buffer_pool_size = 2048M
innodb_log_file_size = 128M
innodb_additional_mem_pool_size = 20M
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2

table_open_cache = 4096
tmp_table_size = 32M
max_heap_table_size = 32M

general_log = 0
general_log_file = /var/log/mysql/general.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-queries.log
long_query_time = 2

event_scheduler = 1

expire_logs_days = 10
max_binlog_size = 100M

[mysqldump]
quick
quote-names
max_allowed_packet = 128M

Можем мы на этом сервере как-то ускорить загрузку подкорректировав настройки? Может тормозить не БД, а что-то другое - php, nginx? Там конфиги практически стандартные после установки через ansible скрипт.

Предлагаю вам спрофилировать магазин и разобраться в медленных функциях более детально. К сожалению, XHProf не работает с PHP 7.0.x, поэтому два варианта:

- Попробовать Blackfire.

- Установить магазин на тестовый стенд с PHP 5.6 и спрофилировать магазин.

Если это будет база, уже будем разбираться детальнее

Предлагаю вам спрофилировать магазин и разобраться в медленных функциях более детально. К сожалению, XHProf не работает с PHP 7.0.x, поэтому два варианта:

- Попробовать Blackfire.

- Установить магазин на тестовый стенд с PHP 5.6 и спрофилировать магазин.

Если это будет база, уже будем разбираться детальнее

Нужно профилировать магазин именно в процессе импорта? Или (если будем делать с XHProf) можно всё сделать как в статье по ссылке?

Просто сам магазин (витрина) вполне приемлемо работает без тормозов 80-90% времени с примерно 410000 товарами на текущий момент.
А вот процесс импорта через админку тормозит теперь всегда (если сравнивать с импортом первых 100000 товаров за 4 часа). Можем мы как-то профилировать именно функции exim модуля с помощью XHProf?

Товарищи, как бы дописать слэш к УРЛ? Сейчас урл\ и урл одинаково доступны. Дубли ведь! Схема nginx-appache.

Чистый nginx. Корень перенаправляет, а вот всё, что дальше - да. Seo cs-cart отдаёт как со слешем, так и без. Тоже интересно как поправить.

Нужно профилировать магазин именно в процессе импорта? Или (если будем делать с XHProf) можно всё сделать как в статье по ссылке?

Просто сам магазин (витрина) вполне приемлемо работает без тормозов 80-90% времени с примерно 410000 товарами на текущий момент.
А вот процесс импорта через админку тормозит теперь всегда (если сравнивать с импортом первых 100000 товаров за 4 часа). Можем мы как-то профилировать именно функции exim модуля с помощью XHProf?

Можно. Вам нужно спрофилировать только интересующий участок, обернув код внутри функции в вызовы, как показано в статье.

Чистый nginx. Корень перенаправляет, а вот всё, что дальше - да. Seo cs-cart отдаёт как со слешем, так и без. Тоже интересно как поправить.

Правильное решение должно быть на стороне кода CS-Cart, поскольку CMS лучше всего знает какую страницу она отдаёт. Можно реализовать на nginx, в этом случае нужно на 100% точно знать какие URL рерайтить со слешем на конце. Например, рерайтить только обращения к бэкэнду, а URL с отдачей CSS, JS, WOFF и прочей статики — нет. Однако, повторюсь, лучше всего задачу решать в коде, а не на стороне веб-сервера.

Чистый nginx. Корень перенаправляет, а вот всё, что дальше - да. Seo cs-cart отдаёт как со слешем, так и без. Тоже интересно как поправить.

Погуглив на stackoverflow, я у себя реализовал так - добавил в /etc/nginx/vhost.d в узел соответствующего server{} строку

rewrite ^([^.\?]*[^/])$ $1/ permanent;

результатом доволен. У меня всё работает, страницы без / отдаются с 301-редиректом.

1 лайк

Погуглив на stackoverflow, я у себя реализовал так - добавил в /etc/nginx/vhost.d в узел соответствующего server{} строку

rewrite ^([^.\?]*[^/])$ $1/ permanent;

результатом доволен. У меня всё работает, страницы без / отдаются с 301-редиректом.

Я бы обязательно просерил урлы с параметрами - типа /?page=XX , не будет ли этот редирект добавлять к ним слеш.

Пагинация отрабатывает нормально: /brend/page-2 редиректится на стр. со / на конце

Пагинация отрабатывает нормально: /brend/page-2 редиректится на стр. со / на конце

Да, но есть страницы, на которых пагинация без ЧПУ - это, например, страница бренда если на ней товаров больше, чем на 1 страницу. Как сделать так, чтоб там была пагинация с ЧПУ я фиг знает.

Погуглив на stackoverflow, я у себя реализовал так - добавил в /etc/nginx/vhost.d в узел соответствующего server{} строку

rewrite ^([^.\?]*[^/])$ $1/ permanent;

результатом доволен. У меня всё работает, страницы без / отдаются с 301-редиректом.

Более чистый вариант:

rewrite ^/(.*)/$ /$1 permanent;

Работает только для случая, когда нужно убрать слеш в конце. Если нужно слеш добавить — в nginx такое написать будет сильно сложнее, поскольку нужно отделять статику от бэкэнда.

Добрый день!

Поднял сервер как указано https://www.cs-cart.ru/docs/4.5.x/install/nginx.html, возникла проблема с SMTP авторизацией на второй витрине (пока нет в функционале)

Пытаюсь поднять на сервере sendmail, инструкции к сожалению нет, 2 домена привязаны к pdd.yandex.ru, оба с ssl сертификатами, может подскажете где поискать или почитать. Нужно чтобы технические письма отправлялись с каждого домена (регистрация, уведомления).

Вопрос с почтой решен, так как понадобилось перерыть пол-интернета и потратить 3 дня, вот работающая инструкция, для тех кто устанавливал сервер по этой интрукции

https://www.cs-cart.ru/docs/4.5.x/install/nginx.html

Поднимаем SSMTP

Создаём различные конфигурационные файлы для каждого домена:

# cp /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp-domain1.conf
# cp /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp-domain2.conf

В каждом конфиге указываем свои аутентификационные данные.

В файле /etc/ssmtp/revaliases укажем оба домена:

root:webmaster@domain1.ru:smtp.yandex.ru:465
root:webmaster@domain2.ru:smtp.mail.ru:465

Таким образом почта с From:webmaster@domain1.ru пойдёт на smtp.yandex.ru, а с webmaster@domain2.ru на smtp.mail.ru. Разумеется, с учётом того, что будут использоваться разный конфиг ssmtp для своего домена.

Теперь задача. Как нам указать произвольный конфиг для ssmtp?

Нужно открыть файл php.ini и найти параметр sendmail_path= , который нужно раскомментировать и указать следующее:

/usr/sbin/ssmtp -t -C

Теперь надо заставить nginx менять этот параметр в зависимости от домена.

Открываем конфигурационные файлы nginx (где описание виртуальных хостов) и добавляем для каждого домена соответствующую строку:

fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-domain1.conf";

У другого домена:

fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-domain2.conf";

и так далее.

Теперь для каждого домена применяется собственный путь к sendmail (а значит и параметры аутентификации).

Для проверки кидаем в document_root каталоги каждого домена файлы mail.php следующего содержания:

<?php
mail('наш_адрес@домен.ru','тема','сообщение',"From: webmaster@domain1.ru \r\n"."X-Mailer: PHP/" . phpversion());
?>

в первый каталог и соответственно во второй:

<?php
mail('наш_адрес@домен.ru','тема','сообщение',"From: webmaster@domain2.ru \r\n"."X-Mailer: PHP/" . phpversion());
?>

Открываем в браузере оба файла: http://domain1.ru/mail.php и http://domain2.ru/mail.php

Нам на почту “наш_адрес@домен.ru” падает два письма. Одно соответственно с webmaster@domain1.ru, второе с webmaster@domain2.ru.

Взято отсюда

https://litl-admin.ru/linux/otpravka-pisem-s-raznyx-domenov-cherez-ssmtp.html

перенес вопрос в другую тему

Вопрос с почтой решен

Хорошо.

Давайте теперь попытаемся решить мой вопрос:

VPS 1024Mb 1 core 2.4 Ghz

Ubuntu Server 16.04, LEMP: nginx + php7.0-fpm + MariaDB

Уже второй раз наблюдаю следующую штуку в логах. Причём ближе к выходным.

Сначала виснет какой-то процесс, потом отваливается php-fpm. Причём при запросе статуса из консоли

systemctl status nginx

php работает, но скрипты не выполняются.

Ребут сервера всё чинит.

Однажды увидел это воочию:

Работаю в админке CsC. Захожу в заказы - конкретный заказ - 502 nginx err.

Остальная админка работает.

Опять пытаюсь зайти в заказ - опять 502.

Делаю контрольный заказ из фронтенда. Всё проходит нормально, но вместо страницы об успешном размещении заказа - 502.

Контрольный заказ в админке появился.

Ещё пара-тройка попыток открыть заказ - и сайт падает.

Изучаю проблему: физические файлы в корне сервера (txt, ico) доступны по прямой ссылке из браузера. Мой тестовый i.php в корне ( phpinfo(); ) не работает. Соответственно мыслю, что php отвалился.

Если свести все логи по хронологии, то вот так выглядит эпизод:

#access.log
195.191.64.27 - - [14/Apr/2017:12:40:04 +0300] "GET /admin-xxx.php?dispatch=orders.manage HTTP/2.0" 200 27668 "https://new.1330.ru/admin-xxx.php?dispatch=exim.export&section=products" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"

#kern.log
Apr 14 12:40:09 ih401955 kernel: [48914.341139] show_signal_msg: 12 callbacks suppressed
Apr 14 12:40:09 ih401955 kernel: [48914.341147] php-fpm7.0[1279]: segfault at 10 ip 00007f91ac074cfa sp 00007fff8e32df90 error 4 in apcu.so[7f91ac06f000+12000]
Apr 14 12:40:28 ih401955 kernel: [48933.391137] php-fpm7.0[1280]: segfault at 10 ip 00007f91ac074cfa sp 00007fff8e32df90 error 4 in apcu.so[7f91ac06f000+12000]
// всего 16 строк подобных

#access.log
195.191.64.27 - - [14/Apr/2017:12:40:27 +0300] “GET /admin-xxx.php?dispatch=orders.details&order_id=185 HTTP/2.0” 499 0 “https://new.1330.ru/admin-xxx.php?dispatch=orders.manage” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36”

#error.log
2017/04/14 12:40:28 [error] 1118#1118: *4498 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 195.191.64.27, server: new.1330.ru, request: “GET /admin-xxx.php?dispatch=orders.details&order_id=185 HTTP/2.0”, upstream: “fastcgi://unix:/run/php/php7.0-fpm.sock:”, host: “new.1330.ru”, referrer: “https://new.1330.ru/admin-xxx.php?dispatch=orders.manage
// всего 15 строк подобных

#php7.0-fpm.log
[14-Apr-2017 12:40:28] WARNING: [pool www] child 1280 exited on signal 11 (SIGSEGV - core dumped) after 48927.469842 seconds from start
[14-Apr-2017 12:40:28] NOTICE: [pool www] child 9817 started
// 16 таких сообщений

apport.log

ERROR: apport (pid 9816) Fri Apr 14 12:40:28 2017: another apport instance is already running, aborting
ERROR: apport (pid 9814) Fri Apr 14 12:40:09 2017: called for pid 1279, signal 11, core limit 0
ERROR: apport (pid 9814) Fri Apr 14 12:40:09 2017: executable: /usr/sbin/php-fpm7.0 (command line “php-fpm:\ pool\ www”)
ERROR: apport (pid 9814) Fri Apr 14 12:40:09 2017: is_closing_session(): no DBUS_SESSION_BUS_ADDRESS in environment
ERROR: apport (pid 9814) Fri Apr 14 12:40:34 2017: wrote report /var/crash/_usr_sbin_php-fpm7.0.33.crash
// 15 раз это повторяется

#Ну и завершает всё
#php7.0-fpm.log
[14-Apr-2017 12:58:29] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

Самое неприятное - что приходится сидеть днём и ночью над сайтом и перегружать если чё. Благо дело на смартфоне есть ssh. Но всё же не дело.

Как с этим жить-то? Как начать копать? Надо же отследить - что это за процессы. Какие вообще есть предложения о помощи :)))

Рекомендую установить последнюю версию PHP 7.0.x из доверенного репозитория. Похоже, в коде демона PHP-FPM есть логическая ошибка, из-за которой происходит некорректное обращение к памяти. Из-за ошибки сегментации процесс аварийно завершался и прекращал обслуживать запросы по FastCGI. Об этом вам сообщил Apport, сохранив отчёт в /var/crash/_usr_sbin_php-fpm7.0.33.crash.

Можно прочесть отчёт о сбое с помощью команды apport-retrace (обязательно наличие пакета php-fpm с дебаг-символами), однако это требует навыка работы с отладчиками (например, gdb).

Скажите пожалуйста, могу ли я поставить движок с лицензией привязанной к одному домену - временно на другой домен с условием закрытой витрины?
Либо могу ли я временно поменять домен привязки лицензии? Если да то куда мне обращаться?

Спасибо!

Скажите пожалуйста, могу ли я поставить движок с лицензией привязанной к одному домену - временно на другой домен с условием закрытой витрины?
Либо могу ли я временно поменять домен привязки лицензии? Если да то куда мне обращаться?

Спасибо!

Можно. За сменой домена для лицензии обратитесь в Helpdesk CS-Cart.