1. 程式人生 > >來了,來了,你們要的Nginx教程來了

來了,來了,你們要的Nginx教程來了

## 一 Nginx簡介 ### 1.1 什麼是Nginx `Nginx`是一個高效能的`http`和反向代理伺服器,其特點是佔用記憶體小,併發能力強。`Nginx`專為效能優化而開發,效能是其最重要的考量,能經受高負載的考驗,有報告表明能支援高達50000個併發連線數。 ### 1.2 反向代理 正向代理:在瀏覽器中配置代理伺服器,通過代理伺服器進行網際網路訪問。 反向代理:將請求傳送到反向代理伺服器,由反向代理伺服器去選擇目標伺服器獲取資料後,再返回給客戶端,此時反向代理伺服器和目標伺服器對外就是一個伺服器,暴漏的是代理伺服器地址。 ### 1.3 負載均衡 如果請求數過大,單個伺服器解決不了,我們增加伺服器的數量,然後將請求分發到各個伺服器上,將原先請求集中到單個伺服器的情況改為請求分發到多個伺服器上,就是負載均衡。 ### 1.4 動靜分離 為了加快伺服器的解析速度,可以把動態頁面和靜態頁面交給不同的伺服器來解析,加快解析速度,降低原來單個伺服器的壓力。 ## 二 Nginx的安裝 `Nginx`需要幾個依賴包,分別是`pcre`,`openssl`,`zlib`,在安裝`nginx`之前需要先安裝這幾個依賴。 ### 2.1 安裝pcre依賴 1. 使用命令下載`pcre`壓縮包 ```java wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz ``` 2. 解壓壓縮檔案 ```java tar -xvf pcre-8.37.tar.gz ``` 3. 進入解壓後的名錄,執行以下命令 ```java ./configure ``` 4. 使用以下命令進行編譯安裝 ```java make && make install ``` 5. 檢視安裝的`pcre`版本號 ```java pcre-config --version ``` ### 2.2 安裝openssl,zlib等依賴 ```java yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel ``` ### 2.3 安裝nginx 1. `nginx`官網下載`nginx`,官網地址:https://nginx.org/download/; 2. 將壓縮包拖到伺服器上; 3. 使用命令`tar -xvf nginx-1.12.2.tar.gz`解壓壓縮包; 4. 使用命令`./configure`檢查; 5. 使用命令`make && make isntall`編譯安裝; **安裝成功後,在`usr`會多出來一個資料夾,`local/nginx`,在`nginx`的`sbin`資料夾下有啟動指令碼。** ### 2.4 啟動nginx 在`/usr/local/nginx/sbin`資料夾下,使用以下命令啟動 ```java ./nginx ``` 然後瀏覽器訪問伺服器ip,`nginx`預設埠是80,出現以下頁面則證明`nginx`安裝成功; ![](https://i.loli.net/2020/07/11/tDcf3gjbpzr17mC.png) ### 2.5 Nginx常用的命令 使用這些命令時需要進入`/usr/local/nginx/sbin`資料夾 - 檢視`nginx`的版本號 ```java ./nginx -v ``` - 啟動`nginx` ```java ./nginx ``` - 關閉`nginx` ```java ./nginx -s stop ``` - 重新載入`nginx` ```java ./nginx -s reload ``` ### 2.6 Nginx的配置檔案 `nginx`的配置檔案在`/usr/local/nginx/conf`中的`nginx.conf`。我們將`nginx.conf`中註釋的內容刪除一下。 ```xml #user nobody; worker_processes 1; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } } } ``` `nginx`的配置檔案包含三部門。 **1.全域性塊** 從配置檔案開始到`events`塊之間的內容,主要會設定一些`nginx`伺服器整體執行的配置指令。 ```java worker_processes 1; ``` 這個代表`nginx`處理併發的關鍵配置,值越大,處理併發能力越強。但是會受到硬體、軟體等約束。 **2.events塊** `events`塊涉及的指令主要影響`nginx`伺服器與使用者網路的連線。 ```java worker_connections 1024; ``` 這個代表`nginx`支援的最大連線數。 **3.http全域性塊** `nginx`伺服器配置最頻繁的部分。`http`全域性塊包含`http塊`和`server塊`。 ## 三 Nginx配置反向代理 ### 3.1 ngix代理流程 ![](https://i.loli.net/2020/07/11/ec6B53ijzNHEvTS.png) 本地瀏覽器訪問`nginx`伺服器,`nginx`伺服器反向代理`tomcat`伺服器,當我們請求`nginx`的時候直接訪問到`tomcat`。`tomcat`的安裝這裡就不在講了,我將`tomcat`和`nginx`安裝在了同一臺伺服器上。 ### 3.2 配置ip和域名的繫結關係 由於我們的`nginx`沒有域名,為了演示,因此我們在本地`host`檔案中配置`nginx`伺服器ip和域名進行繫結。這個`host`檔案的具體位置在`C:\Windows\System32\drivers\etc`。在host檔案中增加一句配置: ```java 47.104.xxx.xxx www.javatrip.com ``` 前面的ip是伺服器的ip地址,後面的域名是我隨便起的用於繫結這個ip的一個域名。配置好之後,我們使用域名訪問一下tomcat,如果能請求到`omcat`預設頁面,則配置成功。 ![](https://i.loli.net/2020/07/11/Qu38yP69qJK1nzV.png) ### 3.3 在nginx配置請求轉發 ```java server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } } ``` 我們將以上預設的配置檔案做個修改: ```java server { listen 80; server_name 47.104.xxx.xxx; location / { root html; proxy_pass http://127.0.0.1:8080; index index.html index.htm; } } ``` 以上這段配置的意思就是請求是`47.104.xxx.xxx:80`,都會轉發至`47.104.xxx.xxx:8080`。 現在瀏覽器訪問www.javatrip.com,發現直接轉發到了`tomcat`上了,這樣簡單的反向代理就完成了。 ### 3.4 根據請求字尾分發 我們再解壓一個`tomcat`,埠號設定為8081,分別在兩個`tomcat`下`webapps`目錄下面新建`dev`和`prod`目錄,然後在該目錄下寫一個檔案。 將請求`www.javatrip.com:7001/dev`轉發到`tomcat8080`,將請求`www.javatrip.com:7001/prod`轉發到`tomcat8081`。現在我們的`nginx`監聽的埠號是7001。開啟`nginx`的配置檔案,新建一個`server`如下: ```java server { listen 7001; server_name 47.104.xxx.xxx; location ~ /dev/ { proxy_pass http://127.0.0.1:8080; } location ~ /prod/ { proxy_pass http://127.0.0.1:8081; } } ``` 然後試試效果,分別訪問`www.javatrip.com:7001/dev/a.html和www.javatrip.com:7001/prod/a.html,效果如下: ![](https://i.loli.net/2020/07/11/GrfnHSoEATeYDvI.png) ![](https://i.loli.net/2020/07/11/nFtTkuPdiV5jwxa.png) 其中,配置轉發的時候用到了~,其含義內容如下: - = 嚴格匹配。如果這個查詢匹配,那麼將停止搜尋並立即處理此請求。 - ~ 為區分大小寫匹配(可用正則表示式) - !~為區分大小寫不匹配 - ~* 為不區分大小寫匹配(可用正則表示式) - !~*為不區分大小寫不匹配 - ^~ 如果把這個字首用於一個常規字串,那麼告訴`nginx`如果路徑匹配那麼不測試正則表示式。 ## 四 Nginx配置負載均衡 ### 4.1 什麼是負載均衡 **負載均衡(Load Balance),意思是將負載(工作任務,訪問請求)進行平衡、分攤到多個操作單元(伺服器,元件)上進行執行。是解決高效能,單點故障(高可用),擴充套件性(水平伸縮)的終極解決方案。** 現在我們想實現的效果是通過訪問www.javatrip.com:7001/prod/a.html,將請求分別分發到兩個tomcat上面去,首先我們在`tomcat8080`上新建一個`prod`的資料夾,裡面放一個`a.html`的檔案。這樣`tomcat8081`和`tomcat8080`兩個上就都有了一個`prod`的檔案加且裡面有一個`a.html`的檔案。 ### 4.2 配置nginx.conf 首先,在`http塊`中配置兩個`tomcat`的服務列表 ```java upstream myserver{ server 127.0.0.1:8080; server 127.0.0.1:8081; } ``` 其次,在`server塊`中配置規則: ```java server { listen 80; server_name 47.104.xxx.xxx; location / { root html; proxy_pass http://myserver; index index.html index.htm; } } ``` ### 4.3 測試效果 訪問地址:www.javatrip.com:7001/prod/a.html,多重新整理幾次。發現有的請求到`tomcat8080`上,有的請求到`tomcat8081`上。 ![](https://i.loli.net/2020/07/11/vVZLrPt48KiHDf7.png) ![](https://i.loli.net/2020/07/11/LOTDquUk76YhZBC.png) ### 4.4 nginx支援的幾種負載策略 - 輪詢(預設):每個請求按時間順序逐一分配到不同的伺服器,如果伺服器down了,會自動剔除。 ```java upstream myserver{ server 127.0.0.1:8080; server 127.0.0.1:8081; } ``` - weight(權重):預設為1,權重越高,分配的請求越多。 ```java upstream myserver{ server 127.0.0.1:8080 weight=1; server 127.0.0.1:8081 weight=2; } ``` - ip hash:每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後臺伺服器,可以解決`session`的問題。 ```java upstream myserver{ ip_hash; server 127.0.0.1:8080; server 127.0.0.1:8081; } ``` - fair(第三方):按後端響應時間進行分配,響應時間越短分配的請求越多。 ```java upstream myserver{ server 127.0.0.1:8080; server 127.0.0.1:8081; fair; } ``` 由於動靜分離在實際開發中也不常用,就不再寫了。本篇文章做為一個nginx入門,到這裡就基本完