nginx相關

longsihua2003發表於2024-09-09

Nginx工具

Web網路服務

我們平時訪問的網站服務就是 Web 網路服務,一般是指允許使用者透過瀏覽器訪問到網際網路中各種資源的服務。

web網路服務是被動的網路服務,透過網路傳輸資源,流程如下:

使用者發起網路請求 --> 網路伺服器接受到請求 --> 網路伺服器取資源 --> 將資源透過http(超文字傳輸協議)和https(安全超檔案傳輸協議)返回。
img

web伺服器與web框架的關係

  1. web伺服器:接受http/https請求,返回資料。
  2. web框架:開發web應用程式,處理得到的資料。

nginx是什麼

優點:

  1. 開源
  2. 高效能,高併發
  3. 資源消耗少
  4. 可以做http反向代理
  5. 負載均衡
  6. 支援非同步網路i/o事件模型epoll
  • Tengine是由淘寶網發起的Web伺服器專案。它在Nginx的基礎上,針對大訪問量網站的需求,新增了很多高階功能和特性。Tengine的效能和穩定性已經在大型的網站如淘寶網,天貓商城等得到了很好的檢驗。它的最終目標是打造一個高效、穩定、安全、易用的Web平臺。

nginx下載安裝

  • 可以直接npm安裝,這裡介紹原始碼包安裝
  1. 原始碼包下載

    摘一句話:淘寶網是開源軟體的使用者和受益者,我們也想成為開源軟體的貢獻者。這就是我們決定開源Tengine的原因。

    tengine:http://tengine.taobao.org/download/tengine.tar.gz、https://tengine.taobao.org/download/tengine-3.0.0.tar.gz

    nginx:http://hg.nginx.org/nginx.org/archive/tip.tar.gz

    官網:https://nginx.p2hp.com/en/download.html

    img

  2. 安裝依賴:

    # 其中有一些重要的庫:gcc、pcre(正規表示式庫)、zlib、OpenSSL
    yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
    
    # ubuntu
    apt install openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev make
    

    img

  3. 釋放Makefile

    ./configure --prefix=/opt/tengine12/
    

    img

  4. 編譯安裝

    make && make install 
    

    img

  5. 設定環境變數,並記一些常用命令
    img
    nginx #啟動
    nginx -s stop #關閉
    nginx -s reload #重新載入

nginx目錄結構

[root@iZ2vchdoid8iit383hsodtZ tengine12]# ls
client_body_temp  conf  fastcgi_temp  html  include  logs  modules  proxy_temp  sbin  scgi_temp  uwsgi_temp
  1. conf 存放nginx配置檔案
  2. html 存放前端檔案目錄
  3. logs 存放nginx執行日誌,錯誤日誌
  4. sbin nginx執行指令碼

nginx主要配置

參考文章:nginx配置

配置的位置處於conf當中的nginx.conf

# 核心配置模組
user nginx; # nginx程序所用的使用者
worker_processes 1; # nginx佔幾個程序
error_log /var/log/nginx/error.log; # 錯誤日誌在哪
pid /run/nginx.pid; # 程序生成的pid放哪

events # 事件模組

http # 核心模組

event模組:

    #事件模型:use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; 
    #epoll模型是Linux 2.6以上版本核心中的高效能網路I/O模型,linux建議epoll,如果跑在FreeBSD上面,就用kqueue模型。
    use epoll;

    #根據硬體調整,和前面工作程序配合起來用,儘量大,但是別把cpu跑到100%就行。每個程序允許的最多連線數,理論上每臺nginx伺服器的最大連線數為。
    worker_connections 65535;

http模組:

    #副檔名與檔案型別對映表,基本上不變
    include mime.types;
    # include /etc/nginx/conf.d/*.conf;  #包含/etc/nginx/conf.d/目錄下所有以.conf結尾的檔案

    #日誌格式設定
    #$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
    #$remote_user:用來記錄客戶端使用者名稱稱;
    #$time_local: 用來記錄訪問時間與時區;
    #$request: 用來記錄請求的url與http協議;
    #$status: 用來記錄請求狀態;成功是200,
    #$body_bytes_sent :記錄傳送給客戶端檔案主體內容大小;
    #$http_referer:用來記錄從那個頁面連結訪問過來的;
    #$http_user_agent:記錄客戶瀏覽器的相關資訊;
    #通常web伺服器放在反向代理的後面,這樣就不能獲取到客戶的IP地址了,透過$remote_add拿到的IP地址是反向代理伺服器的iP地址。反向代理伺服器在轉發請求的http頭資訊中,可以增加x_forwarded_for資訊,用以記錄原有客戶端的IP地址和原來客戶端的請求的伺服器地址。
    log_format access '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';
        
    #定義本虛擬主機的訪問日誌
    access_log  /usr/local/nginx/logs/host.access.log  main;
    access_log  /usr/local/nginx/logs/host.access.404.log  log404;

    #開啟限制IP連線數的時候需要使用
    #limit_zone crawler $binary_remote_addr 10m;
    #負載均衡配置
    upstream jh.w3cschool.cn {
        ......
    }
    # 虛擬主機,也就是服務配置(可以多個)
    server
    {
        #監聽埠
        listen 80;

        #域名可以有多個,用空格隔開,ip或者localhost(本機地址)
        server_name www.w3cschool.cn w3cschool.cn;
        index index.html index.htm index.php;

        #對 "/" 啟用反向代理
        location / {
            root   html; # 定義root根目錄 
            index  index.html index.htm; # 主頁

            proxy_pass http://127.0.0.1:88;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
             
            #後端的Web伺服器可以透過X-Forwarded-For獲取使用者真實IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             
            #以下是一些反向代理的配置,可選。
            proxy_set_header Host $host;

            #允許客戶端請求的最大單檔案位元組數
            client_max_body_size 10m;

            #高負荷下緩衝大小(proxy_buffers*2)
            proxy_busy_buffers_size 64k;

            #設定在寫入proxy_temp_path時資料的大小,預防一個工作程序在傳遞檔案時阻塞太長
            #設定快取資料夾大小,大於這個值,將從upstream伺服器傳
            proxy_temp_file_write_size 64k;
        }
        #設定檢視Nginx狀態的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file confpasswd;
            #htpasswd檔案的內容可以用apache提供的htpasswd工具來產生。
        }
        # 錯誤頁面,當頁面返回404時返回404.html(/指的網頁根目錄)
        error_page  404              /404.html;
    }

nginx限制訪問功能

在nginx.conf當中,編輯server當中新增

deny ip; # 把某ip禁用訪問,寫在location底下

nginx狀態資訊

狀態資訊功能,監測當前有多少連線數。

使用如下(在server當中新增一個location):

    location /status {
        stub_status on;

img

  • 壓測命令ab
yum install httpd-tools

# 1000個併發,100000次請求
ab -kc 1000 -n 100000 http://192.168.119.10/

基於域名和更改server_name實現基於域名的虛擬主機

新增http模組當中server引數:

  • 例如我有兩個域名:www.htsp.com、www.djsidsjd.com

可以這樣修改配置檔案

   server {
        listen       80;
        server_name  www.htsp.com;
        location /{
            root   html/gtsp;
            index  index.html index.htm;
        }
    }
       server {
        listen       80;
        server_name  www.djsidsjd.com;
        location /{
            root   html/djsidsjd;
            index  index.html index.htm;
        }
    }

這樣的話,重啟以後,透過域名的不同,我可以訪問不同的頁面。同樣暴露在80埠。

路徑url的正則匹配

匹配符 匹配規則 優先順序
= 精確匹配 1
^~ 以某個字串開頭 2
~ 區分大小寫的正則匹配 3
~* 不區分大小寫的正則匹配 4
!~ 區分大小寫不匹配的正則 5
!~* 不區分大小寫不匹配的正則 6
/ 通用匹配,任何請求都會匹配到 7

舉個例子:

    server {
    listen 80;
    server_name pythonav.cn;

    #優先順序1,精確匹配,根路徑
    location =/ {
        return 400;
    }

    #優先順序2,以某個字串開頭,以av開頭的,優先匹配這裡,區分大小寫
    location ^~ /av {
       root /data/av/;
    }

    #優先順序3,區分大小寫的正則匹配,匹配/media*****路徑
    location ~ /media {
          alias /data/static/;
    }

    #優先順序4 ,不區分大小寫的正則匹配,所有的****.jpg|gif|png 都走這裡
    location ~* .*\.(jpg|gif|png|js|css)$ {
       root  /data/av/;
        }

    #優先7,通用匹配
    location / {
        return 403;
    }
}

負載均衡

什麼是叢集

指一組或者若干個相互獨立的計算機,利用高速通訊網路組成一個較大的計算機服務系統。(一堆伺服器共同做一件事)

簡單地說,叢集就是指一組(若干個)相互獨立的計算機,利用高速通訊網路組成的一個較大的計算機服務系統,每個叢集節點(即叢集中的每臺計算機)都是執行各自服務的獨立伺服器。這些伺服器之間可以彼此通訊,協同向使用者提供應用程式、系統資源和資料,並以單一系統的模式加以管理。當使用者客戶機清求叢集系統時,叢集給使用者的感覺就是一個單一獨立的伺服器,而實際上使用者請求的是一組叢集伺服器。
開啟谷歌、百度的頁面,看起來好簡單,也許你覺得用幾分鐘就可以製作出相似的網頁,而實際上,這個頁面的背後是由成千上萬臺伺服器叢集協同工作的結果。而這麼多的伺服器維護和管理,以及相互協調工作也許就是讀者你未來的工作職責了。
若要用一句話描述叢集,即一堆伺服器合作做同一件事,這些機器可能需要整個技術團隊架構、設計和統一協調管理,這些機器可以分佈在一個機房,也可以分佈在全國全球各個地區的多個機房。

優點

  1. 高效能

    一些需要大量計算的業務,即便是一臺算力很強的計算機,計算能力也是有限的。但是,集中幾十臺甚至萬-十萬臺的伺服器,可以極大的提高效能。

  2. 價格有效性

    透過幾臺效能較低的伺服器叢集,可以媲美較高配置的伺服器,具有更高的價效比。

  3. 可伸縮性

    當系統效能不足時,對叢集中的較低效能機器進行升配,比提高一個高效能伺服器的效能,相對來說更加簡單,花銷也較少

  4. 高可用性

    單一計算機可能會面臨裝置損壞的情況,一旦損壞,業務全掛。而計算機叢集,其中一臺計算機的失效,不會使得所有業務都掛了。幾乎可以實現7*24的服務。

  5. 透明性(安全性)

    對於伺服器叢集,使用者訪問叢集系統時,就像訪問一臺高效能伺服器一樣,不會暴露所有伺服器的情況。同時,部分伺服器的上下線,也不會中斷整個系統服務。

負載均衡

可以透過下文詳細瞭解:https://www.cnblogs.com/funcquery/p/16009094.html

  1. 工作情況:透過叢集,將web伺服器分為多個,從而減少單個伺服器的負擔
    img

  2. 工作原理

    使用者對負載均衡器傳送請求(大流量,多使用者),透過均衡器(根據演算法將流量分發)。以輪詢(一個一個發)或者加入權重的方式分發請求,讓多個服務共同工作,減少單臺伺服器的負荷,提高響應效率。
    img

  3. 負載均衡和代理

    img
    從圖中看,代理與負載均衡幾乎是一樣的。最大的區別是:

    • 代理將請求轉發給了一臺伺服器。
    • 負載均衡是透過演算法,將請求轉發到了多臺一模一樣的伺服器,從而實現單臺裝置負載的減少。(upstream虛擬代理池)

實現負載均衡、動靜分離的效果

  1. 將程式碼/服務跑在不同的機器,或者是跑在不同的埠。(相同的服務)

    • 負載均衡(被分配的伺服器跑相同的服務。)
    • 動靜分離(分為跑動態頁面和跑靜態頁面的伺服器組。)
  2. 對於不同的伺服器組(提供相同服務的伺服器)

    配置:

        # 動態頁面伺服器
        upstream django {
            server 10.0.0.10:8000;
            # 也可以是自己伺服器的不同埠
            # server 127.0.0.1:2481;
            server 10.0.0.11:9000;
        }
        # 靜態頁面伺服器
        upstream static {
            server 192.168.119.11:80;
        }
    
    • 預設的情況下,對伺服器組的分發是輪詢規則。
      所有的規則如下:
      排程演算法 概述
      輪詢 按時間順序逐一分配到不同的後端伺服器(預設)
      weight 加權輪詢,weight值越大,分配到的訪問機率越高
      ip_hash 每個請求按訪問IP的hash結果分配,這樣來自同一IP的固定訪問一個後端伺服器
      url_hash 按照訪問URL的hash結果來分配請求,是每個URL定向到同一個後端伺服器
      least_conn 最少連結數,那個機器連結數少就分發

    例子:

        # 輪詢
        upstream django {
            server 10.0.0.10:8000;
            server 10.0.0.11:9000;
        }
        # 權重
        upstream django {
            server 10.0.0.10:8000 weight=5;
            server 10.0.0.11:9000 weight=10;#這個節點訪問比率是大於8000的
        }
        # ip_hash
        # 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器
        upstream django {
            ip_hash;
            server 10.0.0.10:8000;
            server 10.0.0.11:9000;
        }
        # backup
        # 在非backup機器繁忙或者當機時,請求backup機器,因此機器預設壓力最小
        upstream django {
            server 10.0.0.10:8000 weight=5;
            server 10.0.0.11:9000;
            server node.oldboy.com:8080 backup;
        }
    
    1. 在虛擬主機當中設定規則

    這裡以動靜分離為例子

    server {
        listen       80;
        server_name  192.168.119.12;
        # 當請求到達192.168.119.12:80/時,轉發給flask的8080應用
        location / {
            proxy_pass http://django;
            include proxy_params;
        }
        # 當判斷資源請求是 192.168.119.12/girl.jpg時候,轉發請求給static地址池 # 的伺服器192.168.119.11/
    
        location ~ .*\.(png|jpg|gif)$ {
         proxy_pass http://static;
            include proxy_params;
        }
    }
    
    1. 這樣就完成了負載均衡的配置。