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.org
java
文檔:https://nginx.org/en/docs/
node
特性:python
功能:mysql
web服務功能:nginx
官方源: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
幫助文檔: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進程所可以打開的文件數量上限
events { worker_connections 1024; }
nginx高度模塊化,但其模塊早期不支持DSO機制;1.9.11版本支持動態裝載和卸載
核心模塊:core module
標準模塊:
- HTTP 模塊:ngx_http_*
- Mail 模塊 ngx_mail_*
- Stream 模塊 ngx_stream_*
第三方模塊:
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]
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]
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
基於ip的訪問控制功能
server { listen 80 default_server; server_name www.dongfei.tech; root /data/www/; location / { allow 192.168.0.0/24; deny all; } }
自上而下檢查,一旦匹配,將生效,條件嚴格的置前
實現基於用戶的訪問控制,使用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/ 測試
用於輸出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:當前狀態,正在等待客戶端發出請求的空閒鏈接數
指定日誌格式記錄請求
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:驗證緩存中各緩存項是否爲活動項的時間間隔
用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充當代理服務器時,對於後端服務器的響應報文,在何種條件下啓用壓縮功能
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; }
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];
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
將用戶請求的URI基於PCRE regex所描述的模式進行檢查,然後完成重定向替換
1)rewrite regex replacement [flag]
將用戶請求的URI基於regex所描述的模式進行檢查,匹配到時將其替換爲replacement指定的新的URI
若是在同一級配置塊中存在多個rewrite規則,那麼會自下而下逐個檢查;被某條件規則替換完成後,會從新一輪的替換檢查
隱含有循環機制,但不超過10次;若是超過,提示500響應碼,[flag]所表示的標誌位用於控制此循環機制
若是replacement是以http://或https://開頭,則替換結果會直接以重向返回給客戶端, 即永久重定向301
[flag]:
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:
實現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; } } }
用來阻止Referer首部無有效值的請求訪問,可防止盜鏈
valid_referers none|blocked|server_names|string ...; 定義referer首部的合法可用值,不能匹配的將是非法值
[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的圖片了
反向代理:轉發請求至另外一臺主機
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
向由代理服務器響應給客戶端的響應報文添加自定義首部,或修改指定首部的值
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]; 添加自定義響應信息的尾部
轉發請求到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/
用於將多個服務器定義成服務器組,而由proxy_pass, fastcgi_pass等指令進行引用,實現健康檢查,負載均衡的功能
1)upstream name { ... } 定義後端服務器組,會引入一個新的上下文,默認調度算法是wrr,在http中定義
2)server address [parameters]; 在upstream上下文中server成員,以及相關的參數
address:
parameters:
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有效
8)match name { ... } 對backend server作健康狀態檢測時,定義其結果判斷機制;只能用於http上下文,僅對nginx plus有效
示例:實現反向代理的負載均衡功能
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
在客戶端測試時不會看到調度的效果,想要看到調度的效果須要把緩存關閉
感謝閱讀!