За последние 24 часа нас посетили 22408 программистов и 1152 робота. Сейчас ищут 654 программиста ...

Unable to bind address на Unix-сокет

Тема в разделе "PHP для новичков", создана пользователем Romio, 11 сен 2016.

Метки:
  1. Romio

    Romio Новичок

    С нами с:
    11 сен 2016
    Сообщения:
    14
    Симпатии:
    0
    то на чем все : vds ubuntu server 16.04, nginx+php7.0-fpm

    При вызове функции socket_bind или socket_create_server используя unix-сокеты,
    постоянно вылетают ошибки(permission denided, already in use, unknown error)
    Например:
    Код (Text):
    1. FastCGI sent in stderr: "PHP message: PHP Warning:  stream_socket_server(): unable to connect to unix:///var/run/php-fpm.sock: (Unknown error) in /usr/share/nginx/html/index.php on line 2" while reading response header from upstream, client: xxx.xx.xxx.xx, server: xx.xx.xx.xx, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: "xx.xxx.xx.xx"
    Код (Text):
    1. FastCGI sent in stderr: "PHP message: PHP Warning:  socket_bind(): unable to bind address [98]: Address already in use
    Эту ошибку дает вот этот код:
    Код (Text):
    1.  
    2. server.php
    3. <?php
    4. error_reporting(E_ALL);
    5. $address = '/run/php/php7.0-fpm.sock';
    6. echo "Start";
    7. //unlink($address);
    8. $sock = socket_create(AF_UNIX, SOCK_STREAM, 0);
    9. if (!is_resource($sock)) {
    10.     echo 'Не могу создать сокет: '. socket_strerror(socket_last_error()) . PHP_EOL;
    11. }
    12. if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
    13.     echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL;
    14. }
    15. if (!socket_bind($sock, $address)) {
    16.     echo 'Не могу привязать сокет: '. socket_strerror(socket_last_error()) . PHP_EOL;
    17. }
    18. socket_close($sock);
    19. ?>
    Со следующим кодом ошибка будет 0(unknown error)
    Код (Text):
    1.  
    2. <?php
    3. $address = 'unix:/run/php/php7.0-fpm.sock';
    4. $socket = stream_socket_server($address, $errno, $errstr);
    5. if (!$socket) {
    6.   echo "$errstr ($errno)<br />\n";
    7. } else {
    8.   while ($conn = stream_socket_accept($socket)) {
    9.     fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
    10.     fclose($conn);
    11.   }
    12.   fclose($socket);
    13. }
    14. ?>
    В строке
    Код (Text):
    1. $address = 'unix:/run/php/php7.0-fpm.sock';
    пробовал разные вариации..
    unix:///run/php/php7.0-fpm.sock
    /run/php/php7.0-fpm.sock

    Сокет по сути уже существует(nginx+php7.0-fpm его создали). Права доступа проверял.
    Может я его не правильно подключаю? Тупик!
    В общем нужна помощь!
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    А что ты пытаешься сделать-то? Создать пхп-сокет-сервер, который будет принимать запросы на том же сокете, что и пхп-машина? Смени адрес сокета тогда на какой-нибудь свой уникальный.
     
  3. Romio

    Romio Новичок

    С нами с:
    11 сен 2016
    Сообщения:
    14
    Симпатии:
    0
    /run/php/php7.0-fpm.sock в php коде ?
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Наверное)))
     
  5. Romio

    Romio Новичок

    С нами с:
    11 сен 2016
    Сообщения:
    14
    Симпатии:
    0
    Я почему то был уверен, что в php коде должен быть использован сокет установленный php-fpm
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Интересная логика. Пхп-машина запущена, слушает подключения на определенном сокете. Твой скрипт создает свой сокет-сервер и пытается этот же сокет забиндить. Внимание вопрос: как машина должна понять к какому процессу отправить запрос, когда кто-то этот сокет почешет? Сокет это уникальный адрес, связанный с процессом. Создаешь новый процесс - будь добр не нарушать адресное пространство, связанное с другими процессами. Даже браузер с веб-сервером после установки соединения по 80 порту (или 443) создают пару новых сокетов для непосредственного обмена данными чисто чтоб текущий запрос не занимал исходный порт и давал возможность подключиться другим клиентам.
     
    denis01 нравится это.
  7. Romio

    Romio Новичок

    С нами с:
    11 сен 2016
    Сообщения:
    14
    Симпатии:
    0
    И правда...все логично! Спасибо!
     
  8. Romio

    Romio Новичок

    С нами с:
    11 сен 2016
    Сообщения:
    14
    Симпатии:
    0
    Не пинайте сильно.. Пытаюсь разобраться в сокетах.
    А смысл тогда в сокете nginx+php-fpm?
    Увеличение скорости и количества подключений и куча проблем с безопасностью(я про использование на VPS/VDS)?
    Как я могу использовать сокет который создали nginx+php-fpm в php? Скорее, я с ним ничего делать не могу.
    Если я правильно понял.. то на линуксе somaxconn=128(по умолчанию) для TCP. А связка nginx+php-fpm позволяет значительно больше соединений обрабатывать. Правильно ?
    Ладно создал я свой unix domain socket(AF_Unix, не AF_INET- это всего 128 соединений по умолчанию?) на php, как его привязать/направить к ip:порту?
    Сразу говорю разницу между сетевой и локальный понимаю. Но у nginx+php-fpm получается)))
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    @Romio фпм использует сокет, чтоб вебсервер мог адресовать к пхп-машине запорсы. Это может быть айпи-сокет или юниксовый. И всё. Ты пытаешься создать сокет-сервер. Его запуском у тебя почему-то занимается фпм, судя по коду. Но не важно кто его будет запускать. Важно что для обработки запросов он обязан использовать свой собственный сокет. Либо же тебе достаточно переписать свою программу так, чтоб это был простой сценарий, который пхп-машина выполнит, получив сигнал от веб-сервера.
     
  10. Romio

    Romio Новичок

    С нами с:
    11 сен 2016
    Сообщения:
    14
    Симпатии:
    0
    Вариант сценария для пхп машины мне не подходит.
    На сервере будет обработка БД(по времени), а так же сервер будет проверять/отвечать на запросы. Клиент отдельно.
    По этому вариант с сокетами кажется наиболее приемлемым. Но терь смущает малое количество соединений TCP.
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Ну если это локальный демон, то в чем проблема указать ему какой-то свой юниксовый сокет? Да и ядро можно подкрутить до нужных значений, если руки прямые и есть уверенность в необходимости таких действий.
     
  12. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    В бубунте как всегда через пятое место пакеты называются...
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
  14. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Php-fpm7.0...
     
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    php7.0-fpm же
     
  16. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Угу, не удобнее ниразу. Непривычно. Ставишь когда на девелоперскую машину с убунтой: только с apt-cache search и подбирать как там их назвали...
     
  17. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    @Zuldek вопрос привычки, наверное. Я за много лет сидения на убунте относительно привык к тому, как пакеты называются. Да, криво, но скорее в примере с 5.5 и 5.6 - при префиксе в php5-* на систему можно только что-то одно поставить. Репозиторий Сури проблему решает. Когда-нибудь может и дебиан/убунту в своих репах наведут порядок.