1. 程式人生 > >使用 Nginx 部署前後端分離專案,解決跨域問題

使用 Nginx 部署前後端分離專案,解決跨域問題

前後端分離這個問題其實鬆哥和大家聊過很多了,上週鬆哥把自己的兩個開源專案部署在伺服器上以幫助大家可以快速線上預覽(喜大普奔,兩個開源的 Spring Boot + Vue 前後端分離專案可以線上體驗了),然後群裡就有小夥伴想讓鬆哥來聊聊如何結合 Nginx 來部署前後端分離專案?今天我們就來聊一聊這個話題。

不得不說的跨域

很多人對前後端分離部署感到困惑,其實主要是困惑跨域問題怎麼解決。因為前後端分離專案在開發的時候,前端通過 nodejs 來執行,需要一個單獨的埠,後端通過 Tomcat 或者 Jetty 來執行,也需要埠,兩個不同的埠,就造成了跨域。

但是鬆哥之前多次和大家聊過這個問題,這種跨域並不是我們傳統開發中真正的跨域,這個所謂的跨域只在開發環境中存在,生產環境下就不存在這個跨域問題了。所以我們不能按照以往的通過 JSONP 或者 CORS 之類的手段來解決這個跨域問題。

前後端分離開發中,前端為了能夠模擬出測試資料,並且模擬出請求,一般需要藉助於 nodejs 來執行,這是開發時候的狀態,開發時候的配置大家可以參考這篇文章:

  • 前後端分離歷險記

等開發完成後,我們會對前端專案編譯打包,編譯打包完成之後,就只剩下一堆 js、css 以及 html 檔案了,我們把這些編譯打包後的檔案拷貝到後端專案中,這樣再去執行就不存在跨域問題了(例如將編譯打包後的靜態檔案拷貝到 Spring Boot 專案的 src/main/resources/static 目錄下)。這種方式我就不再多說了,相信大家都會,今天咱們主要來看看如何結合 Nginx 來部署。

Nginx 大殺器

結合 Nginx 來部署前後端分離專案算是目前的主流方案。一來部署方便,二來通過動靜分離也可以有效提高專案的執行效率。

大家知道我們專案中的資源包含動態資源和靜態資源兩種,其中:

  • 動態資源就是那些需要經過容器處理的資源,例如 jsp、freemarker、各種介面等。
  • 靜態資源則是那些不需要經過容器處理,收到客戶端請求就可以直接返回的資源,像 js、css、html 以及各種格式的圖片,都屬於靜態資源。

將動靜資源分開部署,可以有效提高靜態資源的載入速度以及整個系統的執行效率。

在前後端分離專案部署中,我們用 Nginx 來做一個反向代理伺服器,它既可以代理動態請求,也可以直接提供靜態資源訪問。我們來一起看下。建議大家先閱讀鬆哥以前關於 Nginx 的一篇舊文,可以有效幫助大家理解後面的配置:

  • Nginx 極簡入門教程!

後端部署

後端介面的部署,主要看專案的形式,如果就是普通的 SSM 專案,那就提前準備好 Tomcat ,在 Tomcat 中部署專案,如果是 Spring Boot 專案,可以通過命令直接啟動 jar,如果是微服務專案,存在多個 jar 的話,可以結合 Docker 來部署(參考一鍵部署 Spring Boot 到遠端 Docker 容器),無論是那種形式,對於我們 Java 工程師來說,這都不是問題,我相信這一步大家都能搞定。

後端專案可以在一個非 80 埠上部署,部署成功之後,因為這個後端專案只是提供介面,所以我們並不會直接去訪問他。而是通過 Nginx 請求轉發來訪問這個後端介面。

鬆哥這裡以我去年為一個律所的小程式為例,後端是一個 Spring Boot 工程,那麼我可以通過 Docker 部署,也可以直接通過命令來啟動,這裡簡單點,直接通過命令來啟動 jar ,如下:

nohup java -jar jinlu.jar > vhr.log &

後端啟動成功之後,我並不急著直接去訪問後端,而是安裝並且去配置一個 Nginx,通過 Nginx 來轉發請求,Nginx 的基本介紹與安裝,大家可以參考(Nginx 極簡入門教程!),我這裡就直接來說相關的配置了。

這裡我們在 nginx.conf 中做出如下配置:

首先配置上游伺服器:

upstream zqq.com{
  server 127.0.0.1:9999 weight=2;
}

在這裡主要是配置服務端的地址,如果服務端是叢集化部署,那麼這裡就會有多個服務端地址,然後可以通過權重或者 ip hash 等方式進行請求分發。

然後我們在 server 中配置轉發規則:

location /jinlu/ {
  proxy_pass http://zqq.com;
  tcp_nodelay     on;
  proxy_set_header Host            $host;
  proxy_set_header X-Real-IP       $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

這樣配置完成後,假設我目前的域名是 javaboy.org,那麼使用者通過 http://www.javaboy.org/jinlu/** 格式的地址就可以訪問到我服務端的介面。

前端部署

以 Vue 為例,如果是 SPA 應用,專案打包之後,就是一個 index.html 還有幾個 js、css、images 以及 fonts ,這些都是靜態檔案,我們將靜態檔案首先上傳到伺服器,然後在 nginx.conf 中配置靜態資源訪問,具體配置如下:

location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff|html|txt|pdf|) {
   root /usr/local/nginx/html/;#所有靜態檔案直接讀取硬碟
   expires 30d; #快取30天
} ​​​​

當然我這裡是按照資源型別來攔截的,即字尾為 js、css、ico 等的檔案,統統都不進行請求分發,直接從本地的 /usr/local/nginx/html/ 目錄下讀取並返回到前端(我們需要將靜態資原始檔上傳到 /usr/local/nginx/html/ 目錄下)。

如果我們的伺服器上部署了多個專案,這種寫法就不太合適,因為多個專案的前端靜態檔案肯定要分門別類,各自放好的,這個時候我們一樣可以通過路徑來攔截,配置如下:

location /jinlu-admin/ {
   root /usr/local/nginx/html/jinlu-admin/;#所有靜態檔案直接讀取硬碟
   expires 30d; #快取30天
} ​​​​

這樣,請求路徑是 /jinlu-admin/ 格式的請求,則不會進行請求分發,而是直接從本機的 /usr/local/nginx/html/jinlu-admin/ 目錄下返回相關資源。採用這方方式配置靜態資源,我們就可以部署多個專案了,多個專案的部署方式和上面的一樣。

這樣部署完成之後,假設我的域名是 javaboy.org ,那麼使用者通過 http://www.javaboy.org/jinlu-admin/**
格式的請求就可以訪問到前端資源了。

此時大家發現,前端的靜態資源和後端的介面現在處於同一個域之中了,這樣就不存在跨域問題,所以我一開始基說不必用 JSONP 或者 CORS 去解決跨域。特殊情況可能需要在 nginx 中配置跨域,這個鬆哥以後再和大家細聊~​

好了,不知道小夥伴有沒有看懂呢?有問題歡迎留言討論。

關注公眾號【江南一點雨】,專注於 Spring Boot+微服務以及前後端分離等全棧技術,定期視訊教程分享,關注後回覆 Java ,領取鬆哥為你精心準備的 Java 乾貨!

相關推薦

使用 Nginx 部署前後分離專案解決問題

前後端分離這個問題其實鬆哥和大家聊過很多了,上週鬆哥把自己的兩個開源專案部署在伺服器上以幫助大家可以快速線上預覽(喜大普奔,兩個開源的 Spring Boot + Vue 前後端分離專案可以線上體驗了),然後群裡就有小夥伴想讓鬆哥來聊聊如何結合 Nginx 來部署前後端分離專案?今天我們就來聊一聊這個話題。

vue前後分離專案解決問題

最近公司新開發專案是前後端分離專案,前端用的是vue框架,在和前端除錯介面時存在拒絕跨域訪問403的情況。我這裡主要將解決的過程記錄一下。 什麼是跨域 跨域是瀏覽器的同源策略造成的,只要是域名、埠、協議有一不同,就會被當做是不同的域,之間的請求就被當做跨域操作。 設定同

利用Nginx解決前後分離專案中的問題

1. 前端專案利用Nginx配置站點 server { listen 8092 default_server; listen [::]:8092 default_server; root /home/chenpeng/xiahuaida/data/vue; index index.ht

前後分離專案使用session作為使用者狀態記錄

在使用前後端分離的專案中,我們一般選擇無狀態的請求方式,即web token;或者搭建快取伺服器,來準們儲存使用者的登入狀態。一般不會使用servlet的session來儲存使用者狀態,因為這種方式不太安全,而且前後端分離的專案中每次訪問的時候,所攜帶的sessionId也是不相同的,所以是

Maven多模組Dubbo分散式服務框架SpringMVC前後分離專案基礎搭建搭建過程出現的問題

1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apac

部署前後分離專案

路飛前後端專案部署 前言 使用軟體 vue 部署前段 uwsgi uWSGI是一個全功能的HTTP伺服器,實現了WSGI協議、uwsgi協議、http協議等。它要做的就是把HTTP協議轉化成語言支援的網路協議。比如把

七個開源的 Spring Boot 前後分離專案一定要收藏!

前後端分離已經在慢慢走進各公司的技術棧,根據鬆哥瞭解到的訊息,不少公司都已經切換到這個技術棧上面了。即使貴司目前沒有切換到這個技術棧上面,鬆哥也非常建議大家學習一下前後端分離開發,以免在公司幹了兩三年,SSH 框架用的滾瓜爛熟,出來卻發現自己依然沒有任何優勢! 其實前後端分離本身並不難,後段提供介面,前端做資

解決前後分離後的Cookie問題

-o equals eth success ati $.ajax 設置 ons post 一. 前端Ajax關鍵配置 $.ajax({ type: "post", url: xxx, data: xxx, contentType: ‘applicat

徹底解決前端開發在前後分離過程中的問題

現在的web工程越來也大,傳統的開發模式已經顯得捉襟見肘了,不僅開發人員在開發過程中很痛苦,後期維護的人員也更痛苦。怎麼解決呢?前後端分離。在前後端開發過程中一直會伴隨我們的問題就是跨域問題,因為這時候前端和後端的程式碼是在不同機器上執行的,兩個地址不在一個域名

Yii2.0 前後分離 前端ajax呼叫的問題

Yii2.0有自己的一套防止跨域呼叫的機制,網上一搜一大把的解決方式,無非就是: use yii\filters\Cors; public function behaviors() { return ArrayHelper::merge([ [

spring-boot gradle vue 前後分離專案在騰訊雲上部署到 tomcat nginx

前言 因為種種原因,把後端部署在 tomcat 上,前端專案部署在 nginx 上。 Tomcat tomcat 的執行沒什麼說的,將專案打包為 war,放在 webapps 下,啟動 tomcat 會自動解壓 war 包。 spring-boot

前後分離專案配置Nginx、配https及http強制跳轉https

本篇文章主要解決以下幾個問題: 前後端分離專案如何配置Nginx 配置https協議訪問 開啟http訪問但強制跳轉https訪問 基本的安裝就不多說了,直奔主題。 本文基於ubuntu系統,另外假定有幾個前提條件: 主機地址為192.168

Docker 對前後分離專案部署和運維(詳述)

1.首先要有虛擬機器(vmware 這是一個虛擬機器安裝軟體,然後下載cenos作業系統,centos是linux社群辦的一個流行的作業系統,還有Redhat 商業版的,安全還提供一些額外的服務,但是要收費,還有對虛擬機器的硬體和軟體進行配置,在VMware這個圖形化的工具裡面就可以進行配置)或者是

前後分離解決問題及django的csrf站請求保護 ajax headers JavaScript ajax 請求 +設定headers 實踐

1. 前後端分離解決跨域問題 解決跨域呼叫服務並設定headers 主要的解決方法需要通過伺服器端設定響應頭、正確響應options請求,正確設定 JavaScript端需要設定的headers資訊 方能實現; 關於跨域,前端會先發送OPTIONS請求,進行預檢,檢查後端是否允許前端設定的相應的請求頭,請

Php如何返回json資料前後分離的基本解決方案

php返回json,xml,JSONP等格式的資料 返回json資料: header('Content-Type:application/json; charset=utf-8'); $arr = array('a'=>1,'b'=>2); exit(json_enco

docker 對前後分離專案部署和運維

1.首先要有虛擬機器(vmware 這是一個虛擬機器安裝軟體,然後下載cenos作業系統,centos是linux社群辦的一個流行的作業系統,還有Redhat 商業版的,安全還提供一些額外的服務,但是要收費,還有對虛擬機器的硬體和軟體進行配置,在VMware這個圖形化的工具裡

vue+springboot2.0前後分離專案傳輸cookie獲取cookie返回cookie

上程式碼: 前端vue: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-w

前後分離專案解決問題(後方式解決

新建CorsFilter類實現Filter介面,程式碼如下: package com.rl.config; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servle

前後分離專案問題分析及解決思路

什麼是跨域 瀏覽器的同源策略限制預設情況下前端頁面和後端服務在不同伺服器(域名、埠不一樣)時,前端頁面js無法請求到後端介面服務,即存在跨域問題。 跨域問題解決思路 使用jsonp方式解決 使用cors解決 使用nginx代理解決 這裡不討論jsonp的方式,主要討

Django2.x前後分離開發解決辦法

安裝django-cors-headers pip3 install django-cors-headers # 安裝django-cors-headers 在專案目錄裡面的settings.py新增下面的程式碼 INSTALLED_APPS = [ ... 'corsh