Как приложения (которые принимают различные типы запросов, например http и smtp) размещаются на разных портах серверов?
Я новичок во всех этих http и tcp/ip вещах. Поэтому, возможно, многие вещи в этих вопросах могут быть бессмысленными или совершенно неправильными.
Сначала я добавлю все вопросы, которые у меня были на уме, так как я не смог поместить их в заголовок.
Я работаю на django (python framework) для веб-разработки.
Я запутался в том, как работают серверы. И как порт назначения определяется через url?
MAIN Q : То, что я узнал до сих пор, это то, что через DNS мы получаем ip-адрес веб-сайта. А порт (как назначения, так и источника) определяется TCP. И отправляются через заголовки TCP. Но как он решает, на какой порт сервера он должен идти (т.е. порт назначения).
МОЙ ОТВЕТ НА ВОПРОС : Проведя много времени, я понял, что http запросы по умолчанию 80, а https по умолчанию 443 и аналогично другие типы запросов также по умолчанию определенный порт. Поэтому мы можем определить ip-адрес, основываясь на этом.
Но это поднимает другой вопрос в моем сознании.
Еще один вопрос : Я также создал простой сайт на django и развернул его на pythonanywhere. Но я развернул его как целое приложение. Предположим, что мое django-приложение принимает различные типы запросов, такие как HTTP, HTTPS, SMTP и т.д. Тогда как будет определяться порт для этих конкретных задач? Ведь все эти запросы будут поступать от одного приложения, поэтому они должны работать на одном порту. Я не думаю, что сервер будет что-то менять в самом приложении. Так как теперь будет определяться порт назначения?
NOTE : Я не уверен, можно ли сделать приложение в django, которое принимает различные типы запросов. Но это должно быть возможно, потому что мы можем создавать разные приложения - с помощью startapp и запускать на разных url.
Где-то я читал, что порт по умолчанию для http равен 80, тогда это означает, что его можно изменить?
САМЫЕ ВАЖНЫЕ ВОПРОСЫ И ОБОБЩЕНИЕ ВСЕХ СОМНЕНИЙ Предположим, у меня есть проект, который принимает различные запросы. И я хочу развернуть его на сервере, тогда как будут разделены http запросы и smtp запросы? Должен ли я вручную создавать разные приложения и затем развертывать их на разных портах или что-то еще? Если нет, и все работает на одном порту, то как этот порт определяется в браузере? Предположим, мое доменное имя xyz.com, тогда как будет осуществляться доступ к определенному порту на сервере?
В принципе, как определяется порт назначения?
Как вы уже видели, протоколы обычно имеют назначенный по умолчанию порт (80 для http, 443 для https, 25 для smtp, ...). Основные протоколы, используемые в Интернете, имеют свой порт назначенный IANA.
Некоторые приложения также используют порт по умолчанию (например, служба баз данных PostreSQL по умолчанию настроена на использование порта 5432). https://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-sg-en-4/ch-ports.html
В большинстве случаев порт можно не указывать, поскольку используемые вами приложения знают порт по умолчанию и используют его для вас. Когда вы просите свой веб-браузер отправить запрос на http://example.com, за сценой запрос отправляется на http://example.com:80.
Вы можете настроить свои приложения на прослушивание порта, отличного от порта по умолчанию. Люди могут захотеть сделать это для различных целей (неполный список):
- для безопасности (изменение порта, используемого службой, чтобы злоумышленникам было сложнее узнать о наличии этой службы - не использовать порт 22 для ssh)
- потому что некоторые диапазоны портов требуют определенных привилегий. Ваша операционная система требует учетной записи root/admin для использования портов ниже 1024 (поэтому средства разработки используют некоторые экзотические порты по умолчанию - например, 8080 или 8000 для веб-сервера - ожидается использование неадминской учетной записи). Большинство провайдеров блокируют порт 25 на своих интернет-устройствах для предотвращения спама. И т.д.
- из-за конфликтов (порт уже занят)
Изменение портов таким образом может быть тяжелым для конфигурации (необходимо настроить службу и всех ее клиентов).
Теперь другая часть вопроса: как один и тот же порт может использоваться разными службами?
Если вы хотите открыть разные сервисы на одном порту, вы можете использовать что-то вроде обратного прокси. Это приложение, которое прослушивает порт и перенаправляет трафик на основе правил, а иногда они предлагают возможность изменять содержимое (вот несколько примеров: Traefik, Caddy. Веб-серверы общего назначения также имеют возможность обратного проксирования: Nginx, Apache с mod_proxy, ...).
Например, представьте, что у вас есть 2 веб-приложения, и вы хотите, чтобы они были доступны через порт 80. Вы можете настроить эти приложения на использование разных портов (допустим, 8080 и 8081), заставить обратный прокси слушать порт 80 и перенаправлять запросы на основе используемого url (он может перенаправлять app1.example.com:80
на localhost:8080
и app2.example.com:80
на localhost:8081
). Только порт 80 должен быть доступен извне.