Vapor 更改地址和端口的多种方式
in 技术 with 0 comment

Vapor 更改地址和端口的多种方式

in 技术 with 0 comment

场景

通过 vapor xcode 生成项目文件后。通过 Xcode 运行默认地址是:

Server starting on http://localhost:8080

但是你的 8080 端口可能被其它服务占用,也可能你需要同时运行多个 Vapor 应用。下面是你将会得到的错误信息:

Thread 1: Fatal error: Error raised at top level: bind(descriptor:ptr:bytes:) failed: Address already in use (errno: 48)

解决办法

下面两种方法选其一即可

配置 Scheme

在 Xcode 里面,进入 Edit Scheme...
Sn_2018-08-01_15-53-30.png

选择 Arguments 选项卡。在 Arguments Passed On Launch 块添加如下行:

--hostname 127.0.0.1  --port 8069

根据实际情况,填写你的 hostnameport 参数值。

代码设置参数

Sources -> Run -> main.swift 文件中,修改代码如下:

var arguments = CommandLine.arguments
arguments.append(contentsOf: ["--hostname","127.0.0.1","--port","8069"])
try app(.detect(arguments: arguments)).run()

2018.08.08更新
其实不太建议修改 Run -> main.swift 文件。因为 RunimportApp 模块,而上面代码其实是修改 Vapor 模块的 Environment 结构体。

所以更新代码为 App -> app.swift

var arguments = CommandLine.arguments
arguments.append(contentsOf: ["--hostname","127.0.0.1","--port","8066"])
let commandInput = CommandInput(arguments: arguments)
env.commandInput = commandInput

2018.08.21更新
其实,again,在阅读更多源码后,了解到了更多的细节。建议修改 NIOServerConfig。原因是修改 Service 更符合 Vapor 项目架构,NIOServerConfig 包含所有 Server 启动需要的默认值,并且可以以参数的形式传递值,更加安全方便。而 env.commandInput 是基于 CommandLine.arguments 的,如果在命令行里面运行服务的时候加入了 --hostname --port 参数,则会与 env.commandInput 冲突并报错:

Fatal error: Error raised at top level: ⚠️ CommandError: Too many arguments or unsupported options were supplied: ["--hostname", "127.0.0.1", "--port", "8099"]

CommandLine.arguments 并不会与 NIOServerConfig 冲突,只会优先使用前者:

//NIOServer.swift, func start
let hostname = hostname ?? config.hostname
let port = port ?? config.port

所以建议在 configure.swift 中添加如下代码:

var nioServerConfig = NIOServerConfig.default()
nioServerConfig.hostname = "127.0.0.1"
nioServerConfig.port = 8067
services.register(nioServerConfig)

总结

上面两种办法,其实都是通过 vapor 的命令参数来设置的:

.build/debug/Run --hostname 127.0.0.1 --port 8069

第一种方式无需改动代码,在部署 Vapor 到服务器的时候更加灵活。
第二种方式虽然利用代码设置的参数,但是相信在以后涉及到更多复杂的应用场景的时候,也会有其可用的地方。

后台运行

部署

在部署到 Linux 服务器后,可以使用下面的方式进行后台运行,防止终端退出会造成服务停止:

nohup .build/debug/Run --hostname 127.0.0.1 --port 8069 &

如果在 main.swift 已经配置了 hostnameport

nohup vapor run serve &

如果直接使用 vapor run 指定 hostnameport 参数会报错!不知为何。知道的麻烦给我留言。

Use `.build/debug/Run <command> [--help,-h]` for more information on a command.
Fatal error: Error raised at top level: ⚠️ CommandError: Unknown command `127.0.0.1`
- id: CommandError.unknownCommand
: file /home/buildnode/jenkins/workspace/oss-swift-4.1-package-linux-ubuntu-16_04/swift/stdlib/public/core/ErrorType.swift, line 191

运行

查看运行的 vapor 进程:

ps -aux | grep Run

Sn_ps_aux_grep.png

  • a:显示所有程序;
  • u:以用户为主的格式来显示;
  • x:显示所有程序,不以终端机来区分

截图中的第一条结果可以忽略,它表示当前正在执行的命令。第二条结果的 27097 则为需要的 <PID>

停止

停止运行:

kill -9 <PID>

结语

话不多说了。

目前 Vapor 的资料还是比较少的。希望你读到这篇文章对你有所帮助,在 Vapor 的路上找到乐趣😁。

后续会把最近在写的 Vapor 项目整理成文章,从代码的角度来解析我的一些用法。

Responses