一張小圖看盡 Nginx

0x01:nginx 安裝

Nginx 安裝完成,沒有 sbin 目錄

cd 進入到 nginx-1.18.0 目錄內執行

[root@centos7 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx
[root@centos7 nginx-1.18.0]# make
[root@centos7 nginx-1.18.0]# make install

ps:–prefix=path 定義一個目錄,存放服務器上的文件 ,也就是 nginx 的安裝目錄,默認使用 /usr/local/nginx

這步你會看到 local 目錄下有一個跟你安裝的 nginx1.12.2 同級的 nginx 目錄,裏面就有 sbin 目錄了。

0x02:基礎指令

listen

  該指令用於配置網絡監聽。

1  listen *:80 | *:8080 #監聽所有 80 端口和 8080 端口

2  listen  IP_address:port   #監聽指定的地址和端口號

3  listen  IP_address     #監聽指定 ip 地址所有端口

4  listen port     #監聽該端口的所有 IP 連接

server_name

  該指令用於虛擬主機的配置。

a. 基於名稱的虛擬主機配置

server_name   name ...;

b. 基於 IP 地址的虛擬主機配置

server_name 192.168.1.1

location

  該指令用於匹配 URL。

 location 指令的作用是根據用戶請求的 URI 來執行不同的應用,也就是根據用戶請求的網站 URL 進行匹配,匹配成功即進行相關的操作。

location 的語法

= 開頭表示精確匹配

如 A 中只匹配根目錄結尾的請求,後面不能帶任何字符串。

^~ 開頭表示 uri 以某個常規字符串開頭,不是正則匹配

~ 開頭表示區分大小寫的正則匹配;

~* 開頭表示不區分大小寫的正則匹配

/ 通用匹配, 如果沒有其它匹配, 任何請求都會匹配到

Location 正則案例

#精確匹配,/後面不能帶任何字符
server {
        listen       80;
        server_name  www.itmayiedu.com;
        #精確匹配,註解後面不能帶任何字符
        location ={
            proxy_pass http://127.0.0.1:8080;
            index  index.html index.htm;
        }
}

 #匹配所有以/開頭請求
server {
        listen       80;
        server_name  www.itmayiedu.com;
       #匹配所有以/開頭請求 
        location / {
            proxy_pass http://127.0.0.1:8080;
            index  index.html index.htm;
        }
    }
###  以開頭/itmayiedu_8080攔截  默認開啓不區分大小寫
    server {
        listen       80;
        server_name  www.itmayiedu.com;
        ###  以開頭/itmayiedu_8080 最終跳轉到http://127.0.0.1:8080/;
        location /itmayiedu_8080/ {
            proxy_pass http://127.0.0.1:8080/;
            index  index.html index.htm;
        }
        ###  以開頭/itmayiedu_8080 最終跳轉到http://127.0.0.1:8081/;
        location /itmayiedu_8081/ {
            proxy_pass http://127.0.0.1:8081/;
            index  index.html index.htm;
        }
    }
### 開頭區分大小寫

proxy_pass

  該指令用於設置被代理服務器的地址。可以是主機名稱、IP 地址加端口號的形式。

  語法結構如下:

proxy_pass URL;

index

  該指令用於設置網站的默認首頁。

域名重定向

server
{
    listen 80 ;
    server_name mxiaoqi.top aaa.com;
    if ( $host = mxiaoqi.top )
    #增加判斷條件,當訪問域名是mxiaoqi.top的時候
    {
        rewrite /(.*)  http://aaa.com/$1 permanent;
        #把mxiaoqi.top/後面的內容重新寫到aaa.com/後面如果後面有多段則使用$2、$3以此類推
        #permanent是轉發狀態碼
    }
    index index.html index.htm index.php;
    root /data/wwwroot/mxiaoqi.top;
    }

反向代理

使用 nginx 反向代理 www.123.com 直接跳轉到 127.0.0.1:8080

server {
         listen       80;
         server_name  www.123.com;

         location / {
             proxy_pass http://127.0.0.1:8080;
                          # 歡迎頁面,按照從左到右的順序查找頁面
             index  index.html index.htm index.jsp;
         }
     }

監聽 80 端口,訪問域名爲 www.123.com,不加端口號時默認爲 80 端口,故訪問該域名時會跳轉到 127.0.0.1:8080 路徑上。

限流配置

漏桶算法與令牌桶算法區別

主要區別在於 “漏桶算法” 能夠強行限制數據的傳輸速率,

而 “令牌桶算法” 在能夠限制數據的平均傳輸速率外,還允許某種程度的突發傳輸。在 “令牌桶算法” 中,只要令牌桶中存在令牌,那麼就允許突發地傳輸數據直到達到用戶配置的門限,因此它適合於具有突發特性的流量。

Nginx 按請求速率限速模塊使用的是漏桶算法,即能夠強行保證請求的實時處理速度不會超過設置的閾值。

limit_req_zone 參數配置

Syntax:    limit_req zone=name [burst=number] [nodelay];
Default:    —
Context:    http, server, location

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

limit_req zone=one burst=5 nodelay;

ngx_http_limit_conn_module 參數配置

這個模塊用來限制單個 IP 的請求數。並非所有的連接都被計數。只有在服務器處理了請求並且已經讀取了整個請求頭時,連接才被計數。

Syntax:    limit_conn zone number;
Default:    —
Context:    http, server, location

limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
    location /download/ {
        limit_conn addr 1;
    }

一次只允許每個 IP 地址一個連接。

負載均衡

#user  nobody;
worker_processes  1;
error_log  logs/error.log;# 開啓日誌
pid        logs/nginx.pid;
...
    upstream lyf {
    server 192.168.37.220:8001; # 3個tomcat服務
    server 192.168.37.220:8002;
    server 192.168.37.220:8003;
    }
    server {
        listen       80;
        server_name  192.168.37.220;# 監聽ip
        location / {
            proxy_pass   http://lyf;  # 設置代理
            index  index.html index.htm;
        }
}

keepalive 長連接提高吞吐量

keepalived :設置長連接處理的數量

proxy_http_version :設置長連接 http 版本爲 1.1

proxy_set_header :清除 connection header 信息

upstream tomcats { 
# server 192.168.1.173:8080 max_fails=2 fail_timeout=1s; 
server 192.168.1.190:8080; 
# server 192.168.1.174:8080 weight=1; 
# server 192.168.1.175:8080 weight=1; 
keepalive 32; 
}
server {
listen 80; 
server_name www.tomcats.com; 
location / { 
proxy_pass http://tomcats; 
proxy_http_version 1.1; 
proxy_set_header Connection ""; 
} 
}

工作方式

  1. 輪詢方式是 Nginx 負載默認的方式

  2. 權重方式 指定每個服務的權重比例,weight 和訪問比率成正比

upstream  dalaoyang-server {
       server    localhost:10001 weight=1;
       server    localhost:10002 weight=2;
}
  1. iphash

每個請求都根據訪問 ip 的 hash 結果分配,經過這樣的處理,每個訪客固定訪問一個後端服務,如下配置(ip_hash 可以和 weight 配合使用)。

upstream  dalaoyang-server {
       ip_hash; 
       server    localhost:10001 weight=1;
       server    localhost:10002 weight=2;
}
  1. 最少連接

將請求分配到連接數最少的服務上。

upstream  dalaoyang-server {
       least_conn;
       server    localhost:10001 weight=1;
       server    localhost:10002 weight=2;
}

5.fair

按後端服務器的響應時間來分配請求,響應時間短的優先分配。

upstream  dalaoyang-server {
       server    localhost:10001 weight=1;
       server    localhost:10002 weight=2;
       fair;  
}

Consul+upsync+Nginx  實現無需 raload 動態負載均衡

https://www.cnblogs.com/a1304908180/p/10697278.html

傳統的負載均衡,如果 Upstream 參數發生變化,每次都需要重新加載 nginx.conf 文件,

因此擴展性不是很高,所以我們可以採用動態負載均衡,實現 Upstream 可配置化、動態化,無需人工重新加載 nginx.conf。

LVS+Keepalived+Nginx+Tomcat 搭建高可用雙機主從熱備集羣

https://blog.csdn.net/dsen726/article/details/89519013

需要明確的是:

1.Nginx 兩臺是主備關係,只有一臺在工作。後面的 tomcat 是集羣,同時工作的。

2.keepalived 是同時安裝在兩臺 Nginx 上的,不過文件配置不一樣

  1. 這裏的雙機熱備是指 LVS,Nginx 則是集羣

keepalived

健康檢查和失敗切換是 keepalived 的兩大核心功能。所謂的健康檢查,就是採用 tcp 三次握手,icmp 請求,http 請求,udp echo 請求等方式對負載均衡器後面的實際的服務器 (通常是承載真實業務的服務器) 進行保活;而失敗切換主要是應用於配置了主備模式的負載均衡器,利用 VRRP 維持主備負載均衡器的心跳,當主負載均衡器出現問題時,由備負載均衡器承載對應的業務,從而在最大限度上減少流量損失,並提供服務的穩定性。

LVSLinux Virtual Server 的簡寫,意即 Linux 虛擬服務器,是一個虛擬的服務器集羣系統。lvs 目前是集成在 Linux 內的。

爲什麼要 LVS+Nginx?

一、ngix(應用層 網絡七層負載均衡)

1、異步轉發,請求數據和相應數據都要經過 ngix,ngix 和客戶端建立連接

2、輪詢所有的 tomcat 服務器,保證請求成功或者最後一臺 tomcat 服務器也請求失敗

二、lvs(網絡層  網絡四層負載均衡)

1、同步轉發接受請求數據,lvs 轉發到服務器,服務器直接和客戶端建立連接

nginx 要承受所有的流量,當一臺 nigx 承受不了,就需要搭建 ngix 集羣。ngix+ngix 外層的 ngix 還是要承受所有流量。

lvs+ngix:lvs 同步轉發不會接受相應數據,LVS 採用 DR 模式時不用響應服務器返回的內容。(通常請求數據是比較小的,響應數據會比較大)

靜態資源配置

  location ~ .*\.(jpg|gif|png){
        gzip on;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types text/plain application/javascript image/jpeg image/gif image/png;
        root   /usr/share/nginx/images;
    }

    location ~ .*\.(txt|xml){
        gzip on;
        gzip_http_version 1.1;
        gzip_comp_level 1;
        gzip_types text/plain application/javascript image/jpeg image/gif image/png;
        root   /usr/share/nginx/code;
    }
  location ~ ^/download {
        gzip_static on;
        tcp_nopush on;
        root /opt/app/code;
    }

  sendfile on | off,文件讀取配置

默認 sendfile 是關閉的,可以配置在 http,server,location,if in location 中

   tcp_nopush on | off, 多個包整合

默認是關閉狀態,可以在 http,server,location 中配置,它的作用是在 sendfile 開啓的情況下,提高網絡包的傳輸效率。什麼意思呢,假設服務端收到請求,需要推送 10 個包,爲了提高傳輸效率,這 10 個包不會一個一個返回給客戶端,而是將 10 個包攢夠了後一起返回回去。

   tcp_nodelay on | off, 網絡包的實時性傳輸

默認開啓,可以在 http,server,location 中配置,它的作用是在 keepalive 鏈接下,提高網絡包的傳輸實時性。

  gzip on | off,壓縮

默認是關閉狀態,可以在 http,server,location,if in location 中配置,作用是壓縮傳輸。一般來說瀏覽器是可以對壓縮後的內容進行解壓的。

   gzip_comp_level level; 壓縮級別

默認的壓縮級別是 1,可以在 http,server,location 中配置,級別配置的越高,壓縮的越好,但是壓縮會耗費服務端的計算資源,所以要控制好壓縮級別

   gzip_http_version 1.0 | 1.1,壓縮對 http 協議的支持

默認對 HTTP/1.1 協議的請求才會進行 gzip 壓縮, 可以配置在 http,server,location 中配置。當用戶想要讀取一個 1.html 文件,首先會在目錄中找尋 1.html.gz 是否存在,所以這就導致了磁盤資源的浪費,必須要存儲兩份文件。

###靜態資源訪問
    server {
      listen       80;
      server_name  static.itmayiedu.com;
      location /static/imgs {
           root F:/;
           index  index.html index.htm;
       }
    }
   ###動態資源訪問
     server {
      listen       80;
      server_name  www.itmayiedu.com;

      location / {
         proxy_pass http://127.0.0.1:8080;
         index  index.html index.htm;
       }
    }

跨域配置

跨域就是在原站點訪問域名不同的其他站點,同源策略會阻止一個域的 javascript 腳本和另外一個域的內容進行交互。所謂同源(即指在同一個域)就是兩個頁面具有相同的協議(protocol),主機(host)和端口號(port)。

CORS 是跨域資源分享(Cross-Origin Resource Sharing)的縮寫。它是 W3C 標準,屬於跨源 AJAX 請求的根本解決方法。

1、普通跨域請求:只需服務器端設置 Access-Control-Allow-Origin

2、帶 cookie 跨域請求:前後端都需要進行設置

#允許跨域請求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
#允許帶上cookie請求 
add_header 'Access-Control-Allow-Credentials' 'true'; 
#允許請求的方法,比如 GET/POST/PUT/DELETE 
add_header 'Access-Control-Allow-Methods' *; 
#允許請求的header 
add_header 'Access-Control-Allow-Headers' *;

防盜鏈

#對源站點驗證
valid_referers *.imooc.com; 
#非法引入會進入下方判斷 
if ($invalid_referer) { return 404; }

source: https://www.yuque.com/molizhuzhu/thrgrk/rtslmc

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/qZrJZEDJru9DjVfhPUgLPg