一种自动为应用分配端口号的方法(及系统)

最后更新日期:2019-07-26

  越来越多的应用要在同一台机器上运行,不知道怎么分配端口号怎么办?

  同时开发几个项目,大家默认端口都是 8080(或 3000 ,如果是 nodejs 应用),一启动就端口冲突,有没有什么方法来全局统一分配端口号?

  一个简单粗暴的办法:对应用名进行 hash 。这里直接使用 md5sum 和一些 Linux shell 技巧(16 进制转 10 进制):

#!/bin/sh
[ $# -ne 1 ] && echo "Usage: $0 name" && exit 1

p=$(printf "%d" "0x$(printf "%s" "$1" | md5sum | head -c 4)")
# 端口号范围为 1024 ~ 49151 ,48121 为小于 49151 - 1024 的第一个质数
# https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
port=$((p % 48121 + 1024))
echo "$port"

  测试用例:若项目名为 example ,计算出的端口号为 7801 ;若项目名为 1 ,计算出的端口号为 3281 。

  用中文描述一下:

  1. 计算应用名的 md5 ,取其 16 进制结果的前 4 位
  2. 上述结果作为 16 进制数转换为 10 进制(这一步的结果的范围是 0 ~ 65535)
  3. 上一步结果模 48121 取余再加 1024

  为什么最后要加 1024 :因为在一般的 Linux 系统上,小于 1024 的端口号为系统保留,监听需要 root 权限。一般应用应分配大于等于 1024 的端口号。

  为什么要用 48121:根据英文 wiki ,大于 49151 的端口号为动态端口,一般不推荐应用使用。因此端口号的合理范围为 1024 ~ 49151 ,48121 为小于 49151 - 1024 的第一个质数,hash 函数在取余的时候一般用质数,这样使得 hash 的结果更均匀。