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

Обновлено: 02.07.2024

Я установил стек Bitnami Django, который включал PostgreSQL 8.4.

Когда я бегу psql -U postgres Я получаю следующую ошибку:

PG определенно работает и pg_hba.conf файл выглядит так:

"Доказательство", что pg работает:

21 ответ

Эта проблема возникает из-за установки postgres пакет без номера версии. Хотя postgres будет установлена ​​и будет правильной версией, скрипт для настройки кластера будет работать некорректно; это проблема упаковки.

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

Сначала удалите старую установку postgres. В настоящее время проблема заключается в 9.1, поэтому я буду считать, что это то, что вы установили

Теперь просто переустановите

Запишите название пакета с номером версии. НТН.

The error message refers to a Unix-domain socket, so you need to tweak your netstat invocation to not exclude them. So try it without the option -t :

I would guess that the server is actually listening on the socket /tmp/.s.PGSQL.5432 rather than the /var/run/postgresql/.s.PGSQL.5432 that your client is attempting to connect to. This is a typical problem when using hand-compiled or third-party PostgreSQL packages on Debian or Ubuntu, because the source default for the Unix-domain socket directory is /tmp but the Debian packaging changes it to /var/run/postgresql ,

Возможные обходные пути:

  • Use the clients supplied by your third-party package (call /opt/djangostack-1.3-0/postgresql/bin/psql ). Возможно, удалите все пакеты, поставляемые с Ubuntu (это может быть сложно из-за других обратных зависимостей).
  • Исправьте каталог сокетов стороннего пакета, чтобы он был совместим с Debian/Ubuntu.
  • использование -H localhost to connect via TCP/IP instead.
  • использование -h /tmp or equivalent PGHOST setting to point to the right directory.
  • Не используйте сторонние пакеты.

Ты можешь использовать psql -U postgres -h localhost заставить соединение происходить через TCP вместо доменных сокетов UNIX; ваш netstat вывод показывает, что сервер PostgreSQL прослушивает порт 5432 локального хоста.

Вы можете узнать, какой локальный сокет UNIX используется сервером PostgrSQL, используя другой вызов netstat:

В любом случае, интерфейсы, на которых слушает сервер PostgreSQL, настроены в postgresql.conf ,

Просто создайте мягкую ссылку, подобную этой:

Это работает для меня:

Включить или добавить:

Перезапустите ядро ​​базы данных:

Также вы можете проверить файл pg_hba.conf

И добавьте адрес своей сети или хоста:

Я заставляю это работать этим:

Выберите предпочитаемые локали и запустите

(9.5 - это моя версия postgresql)

и тогда это работает!

Мне пришлось скомпилировать PostgreSQL 8.1 на Debian Squeeze, потому что я использую Project Open, который основан на OpenACS и не будет работать на более поздних версиях PostgreSQL.

Конфигурация компиляции по умолчанию помещает unix_socket в /tmp , но Project Open, который опирается на PostgreSQL, не будет работать, потому что он ищет unix_socket в /var/run/postgresql ,

Есть настройка в postgresql.conf установить местоположение розетки. Моя проблема заключалась в том, что либо я мог установить для /tmp а также psql работал, но проект не открыт, или я мог бы установить его для /var/run/postgresql а также psql не будет работать, но проект открыт.

Одним из решений этой проблемы является установка сокета для /var/run/postgresql а потом беги psql по предложению Петра, как:

Это выполняется локально с использованием локальных разрешений. Единственным недостатком является то, что он больше печатает, чем просто "psql".

В моем случае вместо:

и явно установить unix_socket в /var/run/postgresql/.s.PGSQL.5432 в postgresql.conf ,

Если ваша служба Postgres запущена и работает без каких-либо ошибок или при запуске службы Postgres нет ошибок, но вы все еще получаете указанную ошибку, выполните следующие действия.

Шаг 1: Бег pg_lsclusters выведет список всех кластеров postgres, работающих на вашем устройстве

Скорее всего, статус будет ниже в вашем случае и сервис Postgres

Шаг 2: перезапустите pg_ctlcluster

Шаг 3: Шаг 2 не удался и выдал ошибку

Если этот процесс не будет успешным, он выдаст ошибку. Вы можете увидеть журнал ошибок на /var/log/postgresql/postgresql-9.6-main.log

Моя ошибка была:

Шаг 4: проверьте право собственности на postgres

Удостоверься что postgres является владельцем /var/lib/postgresql/version_no/main

Если нет, запустите

Шаг 5: Проверьте, что пользователь postgres принадлежит к группе пользователей ssl-cert

Решение:

и это. (9.3 - это моя текущая версия PostgreSQL. Напишите свою версию!)

В моем случае это было вызвано опечаткой, которую я сделал при редактировании /etc/postgresql/9.5/main/pg_hba.conf

Но MD5 должен был быть в нижнем регистре md5 :

Во-первых, отключите все параметры ведения журнала в postgresql.conf. Это раздел:

Закомментируйте все в этом разделе. Затем перезапустите сервис.

При перезапуске используйте /etc/init.d/postgresql start или же restart Я нашел полезным находиться в режиме суперпользователя при перезапуске. У меня было открыто окно x только для этой операции. Вы можете установить этот режим суперпользователя с помощью sudo -i ,

Убедитесь, что к серверу можно подключиться с помощью этой простой команды: psql -l -U postgres

Если это не помогает, то подумайте:

Я менял владельца многих папок, пытаясь найти решение. Я знал, что я, вероятно, буду пытаться вернуть владельцы этих папок и chmod еще 2 дня. Если вы уже перепутали владельцев этих папок и не хотите полностью очищать свой сервер, начните отслеживать настройки всех затронутых папок, чтобы вернуть их в исходное состояние. Возможно, вы захотите попробовать выполнить параллельную установку в другой системе и систематически проверять владение и настройки всех папок. Утомительно, но вы можете получить доступ к своим данным.

Я запускаю службу PostgreSQL с Docker. По какой - то причине PostgreSQL хочет привязаться к IPV6-хотя я нигде этого не указывал (по крайней мере, насколько мне известно).

В результате этого я не могу подключиться к PG. Соответствующие подробности приведены ниже:

Dockerfile

PostgreSQL содержимое файла журнала

Я запускаю контейнер, используя следующую команду: docker run --name my_db_service_cntnr image_tag

Когда я запускаю следующую команду: docker container port my_db_service_cntnr , я ничего не получаю взамен:

Я знаю, что PostgreSQL работает в контейнере:

Тем не менее, когда я пытаюсь подключиться к PostgreSQL (используя порт по умолчанию 5432), он не может подключиться к базе данных:

Попытка подключения через psql

Похоже, порт 5432 не прослушивается на моей машине , несмотря на то, что я указываю, что PG image EXPOSE port 5432:

Что вызывает эту ошибку и как ее устранить?

1 ответ

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

Запустите контейнер postgres

Получите PID контейнера

Получите журналы из контейнера, проверьте на наличие ошибок.

Список процессов из контейнера

Запустите ss в контейнере в поисках прослушивающих tcp процессов (например, lsof )

Вне контейнера не будет сообщать о портах в пространствах имен контейнеров

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

Получить IP контейнера из Docker

Сопоставленные порты

С подключенным портом порты на хосте немного изменяются

Теперь контейнер имеет настроенный порт

Порт также будет прослушиваться на хосте

И вы можете подключиться к localhost или вашим хостам IP прямо сейчас

Когда я использовал InetAddress addr = InetAddress.getByName(192.168.1.104); listen_socket = new ServerSocket(port,5,addr); тогда все работает нормально Но когда используется динамический ip InetAddress addr = InetAddress.getByName(114.143.95.69); listen_socket = new ServerSocket(port,5,addr);.

Как настроить мульти-хост под управлением Docker 1.12 на Hyper-V? Я могу легко назначить ip-адрес 127.x.x.x, но я хотел бы назначить, например, 10.240.0.x. Это мой docker-compose.yaml: version: '2' services: nginx: image: nginx:lastest ports: - 127.0.0.100:80:80 Если я попытаюсь назначить.

Похожие вопросы:

Я хочу использовать низкий порт в своем приложении (SNMP Trap Receiver on Spring web + Tomcat7). Как я уже говорил в этом потоке, связывая низкий порт с программой Java на сервере Ubuntu, раньше я.

Мне нужно изменить адрес IP хоста от клиента. Я использую команды UDP и A MulticastSocket для получения адреса IP этого хоста (currentIp) и использую этот адрес IP для успешного установления.

Раньше мой IP был 10.0.6.63, сервер apache работал нормально. При перезагрузке DHCP изменил свой адрес IP на 10.0.15.12 теперь, когда я пытаюсь запустить apache, он выдает мне следующую ошибку.

Я использую zeromq для разработки динамического приложения, которое работает как протокол upnp( автоконфигурация и автоматическое обнаружение оборудования в гостиной). Для этого я использую zeromq.

Когда я использовал InetAddress addr = InetAddress.getByName(192.168.1.104); listen_socket = new ServerSocket(port,5,addr); тогда все работает нормально Но когда используется динамический ip.

Как настроить мульти-хост под управлением Docker 1.12 на Hyper-V? Я могу легко назначить ip-адрес 127.x.x.x, но я хотел бы назначить, например, 10.240.0.x. Это мой docker-compose.yaml: version: '2'.

EDIT 2: После долгого времени все решено! См. ответ ниже. EDIT: мне очень жаль говорить, что проблемы ушли on their own между вчерашним и сегодняшним днем, а я ничего не сделал. Отличный.

Я написал чат-сервер, но не могу привязать свой сокет к адресу IP: import sys import os import socket HOST = 194.118.168.131 SOCKET_LIST = [] RECV_BUFFER = 4096 PORT = 9009 def chat_server().

У меня есть приложение java, которое подключается к mysql на docker. когда я запускаю нагрузочный тест для сохранения и обновления данных до mysql, сначала он работает корректно, но через некоторое.

Здравствуйте, 13akaEagle, Вы писали:

E>Какой бы порт не ставил и он всегда оказывается занятым

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

Здравствуйте, neFormal, Вы писали:

F>а зачем оно тебе вообще?
F>пусть крутится на дефолтном. тебе же только наружу надо прокинуть, внутри всё пофиг.
Так 5432 это и есть дефолтный. Уберу я эту строчку или нет разницы нет.

Я так понимаю эта проблема появилась у меня после того, как подхватился старый конфиг. Видимо его и надо ковырять.
Меня ещё смущает строчка

Почему IPv6, а о IPv4 ни слова.

Здравствуйте, neFormal, Вы писали:

F>Здравствуйте, 13akaEagle, Вы писали:

E>>Какой бы порт не ставил и он всегда оказывается занятым

F>а зачем оно тебе вообще?
F>пусть крутится на дефолтном. тебе же только наружу надо прокинуть, внутри всё пофиг.

Удалил эти строки


запустил. Тоже с ошибками запустилось, но какие-то файлы были созданы.

Затем добавил эти строки и снова запустил. Всё подхватилось. Дурдом

Здравствуйте, 13akaEagle, Вы писали:

E>Так 5432 это и есть дефолтный. Уберу я эту строчку или нет разницы нет.

тогда оно нинужно

E>Я так понимаю эта проблема появилась у меня после того, как подхватился старый конфиг. Видимо его и надо ковырять.
E>Меня ещё смущает строчка
E>
E>Почему IPv6, а о IPv4 ни слова.

так постгрес внутри контейнера запускается на ipv6.
ты можешь подключиться к нему и, поставив net-tools, посмотреть через netstat -lpnt
короче, кто-то занимает порт. скорее в хостовой системе. может другой такой же контейнер запущен.

Здравствуйте, 13akaEagle, Вы писали:

E>Затем добавил эти строки и снова запустил. Всё подхватилось. Дурдом

я бы посмотрел на `docker ps -a`

Здравствуйте, neFormal, Вы писали:

F>Здравствуйте, 13akaEagle, Вы писали:

E>>Затем добавил эти строки и снова запустил. Всё подхватилось. Дурдом

F>я бы посмотрел на `docker ps -a`

У меня всего 3 контейнера пока

Здравствуйте, 13akaEagle, Вы писали:

E>Затем добавил эти строки и снова запустил. Всё подхватилось. Дурдом

Умение пользоваться средствами диагностики и чтения логов обязательно. Никто не будет вести тебя за руку до победного конца. проблем и таинственных явлений будет много без базовых умений.

Сеть.
tcpdump, nmap, "netstat -plunt", ping, nslookup, "ip route list"

Внутрь контейнера, "docker exec -ti xyz [bash|sh]"

Логи и все что создано внутри контейнера:

"docker diff xyz"

Внутри, соответственно, cat, find, grep и т.п.


Далее, маппить хостовый folder внутрь как и volumes-from это антипаттерн. Все данные лучше помещать внутрь копированием и извлекать также. Контейнер в большинстве случаев "где-то там".

На хосте, это "только здесь" плюс куча проблем с созданием файлов и permissions

volumes-from создает зависимости, в том числе и по images

Для чуть более сложных сценариев docker-compose становится слишком ограниченным и неудобным. Скриптинг (docker-py) намного удобнее. И какой нибудь orchestration tool (terraform . ) , как опыта поднаберешься.

Здравствуйте, neFormal, Вы писали:

E>>Я так понимаю эта проблема появилась у меня после того, как подхватился старый конфиг. Видимо его и надо ковырять.
E>>Меня ещё смущает строчка
E>>
E>>Почему IPv6, а о IPv4 ни слова.

F>так постгрес внутри контейнера запускается на ipv6.
F>ты можешь подключиться к нему и, поставив net-tools, посмотреть через netstat -lpnt
F>короче, кто-то занимает порт. скорее в хостовой системе. может другой такой же контейнер запущен.

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

В postgresql.conf раскомментил и изменили строку listen_addresses = '*' и после этого стала подхватываться старая база в новом контейнере.
В pg_hba.conf пришлось разрешить коннект всем 0.0.0.0/0

И не надо забывать в своих приложения указать правильный хост. Никаких localhost, контейнер postgres имеет хост postgres.

Здравствуйте, 13akaEagle, Вы писали:

E>Решил проблему.
E>Если я создаю новый контейнер и подключаю старые данные, то порт не открывается.

скорей всего в логах написано, почему так.

E>Если я сначала создаю контейнер без ссылки на старую бд, а потом подключаю старую бд без пересбора контейнера, то volume просто не маунтиться и поэтому читается старый конфиг и всё запускается.
E>В postgresql.conf раскомментил и изменили строку listen_addresses = '*' и после этого стала подхватываться старая база в новом контейнере.
E>В pg_hba.conf пришлось разрешить коннект всем 0.0.0.0/0

что-то мутно всё это. у меня такой фигни не было.

E>И не надо забывать в своих приложения указать правильный хост. Никаких localhost, контейнер postgres имеет хост postgres.
E>


Весь код максимально прост:

Я на 100% уверен, что мои порты перенаправлены, брандмауэр Windows выключен. Ничто не блокирует порт 9999. Что еще может пойти не так?

Как указывали другие люди, это, скорее всего, связано с другим процессом, использующим порт . В Windows выполните команду:

И в нем должно быть указано все, что забивает порт. Конечно, тогда вам придется вручную убить эти программы в диспетчере задач. Если это по-прежнему не работает, замените строку:

Конечно, замените своим фактическим IP-адресом или используйте .

Это может быть связано с неправильная конфигурация в вашем . В моем случае это было так: вместо

  • то же самое было и со мной. ipadress был изменен.
  • 2 спасибо, я бы годами пытался понять это, если бы не читал это.
  • 1 для меня проблема заключалась в том, что предыдущий IP-адрес все еще находился в etc / hosts

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

Документация Java для ,

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

Отредактируйте файл hosts и исправьте сопоставление имени хоста и IP-адреса, используя права администратора.

Для меня это было потому, что предыдущее изменение jmeter.properties все еще действовало

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

Запросите выходные данные для используемого порта 9999 в левом столбце.

В моем случае удалить из / etc / hosts

  • 127.0.0.1 локальный
  • 192.168.100.20 localhost

почему сокету не присваивается адрес? Я хочу чтобы к нему не только мой пк подключался, но и пк друга допустим. Как присвоить публичный ip?

В интернете практически нету информации по сетям на языке си .


IP адреса присваиваются не серверам целиком, а их сетевым интерфейсам. How to Change Your IP Address From the Command Line in Linux @avp, Я имею ввиду что понятной для новичка информации крайне мало, вот написал я в Гугле "как присвоить сокету ip адрес" и нигде не было подробной инфы как по тем же массивам, приходится по крупицам собирать инфу и множество мелочей остаются непонятными Нельзя научиться IT задавая подобные запросы в гугле. Нужно найти что-то систематизированное, прочесть и начать экспериментировать (написать несколько десятков программок). Потом уже (когда появится принципиальное понимание темы и практика написания сетевого кода) можно уточнять детали в гугле. / А адрес сокету явно присваивается вызовом bind (неявно -- connect (и accept , но тут вам возвращается новый сокет))

а как это понять? Я просто вбил в поисковик "мой айпи" , скопировал его и вставил в программу

Скорей всего ты не верно понимаешь, как работают/устроены ipv4 сети.

Типовая конфигурация выглядит примерно так:

Сейчас обычно роутер (он же маршрутизатор) представляет «коробочку, которая раздаёт wi-fi», но это может быть и оборудование на стороне провайдера. Так вот, из внешней стороны интренета виден только «Внешний IP», о внутреннем устройстве сети за ним удалённая машина может догадываться только по очень косвенным признакам. Именно этот адрес и показывается в поисковике по запросу «мой айпи»

Привязка (bind) сокета осуществляется только к адресу локального интерфейса. Здесь надо понимать, что не «адрес присваивается сокету», а именно сокет привязывается к уже известному ОС адресу, который назначен одному из сетевых адаптеров. Фактически это нужно, чтобы ограничить, с каких интерфейсов приложение будет обрабатывать соединения/пакеты, чтобы, например, если сервер обслуживает только клиентов на localhost'е, злоумышленник из локальной сети не смог бы к нему подключиться, или на том же порту локальную сеть обслуживал бы другой клиент.

Посмотреть адреса локального интерфейсов можно в выводе ifconfig (или ipconfig в win). Также можно привязать сокет к специальному адресу 0.0.0.0 , чтобы обрабатывать пакеты пришедшие на все локальные интерфейсы данной машины:

но лучше воспользоваться специальной константой:

Кроме того стоит помнить, что bind () управляет только локальной машиной; он ни как не влияет на поведение роутера, поэтому когда сервер привяжется к локальному порту, удалённый «пк друга» не увидит его открытым и не сможет на него подключиться т.к. он увидит только роутер. Но если «друг» придёт в гости и подключится к локальной сети, то он сможет обратиться к твоему серверу напрямую по твоему внутреннему адресу.

Собственно для того, чтобы дать возможность подключаться внешним клиентам можно сделать одно из двух:

Переконфигурировать сеть так, чтобы внешний «белый» IP, выдавался напрямую одному из сетевых интерфейсов компьютера. Не всегда возможно, является редким явлением сегодня, требует переконфигурации сети и сопряжено с рядом других неудобств.

Пробросить порты на роутере, (если роутер находится под твоим контролем, а не где-то у провайдера и ему выдан внешний адрес). Конкретное описание, как это сделать см. в руководстве к своему оборудованию.

Также, чтобы подключиться мог именно «друг», есть другие варианты, в частности VPN или тунелирование, но это уже другая история.

Читайте также: