1. 程式人生 > 實用技巧 >Nginx 學習

Nginx 學習

Nginx

一、Nginx介紹

1.1引言

為什麼要學習Nginx

問題1:客戶端到底要將請求傳送給哪臺伺服器。

問題2:如果所有客戶端的請求都發送給了伺服器1.

問題3:客戶端傳送的請求可能是申請動態資源的,也有申請靜態資源的

伺服器搭建集群后

伺服器搭建集群后,使用Nginx做反向代理伺服器。可以解決上訴三個問題

1.2Nginx介紹

Nginx是由俄羅斯人研發,應對Rambler網站,並且2004年釋出的第一個版本

Nginx的特點:

  1. 穩定性極強。7*24小時不間斷執行。
  2. Nginx提供了非常豐富的配置例項。
  3. 佔用記憶體小,併發能力強

二、Nginx安裝

2.1 安裝Nginx

http://hub.daocloud.io/ 映象市場

version: '3.1'
services:
 nginx:
  restart: always
  image: daocloud.io/library/nginx:latest
  container_name: nginx
  ports:
  	- 80:80

首先建立yml檔案:

將上面的地址複製進去

執行

docker-compose up -d

訪問ip:80就可以看到nginx的首頁

2.2 Nginx配置檔案

首先先進去nginx去檢視配置檔案

發現下面有個nginx.conf 檔案,該檔案就是Nginx的核心配置檔案

worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

# 以上統稱為全域性塊;
# worker_processes它的數值越大,Nginx的併發能力就越強
# error_log 代表Nginx的錯誤日誌存放的位置
# pid Nginx執行的一個標識,用處不大
events {
    worker_connections  1024;
}

# events塊
# worker_connections 它的數值越大,Nginx的併發能力越強
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

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

# http塊
# 第一個include 代表引入一個外部的檔案-> /mime.types中放著大量的媒體型別
# include /etc/nginx/conf.d/*.conf; ->引入了conf.d目錄下的以.conf為結尾的配置檔案

conf.d/default.conf;配置檔案

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
	# location塊
	# root: 將接收到的請求根據/usr/share/nginx/html去從查詢靜態資源
	# index:預設去上述的路徑中找到index.html或者index.htm
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
# server塊
# listen: 代表Nginx監聽的埠號
# localhost: 代表Nginx接收請求的ip

}

2.3修改Nginx配置

在docker-compose的配置檔案下新增volumes

version: '3.1'
services:
 nginx:
  restart: always
  image: daocloud.io/library/nginx:latest
  container_name: nginx
  ports:
  	- 80:80
  volumes:
	- /opt/docker_nginx/conf.d/:/etc/nginx/conf.d

新增之後,訪問localhost後訪問不了

但是在原來的資料夾下面新增了conf.d資料夾,這時候我們進去裡面新增配置檔案就可以了

server{
  listen 80;
  server_name localhost;
  location / {
     root /usr/share/nginx/html;
     index index.html index.htm;
  }
}  

然後重啟就可以訪問了

三、Nginx反向代理

關於代理

  1. 說到代理,首先我們要明確一個概念,所謂代理就是一個代表、一個渠道;此時就涉及到兩個角色,一個是被代理角色,一個是目標角色。
  2. 被代理角色通過這個代理訪問目標角色完成一些任務的過程稱為代理操作過程;如同生活中的專賣店,客人到 adidas 專賣店買了一雙鞋,這個專賣店就是代理,被代理角色就是 adidas 廠家,目標角色就是使用者。
  3. 簡而言之,就是adidas老闆找來專賣店這個代理來賣鞋子給客人這個目標角色。

3.1 正向代理:傳說中的“翻牆”

正向代理也是大家最常接觸到的代理模式,從軟體方面和生活方面來解釋一下什麼叫正向代理。

在如今的網路環境下,我們如果由於技術需要要去訪問國外的某些網站,此時你會發現位於國外的某網站我們通過瀏覽器是沒有辦法訪問的。

此時大家可能都會用一個操作 FQ (翻牆)進行訪問,FQ 的方式主要是找到一個可以訪問國外網站的代理伺服器,我們將請求傳送給代理伺服器,代理伺服器去訪問國外的網站,然後將訪問到的資料傳遞給我們

上述這樣的代理模式稱為正向代理,正向代理最大的特點是客戶端非常明確要訪問的伺服器地址伺服器只清楚請求來自哪個代理伺服器,而不清楚來自哪個具體的客戶端;正向代理模式遮蔽或者隱藏了真實客戶端資訊。

來看個示意圖(我把客戶端和正向代理框在一塊,同屬於一個環境,後面我有介紹):

客戶端必須設定正向代理伺服器,當然前提是要知道正向代理伺服器的 IP 地址,還有代理程式的埠。
總結來說:正向代理,“它代理的是客戶端”,是一個位於客戶端和原始伺服器(Origin Server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器)。

然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設定才能使用正向代理。

正向代理的用途:

  1. 訪問原來無法訪問的資源,如 Google。
  2. 可以做快取,加速訪問資源。
  3. 對客戶端訪問授權,上網進行認證。
  4. 代理可以記錄使用者訪問記錄(上網行為管理),對外隱藏使用者資訊。

3.2 反向代理

明白了什麼是正向代理,我們繼續看關於反向代理的處理方式,舉例如我國的某寶網站,每天同時連線到網站的訪問人數已經爆表,單個伺服器遠遠不能滿足人民日益增長的購買慾望了。

此時就出現了一個大家耳熟能詳的名詞:分散式部署;也就是通過部署多臺伺服器來解決訪問人數限制的問題。

某寶網站中大部分功能也是直接使用 Nginx 進行反向代理實現的,並且通過封裝 Nginx 和其他的元件之後起了個高大上的名字:Tengine。

那麼反向代理具體是通過什麼樣的方式實現的分散式的叢集操作呢,我們先看一個示意圖(我把伺服器和反向代理框在一塊,同屬於一個環境,後面我有介紹):

通過上述的圖解大家就可以看清楚了,多個客戶端給伺服器傳送的請求,Nginx 伺服器接收到之後,按照一定的規則分發給了後端的業務處理伺服器進行處理了。

此時請求的來源也就是客戶端是明確的,但是請求具體由哪臺伺服器處理的並不明確了,Nginx 扮演的就是一個反向代理角色。

客戶端是無感知代理的存在的,反向代理對外都是透明的,訪問者並不知道自己訪問的是一個代理。因為客戶端不需要任何配置就可以訪問。

反向代理,“它代理的是服務端”,主要用於伺服器叢集分散式部署的情況下,反向代理隱藏了伺服器的資訊。

反向代理的作用:

保證內網的安全,通常將反向代理作為公網訪問地址,Web 伺服器是內網。
負載均衡,通過反向代理伺服器來優化網站的負載。

3.3 基於Nginx實現反向代理

準備一個目標伺服器

啟動了之前的tomcat伺服器

編寫nginx的配置檔案,通過Nginx訪問到tomcat

在conf.d的資料夾下,修改default.conf檔案
將之前localtion的都註釋掉,重新編寫一個如下:
server{

  listen 80;
  server_name localhost;
  location / {
     proxy_pass http://47.94.229.122:8080/;
  }
  #location / {
   #root /usr/share/nginx/html;
   # index index.html index.htm;
  #}

}

3.4 關於Nginx的location 路徑對映

優先順序關係

(location=)> (location /xxx/yyy/zzz)> (location ^~) > (location ,*) > (location /起始路徑)>

(location /)

# 1. 匹配
location = /{
 # 精準匹配,主機名後面不能帶任何的字串
}
# 2. 通用匹配
location /xxx{
 # 匹配所有以/xxx開頭的路徑
}
# 3. 正則匹配
location ~ /xxx{
 # 匹配所有以/xxx開頭的路徑
}
# 4. 匹配開頭路徑
location ^~ /images/ {
   # 匹配所有以/images開頭的路徑	 
}
# 5. ~*\.(gif|jpg|png)${
  # 匹配以gif或者jpg或者png為結尾的路徑
}

四、Nginx負載均衡

Nginx為我們預設提供了三種負載均衡的策略:

  1. 輪詢:

將客戶端發起的請求,平均的分配給每一臺伺服器。

  1. 權重

會將客戶端的請求,根據伺服器的權重值不同,分配不同的數量。

  1. ip_hash:

基於發起請求的客戶端的ip地址不同,他始終會將請求傳送到指定的伺服器上。

4.1 輪詢

想實現Nginx輪詢負載均衡機制只需要在配置檔案中新增以下內容

upstream 名字 {
  server ip:prot;
  server ip:prot;
  ...
}
server {
  listen 80;
  server_name localhost;
  
  localtion /{
    proxy_pass http://upstream的名字/;
  }
}

4.2 權重

想實現Nginx權重負載均衡機制只需要在輪詢的配置檔案中額外增加weight值

upstream 名字 {
  server ip:prot weight=10; weight值越高,權重越大 
  server ip:prot weight=2;
  ...
}
server {
  listen 80;
  server_name localhost;
  
  localtion /{
    proxy_pass http://upstream的名字/;
  }
}

4.3 ip_hash

ip_hash 實現,只需要新增ip_hash就可以,使用者第一次訪問的頁面,後面就始終是該頁面

upstream 名字 {
  ip_hash;
  server ip:prot;
  server ip:prot;
  ...
}
server {
  listen 80;
  server_name localhost;
  
  localtion /{
    proxy_pass http://upstream的名字/;
  }
}

五、 Nginx動靜分離

Nginx的併發能力公示:

worker_processes * worker_connections / 4 | 2 =Nginx的最終併發能力

動態資源需要/4 ,靜態資源 需要/2;

Nginx通過動靜分離,來提升Nginx的併發能力,更快的給使用者響應

動態資源 /4

靜態資源 /2

5.1 動態資源代理

# 配置如下
location / {
    proxy_pass 路徑;
}

5.2 靜態資源代理

# 配置如下
location / {
    root 靜態資源路徑;
    index 預設訪問路徑下的什麼資源;
    autoindex on; # 代表展示靜態資源全的全部內容,以列表的形式展開;
}

# 先修改docker,新增一個數據卷,對映到Nginx服務的一個目錄
      - /opt/docker_nginx/img/:/data/img
      - /opt/docker_nginx/html/:/data/html
# 新增index.html和1.jpg 靜態資源

# 修改conf下的配置檔案
server{

  listen 80;
  server_name localhost;
   #代理到html靜態資源 
  location /html {
    root /data;
    index index.html; 
 }
    # 代理到img靜態資源
  location /img {
    root /data;
    autoindex on;  
}

訪問靜態資源: