天天看點

nginx學習筆記安裝HTTP協定案例實戰負載均衡

安裝

源碼方式

  1. nginx官網找到最新穩定版本【http://nginx.org/en/download.html】
  2. 安裝
    cd /usr/local/soft
    wget http://nginx.org/download/nginx-1.18.0.tar.gz
               
  3. 解壓
    tar -xzvf nginx-1.18.0.tar.gz
               
  4. 安裝依賴環境
    # gcc環境:基本運作環境
    # pcre:用于nginx的http子產品解析正規表達式
    # zlib:使用者進行gzip壓縮
    # openssl:用于nginx https協定的傳輸
    yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
               
  5. 編譯安裝
    cd /usr/local/soft/nginx-1.18.0
    ./configure --prefix=/usr/local/soft/nginx 
    make && sudo make install
    cd /usr/local/soft/nginx/
               
  6. 檢測安裝是否成功
    /usr/local/soft/nginx/sbin/nginx -t -c /usr/local/soft/nginx/conf/nginx.conf
               
  7. 啟動nginx
    # 預設配置檔案啟動
    /usr/local/soft/nginx/sbin/nginx
    # 指定配置檔案啟動
    ./nginx -c /usr/local/soft/nginx/conf/nginx-domains.conf
    
    ./nginx -c /usr/local/soft/nginx/conf/nginx-sdy.conf
               
  8. 浏覽器直接通路IP(HTTP協定預設80端口,不需要輸入):
    http://159.75.79.151/
               
  9. copy vimfile
    # 為了讓VIM檢視nginx配置檔案時文法高亮,需要把相應檔案copy到VIM目錄。
    # 先确定本機的vimfiles目錄在哪個位置。
    find / -name vimfiles
    cd /usr/local/soft/nginx-1.18.0
    cp -r contrib/vim/* /usr/share/vim/vimfiles/
               
  10. 常用指令,在sbin目錄下,l例如【./nginx -v】
    nginx -s reopen #重新開機Nginx
    
    nginx -s reload #重新加載Nginx配置檔案,然後以優雅的方式重新開機Nginx
    
    nginx -s stop #強制停止Nginx服務
    
    nginx -s quit #優雅地停止Nginx服務(即處理完所有請求後再停止服務)
    
    nginx -t #檢測配置檔案是否有文法錯誤,然後退出
    
    nginx -?,-h #打開幫助資訊
    
    nginx -v #顯示版本資訊并退出
    
    nginx -V #顯示版本和配置選項資訊,然後退出
    
    nginx -t #檢測配置檔案是否有文法錯誤,然後退出
    
    nginx -T #檢測配置檔案是否有文法錯誤,轉儲并退出
    
    nginx -q #在檢測配置檔案期間屏蔽非錯誤資訊
    
    nginx -p prefix #設定字首路徑(預設是:/usr/share/nginx/)
    
    nginx -c filename #設定配置檔案(預設是:/etc/nginx/nginx.conf)
    
    nginx -g directives #設定配置檔案外的全局指令
    
    killall nginx #殺死所有nginx程序
               

docker

建立挂載目錄

mkdir -p /usr/local/soft/nginx/{conf,conf.d,html,log}
           

啟動

docker run --name nginx01 -d -p 80:80  -v /usr/local/soft/nginx/conf/nginx.conf:/etc/nginx/nginx.conf  -v /usr/local/soft/nginx/log:/var/log/nginx  -v /usr/local/soft/nginx/html:/usr/share/nginx/html nginx
           

HTTP協定

HTTP 協定是基于應用層的協定,并且在傳輸層使用的 TCP 的可靠性通信協定

IP:端口

ip确定具體的位址,端口确定位址内的程序,組合在一起确定了某個程序的确定位置

域名

ip不易記住,用域名來友善人腦記憶,通過dns域名解析器來轉換

http預設端口是80,https預設端口443

協定://子域名.頂級域名.域名類型/資源路徑?參數
http://nginx.org
https://www.baidu.com:443
https://www.qq.com
https://user.qzone.qq.com/1165069099/infocenter?via=toolbar
           
  1. 協定:http、https
  2. 子域名:www、user.qzone
  3. 頂級域名:baidu、qq
  4. 域名類型:com、org、cn
  5. 資源路徑:/1165069099/infocenter
  6. 參數:?via=toolbar

特點

  1. 簡單快速
  2. 靈活
  3. 無連接配接
  4. 無狀态

MIME Type

描述消息内容類型的網際網路标準,常見的幾種類型

  1. 文本檔案:text/html,text/plain,text/css,application/xhtml+xml,application/xml,application/json
  2. 圖檔檔案:image/jpeg,image/gif,image/png
  3. 視訊檔案:video/mpeg,video/quicktime

檔案的渲染類型

  1. Accept:表示用戶端希望接受的資料類型,即告訴伺服器我需要什麼媒體類型的資料,此時伺服器應該根據 Accept 請求頭生産指定媒體類型的資料。
  2. Content-Type:表示發送端發送的實體資料類型,比如代碼中設定:resposne.setContentType(“application/json;charset=utf-8”),表示服務端傳回的資料格式是json。

請求封包格式

  1. 請求行【請求方法 uri 版本】空格分開,例如:POST /v1/sd HTTP/1.1
  2. 請求報頭
  3. 空行
  4. 正文主體,POST請求才有

請求方法 Request Method

  1. GET(查詢操作):擷取資源,不會改變資源資訊,不支援大資料的傳輸,參數明文顯示,敏感資訊請求不要使用。
  2. POST(建立操作):一般使用者用戶端傳輸一個實體給到服務端,讓服務端去儲存,資訊在請求體中,加密處理。
  3. PUT(更新操作):從用戶端向伺服器傳送的資料取代指定的文檔的内容。
  4. DELETE(删除操作):用戶端發起一個 Delete 請求要求服務端把某個資料删除。
  5. HEAD:獲得封包首部。
  6. OPTIONS:詢問支援的方法,允許用戶端檢視伺服器的性能。
  7. TRACE:追蹤路徑,回顯伺服器收到的請求,主要用于測試或診斷。
  8. CONNECT:HTTP/1.1 協定中預留給能夠将連接配接改為管道方式的代理伺服器。

響應封包格式

  1. 狀态行【HTTP/1.1 200 OK】
  2. 響應報頭
  3. 空行
  4. 響應正文

響應狀态碼

狀态碼:描述服務端向用戶端傳回的請求處理結果狀态,浏覽器可以知道伺服器是正常處理請求還是出現了錯誤。

  1. 1XX(Informational,資訊狀态碼):接收的請求正在處理。
  2. 2XX(Success,成功狀态碼):請求正常處理完畢。
  3. 3XX(Redirection,重定向狀态碼):需要進行附加操作以完成請求。
  4. 4XX(Client Error,用戶端請求錯誤碼):伺服器無法處理請求。
  5. 5XX(Sever Error,服務端錯誤代碼):伺服器處理請求出錯。

常見狀态碼

  1. 200:一切正常
  2. 301:永久重定向
  3. 404:請求資源不存在
  4. 500:服務端内部錯誤

通用頭字段 Common Header

字段 含義
Cache-Control 控制緩存的行為
Connection 控制不再轉發給代理的首部字段、管理持久連接配接
Date 建立封包的日期時間
Pragma 封包指令
Trailer 封包末端的首部一覽
Transfer-Encoding 指定封包主體的傳輸編碼方式
Upgrade 更新為其他協定
Via 代理伺服器的相關資訊
Warning 錯誤通知

請求頭字段

字段 含義
Accept 使用者代理可處理的媒, 本類型
Accept-Charset 優先的字元集
Accept-Encoding 優先的内容編碼
Accept-Language 優先的語言(自然語言)
Authorization Web認證資訊
Expect 期待伺服器的特定行為
From 使用者的電子郵箱位址
Host 請求資源所在伺服器
If-Match 比較實體标記(ETag)
If-Modified-Since 比較資源的更新時間
If-None-Match 比較實體标記(與If-Match相反)
If-Range 資源未更新時發送實體Byte的範圍請求
If-Unmodified-Since 比較資源的更新時間(與If-Modified-Since相反)
Max-Forwards 最大傳輸逐跳數
Proxy-Authorization 代理伺服器要求用戶端的認證資訊
Range 實體的位元組範圍請求
Referer
TE 傳輸編碼的優先級
User-Agent HTTP用戶端程式的資訊

響應頭字段

字段 含義
Accept-Ranges 是否接受位元組範圍請求
Age 推算資源建立經過時間
ETag 資源的比對資訊
Location 令用戶端重定向至指定URI
Proxy-Authenticate 代理伺服器對用戶端的認證資訊
Retry-After 對再次發起請求的時機要求
Server HTTP伺服器的安裝資訊
Vary 代理伺服器緩存的管理資訊
WWW-Authenticate 伺服器對用戶端的認證資訊

案例實戰

虛拟主機/綁定目錄

nginx.conf

反向代理

  1. 在内網中開啟兩個服務
    # 服務字首 test
    curl http://172.16.0.8:8080/
    # 服務字首 tiger
    curl http://172.16.0.8:8081/
               
  2. 修改配置檔案nginx.conf,部署在【159.75.79.151】中
    # For more information on configuration, see:
    #   * Official English Documentation: http://nginx.org/en/docs/
    #   * Official Russian Documentation: http://nginx.org/ru/docs/
    
    #user  nobody;
    worker_processes auto;
    error_log /usr/local/soft/nginx/logs/error.log;
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        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  /usr/local/soft/nginx/logs/access.log  main;
    
        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 2048;
    
        include             /usr/local/soft/nginx/conf/mime.types;
        default_type        application/octet-stream;
    
        # Load modular configuration files from the /etc/nginx/conf.d directory.
        # See http://nginx.org/en/docs/ngx_core_module.html#include
        # for more information.
        include /usr/local/soft/nginx/conf/conf.d/*.conf;
        
        # 負載均衡
        upstream load_balancing_test {
            server 159.75.79.151:8080;
            server 49.234.55.50:8080;
            server 49.234.55.50:8081;
        }
    
        server {
            # 對外開放的端口,預設是80
            listen       80;
            # 公網ip或域名
            server_name 159.75.79.151;
            root         /usr/share/nginx/html;
    
            # Load configuration files for the default server block.
            include /usr/local/soft/nginx/conf/default.d/*.conf;
    
            #location / {
            #}
            
           # 負載均衡測試,通路【http://159.75.79.151/load_balancing_test/tiger/test】
           location /load_balancing_test {
                proxy_http_version 1.1;
                proxy_pass http://load_balancing_test/;
                proxy_set_header   Host    $host:$server_port;
                proxy_set_header   X-Real-IP   $remote_addr;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size  1000M;
            }
           
           # 服務1映射資訊,通路【http://159.75.79.151/test/tiger/test】
           location /test {
                proxy_http_version 1.1;
                proxy_pass http://172.16.0.8:8080/;
                # 轉換請求方法,預設是get
                proxy_method POST;
                # nginx 服務端 ip:port
                proxy_set_header   Host    $host:$server_port;
                #擷取 用戶端位址設定到 header 中
                proxy_set_header   X-Real-IP   $remote_addr;
                # 擷取所有轉發請求的ip位址設定到 header 中
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size  1000M;
            }
    
          # 服務2映射資訊,通路【http://159.75.79.151/tiger/test】
           location /tiger {
                proxy_http_version 1.1;
                proxy_pass http://172.16.0.8:8081/;
                proxy_set_header   Host    $host:$server_port;
                proxy_set_header   X-Real-IP   $remote_addr;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size  1000M;
            }    
    
           # error_page 404 /404.html;
           # location = /404.html {
           # }
    
            #error_page 500 502 503 504 /50x.html;
            #location = /50x.html {
            #}
        }
    
    # Settings for a TLS enabled server.
    #
    #    server {
    #        listen       443 ssl http2 default_server;
    #        listen       [::]:443 ssl http2 default_server;
    #        server_name  _;
    #        root         /usr/share/nginx/html;
    #
    #        ssl_certificate "/etc/pki/nginx/server.crt";
    #        ssl_certificate_key "/etc/pki/nginx/private/server.key";
    #        ssl_session_cache shared:SSL:1m;
    #        ssl_session_timeout  10m;
    #        ssl_ciphers HIGH:!aNULL:!MD5;
    #        ssl_prefer_server_ciphers on;
    #
    #        # Load configuration files for the default server block.
    #        include /etc/nginx/default.d/*.conf;
    #
    #        location / {
    #        }
    #
    #        error_page 404 /404.html;
    #        location = /404.html {
    #        }
    #
    #        error_page 500 502 503 504 /50x.html;
    #        location = /50x.html {
    #        }
    #    }
    }
               

負載均衡

負載政策

  1. 權重輪詢:wrr 【weight round-robin】
  2. ip_hash:

    nginx會根據用戶端ip的hash結果選擇一個真實伺服器,而且每次都會固定通路這台伺服器,可以解決session儲存問題。

  3. least_conn:目前活躍連接配接數越小,權重越大,優先選擇。
  4. 第三方負載政策,另查找資料

配置塊

  1. weight
  2. max_fails
  3. fail_timeout
  4. down
  5. backup

nginx.conf

重點關注 upstream 塊裡邊的内容 upstream server_group { }

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

#user nginx;
worker_processes auto;
error_log /usr/local/soft/nginx/logs/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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  /usr/local/soft/nginx/logs/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /usr/local/soft/nginx/conf/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /usr/local/soft/nginx/conf/conf.d/*.conf;

    # 定義一個伺服器組
    upstream server_group {
        # 預設的輪詢算法
        wrr;
        server 49.234.55.50:8080 weight=2 max_fails=3 fail_timeout=15;
        server 49.234.55.50:8081 down;
        server 49.234.55.50:8082 backup;
    }

    server {
        listen       80;
        server_name 159.75.79.151;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /usr/local/soft/nginx/conf/default.d/*.conf;

       location /load_balancing_test {
            proxy_http_version 1.1;
            proxy_pass http://server_group/;
            proxy_set_header   Host    $host:$server_port;
            proxy_set_header   X-Real-IP   $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size  1000M;
        }
    }
}
           

java -jar xxx.jar --server.port=9090