在一個Linux上跑一個服務,需要指定一個監聽端口(系統調用listen),當client請求服務時,系統爲該請求建立 tcp連接,該連接的port值是一個隨機數字。該數字的取值範圍配置在
/proc/sys/net/ipv4/ip_local_port_range 文件中,我的機器上的內容如下:
32768 61000
啓動我們自己的服務時,分配端口號需要注意儘量不要在這個區間內。
否則容易報類似下面的錯:
E0513 10:29:17.856476840 14733 server_chttp2.cc:40] {"created":"@1589336957.856392895","description":"No address added out of total 1 resolved","file":"src/core/ext/transport/chttp2/server/chttp2_server.cc","file_line":395,"referenced_errors":[{"created":"@1589336957.856389192","description":"Failed to add any wildcard listeners","file":"src/core/lib/iomgr/tcp_server_posix.cc","file_line":342,"referenced_errors":[{"created":"@1589336957.856378048","description":"Unable to configure socket","fd":10,"file":"src/core/lib/iomgr/tcp_server_utils_posix_common.cc","file_line":216,"referenced_errors":[{"created":"@1589336957.856373682","description":"Address already in use","errno":98,"file":"src/core/lib/iomgr/tcp_server_utils_posix_common.cc","file_line":189,"os_error":"Address already in use","syscall":"bind"}]},{"created":"@1589336957.856388669","description":"Unable to configure socket","fd":10,"file":"src/core/lib/iomgr/tcp_server_utils_posix_common.cc","file_line":216,"referenced_errors":[{"created":"@1589336957.856386083","description":"Address already in use","errno":98,"file":"src/core/lib/iomgr/tcp_server_utils_posix_common.cc","file_line":189,"os_error":"Address already in use","syscall":"bind"}]}]}]}
假定你啓動了一個服務,監聽的端口爲50056,它正好落在了32768~61000區間。在A機器上能正常啓動,並運行良好。但在B機器上仍然有可能會無法啓動,並報上面的錯。甚至你在B機器上使用lsof -i :50056這個命令去查看是否有被佔用情況,也會發現沒啥進程佔用,也看不出什麼問題。
保險的做法,就是監聽端口直接避開這個區間。