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 中失败的主要内容,如果未能解决你的问题,请参考以下文章