Nginx 基礎之靜態網站部署,負載均衡,動靜分離

1、Nginx 簡介

1.1 簡介

Nginx(engine x)是一個免費的,開源的,高性能的 HTTP 服務器, IMAP/POP3 代理服務器 和 TCP/UDP 代理服務器,一般能夠用於進行反向代理和實現基於軟件的負載均衡,除此以外,它還具有如下特性:css

  • Nginx 在設計時遵循模塊化的設計方案,能夠經過組合模塊來擴展實現不一樣的功能,具有很高的擴展性。
  • Nginx 遵循 matser \ worker 架構,主進程負責管理一個或者多個 worker 進程,每一個 worker 進程負責處理實際的鏈接,當某個 worker 進程出錯時,主進程會迅速建立一個新的 worker 來繼續處理鏈接請求,從而保證高可用。
  • Nginx 在高鏈接數的狀況下仍然能夠保持極低的內存佔用,從而能夠支持高併發量地訪問。
  • Nginx 支持熱部署和配置熱加載,並支持在不停機的狀況下進行版本升級。
  • 有免費的開源版本和商業版本 ( Nginx Plus ),能夠按需選擇或者進行二次開發。
  • 在高併發環境下,Nginx 比其餘 WEB 服務器有更快的響應速度。

1.2 正向代理和反向代理

Nginx 可以同時支持正向代理和反向代理,這兩種代理模式的區別以下:html

  • 正向代理髮生在客戶端,是客戶端主動發起的代理。如咱們不能直接訪問某個服務器,但能夠間接經過中間的代理服務器去進行訪問,而後將訪問結果再返回給咱們。
  • 反向代理髮生在服務端,客戶端並不知道發生了代理,示例以下。用戶只知道將請求發送給 Nginx,可是並不知道請求被轉發了,也不知道被轉發給了哪一臺應用服務器。實際上對於用戶來講,他也不必知道,由於請求結果都是相同的。

2、基本命令

Nginx Shell 的基本使用格式以下:node

nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
複製代碼
  • -?,-h :顯示幫助信息;
  • -v:查看版本號;
  • -V:查看版本號及配置信息;
  • -t:檢測配置文件是否有語法錯誤;
  • -q:靜默模式,在檢測配置期間除了錯誤提示外,不輸出其餘消息;
  • -s signal:向 Master 進程發送信號,支持如下信號類型:stop ( 當即中止 ),quit ( 優雅中止 ),reload ( 從新加載配置文件 ),reopen (打開一個新的日誌文件來繼續記錄日誌) ;
  • -p prefix :指定路徑的前綴,默認爲安裝目錄,如 /usr/app/nginx-1.16.1/
  • -c filename :指定配置文件的位置, 默認值爲 conf/nginx.conf,其實際指向的路徑爲 prefix + filename
  • -g directives:從指定的配置文件中設置全局指令。

3、配置格式

3.1 基本配置格式

Nginx 的配置由全局配置和局部配置(指令塊)共同組成,全部的指令塊都遵循相同的配置格式:nginx

<section>{
    <directive>    <parameters>;
}
複製代碼

指令塊使用大括號進行劃分,大括號內是獨立的配置上下文,包含指令和具體的參數,每行指令以分號做爲結尾。除此以外,Nginx 的配置中還支持如下操做:git

  • 支持使用 include 語法來引入外部配置文件,從而能夠將每一個獨立的配置拆分到單獨的文件中;
  • 支持使用 # 符號來添加註釋;
  • 支持使用 $ 符號來引用變量;
  • 部分指令的參數支持使用正則表達式。

3.2 時間和空間單位

Nginx 的配置文件支持如下空間和時間單位:github

  • 空間單位:不加任何單位默認就是 bytes,除此以外還支持 k/K,m/M,g/G 等經常使用單位。web

  • 空間單位:支持 ms (毫秒) ,s (秒) ,m (分鐘) ,h (小時) ,d (天),w (星期),M (月,30天),y (年,365天) 等經常使用單位,並支持組合使用,如 1h 30m (1小時 30分),1y 6M(1年零6個月)。正則表達式

3.3 官方配置模板

在安裝 Nginx 後,在安裝目錄的 conf 目錄下會有一個官方的配置樣例 nginx.conf ,其內容以下:spring

# 使用這個參數來配置worker進程的用戶和組,若是沒有指定組,則默認爲指定用戶所處的組,默認值爲nobody
user  nobody;
# 指定用於處理客戶端鏈接的worker進程的數量,一般設置爲CPU的核心數。
# 若是是爲IO密集型操做進行負載,能夠設置爲核心數的1.5 ~ 2倍
worker_processes  1;

# 指定日誌的位置和日誌級別,日誌級別按照由低到高的順序以下:[debug|info|notice|warn|error|crit]
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# 指定記錄主進程的ID的文件
pid        logs/nginx.pid;


events {
    # 指定每一個工程線程的最大鏈接數,總的鏈接數 max_clients = worker_processes * worker_connections
    worker_connections  1024;
}


http {
    # 使用include來引用外部文件
    include       mime.types;
    # 指定默認MIME類型
    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  logs/access.log  main;


    # 是否開啓系統調用方法sendfile(),開啓後能夠直接在內核空間完成文件的發送,即零拷貝
    sendfile        on;
    # 是否開啓Socket選項,它只有在sendfile啓用後纔會生效
    tcp_nopush     on;

    # 鏈接超時時間
    keepalive_timeout  65;

    # 開啓文件壓縮
       gzip  on;

    # 配置nginx服務器(虛擬主機)
    server {
        # 監聽端口
        listen       80;
        server_name  localhost;

        # 默認字符集
        charset koi8-r;
        # 配置當前虛擬主機的訪問日誌的存放位置
        access_log  logs/host.access.log  main;
        
        # 虛擬主機對應的映射目錄
        location / {
            root   html;
            index  index.html index.htm;
        }
            
        # 錯誤重定向頁面
        # error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # 禁止訪問根目錄下以ht結尾的文件
        location ~ /\.ht {
            deny  all;
        }
    }


    # 支持配置多臺虛擬主機
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # 配置Https服務
    server {
        listen       443 ssl;
        server_name  localhost;
        
        # 指定數字證書
        ssl_certificate      cert.pem;
        # 指定密匙
        ssl_certificate_key  cert.key;

        # 設置存儲session的緩存類型和大小
        ssl_session_cache    shared:SSL:1m;
        # session緩存時間
        ssl_session_timeout  5m;

        # 返回客戶端支持的密碼列表
        ssl_ciphers  HIGH:!aNULL:!MD5;
        # 指定在使用SSLv3和TLS協議時,服務器密碼應優先於客戶端密碼
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}
複製代碼

4、部署靜態網站

Nginx 一般用做 HTTP 服務器來部署靜態資源,其具體的操做步驟以下:shell

4.1 增長配置

修改 nginx.conf ,並在 http 指令塊中增長以下配置:

server {
    # 監聽端口號
    listen 9010;
    # 若是有域名的話,能夠在這裏進行配置
    server_name _;      
    # 存放靜態頁面的目錄
    root /usr/web;
    # 主頁面
    index index.html;
   }
複製代碼

/usr/web 目錄下新建一個測試頁面 index.html,內容以下:

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Nginx靜態資源網站</title>
</head>
<body>
<h1 style="text-align: center">Nginx靜態資源網站</h1>
</body>
</html>
複製代碼

4.2 檢查配置

使用 -t 參數來檢查配置,出現 successful 則表明配置正確:

[root@node1 web]# nginx -t -c conf/nginx.conf
nginx: the configuration file /usr/app/nginx-1.16.1/conf/nginx.conf syntax is ok
nginx: configuration file /usr/app/nginx-1.16.1/conf/nginx.conf test is successful
複製代碼

4.3 重載配置

啓動 Nginx ,若是 Nginx 已經啓動,可使用以下命令重載配置:

nginx -s reload
複製代碼

訪問 http://hostname:9010/index.html ,便可查看到靜態網站首頁。

5、實現負載均衡

5.1 部署後臺服務

這裏我使用 Docker 來部署兩個 Tomcat,以後將測試項目 WAR 包分別拷貝到 /usr/webapps001/usr/webapps002 兩個掛載的容器卷下,程序會自動解壓並運行,兩個項目的端口號分別爲 8080 和 8090:

run -d  -it --privileged=true -v /usr/webapps01:/usr/local/tomcat/webapps \
-p 8080:8080 --name tomcat8080  96c4e536d0eb
複製代碼
run -d  -it  --privileged=true -v /usr/webapps02:/usr/local/tomcat/webapps \
-p 8090:8080 --name tomcat8090  96c4e536d0eb
複製代碼

5.2 負載均衡配置

修改 nginx.conf ,並在 http 指令塊中增長以下配置:

# 這裏指令塊的名稱能夠隨意指定,只要和下面的proxy_pass的值相同便可,一般配置爲項目名
upstream springboot {
    server 192.168.0.226:8080;
    server 192.168.0.226:8090;
}

server {
    listen 9020;
    location / {
        proxy_pass http://springboot;
    }
}
複製代碼

重載配置後,打開瀏覽器,經過 9020 端口訪問項目,此時 Nginx 會以輪詢的方式將請求分發到 8080 和 8090 端口上。在測試負載均衡策略的時候,最好將瀏覽器的緩存功能關閉,避免形成影響。

5.3 負載均衡策略

在上面的配置中,咱們沒有配置任何負載均衡策略,默認採用的是輪詢策略,除此以外,Nginx 還支持如下負載均衡策略:

1. 權重策略 ( Weighted load balancing )

經過爲不一樣的服務分配不一樣的權重來進行轉發,配置示例以下:

upstream myapp1 {
    server srv1.example.com weight=3;
    server srv2.example.com weight=2;
    server srv3.example.com;
}
複製代碼

2. 最少鏈接策略 ( Least connected load balancing )

將請求轉發給鏈接數最少的服務,配置實例以下:

upstream myapp1 {
    least_conn;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}
複製代碼

3. IP 策略 ( IP Hash load balancing )

經過對請求的 IP 地址進行哈希運算並取模來決定轉發對象,配置示例以下:

upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}
複製代碼

以上是 Nginx 內置的基礎的負載均衡策略,若是想要實現其餘更加複雜的負載均衡策略,能夠經過第三方模塊來實現。

4.4 聲明備用服務

在上面任何負載均衡策略當中,均可以經過 backup 參數來添加備用服務,示例以下:

server backup1.example.com:8080   backup;
複製代碼

處於備用狀態下的服務並不會參與負載均衡,除非全部主服務都已宕機,此時 Nginx 纔會將請求轉發到備用服務上。

6、實現動靜分離

6.1 動靜分離配置

Nginx 可以支持高併發的訪問,並具備靜態資源緩存等特性,所以相比於 Tomcat 等動態資源應用服務器,其更加適合於部署靜態資源。想要實現動靜分離,只須要在 server 指令塊中經過正則表達式來劃分靜態資源,並指定其存放位置,示例以下:

server {
    listen 9020;
    location / {
        proxy_pass http://springboot;
    }
    # 經過正則來控制所須要分離的靜態資源
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
        # 靜態資源存放目錄
        root /usr/resources/;
    }
}
複製代碼

6.2 常見配置異常

1. No such file or directory

第一個常見的問題是找不到靜態資源,此時能夠查看 logs 目錄下的 error.log 日誌,一般輸出以下:

2019/09/01 17:12:43 [error] 12402#0: *163 open() "/usr/resources/spring-boot-tomcat/css/show.css"
failed (2: No such file or directory), client: 192.168.0.106, server: , 
request: "GET /spring-boot-tomcat/css/show.css HTTP/1.1", host: "192.168.0.226:9020",
referrer: "http://192.168.0.226:9020/spring-boot-tomcat/index"
複製代碼

出現這個問題,是由於 Nginx 要求靜態資源的請求路徑必須和原有請求路徑徹底相同,這裏個人項目在 Tomcat 中解壓後的項目名爲 pring-boot-tomcat,以 show.css 文件爲例,其正確的存儲路徑應該爲:

/usr/resources/spring-boot-tomcat/css/show.css
複製代碼

即: 靜態資源根目錄 + 項目名 + 原有路徑,一般咱們在建立目錄時會忽略掉項目名這一層級,從而致使異常。

2. Permission denied

路徑正確後,另一個常見的問題是權限不足,錯誤日誌以下。此時須要保證配置文件中的 user 用戶必須具備靜態資源所處目錄的訪問權限,或者在建立靜態資源目錄時,直接使用 user 配置的用戶來建立:

2019/09/01 17:15:14 [error] 12402#0: *170 open() "/usr/resources/spring-boot-tomcat/css/show.css" 
failed (13: Permission denied), client: 192.168.0.106, server: ,
request: "GET /spring-boot-tomcat/css/show.css HTTP/1.1", host: "192.168.0.226:9020", 
referrer: "http://192.168.0.226:9020/spring-boot-tomcat/index"
複製代碼

參考資料

官方文檔:nginx documentationUsing nginx as HTTP load balancer

更多文章,歡迎訪問 [全棧工程師手冊] ,GitHub 地址:github.com/heibaiying/…

相關文章
相關標籤/搜索