Web服務器-Nginx詳解


Nginx基本概念

什么是Nginx

Nginx是一個高性能的HTTP和反向代理web服務器,特點是占有內存少,並發能力強,有報告表明能支持高達50000個並發連接數。

 

正向代理

是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求並指定目標(原始服務器),然后代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端才能使用正向代理。

 

反向代理

反向代理服務器位於用戶與目標服務器之間,但是對於用戶而言,反向代理服務器就相當於目標服務器,即用戶直接訪問反向代理服務器就可以獲得目標服務器的資源。同時,用戶不需要知道目標服務器的地址,也無須在用戶端作任何設定。反向代理服務器通常可用來作為Web加速,即使用反向代理作為Web服務器的前置機來降低網絡和服務器的負載,提高訪問效率。

 

負載均衡

Load balancing,即負載均衡,是一種計算機技術,用來在多個計算機(計算機集群)、網絡連接、CPU、磁盤驅動器或其他資源中分配負載,以達到最優化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。

 

動靜分離

 

 

安裝Nginx

①安裝依賴包

yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel open openssl-devel

②下載Nginx穩定版

wget http://nginx.org/download/nginx-1.18.0.tar.gz

③解壓、編譯、安裝

# 解壓
tar -zxvf nginx-1.18.0.tar.gz

# 進入解壓好的文件
cd nginx-1.18.0/

# 編譯
./configure  --prefix=/usr/local/nginx

# 安裝
make && make install

④開放Linux對外網訪問的80端口

/sbin/iptables -I INPUT  -p tcp --dport 80 -j ACCEPT

⑤Nginx服務的啟動操作

##### 啟動方式二選一 #####

# 默認配置文件啟動
cd /usr/local/nginx/sbin
./nginx 

# 指定配置文件啟動
./nginx -c  /usr/local/nginx/conf/nginx.conf

⑥驗證:瀏覽器訪問http://公網ip/

 

Nginx常用命令

使用Nginx操作命令前提條件:必須進入到Nginx的目錄:/usr/local/nginx/sbin。

作用 命令
查看nginx版本 ./nginx -v
啟動nginx ./nginx
關閉nginx ./nginx -s stop
重新加載nginx ./nginx -s reload

 

Nginx配置文件

配置文件的位置

/usr/local/nginx/conf/nginx.conf

 

配置文件的結構

...              #全局塊

events {         #events塊
   ...
}

http      #http塊
{
    ...   #http全局塊
    server        #server塊
    { 
        ...       #server全局塊
        location [PATTERN]   #location塊
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局塊
}

全局塊:配置影響nginx全局的指令。一般有運行nginx服務器的用戶組,nginx進程pid存放路徑,日志存放路徑,配置文件引入,允許生成worker process數等。
events塊:配置影響nginx服務器或與用戶的網絡連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網絡連接序列化等。
http塊:可以嵌套多個server,配置代理,緩存,日志定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。
server塊:配置虛擬主機的相關參數,一個http中可以有多個server。
location塊:配置請求的路由,以及各種頁面的處理情況。

 

配置文件詳解

########### 每個指令必須有分號結束。#################
#user administrator administrators;  #配置用戶或者組,默認為nobody nobody。
#worker_processes 2;  #允許生成的進程數,默認為1
#pid /nginx/pid/nginx.pid;   #指定nginx進程運行文件存放地址
error_log log/error.log debug;  #制定日志路徑,級別。這個設置可以放入全局塊,http塊,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #設置網路連接序列化,防止驚群現象發生,默認為on
    multi_accept on;  #設置一個進程是否同時接受多個網絡連接,默認為off
    #use epoll;      #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大連接數,默認為512
}
http {
    include       mime.types;   #文件擴展名與文件類型映射表
    default_type  application/octet-stream; #默認文件類型,默認為text/plain
    #access_log off; #取消服務日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
    access_log log/access.log myFormat;  #combined為日志格式的默認值
    sendfile on;   #允許sendfile方式傳輸文件,默認為off,可以在http塊,server塊,location塊。
    sendfile_max_chunk 100k;  #每個進程每次調用傳輸數量不能大於設定的值,默認為0,即不設上限。
    keepalive_timeout 65;  #連接超時時間,默認為75s,可以在http,server,location塊。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #熱備
    }
    error_page 404 https://www.baidu.com; #錯誤頁
    server {
        keepalive_requests 120; #單連接請求上限次數。
        listen       4545;   #監聽端口
        server_name  127.0.0.1;   #監聽地址       
        location  ~*^.+$ {       #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫。
           #root path;  #根目錄
           #index vv.txt;  #設置默認頁
           proxy_pass  http://mysvr;  #請求轉向mysvr 定義的服務器列表
           deny 127.0.0.1;  #拒絕的ip
           allow 172.18.5.54; #允許的ip           
        } 
    }
}

 

Nginx配置反向代理

方式一

只替換域名

upstream domain {
  server localhost:8080 weight=5;
}
server {
    listen              80;
    server_name         test.com;
    access_log  "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G"  main;
    location / {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://domain;
    }
}

 

方式二

帶前綴訪問

upstream prod {
  server localhost:8081 weight=5;
}
upstream user {
  server localhost:8082 weight=5;
}
server {
    listen              80;
    server_name         test.com;
    access_log  "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G"  main;
    location ^~/prod/ {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://prod/;
    }
    location ^~/user/ {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://user/;
    }
}

 

方式三

rewrite重寫URL

upstream prod {
  server localhost:8081 weight=5;
}
upstream user {
  server localhost:8082 weight=5;
}
server {
    listen              80;
    server_name         test.com;
    access_log  "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G"  main;
    location ^~/prod/ {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        rewrite ^/prod/(.*)$ /$1 break;
        proxy_pass http://prod;
    }
    location ^~/user/ {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        rewrite ^/user/(.*)$ /$1 break;
        proxy_pass http://user;
    }
}

 

Nginx配置負載均衡

配置

http {
    upstream upstream_name{
        server 192.168.0.28:8001;
        server 192.168.0.28:8002;
    }
    server {
        listen       8080;
        server_name  localhost;
        location / {
            proxy_pass http://upstream_name;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

 

負載均衡策略

策略一:輪詢(默認)

最基本的配置方法,它是upstream的默認策略,每個請求會按時間順序逐一分配到不同的后端服務器。

參數 描述
fail_timeout 與max_fails結合使用。
max_fails 設置在fail_timeout參數設置的時間內最大失敗次數,如果在這個時間內,所有針對該服務器的請求都失敗了,那么認為該服務器會被認為是停機了。
fail_time 服務器會被認為停機的時間長度,默認為10s。
backup 標記該服務器為備用服務器,當主服務器停止時,請求會被發送到它這里。
down 標記服務器永久停機了。

注意:

①在輪詢中,如果服務器down掉了,會自動剔除該服務器。

②缺省配置就是輪詢策略。

③此策略適合服務器配置相當,無狀態且短平快的服務使用。 

 

策略二:權重

在輪詢策略的基礎上制定淪陷的幾率。

如:

upstream foo {
    server localhost:8001 weight=2;
    server localhost:8002;
    server localhost:8003 backup;
    server localhost:8004 max_fails=3 fail_timeout=20s;
}

這里例子中,weight參數用於制定輪詢的幾率,weight默認值為1;weight的數值和被訪問的幾率成正比。

注意:

①權重越高分配到需要處理的請求越多。

②此策略可以與least_conn和ip_hash結合使用。

③此策略比較適合服務器的硬件配置差別比較大的情況。 

 

策略三:ip_hash

負載均衡器按照客戶端IP地址的分配方式,可以確保相同客戶端的請求一直發送到相同的服務器。這樣每個訪客都固定訪問一個后端服務器。

upstream foo {
    ip_hash;
    server localhost:8001 weight=2;
    server localhost:8002;
    server localhost:8003;
    server localhost:8004 max_fails=3 fail_timeout=20s;
}

注意:

①在nginx版本1.3.1之前,不能在ip_hash中使用權重(weight)。

②ip_hash不能與backup同時使用。

③此策略適合有狀態服務,比如session。

④當有服務器需要剔除,必須手動down掉。

 

策略四:least_conn最小連接

把請求轉發給連接數較少的后端服務器。輪詢算法是把請求平均的轉發給各個后端,使它們的負載大致相同;但是,有些請求占用的時間很長,會導致其所在的后端負載較高。這種情況下,least_conn這種方式就可以達到更好的負載均衡效果。

upstream foo {
    least_conn;
    server localhost:8001 weight=2;
    server localhost:8002;
    server localhost:8003 backup;
    server localhost:8004 max_fails=3 fail_timeout=20s;
}

注意:此負載均衡策略適合請求處理時間長短不一造成服務器過載的情況。

 

Nginx配置動靜分離

架構分析

 

配置

動靜分離的原理很簡單,通過location對請求url進行匹配即可,在/Users/Hao/Desktop/Test(任意目錄)下創建 /static/imgs 。

配置如下:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
   server {
       listen       10000;
       server_name  localhost;
      #攔截后台請求
      location / {
        proxy_pass http://localhost:8888;
        proxy_set_header X-Real-IP $remote_addr;
      }
      #攔截靜態資源
      location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
        root /Users/dalaoyang/Downloads/static;
       }
    }
}

 

 動靜分離與前后分離的區別

動靜分離:動態資源與靜態資源分離,不會部署在同一台服務器上。
前后分離:網站架構模式,微服務開發基於SOA面向於服務器開發,后台和前端都采用調用接口方式。將一個項目拆分成一個控制Web(前端)和接口(后端),最終使用rpc遠程調用技術。視圖層和業務邏輯層拆分,中間采用RPC遠程調用技術。

 

常見問題

①為什么互聯網公司項目中,靜態資源url后面會加上一個時間戳?

目的:最終的目的是為了控制項目上線的時候,新靜態資源與老的瀏覽器緩存靜態資源避免沖突問題。

解決方案:加上時間戳規范t=項目上線。

②304走本地緩存狀態碼的原理是什么?

默認瀏覽器圖片緩存是7天。

第一次下載資源的時候,客戶端保存修改資源時間。

第二次下載資源的時候,服務端判斷客戶端上一次修改的時間是否需返回200還是304。

第二次下載資源的時候,服務端判斷當前資源文件與客戶端上一次修改的時間是否需返回200還是304客戶端第二次下載資源最后修改時間2018/6/28 下午11:07:11。

服務端最后一次修改時間大於客戶端最后一次修改的時間200重新加載資源。

服務器端最后一次修改的時間小於客戶端最后修改的時間返回304走本地緩存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM