介紹
Spring / Spring引導應用程序的部署總是與Apache Tomcat相關聯,而且由於框架本身運行在嵌入式Tomcat web服務器之上,所以它似乎是默認的解決方案。我一直認為這是一個問題,因為我對Apache的解決方案不是很熟悉,而且它處理配置和設置的方式對我來說似乎有些過火。我決定拋棄它,支持NGINX,到目前為止,這個解決方案沒有任何缺陷。要在ssl安全的NGINX下部署Spring Boot JAR(或WAR)工件,您必須這樣做。
準備Spring引導應用程序
除了通過適當的servlet參數設置資源/應用程序的上下文路徑外,在應用程序本身中實際上沒有什麼可做的。屬性文件:
服務器:
server:
servlet:
contextPath= /myapplication
上下文路徑定義了我們應用程序的入口點,並且為我們創建的每個應用程序設置不同的路徑是一種總體的好習慣。 指定此參數後,應用程序將在127.0.0.1:8080/myapplication上可用,而不是默認的127.0.0.1:8080/,並且對於NGINX而言,此單路徑更改將非常方便。
更新應用程序配置後,我們可以生成一個準備部署的JAR或WAR文件,並使用FTP或SSH將其上傳到我們的服務器,以便稍後我們可以在遠程計算機上運行它。
準備服務器環境
在我的項目中,我使用了運行Debian 9的虛擬機,並進行了庫存設置和配置。 為了使一切正常運行,我們需要安裝:
- Java,運行應用程序
- UFW,以保護我們的服務器端口
- NGINX,處理Web請求
對於Java,我們可以安裝開源OpenJDK:
- sudo apt update
- sudo apt install java
或Oracle提供的專有Java JDK:
# Required to add PPA's
sudo apt install software-properties-common
# Adding a PPA providing Oracle's JDK
sudo apt-add-repository ppa:webupd8team/java
sudo apt update
# Replace '8' with desired java version
sudo apt install oracle-java8-installer
對於其他軟件,在Debian(可能還有其他基於Debian的系統)上,這些命令應該可以完成以下工作:
sudo apt update
sudo apt install ufw nginx
安裝完所有組件後,我們可以啟用UFW,以阻止除NGINX處理的所有傳入連接之外的所有傳入連接:
sudo systemctl start ufw
sudo systemctl enable ufw
# 'Full' can be replaced with 'HTTP' or 'HTTPS' to allow only selected protocol s
udo ufw allow 'Nginx Full'
現在我們可以啟用並啟動NGINX:
sudo systemctl start nginx
sudo systemctl enable nginx
將Spring Boot應用程序作為後臺服務運行
在NGINX準備提供數據時,我們需要運行我們的應用程序。 我們當然可以通過一個簡單的java -jar myapplication.jar命令來執行此操作,但是此解決方案無法使我們的應用程序保持活動狀態並提供各種啟動功能,因此最好創建一個後臺服務,以使我們的應用程序永遠在其中運行。 的背景。 為此,我們需要創建一個服務文件。 Debian正在運行systemd管理器,因此我們的文件將是/etc/systemd/system/myapplication.service。 對於其他Linux發行版,系統服務路徑可能不同。 我們的文件如下所示:
[Unit]
Description= # Place a descriptive application name here
After=syslog.target
After=network.target[Service]
User= # Define a user account that will own our app
Type=simple
[Service]
ExecStart=/usr/bin/java -jar # Provide /path/to/file/myapplication.jar
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier= # A short identifier for system journal, f. e. 'myapplication'
[Install]
WantedBy=multi-user.target
保存文件後,可以使用默認的systemd服務管理器啟動服務:
# This will start service from file we created earlier
sudo systemctl start myapplication.service
# To see if it's running we can check system journal
journalctl -u myapplication -b
如果一切正常,我們的應用程序現在應在後臺運行,所有日誌應寫入系統日誌。
配置NGINX代理請求
如果我們的應用程序啟動,我們現在可以將NGINX配置為反向代理請求。 我們已經安裝了所有內容,因此現在我們需要創建一個配置文件,這將使我們的NGINX實例服務器請求正確的方式。 為此,我們需要創建一個文件/etc/nginx/sites-available/myserver.com,在其中可以將myserver.com替換為服務器名,應用程序名或其他用於標識配置的文件。 創建的文件應如下所示:
server {
# NGINX will listen on port 80 for both IP V4 and V6
listen 80;
listen [::]:80;
# Here we should specify the name of server
server_name myserver.com;
# Requests to given location will be redirected
location /myapplication {
# NGINX will pass all requests to specified location here
proxy_pass http://localhost:8080/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}
創建我們的配置後,我們可以使用NGINX內置的測試工具,通過調用以下命令來檢查它是否可以正確應用:
sudo nginx -t
如果測試沒有返回任何錯誤,我們可以安全地重新啟動NGINX服務:
sudo systemctl restart nginx
測試反向代理
現在,為了測試我們的設置,我們可以將示例請求發送到http:// <server> / myapplication / <endpoint>。 NGINX將收到請求,然後將/ myapplication / <endpoint>重定向到我們的Spring Boot應用程序,該應用程序在端口8080上本地運行。Spring的上下文路徑設置為/ myapplication,因此我們的應用程序將僅接收/ <endpoint>部分, 調用指定的URL。/<endpoint>/<endpoint>/<endpoint>/<server>
為HTTPS連接啟用SSL
使用NGINX,我們可以將所有HTTP連接重定向到安全HTTP。 如果我們的服務器沒有SSL證書,最簡單的方法是讓我們加密CertBot(https://certbot.eff.org/),該證書可以從apt安裝在Debian上,並自動配置NGINX來提供HTTPS服務 ,並使用一些簡單的命令重定向所有HTTP通信:
sudo apt-get install certbot python-certbot-nginx -t stretch-backports
sudo certbot --nginx certonly
sudo certbot renew --dry-run
如果我們已經有了生成的SSL證書,則無需運行Certbot並獲取一個新的證書。 相反,我們可以更改NGINX配置以使用已經存在的證書。 在線上有很多教程可以指導這一過程。
摘要
在NGINX代理後面運行Spring Boot應用程序是使我們的應用程序運行的一種相當不錯的方法,它解決了Tomcat產生的許多問題。 傳遞啟動參數可以輕鬆得多,可以將日誌寫入系統日誌,可以在單個配置文件中完成SSL設置,並且我們的應用程序可以作為標準系統服務運行。 此設置也比Tomcat部署輕得多。
原文:https://ikurek.pl/deploying-spring-boot-with-nginx/
本文:https://pub.intelligentx.net/deploying-spring-boot-nginx
討論:請加入知識星球或者小紅圈【首席架構師圈】
閱讀更多 首席架構師 的文章