1. 程式人生 > >後臺服務搭建與nginx伺服器

後臺服務搭建與nginx伺服器

這篇部落格主要記錄一下我平時怎麼搭建服務端的,從大二開始接觸到伺服器,經過了一年踩了很多坑,現在摸索到了一些門路,當然肯定我的處理辦法不是最好的,學習ing,歡迎朋友們和我多多交流。

一個埠一個服務

大一的時候我主要使用的是Apache和Tomcat兩種伺服器,當時因為不太瞭解linux作業系統(伺服器最好使用linux),所以是用的Windows Server 2016。記得當時在用PHP做網站時,用的是wampserver這個軟體,而且它只能執行在windows環境下。安裝軟體後執行apache就可以了,如果要修改埠只需要配置相應的配置檔案就可以了。

加入WingStudio之後我轉向了Java,平時用的更多的就是Tomcat了,這個也很簡單,將java程式的war包放進Tomcat的webapp目錄下,然後再在其bin目錄下執行startup.bat就可以了(

linux執行startup.sh),如果要修改訪問埠只需要在conf/server.xml裡面找到相應配置就行了。

一個簡單的web服務最好理解,應該也是初學者最容易接收的。 在這裡插入圖片描述

多個埠多個服務

其實這個就是搭建多個簡單的服務,這裡提一下主要是引出後面nginx和docker的一些優勢。 如果我現在有五個服務需要放在伺服器上,在不使用任何其他工具的情況下,那麼我就需要在伺服器上啟動五個服務,並且為每個服務開啟一個埠。這樣很浪費資源,但是也是我曾經嘗試過的,沒嘗試過怎麼知道其中的利與弊呢?來看看它的一個結構圖: 在這裡插入圖片描述

同一埠多個服務

當我們有很多服務需要掛載在伺服器上,但是我又想通過一個埠去訪問不同服務,並且在一個伺服器(以Tomcat為例)的前提下,就可以將多個服務放在伺服器下,並且做埠對映(如果是8080埠Tomcat自帶,如果是其他埠需要在server.xml中配置,這個配置賊惱火,親測!!),這種方式也是我之前用的最多的。其結構圖如下: 在這裡插入圖片描述

使用這種方式很容易遇到一個問題,也是我曾經遇到過的,就是Tomcat記憶體不足!!!當時看到這個錯誤的時候也很懵逼,嘗試著給Tomcat多分配一點記憶體,雖然這個能解決問題,但是還是會出現一些問題,比如Tomcat伺服器壓力太大,幾個服務同時執行的時候,如果你的服務還很大,Tomcat很可能會GG,為了解決這個問題可以用消耗作業系統資源空間的方法來增強你服務的效能。

使用nginx伺服器

如果你現在有兩個服務需要上線,只有一個備案域名,一臺伺服器主機,個人又有強迫症,不喜歡在訪問時帶上埠訪問,為了減輕Tomcat壓力不能使用上面“同一埠多個服務”的方法,那麼這種情況下,一個Tomcat伺服器就無法滿足需求。我之前在配置伺服器的時候也是這種情況,通過師兄介紹Nginx伺服器可以做反向代理,這就很不錯了呀,於是嘗試著去學了一下。

nginx簡介

先copy一下百度百科對nginx的介紹

Nginx (engine x) 是一個高效能的HTTP和反向代理服務,也是一個IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0釋出於2004年10月4日。

Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,並在一個BSD-like 協議下發行。其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:百度、京東、新浪、網易、騰訊、淘寶等。

如果要做服務運維的童鞋nginx是必學的,但是作為開發者來說可能說不必學得很深入,但是基本原理與應用還是需要掌握的,接下來談談我對nginx的理解。

從我平時應用來講,nginx最大的優點在於負載均衡反向代理靜態檔案分發,接下來說一下我平時如何使用它的,肯定有很多不足之處,望大佬們提點。

nginx反向代理

什麼是反向代理

反向代理(Reverse Proxy)方式是指以代理伺服器來接受Internet上的連線請求,然後將請求轉發給內部網路上的伺服器;並將從伺服器上得到的結果返回給Internet上請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。 通常的代理伺服器,只用於代理內部網路對Internet的連線請求,客戶機必須指定代理伺服器,並將本來要直接傳送到Web伺服器上的http請求傳送到代理伺服器中。當一個代理伺服器能夠代理外部網路上的主機,訪問內部網路時,這種代理服務的方式稱為反向代理服務。 在這裡插入圖片描述

nginx反向代理工作原理

(此部分內容轉自https://www.cnblogs.com/anruy/p/4989161.html)

反向代理伺服器通常有兩種模型,它可以作為內容伺服器的替身,也可以作為內容伺服器叢集的負載均衡器。

一、作內容伺服器的替身

如果您的內容伺服器具有必須保持安全的敏感資訊,如信用卡號資料庫,可在防火牆外部設定一個代理伺服器作為內容伺服器的替身。當外部客戶機嘗試訪問內容伺服器時,會將其送到代理伺服器。實際內容位於內容伺服器上,在防火牆內部受到安全保護。代理伺服器位於防火牆外部,在客戶機看來就像是內容伺服器。

當客戶機向站點提出請求時,請求將轉到代理伺服器。然後,代理伺服器通過防火牆中的特定通路,將客戶機的請求傳送到內容伺服器。內容伺服器再通過該通道將結果回傳給代理伺服器。代理伺服器將檢索到的資訊傳送給客戶機,好像代理伺服器就是實際的內容伺服器(參見圖 2)。如果內容伺服器返回錯誤訊息,代理伺服器會先行擷取該訊息並更改標頭中列出的任何 URL,然後再將訊息傳送給客戶機。如此可防止外部客戶機獲取內部內容伺服器的重定向 URL。

這樣,代理伺服器就在安全資料庫和可能的惡意攻擊之間提供了又一道屏障。與有權訪問整個資料庫的情況相對比,就算是僥倖攻擊成功,作惡者充其量也僅限於訪問單個事務中所涉及的資訊。未經授權的使用者無法訪問到真正的內容伺服器,因為防火牆通路只允許代理伺服器有權進行訪問。

在這裡插入圖片描述 可以配置防火牆路由器,使其只允許特定埠上的特定伺服器(在本例中為其所分配埠上的代理伺服器)有權通過防火牆進行訪問,而不允許其他任何機器進出。

二、作為內容伺服器的負載均衡器

可以在一個組織內使用多個代理伺服器來平衡各 Web 伺服器間的網路負載。在此模型中,可以利用代理伺服器的快取記憶體特性,建立一個用於負載平衡的伺服器池。此時,代理伺服器可以位於防火牆的任意一側。如果 Web 伺服器每天都會接收大量的請求,則可以使用代理伺服器分擔 Web 伺服器的負載並提高網路訪問效率。

對於客戶機發往真正伺服器的請求,代理伺服器起著中間調停者的作用。代理伺服器會將所請求的文件存入快取記憶體。如果有不止一個代理伺服器,DNS 可以採用“迴圈複用法”選擇其 IP 地址,隨機地為請求選擇路由。客戶機每次都使用同一個 URL,但請求所採取的路由每次都可能經過不同的代理伺服器。

可以使用多個代理伺服器來處理對一個高用量內容伺服器的請求,這樣做的好處是內容伺服器可以處理更高的負載,並且比其獨自工作時更有效率。在初始啟動期間,代理伺服器首次從內容伺服器檢索文件,此後,對內容伺服器的請求數會大大下降。 在這裡插入圖片描述

nginx配置

如果有多個服務的話,不建議直接在nginx.conf這個配置檔案下配置你的服務,最好在nginx根目錄下的conf.d檔案中新增你的配置檔案,當然這裡需要吧conf.d檔案下的所有配置檔案引入到nginx.conf中去。在nginx.conf中http配置中加入這句話

    include /etc/nginx/conf.d/*.conf;

比如我有兩個服務分別是VR360和blog,那麼我只需要在conf.d中建立兩個檔案VR360.confblog.conf就可以了,各自服務的配置分別放在各自的配置檔案裡就可以了,方便管理,而且還不容易出錯。下面引入剛剛那位大佬部落格中的配置模板

server {
	    listen   80;
	    root /root/nmapp2_venv;
	    index index.py index.html;
	  
	    server_name server;
	  
	    location / {
	        #if (!-e $request_filename) {
	        #    rewrite ^/(.*)$ /index.py/$1 last;
	        #}
            # 這裡配置轉發到哪個服務
            proxy_pass  http://localhost:8080/;
	  
	        #Proxy Settings
	        proxy_redirect     off;
	        proxy_set_header   Host             $host;
	        proxy_set_header   X-Real-IP        $remote_addr;
	        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
	        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
	        proxy_max_temp_file_size 0;
	        proxy_connect_timeout      90;
	        proxy_send_timeout         90;
	        proxy_read_timeout         90;
	        proxy_buffer_size          4k;
	        proxy_buffers              4 32k;
	        proxy_busy_buffers_size    64k;
	        proxy_temp_file_write_size 64k;
	    }
	  
	    location ~ /index\.py {
	        proxy_pass_header Server;
	        proxy_set_header Host $http_host;
	        proxy_set_header X-Real-IP $remote_addr;
	        proxy_set_header X-Scheme $scheme;
	        proxy_pass http://tornado;
	    }

nginx負載均衡

網站的訪問量越來越大,伺服器的服務模式也得進行相應的升級,比如分離出資料庫伺服器、分離出圖片作為單獨服務,這些是簡單的資料的負載均衡,將壓力分散到不同的機器上。有時候來自web前端的壓力,也能讓人十分頭痛。怎樣將同一個域名的訪問分散到兩臺或更多的機器上呢?這其實就是另一種負載均衡了,nginx自身就可以做到,只需要做個簡單的配置就行。

nginx不單可以作為強大的web伺服器,也可以作為一個反向代理伺服器,而且nginx還可以按照排程規則實現動態、靜態頁面的分離,可以按照輪詢、ip雜湊、URL雜湊、權重等多種方式對後端伺服器做負載均衡,同時還支援後端伺服器的健康檢查。 Nginx負載均衡一些基礎知識:

nginx 的 upstream目前支援 4 種方式的分配

  1. 輪詢(預設)   每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
  2. weight   指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。
  3. ip_hash   每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
  4. fair(第三方)   按後端伺服器的響應時間來分配請求,響應時間短的優先分配。 在這裡插入圖片描述 當然做負載均衡一般都是在服務比較大、訪問請求多的情況下會用到。我也只有一臺伺服器,暫時需求量沒那麼大,所以暫時會用不到,做個筆記相信以後會用到的
upstream  vr.beifengtz.com
{
    server   主機IP1:埠;
    server   主機IP2:埠;
}
 
upstream  blog.beifengtz.com   
{
    server   主機IP1:埠;
    server   主機IP2:埠;
}
 
server
{
    listen  80;
    server_name  vr.beifengtz.com;
 
    location / {
        proxy_pass        https://vr.beifengtz.com;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}
 
server
{
    listen  80;
    server_name  blog.beifengtz.com;
 
    location / {
        proxy_pass        http://blog.beifengtz.com;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

nginx檔案分發

MVC與MVVC

一般做網站目前有兩種主要模型:MVC、MVVC,兩者目前使用的都非常多,VR360是MVVC模型,本站部落格系統是直接用的tale的,他是使用的MVC模型。我平時更喜歡使用MVVC模型,當然各有各的好處吧,先解釋一下MVC和MVVC模型有什麼區別:

MVC模型是Model、View、Control三個單詞的首字母,很明顯它將整個系統分成了三個模組,做過開發的人都清楚這個我就不細說了,我們重點關注V和MC之間吧,MVC模型是將View層的資料渲染直接放在服務端,渲染好了之後直接將靜態檔案傳送給客戶端進行顯示。而MVVC模型則有所不同,它又稱雙MVC模型,相當於客戶端、服務端均是一個MVC模型,View層更多的是在客戶端進行渲染。歸根結底一句話:MVC相對更安全,但是會增加伺服器壓力;MVVC沒有MVC安全,但是把資料渲染的工作交給每個客戶端,為伺服器減輕了很大的壓力。

在這裡插入圖片描述

nginx解決跨域問題

上面介紹MVC和MVVC區別的時候就有一點,MVC模型下的系統伺服器壓力會比較大,這是因為靜態檔案和服務處理都是放在同一個伺服器下的,那麼如果不想單獨開一個Tomcat伺服器,這時候就可以用nginx來分發靜態檔案了,直接將靜態檔案放在nginx伺服器下,Tomcat的任務就只有服務處理了,它的壓力會減輕一點。

平時在做網站開發的時候(特別是前後臺分離開發)都會遇到一個頭疼的問題:請求跨域被拒絕!

首先什麼是跨域?

指的是瀏覽器不能執行其他網站的指令碼。它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制。域名、埠不一樣都屬於跨域,XMLHttpRequest請求屬於跨域(也就是AJAX)。

那麼如何解決跨域問題呢?一般有三種方法:

  1. 服務端在配置過濾器的時候配置允許所有域訪問,不推薦,因為不安全。
  2. 前後臺數據用JSONP格式傳輸,它是將資料包裝在JS指令碼中,讓瀏覽器以為此資料是js檔案,瀏覽器就會放行。
  3. 使用nginx代理,靜態檔案放在nginx中,服務端與nginx放在同一個伺服器主機裡,這時請求的域和服務端的域是在同一主機下並且用nginx做過反向代理,就相當於是同一個域。

伺服器這一塊我是一直採坑過來的,搞不好自己現在還在某個坑裡,還有很多的內容需要學習,如果上述的內容有什麼不對的地方歡迎向我指出,同時歡迎和我一起學習交流。ヾ(◍°∇°◍)ノ゙