簡體   English   中英

如何在端口 80 上運行 Spring Boot 應用程序

[英]How can I run a Spring Boot application on port 80

我無法在端口 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)

linux上1024以下的端口只能root打開,所以默認限制80端口

如果您想在 80 端口上發布您的應用程序,您需要將請求從端口 80 重定向到您要運行 springapp(例如 8080)端口的端口

方案一:HTTP代理服務器

您可以使用默認允許在端口 80 上工作的 Apache2 服務器,並且可以將您的請求轉發到 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 + OENTERCtrl + X

注意:要了解有關虛擬主機配置的更多信息,您可以單擊此處查看有關該主題的詳細 Apache 手冊。

重新啟動 Apache2 以應用更改:

sudo service apache2 restart

或者

sudo systemctl restart apache2

方案二:端口轉發

使用 iptables 進行重定向

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

如果你需要使用 localhost 也添加這個

iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

在 Linux 上使用sudo

我在 Ubuntu 上運行 Spring Boot 應用程序, java -jar app.jar --server.port=80給了我同樣的錯誤。 由於 1024 以下的端口只能由 root 訪問打開,所以使用“sudo”: sudo java -jar app.jar --server.port=80

出於安全考慮,這種部署方式僅建議用於本地測試。 詳情見評論。

這是我在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

在使用macOs的情況下,現在可以在端口 80 上運行而無需在macOs Mojave 版本 10.14上進行任何更改。

如果您使用 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)。

-Djava.net.preferIPv4Stack=true添加到 VM 選項

JavaMail API 到 iMail -- java.net.SocketException: 權限被拒絕:連接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM