![](/img/trans.png)
[英]How can i change spring boot backend port to 80 using docker compose?
[英]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)端口的端口
您可以使用默認允許在端口 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 + O 、 ENTER 、 Ctrl + 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 選項
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.