Tomcat7 绑定到端口 80 在 Ubuntu 14.04LTS 中失败

Posted

技术标签:

【中文标题】Tomcat7 绑定到端口 80 在 Ubuntu 14.04LTS 中失败【英文标题】:Tomcat7 bind to port 80 fails in Ubuntu 14.04LTS 【发布时间】:2014-06-09 23:03:24 【问题描述】:

我在新更新的 Ubuntu 系统上安装 tomcat7 时遇到问题。自从更新到 14.04 LTS 后,tomcat 拒绝在端口 80 上启动,出现我无法解决的错误,也找不到任何关于如何修复它的信息:

    Information: Initializing ProtocolHandler ["http-bio-80"]
Apr 24, 2014 4:39:37 PM org.apache.coyote.AbstractProtocol init
Schwerwiegend: Failed to initialize end point associated with ProtocolHandler ["http-bio-80"]
java.net.SocketException: Datei oder Verzeichnis nicht gefunden
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376)
    at java.net.ServerSocket.bind(ServerSocket.java:376)
    at java.net.ServerSocket.<init>(ServerSocket.java:237)
    at java.net.ServerSocket.<init>(ServerSocket.java:181)
    at org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:49)
    at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:397)
    at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:640)
    at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:434)
    at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11JsseProtocol.java:119)
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:978)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:813)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:638)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:663)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:280)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:454)

问题是,我已经完全完成了我在以前的 Ubuntu 中所做的事情(运行 12.04 LTS),简而言之,将 server.xml 编辑为端口 80,并将 /etc/default/tomcat7 中的 authbind 更改为是的,所以基本上你需要在 80 端口上运行 tomcat。

在 12.04LTS 上执行这些步骤可以正常工作,只是在 14.04LTS 上现在会引发此“找不到文件或目录”错误。

此外,当将 12.04LTS(tomcat 在端口 80 上运行良好)升级到 14.04LTS 时,它会突然抛出上述错误,而所有配置都与 12.04LTS 中的配置相同。

希望有人能帮我解决这个问题。

【问题讨论】:

我的 tomcat 启动正常,但是当我打开网站时不起作用 跨站重复serverfault.com/q/112795/246766 【参考方案1】:

以下作品:

apt-get install authbind

首先,在/etc/default/tomcat7文件中设置AUTHBIND=yes

sudo touch /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80
sudo chown tomcat7 /etc/authbind/byport/80

这里有一个参考 URL,但该网站已被黑客入侵(在 Edge 中标记为不安全,Chrome 提示我安装浏览器扩展程序)。

【讨论】:

像魅力一样工作。谢谢你。 只是想补充一点,如果服务器设置为 ipv6 显然 authbind 但不支持它,我最终会遇到与以前相同的错误。所以我必须做的是通过以下方式禁用ipv6:1)在文件/usr/share/tomcat7/bin/setenv.sh中添加export CATALINA_OPTS="$CATALINA_OPTS -Djava.net.preferIPv4Stack=true" 2)在文件/usr/share/tomcat7/bin/startup.sh中将exec "$PRGDIR"/"$EXECUTABLE" start "$@" 行更改为exec authbind --deep "$PRGDIR"/"$EXECUTABLE" start "$@" 【参考方案2】:

server.xml中默认设置8080端口

运行: sudo /sbin/iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

ZH 在 Ubuntu 14.04 中,这会将流量从端口 80 重定向到 8080(tomcat 中的默认值),因此无法在 server.xml 中将默认端口设置为 80。

法国 (Ceci redirige le trafic du port 80 vers 8080 (Par défaut dans tomcat) dans Ubuntu 14.04 il n'est pas possible de mettre le port par défaut à 80 dans server.xml。)

要使其持久化: sudo apt-get install iptables-persistent

ZH 这个包允许你保存之前输入的 iptables 规则。请务必回答是(保存当前设置)。 FR Ce packet permet de sauvegarder les règles iptables entrées precédemment。 Il faut répondre ou aux questions, (sauvegarder les paramètres actuels)。

【讨论】:

如果你想让它在本地主机上工作,你还需要运行“sudo /sbin/iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-端口 8080" 来源:askubuntu.com/questions/444729/… 很好的解决方案。谢谢琼 这就像一个魅力,它很容易实现。非常感谢!【参考方案3】:

使用 authbind 启动 tomcat 服务,这将允许用户启动小于 1024 的端口,我们不需要重定向或 iptables。

apt-get install authbind -y

安装 Authbind 软件

chmod -R 755 /etc/authbind

group 应该是用户组。

chown -Rh root:group /etc/authbind

然后运行以下命令

cd /etc/authbind/byuid

例如,假设用户 ID 为 2000,您可以使用您的用户 ID 号

echo '0.0.0.0/0:1,1023' > 2000

该文件应归用户和组所有。

chown : 2000

chmod 700 2000

在tomcat启动文件$CATALINA_BASE/startup.sh中添加下面一行

export JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"

使用Authbind服务startup.sh启动tomcat

评论下面一行

#$CATALINA_HOME/bin/startup.sh

添加This End作为文件的结尾

AUTHBIND_COMMAND="/usr/bin/authbind --deep /bin/bash -c " 

$AUTHBIND_COMMAND $CATALINA_HOME/bin/startup.sh   

现在您应该能够以少于 1024 个端口的用户身份启动 tomcat 服务了。

【讨论】:

【参考方案4】:

我遇到了同样的问题。最后,我使用了 iptables 端口重定向,而不是 authpriv 机制

1) 在 /etc/default/tomcat7 中,设置 authpriv=no

2) 在 /etc/tomcat7/server.xml 中,使用

 而不是 80

3) ufw 允许 8080/tcp

4) 按照此处的说明进行操作:https://serverfault.com/questions/238563/can-i-use-ufw-to-setup-a-port-forward

如有必要,可以对端口 443 (SSL) 执行相同操作

【讨论】:

以上是关于Tomcat7 绑定到端口 80 在 Ubuntu 14.04LTS 中失败的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu 1404部署tomcat7

ubuntu下Tomcat绑定80端口

IIS7和Tomcat7整合,即IIS7和Tomcat共用80端口

tomcat7配置设置

Ubuntu将tomcat7 端口改为81

lls 在* 80端口已经绑定的情况下,批量加域名到*80端口