「技術架構」使用NGINX部署Spring Boot
- 2019 年 10 月 11 日
- 筆記

介紹
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。
為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部署輕得多。