Nginx

1、Nginx簡介

​ Nginx(發音同engine x)是一個異步框架的 Web服務器,也能夠用做反向代理,負載平衡器 和 HTTP緩存。該軟件由 Igor Sysoev 建立,並於2004年首次公開發布。同名公司成立於2011年,以提供支持。javascript

NGINX是免費,開源,高性能的HTTP和反向代理服務器,郵件代理服務器,通用TCP/UDP代理服務器php

Nginx在官方測試的結果中,可以支持五萬個並行鏈接,而在實際的運做中,能夠支持二萬至四萬個並行鏈接。css

Nginx 的編寫有一個明確目標就是超越 Apache Web 服務器的性能。Nginx 提供開箱即用的靜態文件,使用的內存比 Apache 少得多,每秒能夠處理大約四倍於 Apache 的請求。低併發下性能與 Apache 至關,有時候還低於,可是在高併發下 Nginx 能保持低資源低消耗高性能。還有高度模塊化的設計,模塊編寫簡單。配置文件簡潔。html

官網:http://nginx.orgjava

文檔:https://nginx.org/en/docs/node

特性:python

  • 模塊化設計,較好的擴展性
  • 高可靠性
  • 支持熱部署:不停機更新配置文件、升級版本、更換日誌文件
  • 低內存消耗:10000個keep-alive鏈接模式下的非活動鏈接,僅需2.5M內存
  • event-driven(事件驅動)、aio(異步IO)、mmap(內存映射)、sendfile

功能:mysql

  • 靜態資源的web服務器,html,圖片,js,css,txt等靜態資源
  • http協議反向代理服務器
  • pop3/imap4協議反向代理服務器
  • FastCGI(LNMP)、uWSGI(python)等協議
  • 模塊化(非DSO),如zip、SSL模塊

web服務功能:nginx

  • 虛擬主機(server)
  • 支持 keep-alive 和管道鏈接
  • 訪問日誌(支持基於日誌緩衝提升其性能)
  • url重寫(rewirte)
  • 路徑別名
  • 基於IP及用戶的訪問控制
  • 支持速率限制及併發數限制
  • 從新配置和在線升級而無須中斷客戶的工做進程
  • Memcached 的 GET 接口

2、nginx的安裝

一、yum源安裝

官方源:http://nginx.org/packages/centos/7/x86_64/web

epel源:https://mirrors.aliyun.com/epel/7/x86_64/

安裝:yum install nginx -y

默認主站點目錄:/usr/share/nginx/html

主程序:/usr/sbin/nginx

# nginx 啓動服務
# nginx -v|-V 查看版本
# nginx -t 檢查配置文件
# nginx -c filename 指定配置文件(default: /etc/nginx/nginx.conf)
# nginx -s signal 發送信號給master進程,signal:stop, quit, reopen, reload
# nginx -g directives 在命令行中指明全局指令

主配文件:/etc/nginx/nginx.conf

子配文件:/etc/nginx/conf.d/*

配置文件格式:

main block:主配置段,即全局配置段,對http,mail都有效
event { 
    ... 
}   事件驅動相關的配置

http { 
    ... 
}   http/https 協議相關配置段

mail { 
    ... 
}   mail 協議相關配置段

stream {
    ... 
}   stream 服務器相關配置段

默認配置文件示例:

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  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;
        location / {
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

二、編譯安裝

[root@centos7 ~]# yum install pcre-devel openssl-devel zlib-devel -y
[root@centos7 ~]# useradd -r -s /sbin/nologin nginx
[root@centos7 ~]# wget https://nginx.org/download/nginx-1.14.0.tar.gz
[root@centos7 ~]# tar xf nginx-1.14.0.tar.gz
[root@centos7 ~]# cd nginx-1.14.0/
[root@centos7 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx \
> --conf-path=/etc/nginx/nginx.conf \
> --error-log-path=/var/log/nginx/error.log \
> --http-log-path=/var/log/nginx/access.log \
> --pid-path=/var/run/nginx.pid \
> --lock-path=/var/run/nginx.lock \
> --user=nginx \
> --group=nginx \
> --with-http_ssl_module \
> --with-http_v2_module \
> --with-http_dav_module \
> --with-http_stub_status_module \
> --with-threads \
> --with-file-aio
[root@centos7 nginx-1.14.0]# vim src/http/ngx_http_header_filter_module.c
static u_char ngx_http_server_string[] = "Server: feijikesi" CRLF;
[root@centos7 nginx-1.14.0]# vim src/core/nginx.h
#define NGINX_VERSION      "1.14.0"
#define NGINX_VER          "feijikesi/" NGINX_VERSION
[root@centos7 nginx-1.14.0]# make && make install
[root@centos7 ~]# echo 'PATH=/usr/local/nginx/sbin/:$PATH' > /etc/profile.d/nginx.sh
[root@centos7 ~]# . /etc/profile.d/nginx.sh
[root@centos7 ~]# nginx
[root@centos7 ~]# curl -I 127.0.0.1
Server: feijikesi/1.14.0
[root@centos7 ~]# vim /etc/nginx/nginx.conf
http {
    server_tokens off;
}
[root@centos7 ~]# nginx -s reload
[root@centos7 ~]# curl -I 127.0.0.1
Server: feijikesi

3、nginx主配置段

幫助文檔:http://nginx.org/en/docs/ngx_core_module.html

一、正常運行必備的配置

  • user:指定worker進程的運行身份,如組不指定,默認和用戶名同名

  • pid /PATH/TO/PID_FILE:指定存儲nginx主進程PID的文件路徑

  • include file|mask:指明包含進來的其它配置文件片段

  • load_module file:

    模塊加載配置文件:/usr/share/nginx/modules/*.conf

    指明要裝載的動態模塊路徑:/usr/lib64/nginx/modules/*.so

二、優化性能相關的配置

  • worker_processes number | auto:worker進程的數量;一般應該爲當前主機的cpu的物理核心數

  • worker_cpu_affinity cpumask ...:將worker進程綁定到指定CPU上,提升緩存命中率

    cpumask:
          00000001:0號CPU
          00000010:1號CPU
          10000000:8號CPU
    worker_cpu_affinity 0001 0010 0100 1000; 分別將worker進程綁定到1,2,3,4號CPU上
  • worker_priority number:指定worker進程的nice值,設定worker進程優先級:[-20-19]

  • worker_rlimit_nofile number:worker進程所可以打開的文件數量上限

三、用於調試及定位問題相關的配置

  • daemon on|off:是否以守護進程方式運行nignx,默認是守護進程方式
  • master_process on|off:是否以master/worker模型運行nginx;默認爲on;off 將不啓動worker
  • error_log file [level] :錯誤日誌文件及其級別;出於調試須要,可設定爲debug;但debug僅在編譯時使用了「--with-debug」選項時纔有效:level:debug|info|notice|warn|error|crit|alter|emerg

四、事件驅動相關的配置

events {
    worker_connections 1024;
}
  • worker_connections number:每一個worker進程所可以打開的最大併發鏈接數數量;總最大併發數:worker_processes * worker_connections
  • use method:指明併發鏈接請求的處理方法,默認自動選擇最優方法:use epoll;
  • accept_mutex on|off:處理新的鏈接請求的方法;on指由各個worker輪流處理新請求,Off指每一個新請求的到達都會通知(喚醒)全部的worker進程,但只有一個進程可得到鏈接,會形成「驚羣」,影響服務器性能,建議開啓

4、nginx的模塊

nginx高度模塊化,但其模塊早期不支持DSO機制;1.9.11版本支持動態裝載和卸載

核心模塊:core module

標準模塊:

  • HTTP 模塊:ngx_http_*
  • Mail 模塊 ngx_mail_*
  • Stream 模塊 ngx_stream_*

第三方模塊:

一、ngx_http_core_module 核心模塊

1)server { ... }:配置虛擬主機

# vim /etc/nginx/nginx.conf
 http  { 
    server {
        listen 80;
        server_name www.dongfei.tech;
        root /data/www/;
    }
    server {
        listen 80;
        server_name news.dongfei.tech;
        root /data/news/;
    }
}
# nginx  啓動服務
# echo news site > /data/news/index.html
# echo www site > /data/www/index.html

客戶端測試:

# curl www.dongfei.tech
www site
# curl news.dongfei.tech
news site

2)listen port|address[:port]|unix:/PATH/TO/SOCKET_FILE

listen address[:port] [default_server] [ssl] [http2 | spdy]  [backlog=number] [rcvbuf=size] [sndbuf=size]
  • default_server:設定爲默認虛擬主機
  • ssl:限制僅可以經過ssl鏈接提供服務
  • backlog=number:超過併發鏈接數後,新請求進入後援隊列的長
  • rcvbuf=size:接收緩衝區大小
  • sndbuf=size:發送緩衝區大小

listen PORT; 指令監聽在不一樣的端口,可實現基於端口的虛擬主機

listen IP:PORT; 監聽 IP 地址不一樣,實現基於IP的虛擬主機

3)server_name name ...

虛擬主機的主機名稱後可跟多個由空白字符分隔的字符串

支持*通配任意長度的任意字符

server {
        listen 80;
        server_name *.dongfei.tech;
        root /data/default/;
    }
# echo default > /data/default/index.html
# nginx -s reload
# curl xxx.dongfei.tech
default

支持 ~ 起始的字符作正則表達式模式匹配,性能緣由慎用

server_name     ~^www\d+\.dongfei\.tech$  #說明:\d 表示 [0-9]

匹配優先級機制從高到低:

(1) 首先是字符串精確匹配 如:www.dongfei.com

(2) 左側*通配符 如:*.dongfei.tech

(3) 右側*通配符 如:www.dongfei.*

(4) 正則表達式 如: ~^.*\.dongfei\.tech$

(5) default_server

4)tcp_nodelay on|off

在keepalived模式下的鏈接是否啓用TCP_NODELAY選項

當爲off時,延遲發送,合併多個請求後再發送

默認on時,不延遲發送

可用於:http, server, location

若是爲了節約服務器性能能夠打開,若是爲了用戶體驗更好選擇關閉

5)sendfile on|off

是否啓用sendfile功能,在內核中封裝報文直接發送,默認關閉

6)server_tokens on|off|build|string

是否在響應報文的Server首部顯示nginx版本,建議關閉

7)root

設置web資源的路徑映射;用於指明請求的URL所對應的文檔的目錄路徑,可用於http, server, location, if in location

8)location [ = | ~ | ~* | ^~ ] uri { ... }

在一個server中location配置段可存在多個,用於實現從uri到文件系統的路徑映射;ngnix會根據用戶請求的URI來檢查定義的全部location,並找出一個最佳匹配,然後應用其配置

# mkdir /data/www/blog/
# echo blog > /data/www/blog/index.html
# vim /etc/nginx/nginx.conf
    server {
        listen 80;
        server_name www.dongfei.tech;
        root /data/www/;
        location /blog {
            root /data/www/;
        }
    }
# curl http://www.dongfei.tech/blog/  #測試
blog

=:對URI作精確匹配

^~: 對URI的最左邊部分作匹配檢查,不區分字符大小寫

~: 對URI作正則表達式模式匹配,區分字符大小寫

~*: 對URI作正則表達式模式匹配,不區分字符大小寫

不帶符號:匹配起始於此uri的全部的uri

匹配優先級從高到低:=, ^~, ~/~*, 不帶符號

例如:

location = / {
    [ configuration A ]
}
location / {
    [ configuration B ]
}
location /documents/ {
    [ configuration C ]
}
location ^~ /images/ {
    [ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

The 「/」 request will match configuration A, 
the 「/index.html」 request will match configuration B, 
the 「/documents/document.html」 request will match configuration C, 
the 「/images/1.gif」 request will match configuration D, 
and the 「/documents/1.jpg」 request will match configuration E.

9)alias

路徑別名,文檔映射的另外一種機制;僅能用於location上下文

server {
        listen 80;
        server_name www.dongfei.tech;
        root /data/www/;
        location /blog {
            alias /data/www/blog;  #和root /data/www/;做用相同
        }
    }
# curl http://www.dongfei.tech/blog/
blog

注意:location中使用root指令和alias指令的意義不一樣

(a) root,給定的路徑對應於location中的/uri/左側的/

(b) alias,給定的路徑對應於location中的/uri/右側的/

10)index file ...

指定默認網頁文件,注意須要裝載 ngx_http_index_module 模塊

11)error_page code ... [=[response]] uri

定義錯誤頁,以指定的響應狀態碼進行響應;可用位置:http, server, location, if in location

# echo "404 not found page" > /data/www/404.html
    server {
        listen 80;
        server_name www.dongfei.tech;
        root /data/www/;
        error_page 404 /404.html;
    }
# curl http://www.dongfei.tech/notfound.html
404 not found page
server {
        listen 80;
        server_name www.dongfei.tech;
        root /data/www/;
        error_page 404 =200 /404.html;  #將404返回碼重定向成200訪問碼,防止瀏覽器劫持
    }
# curl -I http://www.dongfei.tech/notfound.html
HTTP/1.1 200 OK  #測試爲200正確訪問碼

12)try_files file ... uri | =code

​ 按順序檢查文件是否存在,返回第一個找到的文件或文件夾(結尾加斜線表示爲文件夾),若是全部的文件或文件夾都找不到,會進行一個內部重定向到最後一個參數。只有最後一個參數能夠引發一個內部重定向,以前的參數只設置內部URI的指向。最後一個參數是回退URI且必須存在,不然會出現內部500錯誤

# echo default page > /data/news/default.html
    server {
        listen 80;
        server_name news.dongfei.tech;
        root /data/news/;
        location / {
            try_files $uri /default.html;  #若是用戶訪問的URI不存在則放回默認頁面
        }
    }
# curl http://news.dongfei.tech/index.html   
news site
# curl http://news.dongfei.tech/noindex.html
default page
server {
        listen 80;
        server_name news.dongfei.tech;
        root /data/news/;
        location / {
            try_files $uri $uri/index.html $uri.html =404;
        }
    }
# curl http://news.dongfei.tech/index.html  
news site
# curl http://news.dongfei.tech/noindex.html
404 Not Found

13)keepalive_timeout timeout [header_timeout]

設定保持鏈接超時時長,0表示禁止長鏈接,默認爲75s,可用於http, server, location

14)keepalive_requests number

在一次長鏈接上所容許請求的資源的最大數量,默認爲100

15)keepalive_disable none | browser ...

對哪類型的瀏覽器禁用長鏈接

16)send_timeout time

向客戶端發送響應報文的超時時長,此處是指兩次寫操做之間的間隔時長,而非整個響應過程的傳輸時長

17)client_body_buffer_size size

用於接收每一個客戶端請求報文的body部分的緩衝區大小;默認爲16k;

超出此大小時,其將被暫存到磁盤上的由下面 client_body_temp_path 指令所定義的位置

18)client_body_temp_path path [level1 [level2 [level3]]]

設定存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量

19)limit_rate rate

限制響應給客戶端的傳輸速率,單位是bytes/second;默認值0表示無限制

20)limit_except method ... { ... }

限制客戶端使用除了指定的請求方法以外的其它方法,僅用於location

method:GET(包括HEAD), HEAD, POST, PUT, DELETE, MKCOL, COPY, MOVE, OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK, PATCH

location /upload {
    root /date/www/;
    limit_except GAT {
        allow 192.168.0.9/24;
        deny all;
    }
}
# 除了 GET和HEAD 以外其它方法僅容許192.168.0.9/24主機使用

21)aio on | off | threads[=pool]

是否啓用aio功能

22)directio size | off

當文件大於等於給定大小時,例如directio 4m,同步到磁盤,而非寫緩存,以防數據丟失

23)open_file_cache off | max=N [inactive=time]

  • max=N:可緩存的緩存項上限;達到上限後會使用LRU算法實現管理
  • inactive=time:緩存項的非活動時長,在此處指定的時長內未被命中的或命中的次數少於open_file_cache_min_uses指令所指定的次數的緩存項即爲非活動項將被刪除

24)open_file_cache_errors on | off

是否緩存查找時發生錯誤的文件一類的信息,默認值爲off

25)open_file_cache_min_uses number

open_file_cache指令的inactive參數指定的時長內,至少被命中此處指定的次數方可被歸類爲活動項,默認值爲1

26)open_file_cache_valid time

緩存項有效性的檢查頻率,默認值爲60s

二、ngx_http_access_module 訪問控制模塊

基於ip的訪問控制功能

server {
        listen 80 default_server;
        server_name www.dongfei.tech;
        root /data/www/;
        location / {
            allow 192.168.0.0/24;
            deny all;
        }
    }

自上而下檢查,一旦匹配,將生效,條件嚴格的置前

三、ngx_http_auth_basic_module 用戶認證模塊

實現基於用戶的訪問控制,使用basic機制進行用戶認證

# mkdir /data/www/admin/
# echo admin area > /data/www/admin/index.html
    server {
        listen 80 default_server;
        server_name www.dongfei.tech;
        root /data/www/;
        location /admin {
            auth_basic "Admin Area";
            auth_basic_user_file /etc/nginx/.ngxpasswd;
        }
    }
# yum install httpd-tools -y
# htpasswd -cm /etc/nginx/.ngxpasswd user1
# htpasswd -m /etc/nginx/.ngxpasswd user2
# nginx -s reload
瀏覽器訪問:http://192.168.0.8/admin/  測試

四、ngx_http_stub_status_module 服務器狀態信息模塊

用於輸出nginx的基本狀態信息

server {
        listen 80 default_server;
        server_name www.dongfei.tech;
        root /data/www/;
        location /admin {
            auth_basic "Admin Area";
            auth_basic_user_file /etc/nginx/.ngxpasswd;
        }
        location /status {
            stub_status;
            allow 192.168.0.0/24;
            deny all;
        }
    }
# curl http://192.168.0.8/status/
Active connections: 3 
server accepts handled requests
       35      35      34
Reading: 0 Writing: 1 Waiting: 2

Active connections:當前狀態,活動狀態的鏈接數
accepts:統計總值,已經接受的客戶端請求的總數
handled:統計總值,已經處理完成的客戶端請求的總數
requests:統計總值,客戶端發來的總的請求數
Reading:當前狀態,正在讀取客戶端請求報文首部的鏈接的鏈接數
Writing:當前狀態,正在向客戶端發送響應報文過程當中的鏈接數
Waiting:當前狀態,正在等待客戶端發出請求的空閒鏈接數

五、ngx_http_log_module 日誌模塊

指定日誌格式記錄請求

1)log_format name string ...

string可使用nginx核心模塊及其它模塊內嵌的變量

2)access_log path [format [buffer=size][gzip[=level]][flush=time][if=condition]] 或 access_log off

http {
   log_format  customlog  '$remote_addr - $remote_user [$time_iso8601] "$request" '
                 '$status $body_bytes_sent "$http_referer" '
                 '"$http_user_agent" "$http_x_forwarded_for"';
   server {
        listen 80 default_server;
        server_name www.dongfei.tech;
        root /data/www/;
        access_log /var/log/nginx/www.dongfei.tech-access.log customlog buffer=32k;
    }
}

3)open_log_file_cache max=N [inactive=time][min_uses=N][valid=time]; 和 open_log_file_cache off;

緩存各日誌文件相關的元數據信息

max:緩存的最大文件描述符數量
min_uses:在inactive指定的時長內訪問大於等於此值方可被看成活動項
inactive:非活動時長
valid:驗證緩存中各緩存項是否爲活動項的時間間隔

六、ngx_http_gzip_module 壓縮傳輸模塊

用gzip方法壓縮響應數據,節約帶寬

1)gzip on | off; 啓用或禁用gzip壓縮

2)gzip_comp_level level; 壓縮比由低到高:1 到 9 ,默認:1

3)gzip_disable regex ...; 匹配到客戶端瀏覽器不執行壓縮

4)gzip_min_length length; 啓用壓縮功能的響應報文大小閾值

5)gzip_http_version 1.0 | 1.1; 設定啓用壓縮功能時,協議的最小版本,默認:1.1

6)gzip_buffers number size; 支持實現壓縮功能時緩衝區數量及每一個緩存區的大小,默認:32 4k 或 16 8k

7)gzip_types mime-type ...; 指明僅對哪些類型的資源執行壓縮操做;即壓縮過濾器,默認包含有text/html,不用顯示指定,不然出錯

8)gzip_vary on | off; 若是啓用壓縮,是否在響應報文首部插入「Vary: Accept-Encoding」

9)gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;

nginx充當代理服務器時,對於後端服務器的響應報文,在何種條件下啓用壓縮功能

  • off:不啓用壓縮
  • expired,no-cache, no-store,private:對後端服務器的響應報文首部Cache-Control值任何一個,啓用壓縮功能
server {
    listen 80 default_server;
    server_name www.dongfei.tech;
    root /data/www/;
    gzip on;
    gzip_comp_level 6;
    gzip_min_length 64;
    gzip_proxied any;
    gzip_types text/xml text/css text/plain application/javascript;
}

七、ngx_http_ssl_module 加密傳輸模塊

1)ssl on|off; 爲指定虛擬機啓用HTTPS protocol, 建議用listen指令代替

2)ssl_certificate file; 當前虛擬主機使用PEM格式的證書文件

3)ssl_certificate_key file; 當前虛擬主機上與其證書匹配的私鑰文件

4)ssl_protocols [SSLv2][SSLv3][TLSv1][TLSv1.1][TLSv1.2]; 支持ssl協議版本,默認爲後三個

5)ssl_session_cache off | none | [builtin[:size]][shared:name:size];

  • none: 通知客戶端支持ssl session cache,但實際不支持
  • builtin[:size]:使用OpenSSL內建緩存,爲每worker進程私有
  • [shared:name:size]:在各worker之間使用一個共享的緩存

6)ssl_session_timeout time; 客戶端鏈接能夠複用ssl session cache中緩存的ssl參數的有效時長,默認5m

服務器配置示例:

[root@nginx ~]# cd /etc/pki/tls/certs/
[root@nginx certs]# vim Makefile
%.key:
    umask 77 ; \
    /usr/bin/openssl genrsa $(KEYLEN) > $@
[root@nginx certs]# make aa.crt
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:bj
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:aa.com
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:www.aa.com
[root@nginx certs]# make bb.crt
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:bj
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:bb.com
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:www.bb.com
[root@nginx certs]# mkdir /etc/nginx/conf.d/ssl/
[root@nginx certs]# mv aa.crt aa.key bb.crt bb.key /etc/nginx/conf.d/ssl/
[root@nginx ~]# vim /etc/nginx/conf.d/vhosts.conf
server {
    listen 443 ssl;
    server_name www.aa.com;
    root /data/www/aa/;
    ssl_certificate /etc/nginx/conf.d/ssl/aa.crt;
    ssl_certificate_key /etc/nginx/conf.d/ssl/aa.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
}
server {
    listen 443 ssl;
    server_name www.bb.com;
    root /data/www/bb/;
    ssl_certificate /etc/nginx/conf.d/ssl/bb.crt;
    ssl_certificate_key /etc/nginx/conf.d/ssl/bb.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
}
[root@nginx ~]# mkdir -pv /data/www/{aa,bb}
[root@nginx ~]# echo "aa test page" > /data/www/aa/index.html
[root@nginx ~]# echo "bb test page" > /data/www/bb/index.html
[root@nginx ~]# nginx

客戶端測試:

[root@client ~]# vim /etc/hosts
192.168.0.8 www.aa.com www.bb.com
[root@client ~]# curl -k https://www.aa.com/
aa test page
[root@client ~]# curl -k https://www.bb.com/
bb test page

八、ngx_http_rewrite_module URI重寫模塊

將用戶請求的URI基於PCRE regex所描述的模式進行檢查,然後完成重定向替換

1)rewrite regex replacement [flag]

將用戶請求的URI基於regex所描述的模式進行檢查,匹配到時將其替換爲replacement指定的新的URI

若是在同一級配置塊中存在多個rewrite規則,那麼會自下而下逐個檢查;被某條件規則替換完成後,會從新一輪的替換檢查

隱含有循環機制,但不超過10次;若是超過,提示500響應碼,[flag]所表示的標誌位用於控制此循環機制

若是replacement是以http://或https://開頭,則替換結果會直接以重向返回給客戶端, 即永久重定向301

[flag]:

  • last:重寫完成後中止對當前URI在當前location中後續的其它重寫操做,然後對新的URI啓動新一輪重寫檢查;提早重啓新一輪循環,不建議在location中使用
  • break:重寫完成後中止對當前URI在當前location中後續的其它重寫操做,然後直接跳轉至重寫規則配置塊以後的其它配置;結束循環,建議在location中使用
  • redirect:臨時重定向,重寫完成後以臨時重定向方式直接返回重寫後生成的新URI給客戶端,由客戶端從新發起請求;使用相對路徑,或者http://或https://開頭,狀態碼:302
  • permanent:重寫完成後以永久重定向方式直接返回重寫後生成的新URI給客戶端,由客戶端從新發起請求,狀態碼:301

2)return

return code [text];

return code URL;

return URL;

中止處理,並返回給客戶端指定的響應碼

3)rewrite_log on | off;

是否開啓重寫日誌, 發送至error_log(notice level)

4)set $variable value;

用戶自定義變量;注意:變量定義和調用都要以$開頭

5)if (condition) { ... }

條件知足時,執行配置塊中的配置指令;server, location

condition:

  • = 相同 != 不一樣
  • ~:模式匹配,區分字符大小寫
  • ~*:模式匹配,不區分字符大小寫
  • !~:模式不匹配,區分字符大小寫
  • !~*:模式不匹配,不區分字符大小寫
  • -e, !-e 存在(包括文件,目錄,軟連接)
  • -f, !-f 文件 -d, !-d 目錄 -x, !-x 執行

實現http重定向到https

server {
    listen 80 default_server;
    listen 443 ssl;
    server_name www.aa.com;
    root /data/www/aa;
    ssl_certificate /etc/nginx/conf.d/ssl/aa.crt;
    ssl_certificate_key /etc/nginx/conf.d/ssl/aa.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    location / {
        if ( $scheme = http ) {
            rewrite / https://www.aa.com/ redirect;
        }
    }
}

九、ngx_http_referer_module 模塊

用來阻止Referer首部無有效值的請求訪問,可防止盜鏈

valid_referers none|blocked|server_names|string ...; 定義referer首部的合法可用值,不能匹配的將是非法值

  • none:請求報文首部沒有referer首部
  • blocked:請求報文有referer首部,但無有效值
  • server_names:參數,其能夠有值做爲主機名或主機名模式
  • arbitrary_string:任意字符串,但可以使用*做通配符
  • regular expression:被指定的正則表達式模式匹配到的字符串,要使用~開頭,例如: ~.*\.dongfei\.com
[root@nginx ~]# cp /usr/share/backgrounds/night.jpg /data/www/aa/
[root@nginx ~]# vim /data/www/bb/index.html
bb test page
<img src=http://www.aa.com/night.jpg>  #bb.com網站盜鏈aa.com網站圖片
[root@nginx ~]# vim /etc/nginx/conf.d/vhosts.conf
server {
    listen 80;
    server_name www.aa.com;
    root /data/www/aa;
    valid_referers none block server_names *.aa.com ~\.aa\.;  #只有從aa.com訪問的才能夠瀏覽
    if  ($invalid_referer)  {
        return 403  http://www.aa.com;
    }
}
server {
    listen 80;
    server_name www.bb.com;
    root /data/www/bb/;
}
如今訪問www.bb.com沒法獲取aa.com的圖片了

十、ngx_http_proxy_module 反向代理模塊

反向代理:轉發請求至另外一臺主機

1)proxy_pass URL; proxy_pass後面路徑不帶uri時,會將location的uri傳遞(附加)給後端主機

server {
    listen 80;
    server_name www.aa.com;
    location /admin {
        proxy_pass http://192.168.0.9/;  #帶" / "
    }
}
訪問http://www.aa.com時至關於訪問 http://192.168.0.9/
server {
    listen 80;
    server_name www.aa.com;
    location /admin {
        proxy_pass http://192.168.0.9;  #不帶" / "
    }
}
訪問http://www.aa.com時至關於訪問 http://192.168.0.9/admin

若是location定義其uri時使用了正則表達式的模式,則proxy_pass以後必須不能使用uri; 用戶請求時傳遞的uri將直接附加至後端服務器以後

2)proxy_set_header field value; 設定發日後端主機的請求報文的請求首部的值

proxy_set_header X-Real-IP  $remote_addr;  #$remote_addr客戶端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  #$proxy_add_x_forwarded_for代理IP

配合日誌記錄實現後端web服務器記錄真正的客戶端地址:

[root@nginx ~]# vim /etc/nginx/conf.d/vhosts.conf
server {
    listen 80 default_server;
    server_name www.aa.com;
    location / {
        proxy_pass http://192.168.0.9/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
[root@nginx-1 ~]# vim /etc/nginx/nginx.conf
listen       80;
listen       [::]:80;
log_format  mylogformat  '$http_x_forwarded_for - $remote_user [$time_iso8601] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
[root@nginx-1 ~]# vim /etc/nginx/conf.d/vhosts.conf
server {
    listen 80 default_server;
    server_name www.aa.com;
    root /data/www/aa/;
    access_log /var/log/nginx/www.aa.com-access.log mylogformat;
}
root@nginx-1 ~]# mkdir -pv /data/www/aa/
[root@nginx-1 ~]# echo www.aa.com test page on nginx-1 > /data/www/aa/index.html
[root@nginx-2 ~]# curl www.aa.com
www.aa.com test page on nginx-1
[root@nginx-1 ~]# tail -f /var/log/nginx/www.aa.com-access.log
192.168.0.10 - - [2018-07-07T14:34:07+08:00] "GET / HTTP/1.0" 200 32 "-" "curl/7.29.0" "192.168.0.10"  #顯示的是真正的客戶端的IP地址

3)proxy_cache_path; 定義可用於proxy功能的緩存,在http中定義

proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

配置代理緩存示例:在http配置定義緩存信息

[root@nginx ~]# vim /etc/nginx/nginx.conf
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;
[root@nginx ~]# mkdir /var/cache/nginx/

proxycache:20m 指內存中緩存的大小,主要用於存放key和metadata

max_size=1g 指磁盤存入文件內容的緩存空間最大值

[root@nginx ~]# vim /etc/nginx/conf.d/vhosts.conf
server {
    listen 80 default_server;
    server_name www.aa.com;
    location / {
        proxy_pass http://192.168.0.9/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_cache proxycache;
        proxy_cache_key $request_uri;
        proxy_cache_valid 200 302 301 1h;
        proxy_cache_valid any 1m;
    }
}
[root@nginx ~]# tree /var/cache/nginx/proxy_cache/
/var/cache/nginx/proxy_cache/
└── 9
    └── d
        └── 7
            └── 6666cd76f96956469e7be39d750cc7d9

4)proxy_cache zone|off; 默認off ,指明調用的緩存,或關閉緩存機制

5)proxy_cache_key string; 緩存中用於「鍵」的內容

默認值:proxy_cache_key $scheme$proxy_host$request_uri;

6)proxy_cache_valid [code ...] time; 定義對特定響應碼的響應內容的緩存時長,定義在http{...}中

7)proxy_cache_use_stale; 在被代理的後端服務器出現哪一種狀況下,能夠真接使用過時的緩存響應客戶端

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...

8)proxy_cache_methods GET | HEAD | POST ...; 對哪些客戶端請求方法對應的響應進行緩存,GET和HEAD方法老是被緩存

9)proxy_hide_header field; 默認nginx在響應報文不傳遞後端服務器的首部字段Date, Server, X-Pad, X-Accel-等,用於隱藏後端服務器特定的響應首部

10)proxy_connect_timeout time; 定義與後端服務器創建鏈接的超時時長,如超時會出現502錯誤,默認爲60s,通常不建議超出75s

11)proxy_send_timeout time; 將請求發送給後端服務器的超時時長;默認爲60s

12)proxy_read_timeout time; 等待後端服務器發送響應報文的超時時長,默認爲60s

十一、ngx_http_headers_module 模塊

向由代理服務器響應給客戶端的響應報文添加自定義首部,或修改指定首部的值

1)add_header name value [always]; 添加自定義首部

add_header X-Via  $server_addr;
add_header X-Cache $upstream_cache_status;
add_header X-Accel $server_name;

2)add_trailer name value [always]; 添加自定義響應信息的尾部

十二、ngx_http_fastcgi_module 模塊

轉發請求到FastCGI服務器,不支持php模塊方式

1)fastcgi_pass address; address爲後端的fastcgi server的地址;可用位置:location, if in location

2)fastcgi_index name; fastcgi默認的主頁資源;fastcgi_index index.php;

3)fastcgi_param parameter value [if_not_empty]; 設置傳遞給 FastCGI服務器的參數值,能夠是文本,變量或組合

4)fastcgi_cache_path path ... 定義fastcgi的緩存:

fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time][purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

path:緩存位置爲磁盤上的文件系統
max_size=size:磁盤path路徑中用於緩存數據的緩存空間上限
levels=levels:緩存目錄的層級數量,以及每一級的目錄數量
levels=ONE:TWO:THREE:示例:leves=1:2:2
keys_zone=name:size:k/v映射的內存空間的名稱及大小
inactive=time:非活動時長

5)fastcgi_cache zone|off; 調用指定的緩存空間來緩存數據,可用位置:http, server, location

6)fastcgi_cache_key string; 定義用做緩存項的key的字符串,示例:fastcgi_cache_key $request_rui;

7)fastcgi_cache_methods GET | HEAD | POST ...; 爲哪些請求方法使用緩存

8)fastcgi_cache_min_uses number; 緩存空間中的緩存項在inactive定義的非活動時間內至少要被訪問到此處所指定的次數方可被認做活動項

9)fastcgi_keep_conn on | off; 收到後端服務器響應後,fastcgi服務器是否關閉鏈接,建議啓用長鏈接

10)fastcgi_cache_valid [code ...] time; 不一樣的響應碼各自的緩存時長

示例:配置 lnmp

[root@lnmp ~]# yum install nginx php-fpm php-mysql mariadb -y
[root@lnmp ~]# cp /etc/nginx/nginx.conf{,.bak}
[root@lnmp ~]# vim /etc/nginx/conf.d/lnmp.conf
server {
    listen       80 default_server;
    server_name  www.dongfei.tech;
    root         /data/www;
    location / {
        root /data/www;
        index index.php index.html;
    }
    location ~* \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /data/www/$fastcgi_script_name;
            include fastcgi_params;
    }
    location ~* ^/(status|ping)$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_param  SCRIPT_FILENAME  $fastcgi_script_name;
            include fastcgi_params;
    }
}
[root@lnmp ~]# vim /etc/php-fpm.d/www.conf
pm.status_path = /status
ping.response = pong
ping.path = /ping
[root@lnmp ~]# systemctl enable nginx.service php-fpm.service
[root@lnmp ~]# systemctl start nginx.service php-fpm.service
[root@lnmp ~]# mkdir /var/cache/nginx/
[root@lnmp ~]# mkdir -pv /data/www/
[root@lnmp ~]# vim /data/www/index.php
<?php
phpinfo();
?>
測試:
# curl 192.168.0.8/status  #查看PHP的工做狀態
pool:                 www
process manager:      dynamic
start time:           07/Jul/2018:16:27:07 +0800
start since:          1463
accepted conn:        9
listen queue:         0
max listen queue:     0
listen queue len:     128
idle processes:       4
active processes:     1
total processes:      5
max active processes: 1
max children reached: 0
slow requests:        0
# curl 192.168.0.8/ping  #測試PHP進程是否工做
pong
訪問 http://192.168.0.8/

1三、ngx_http_upstream_module 反向代理調度模塊

用於將多個服務器定義成服務器組,而由proxy_pass, fastcgi_pass等指令進行引用,實現健康檢查,負載均衡的功能

1)upstream name { ... } 定義後端服務器組,會引入一個新的上下文,默認調度算法是wrr,在http中定義

2)server address [parameters]; 在upstream上下文中server成員,以及相關的參數

address:

  • unix: /PATH/TO/SOME_SOCK_FILE socket文件
  • IP[:PORT] IP加端口
  • HOSTNAME[:PORT] 主機名加端口

parameters:

  • weight=number 權重,默認爲1
  • max_conns 鏈接後端報務器最大併發活動鏈接數,1.11.5版本後支持
  • max_fails=number 失敗嘗試最大次數;超出此處指定的次數時,server將被標記爲不可用,默認爲1
  • fail_timeout=time 後端服務器標記爲不可用狀態的鏈接超時時長,默認10s
  • backup 將服務器標記爲「備用」,即全部服務器均不可用時才啓用
  • down 標記爲「不可用」,配合ip_hash使用,實現灰度發佈

3)ip_hash 源地址hash調度方法

4)least_conn 最少鏈接調度算法,當server擁有不一樣的權重時其爲wlc,當全部後端主機鏈接數相同時,則使用wrr,適用於長鏈接

5)hash key [consistent]

基於指定的key的hash表來實現對請求的調度,此處的key能夠直接文本、變量或兩者組合

將請求分類,同一類請求將發往同一個upstream server,使用consistent參數,將使用ketama一致性hash算法,適用於後端是Cache服務器(如varnish)時使用

hash $request_uri consistent;
hash $remote_addr;

6)keepalive 鏈接數N:爲每一個worker進程保留的空閒的長鏈接數量,可節約nginx端口,並減小鏈接管理的消耗

7)health_check [parameters]; 健康狀態檢測機制;只能用於location上下文,僅對nginx plus有效

  • interval=time檢測的頻率,默認爲5秒
  • fails=number:斷定服務器不可用的失敗檢測次數;默認爲1次
  • passes=number:斷定服務器可用的失敗檢測次數;默認爲1次
  • uri=uri:作健康狀態檢測測試的目標uri;默認爲/
  • match=NAME:健康狀態檢測的結果評估調用此處指定的match配置塊

8)match name { ... } 對backend server作健康狀態檢測時,定義其結果判斷機制;只能用於http上下文,僅對nginx plus有效

  • status code[ code ...]: 指望的響應狀態碼
  • header HEADER[operator value]:指望存在響應首部,也可對指望的響應首部的值基於比較操做符和值進行比較
  • body:指望響應報文的主體部分應該有的內容

示例:實現反向代理的負載均衡功能

web1:

[root@web1 ~]# yum install httpd -y
[root@web1 ~]# echo web1 test page. > /var/www/html/index.html
[root@web1 ~]# vim /etc/httpd/conf/httpd.conf
LogFormat "%{client_ip}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# systemctl enable httpd

web2:

[root@web2 ~]# yum install httpd -y
[root@web2 ~]# echo web2 test page. > /var/www/html/index.html
[root@web2 ~]# vim /etc/httpd/conf/httpd.conf
LogFormat "%{client_ip}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# systemctl enable httpd

proxy:

[root@proxy ~]# curl http://192.168.0.9/
web1 test page.
[root@proxy ~]# curl http://192.168.0.10/
web2 test page.
[root@proxy ~]# yum install nginx -y
[root@proxy ~]# vim /etc/nginx/nginx.conf  #在http中加入如下內容
http {
    upstream web {
        least_conn;
        server 192.168.0.9:80;
        server 192.168.0.10:80 weight=3;
    }
    proxy_cache_path /var/cache/nginx/proxy_cache
                     levels=1:1:1
                     keys_zone=proxycache:20m
                     inactive=120s
                     max_size=1g;
    server {
        location / {
            proxy_pass http://web;
            proxy_set_header client_ip $proxy_add_x_forwarded_for;
            proxy_cache proxycache;
            proxy_cache_key $request_uri;
            proxy_cache_valid 200 302 301 1h;
            proxy_cache_valid any 1m;
        }
    }
}
[root@proxy ~]# mkdir /var/cache/nginx/
[root@proxy ~]# nginx

在客戶端測試時不會看到調度的效果,想要看到調度的效果須要把緩存關閉

感謝閱讀!

相關文章
相關標籤/搜索