应用程序(接受不同类型的请求,如 http 和 smtp)如何部署在服务器的不同端口上?

How are applications (which accepts different types of requests like http and smtp) deployed on different ports on servers?

我是所有这些 http 和 tcp/ip 方面的初学者。所以这些问题中可能有很多东西可能没有意义或完全不正确。

首先我会添加我想到的所有问题,因为我无法将它们放在标题上。

我从事用于 Web 开发的 django(python 框架)。

我对服务器的工作方式感到困惑。以及目标端口是如何通过 url?

决定的

MAIN Q : 目前我了解到的是,通过 DNS 我们可以获取网站的 IP 地址。和端口(目标和源)由 TCP 决定。并通过 TCP headers 发送。但是它如何决定它应该去服务器中的哪个端口(即目标端口)。

我对上述问题的回答: 在花了很多时间之后,我开始知道,http 请求默认为 80,https 默认为 443,其他类型的请求也类似请求也默认为某个端口。所以我们可以根据这个算出ip地址。

但这又在我脑海中提出了另一个问题。

另一个问题: 我还构建了一个简单的 django 网站并将其部署在 python 任何地方。但我将它部署为一个完整的应用程序。假设我的 Django 应用程序接受不同类型的请求,如 HTTP、HTTPS、SMTP 等。那么如何确定这些特定任务的端口?因为所有这些请求都将在单个应用程序下进行,所以它们应该 运行 在同一个端口上。我认为服务器不会更改应用程序本身的任何内容。那么现在目的港将如何决定呢?

注意: 我不确定是否可以在 django 中制作一个接受不同类型请求的应用程序。但这应该是可能的,因为我们可以创建不同的应用程序 - 在不同的 url.

上使用 startapp 和 运行

我在哪里看过,说http的默认端口是80,那也就是说应该也可以改吧?

最重要的问题并总结所有疑问 假设我有一个接受不同请求的项目。我想将它部署在服务器上,那么 http 请求和 smtp 请求将如何分离?我是否必须手动制作不同的应用程序,然后部署在不同的端口或其他东西上?如果不是,并且所有 运行s 都在同一个端口上,那么这个端口是如何在浏览器中决定的?假设我的域名是xyz.com那么服务器上具体的端口怎么访问呢?

目的港基本上是如何决定的?

如您所见,协议通常有一个默认分配的端口(http 为 80,https 为 443,smtp 为 25,...)。 互联网上使用的主要协议都有它们的端口 assigned by the IANA.

一些应用程序也默认使用端口(例如,数据库服务PostreSQL 默认配置为使用端口5432)。 https://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-sg-en-4/ch-ports.html

大多数时候您可以省略端口,因为您使用的应用程序知道默认值并为您使用。当您要求网络浏览器向 http://example.com, behind the scene the request is sent to http://example.com:80.

发送请求时

您可以将您的应用程序配置为侦听与默认端口不同的端口。人们可能出于不同目的(非详尽列表)这样做:

  • 出于安全考虑(更改服务使用的端口以使攻击者更难知道此服务的存在 - 不使用端口 22 进行 ssh)
  • 因为某些端口范围需要某些权限。您的操作系统需要一个 root/admin 帐户才能使用低于 1024 的端口(这就是为什么开发工具默认使用一些特殊端口的原因 - 对于 Web 服务器使用 8080 或 8000 -,预计使用非管理员帐户)。大多数 ISP 会阻止其 Internet 盒子上的端口 25 以防止垃圾邮件。等等
  • 因为冲突(端口已被占用)

以这种方式更改端口可能需要大量配置(您必须配置服务及其所有客户端)。

现在,问题的另一部分:同一个端口如何被不同的服务使用?

如果你想在同一个端口上公开不同的服务,你可以使用类似反向代理的东西。它是一个侦听端口并根据规则重定向流量的应用程序,有时它们提供修改内容的可能性(仅举几例:Traefik,Caddy。一般 Web 服务器也具有反向代理功能:Nginx,Apache 和mod_proxy, ...).

例如,假设您有 2 个 Web 应用程序并且您希望它们可以在端口 80 上访问。您可以将这些应用程序配置为使用不同的端口(比如 8080 和 8081),让反向代理监听端口80 并根据使用的 url 重定向请求(它可以将 app1.example.com:80 重定向到 localhost:8080 并将 app2.example.com:80 重定向到 localhost:8081)。只有端口 80 必须可以从外部访问。