我无法在端口80上启动应用程序。
我在我的本地计算机上尝试过(使用我的IDE和本地服务器),没有运气。
我已检查过其他类似的帖子,并确保我在root服务器上运行jar。
这是错误:
till here all ok
...
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 org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:338)
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:760)
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:472)
at org.apache.catalina.connector.Connector.startInternal(Connector.java:986)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:237)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.addPreviouslyRemovedConnectors(TomcatEmbeddedServletContainer.java:186)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.start(TomcatEmbeddedServletContainer.java:149)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.startEmbeddedServletContainer(EmbeddedWebApplicationContext.java:288)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:141)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:483)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.andirod.StartApplication.main(StartApplication.java:20)
...
...
...
Exception in thread "main" java.lang.IllegalStateException: Tomcat connector in failed state
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.start(TomcatEmbeddedServletContainer.java:157)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.startEmbeddedServletContainer(EmbeddedWebApplicationContext.java:288)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:141)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:483)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.andirod.StartApplication.main(StartApplication.java:20)
答案 0 :(得分:43)
在linux下,1024以下的端口只能由root打开,因此默认情况下端口80是受限制的
如果您想在80端口上发布应用程序,则需要将请求从端口80重定向到您将运行springapp的端口(例如8080)端口
您可以使用默认允许的Apache2服务器在端口80上工作,并可以将请求转发给Tomcat
Debian的配置示例
sudo apt-get install apache2
a2enmod proxy
a2enmod proxy_http
cd /etc/apache2/sites-enabled
sudo nano 000-default.conf
编辑文件:
<VIRTUALHOST *:80>
ProxyPreserveHost On
# ...
ProxyPass / http://localhost:8080/
</VIRTUALHOST>
保存文件: Ctrl + O , ENTER , Ctrl + X
注意:要了解有关虚拟主机配置的更多信息,可以单击here查看有关该主题的详细Apache手册。
重新启动Apache2以应用更改:
sudo service apache2 restart
或
sudo systemctl restart apache2
使用iptables进行重定向
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
如果您需要使用localhost也添加此
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080
答案 1 :(得分:4)
刚遇到这个问题。我在Ubuntu AWS实例上运行Spring Boot应用程序。
java -jar app.jar --server.port=80
会像你描述的那样给我一个错误。解决方案,因为1024以下的端口只能由root打开,添加&#34; sudo&#34;。 sudo java -jar app.jar --server.port=80
。
出于安全考虑,这种部署方式仅建议用于本地测试。有关详细信息,请参阅注释。
答案 2 :(得分:1)
以下是我在centos上遵循的步骤。
第1步(可选):设置端口
默认情况下,Spring Boot应用程序在端口8080上运行,如果要更改此设置,可以在src / main / resources / application.properties文件中进行更改
server.port = 8082 // any port above than 1024
第2步:如果尚未安装apache,请安装
在Centos 7上
sudo yum install httpd
步骤3:编辑您的虚拟主机
/etc/httpd/conf.d/vhost.conf
您的配置应如下所示
<VirtualHost *:80>
ServerName yourdomin.com
#DocumentRoot /var/www/html
ProxyPreserveHost On
ProxyPass / http://localhost:8082/
ProxyPassReverse / http://localhost:8082/
</VirtualHost>
然后重新启动apache
sudo service httpd restart
答案 3 :(得分:0)
在使用 macOs 的情况下,现在可以在端口80上运行,而无需在 macOs Mojave版本10.14 上进行任何更改。
答案 4 :(得分:0)
如果您正在使用docker运行spring boot。
Dockerfile:
FROM adoptopenjdk/openjdk13 AS server
ADD /target/AppServer-1.0.jar AppServer-1.0.jar
ENTRYPOINT ["java", "-jar" , "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:9000", "-Dcom.sun.management.jmxremote", "-Dcom.sun.management.jmxremote.authenticate=false", "-Dcom.sun.management.jmxremote.ssl=false", "-Dcom.sun.management.jmxremote.local.only=false", "-Dcom.sun.management.jmxremote.port=1099", "-Dcom.sun.management.jmxremote.rmi.port=1099", "-Djava.rmi.server.hostname=127.0.0.1", "-Dlog4j.configurationFile=log4j2-docker.xml", "AppServer-1.0.jar", "--server.port=80"]
(*)向右滚动直到结尾,然后在jar名称后面看到--server.port=80
。
构建图像并运行:
docker run -it -p 8080:80 --cap-drop all --cap-add net_bind_service <image-name>:<tag>
(!)请注意,我删除了此进程/容器的所有功能,仅添加了相关的功能-net_bind_service
,该功能将套接字绑定到特权端口(端口号小于1024)。
答案 5 :(得分:-1)