LINUX.ORG.RU

Сообщения tetramin

 

Не кэшируются is_file, is_dir и file_exists

Добрый день.

Имеется проект на Symfony2, nginx, php-fpm + opcache.

Смотрю профилировщик: на каждый запрос идёт очень много обращений к сабжевым функциям. Но они же должны закэшироваться опкэшем? Или я чего-то не понимаю?

Подскажите, пожалуйста.

 

tetramin
()

Горизонтальное масштабирование базы данных

Добрый день.

Задача состоит в том, что нужно разработать такую схему, при которой будет удобно динамически масштабировать БД без даунтайма. Объясню более подробно:

В docker-контейнере поднят, например, Postgres, настроенный на репликацию в качестве мастера и контейнер со слейвом. До какого-то времени это выдерживает нагрузки и всё нормально. Но в какой-то момент сервер перестанет справляться с запросами (заранее точно не известно сколько будет селектов и инсертов/апдейтов, но скорее всего поровну или даже больше будет именно последних). Тогда будет необходимо поднять ещё один сервер с БД и если нагрузки не упираются в железо, то можно, например, сделать:

docker-compose scale db-slave=2
(Рассмотрим пока случай, когда селектов больше)

Тогда нужно балансировать нагрузку. Для этого возможно использовать pgpool: поднимаем сначала контейнер с pgpool и прописываем адрес бэкенда, затем поднимаем контейнер с БД.

Проблема номер один возникнет, когда нужно будет масштабировать. Придётся убивать контейнер с pgpool и поднимать его с указанием дополнительных бэкендов. А это недопустимый даунтайм.

Проблема номер два - если апдейтов/инсертов будет равно или больше селектов... Вижу решение в мультимастер-репликации, но мне сложно представить, как это реализовать и исключить неконсистентность данных.

Проблема номер три - железо. Однажды возможности сервера иссякнут и нужно будет докупать ещё один сервер. И для этого есть интересный проект Kubernetes. Он позволяет поднимать контейнеры на других серверах. Но как этим всем управлять??? Как балансировать запросы?

Возможно, postgres не лучший вариант для этих целей? Если это так - посоветуйте, пожалуйста, другую СУБД. Расскажите, кто как делает у себя.

Прошу вашей помощи. Заранее благодарю.

 , , , ,

tetramin
()

Попросить smtp получателя отправлять отлуп на определённый адрес

Добрый день.

А можно так сделать, чтобы сервер получателя отправлял отлуп о недоставленном сообщении на определённый адрес, вне зависимости от того, откуда пришло письмо?

Я хочу сделать обработчик входящей почты, чтобы он парсил такие письма и записывал емайл с ошибкой в базу.

Сервер exim4, писать обработчик буду на php.

 

tetramin
()

Имена сервера nginx

Добрый день.

Есть сайт с поддоменами-городами (spb.example.com, msk.example.com), которых, на самом деле, много у нас в матушке-России.

На сервере фронтенд - nginx:

...
server_name www.example.com *.example.com;
...

Бэкенд - тоже nginx. Сейчас (пока поддоменов не много) сделано несколько секций server с разными server_name (и одинаковыми настройками!) для каждого города, что крайне отвратительно!

Если на бэкенде прописать такое же имя сервера (www и *.), как на фронтенде, то браузер сообщает о бесконечном 302 редиректе.

Знаю, что вся проблема в разделителе-точке между доменом и поддоменом. Nginx считает некорректным выражение *example.com - иначе можно было бы прописать так и работало бы.

Как поступить в данном случае?

 

tetramin
()

ip адрес клиента - это ip адрес гипервизора

Добрый день.

Схема такая:

Есть сервер (назову его А) с айпи 1.0.0.1 - он главный, на нём крутятся виртуальные машины, которые выполняют свои задачи. К нему, само собой, есть доступ из интернет.

На нём крутится виртуальная машина (назову её Б) с айпи 1.0.0.2, которая выполняет роль веб-сервера.

Организовано всё при помощи nginx: он установлен на машине «А» и проксирует запросы на машину «Б», на которой, nginx + php-fpm.

Есть сайт, который лежит на машине Б и на нём ведётся статистика переходов с этого сайта на сторонние ресурсы - в базу данных, помимо прочего, записываются ещё и айпи-адреса клиентов (статистика по которым и собирается).

Грубый пример: зашёл ко мне на сайт человек с ip 3.3.3.3 и перешёл по ссылке. Мне в базу записался его ip. (Можно было всё это не расписывать, а посмотреть access.log с машины Б)

Проблема в следующем: РАНЬШЕ, когда схема вебсервера была такая

nginx -> apache
в эту статистику (читай access.log) записывались правильные айпишники клиентов. Теперь же в статистику пишется адрес гипервизора «А» 1.0.0.1.

Подозреваю, что какие-то заголовки не передаю. Только какие?

На всякий случай, вот конфиг виртуалхоста с гипервизора:

server {
    listen внешний_айпи_сервера:80;
    server_name www.сайт.ru *.сайт.ru;

    access_log off;
    error_log /var/log/nginx/сайт.ru.error.log crit;

    location / { 
        client_max_body_size 32m;
        proxy_max_temp_file_size 0;

        proxy_pass http://1.0.0.2:80;
    
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    Host            $http_host;
        proxy_set_header    X-NginX-Proxy   true;
    
        proxy_redirect off;
        port_in_redirect off;
    }   
}

 ,

tetramin
()

Как теперь избавиться от шпиона?

Например, последние пару дней, садясь за свой комп я понимаю, что оставил тут в прошлый раз всё не так, как тут всё лежит сейчас. Всё понятно - шпион, опущу подробности, как он туда попал.

Вопрос: каков мой дальнейший порядок действий, чтобы избавиться от этого шпиона чтобы он снова не смог залезть в мою сеть? С чего вообще начать? Как профессионалы поступают в таких случаях?

 , ,

tetramin
()

Переопределить часть функции (возможно ли?)

Добрый день.

Например, у меня есть класс:

class A {
  public function test() {
    echo "Test";
  }
}

Например, есть унаследованный класс, в котором переопределена функция test():

class B extends A {
  public function test() {
    echo "Test";
    echo "This is test";
  }
}

Как видно, метод наполовину копирует код (вывод «Test»). Когда речь идёт об одной строке - всё нормально. А если у меня десять строк и переопределяется 4 метода? Не копировать же их - неправильно это... Может есть какой-то способ указать, что перед интерпретацией функции, сначала, нужно выполнить часть кода из «функции-родителя»?

Поясню: речь идёт о фреймворке. Там есть action'ы. И в некоторых осуществляется проверка на то, является ли пользователь админом.

 ,

tetramin
()

Git, разработка в одном каталоге и деплой в другой

Добрый день.

У меня на локалхосте php-fpm пулы работают от разных пользователей. Например есть сайт, который лежит в

/var/www/user1.ru
с соответствующим овнером и правами на файлы 644 и каталоги 755. А иксы работают от другого пользователя, который не может править файлы пользователя user1. Решил, что мне может помочь в этом гит: я буду вести разработку от своего пользователя в домашнем каталоге, а в каталоге вебсервера буду делать git pull...

Выглядит просто, а как так сделать? Это же два разных репозитория, получается. Не хотелось бы использовать гитхаб. Как на локалхосте такое осуществить?

 ,

tetramin
()

Revive AdServer нет статистики кликов

Добрый день.

Уже месяц эта проблема остаётся нерешённой. А именно, отсутствует статистика кликов по флеш-баннерам в системе Revive AdServer (бывший OpenX). При этом, статистика показов нормально отображается, а так же нормально работает статистика кликов по обычным картинкам и gif-анимации.

Проблема где-то в flash. Подскажите, пожалуйста, куда копать. Может форум есть специальный. Раньше (пару лет назад) всё работало и статистика отображалась по кликам.

 ,

tetramin
()

BOSH-сервер, openfire, XMPP-чат на веб-странице

Добрый день.

Есть сервер с работающим XMPP-сервером openfire. Есть задача: сделать чат на сайте при помощи js. Я выбрал converse.js. Ему (всем подобным) для работы требуется BOSH-сервер. В openfire есть настройка http-binding - то есть, вроде уже из коробки у него должен быть BOSH-сервер. Усложняет всю схему nginx, который работает на хост-системе, как прокси и проксирует запросы на виртуальную машину, на которой и установлен openfire.

В nginx (на главной машине) есть такая настройка:

location /http-bind/ {
    proxy_pass http://10.0.0.2:7070/http-bind/;
}

Если в браузере открыть эту страницу, то на экране:

HTTP ERROR: 400
Problem accessing /http-bind/. Reason:
    Bad Request

Powered by Jetty://

То есть BOSH, вроде бы, работает... tcpdump показывает обращение к порту 7070. Но сам converse.js не работает: к порту 7070 не обращается и, при этом, не может залогиниться (ошибок не показывает).

Что-то я делаю не правильно. Вот только что?

1. Как проверить работоспособность BOSH-сервера?

2. Есть ли у openfire BOSH-сервер (или нужно ставить, например punjab)?

 , ,

tetramin
()

Индексация в поисковиках, поддомены, регионы.

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

Хотелось бы прояснить ситуацию с индексацией сайта в поисковых системах. Рассмотреть хочу три ситуации: поддомены, адреса и куки. Расскажу, что именно имею в виду.

У меня есть сайт, у которого есть представительства в других городах. И контент, соответствующий городу, выдаётся путём изменения поддомена, например, Екатеринбург:

ekb.example.com
Это первая ситуация.

На авито, например, сделано наоборот - город дописывается в адрес:

www.example.com/ekaterinburg
А ещё я знаю, что многие сайты не используют ни тот, ни другой способ. Контент у них отдаётся по разным городам, но адрес при этом не меняется. Делается это при помощи кук, на сколько мне известно.

Вопрос: как поисковики индексируют такие сайты? Как безопасно для SEO сменить один способ на другой? Да и вообще, хотелось бы где-то почитать про это и живого обсуждения!

Заранее благодарю!

 

tetramin
()

Про заголовки и аутентификацию в exim4

Добрый день.

Я уже всю голову сломал, никак не могу победить, а информации не много по этому вопросу...

У меня две проблемы.

Первая: не могу победить аутентификацию на сервере. Вот мои аутентификаторы:

    PLAIN:
      driver                     = dovecot
      public_name                = PLAIN
      server_set_id              = $auth1
      server_socket              = /var/run/dovecot/auth-client
      server_advertise_condition = ${if def:tls_cipher }
     

     
    LOGIN:
      driver                     = dovecot
      public_name                = LOGIN
      server_set_id              = $auth1
      server_socket              = /var/run/dovecot/auth-client
      server_advertise_condition = ${if def:tls_cipher }

При отправке сообщения из thunderbird - оно отлично уходит и доставляется до получателя. Проблема возникает при попытке отправить сообщения с некоторых сайтов, написанных, например, на opencart. Я создаю учётную запись, ввожу настройки на сайте и, какой бы тип шифрования я не выбрал - возникает ошибка:

auth command used when not advertised

Собственно, если прителнетиться к 25 порту (и то же самое, если сделать gnutls-cli --verbose --starttls -p 587 $server) и набрать EHLO - нет команды AUTH в списке. Затем набираем STARTTLS, получаем сертификат. Снова EHLO - всё так же нет AUTH... Возможно, проблема с отправкой с сайта на opencart в этом.

Это связано с server_advertise_condition - если поставить её равной *, то AUTH появляется в списке. Но не стоит ведь разрешать аутентификацию, если соединение не зашифровано! Так нельзя!

Есть ещё один параметр server_condition. Если его настроить, например так:

server_condition = ${lookup mysql{SELECT `username` FROM `users` WHERE `username` = '${quote_mysql:$auth2}' AND `passwd` = '${quote_mysql:$auth3}' AND `active` = '1'}{yes}{no}}
то аутентификация начинает работать почти правильно: пишем EHLO, получаем список, в котором нет AUTH, вводим STARTTLS, снова EHLO - появляется AUTH PLAIN LOGIN - отлично? Нет! После этого из thunderbird нельзя отправить сообщение. Вот часть лога:
11:42:57   731   $auth1 = admin@example.ru
11:42:57   731   $1 = admin@example.ru
11:42:57   731 expanding: $auth2
11:42:57   731    result: 
11:42:57   731 expanding: $auth3
11:42:57   731    result: 
11:42:57   731 expanding: SELECT `username` FROM `users` WHERE `username` = '${quote_mysql:$auth2}' AND `passwd` = '${quote_mysql:$auth3}' AND `active` = '1'
11:42:57   731    result: SELECT `username` FROM `users` WHERE `username` = '' AND `passwd` = '' AND `active` = '1'
И, естественно:
SMTP>> 535 Incorrect authentication data
ибо $auth2 и $auth3 не разворачиваются...

Как быть, где почитать, что настроить?

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

...
Sender: "admin@example.ru"@example.ru
...
Return-Path: "admin@example.ru"@example.ru
...
Они такие, если отправлять из thunderbird или roundcube. Почему они такие?

Ребята помогите, пожалуйста! Направьте в нужную сторону.

 

tetramin
()

AUTH LOGIN нет в списке после EHLO

Добрый день.

Хочу настроить аутентификацию на почтовом сервере. Захожу на сервер, ввожу EHLO и в списке нет метода AUTH LOGIN:

telnet example.com 25
Connected to example.com
Escape character is '^]'.
220 example.com ESMTP MTA :)
EHLO example.com
250-example.com Hello example.com [мой_локальный_айпи]
250-SIZE 31457280
250-8BITMIME
250-PIPELINING
250-STARTTLS
250 HELP

Подскажите, где в exim4 это настраивается?

Спасибо.

 ,

tetramin
()

Заголовок Sender: при отправке почты виртуальными юзерами

Добрый день.

Пулы php-fpm работают от разных пользователей. Например, roundcube работает от имени пользователя roundcube. Соответственно, при отправке из него письма, оно уходит с заголовком:

...
Sender: roundcube@example.com
...

А в DATA From: правильный_юзер@example.com

Как сделать, чтобы отправителем был виртуальный пользователь, под которым я залогинился в roundcube?

 

tetramin
()

Отправка почты виртуальными машинами через один почтовый сервер

Добрый день.

Хотел бы разобраться в терминологии и технической стороне вопроса. В общем, настроил почтовый сервер на одной из виртуальных машин, которая находится за NAT и её почтовые (110 и 25) порты проброшены на гипервизоре. Виртуальные почтовые юзеры и домены хранятся в БД. Почта с этой машины ходит отлично, с красивыми заголовками и популярные почтовики не считают её спамом, с радостью её принимая!

Есть у меня ещё несколько виртуальных машин, каждая для своих задач. На них лежат сайты, которые должны иметь возможность отправить почту, ну, например, подтверждение регистрации или информацию.

Как мне сделать, чтобы все виртуальные машины слали почту от MAILER-DAEMON'а (через) с почтового сервера, а не пытались сделать это самостоятельно? Чтобы, так сказать, MAILER-DAEMON был один на всех...

 , ,

tetramin
()

Проблема с правами exim4 и clamav

Добрый день.

Debian jessie. Никак не могу подружить clamav-daemon и exim4. В логах это:

malware acl condition: clamd: ClamAV returned: /var/spool/exim4/scan/XXX.eml: lstat() failed: Permission denied. ERROR

Exim входит в группу clamav. Clamav входит в группу Debian-exim, права на каталоги:

ls -l /var/spool

drwxr-xr-x 5 root        root        4096 апр 13 11:52 cron
drwxrws--- 6 Debian-exim Debian-exim 4096 июн 29 09:18 exim4
lrwxrwxrwx 1 root        root           7 апр 13 11:46 mail -> ../mail
drwx------ 2 root        root        4096 окт  8  2014 rsyslog
Всё, что в каталоге exim4, имеет такие же права, как у exim4.

Кому не хватает прав? Как посмотреть логи, в которых указаны пользователи, от которых пытаются lstat()?

 , ,

tetramin
()

Mixxx, вручную установить bpm

Добрый день!

Не знаю, как это правильно всё называется... В общем у трека автоматом вычисляется bpm и, в соответствии с ним, на waveform появляется разметка (beatgrid вроде называется), в виде вертикальных полосок. Как мне вручную изменить их размер? Допустим, многократный тап в ритм по bpm изменяет значение, но полоски остаются на своих местах. И я уже не могу, например, зациклить какой-то кусок в ритм.

 ,

tetramin
()

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

Добрый день.

Дано: nginx+php-fpm, CMS написанная на Codeigniter.

Не знаю, на что грешить: то ли сайт написан по идиотски, то ли руки кривые у меня...

В общем, проблема в следующем. Есть сайт с фронтендом и бэкендом. С фронтендом всё нормально - index.php лежит в корне и сайт отлично отдаётся. А вот с бэкендом проблема. index.php лежит в папке /admin и, кажется, ничего сложного, должно всё и так работать... Просто пишем

http://example.com/admin
и попадаем на страницу авторизации по вышеуказанному адресу. Пока всё нормально. Вводим логин-пароль и адрес меняется на
http://example.com/login/send
Поскольку в адресе нет слова admin, срабатывает контроллер из фронтенда и говорит, что такой страницы не существует.

Приведу конфиг виртуалхоста на всякий случай.

server {
    listen 80; 
    server_name example.com;

    root /var/www/example.com/public_html;
    index index.php;

    location / { 
        try_files $uri $uri/ /index.php;
    }   

    location ~ \.php$ {
        root /var/www/example.com/public_html;
        try_files $uri =404;
        fastcgi_pass unix:/var/run/phpfpm-examplecom.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        include fastcgi_params;
    }
}

На апаче всё работает нормально.

Осталось лишь добавить, что я много читал, кучу вариантов перепробовал. Есть ещё вариант, при котором не работает фронтенд, зато работает бэкенд...

Помогите понять, почему идёт перенаправление.

 , ,

tetramin
()

После переноса на другой хостинг изменился протокол у ссылок

Добрый день. Сервер nginx + php-fpm. При разворачивании на нём проекта меняется протокол у ссылок. На старом сервере http://, а на новом https://

Я даже не знаю, как такой вопрос задать гуглу, прошу не пинать сильно.

 , ,

tetramin
()

Где кэшируется маршрут?

Добрый день.

На сервере 2 внешних ip-адреса из одной подсети: x.x.x.1 и x.x.x.2, стоит nginx. На нём 2 сайта: eth0.example.com и eth1.example.com. На каждом сайте для теста я создал по 1 файлу одинакового размера (1 гб), с разным содержимым и разными именами.

Маршрутизация сделана путём добавления одного дефолтного шлюза для каждого интерфейса:

route add default gw x.x.x.3 dev eth0
route add default gw x.x.x.3 dev eth1

1. С домашнего компа wget'ом пробую скачать первый файл (с eth0.example.com) - пакеты идут через eth0;

2. пробую скачать второй файл (с eth1.example.com) - пакеты идут через eth1;

А дальше проблема:

3. пробую ещё раз скачать первый файл (с eth0.example.com) - пакеты идут через eth1 и, с какого бы адреса не пытался скачать - трафик идёт через eth1.

Где кэшируется маршрут? ЧЯДНТ?

 , ,

tetramin
()

RSS подписка на новые темы