为啥在 undertow 服务器中将端口设置为 80 失败? (爪哇)

Posted

技术标签:

【中文标题】为啥在 undertow 服务器中将端口设置为 80 失败? (爪哇)【英文标题】:why set port to 80 failed in undertow server? (java)为什么在 undertow 服务器中将端口设置为 80 失败? (爪哇) 【发布时间】:2017-07-29 15:11:54 【问题描述】:

当我“mvn exec:java”java程序时,设置端口为80有问题,但8080可以成功。

 Undertow server = Undertow.builder()
                    .addHttpListener(80, "localhost")
                    .setHandler(path)
                    .build();
            server.start();

当我将它设置为 80 时,我遇到了类似的异常

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: java.net.SocketException: Permission denied
        at io.undertow.Undertow.start(Undertow.java:141)
        at cc.cmu.edu.Q1.Q1Controller.main(Q1Controller.java:46)
        ... 6 more
Caused by: java.net.SocketException: Permission denied
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:433)
        at sun.nio.ch.Net.bind(Net.java:425)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:67)
        at org.xnio.nio.NioXnioWorker.createTcpConnectionServer(NioXnioWorker.java:175)
        at org.xnio.XnioWorker.createStreamConnectionServer(XnioWorker.java:242)
        at io.undertow.Undertow.start(Undertow.java:120)
        ... 7 more

【问题讨论】:

错误是Permission denied,这是有道理的:端口 80 是一个特权端口 (***.com/questions/10182798/…),所以你不能连接到它(除非你有管理员权限)。 谢谢!有什么方法可以得到正确的吗? 你使用什么操作系统? 尝试在mvn exec:java之前使用sudo 确实有帮助!!!非常感谢!!! 【参考方案1】:

您需要 root 权限才能监听 1024 以下的所有端口。 以 root 身份或使用sudo 命令启动您的应用程序。

【讨论】:

以下解决方案可能更适合生产环境:***.com/questions/33703965/… 这真的取决于你的要求。您链接的答案建议使用 apache2,在某些情况下处理起来可能很麻烦。我认为直接在端口 80 上公开服务非常好。

以上是关于为啥在 undertow 服务器中将端口设置为 80 失败? (爪哇)的主要内容,如果未能解决你的问题,请参考以下文章

Undertow技术:为啥很多Spring Boot开发者放弃了Tomcat

在 Undertow 中将 HTTP 重定向到 HTTPS

为嵌入的 Undertow 设置默认编码

开微服务项目tomcat更换成undertow

为啥我们在 jsonArrayRequest 中将 jsonRequest 参数设置为 null?

为啥在 SwiftUI Lifecycle 中将 rootViewController 设置为 UIHostingController 时会出错?