第一節:nginx 配置
1.1 配置文件的組成部分
主配置文件:/nginx.conf
子配置文件:include conf.d/*.conf
fastcgi,uwsgi,scgi 等協議相關的配置文件
mime.types:支持的 mime 類型
1.2 主配置文件的配置指令
directive value [value2...];
1.3 注意
指令必須以分號結尾;
支持使用配置變量
內建變量:由 nginx 模塊引入,可直接引入
自定義變量:由用戶使用set命令定義
set variable_name value;
引用變量:$variable_name
1.4 主配置文件結構
1.5 http 協議相關的配置結構
1.6 main 全局配置段常見的配置指令分類
(1)正常運行必備的配置
user:指定 worker 進程的運行身份,組不指定,默認和用戶名同名
pid:指定存儲 nginx 主進程 PID 文件的路徑
include:指明包含進來的其他配置文件
load_module file:加載模塊的配置文件;裝載的動態模塊的路徑
(2)優化性能相關的配置
#worker進程的數量,通常為當前主機CPU物理核數 worker_processes number | auto; #提高緩存命中率 worker_cpu_affinity cpumask... | auto [cpumask]; #CPUMASK:00000001:0號CPU 00000010:1號CPU 10000000:8號CPU #例:worker_cpu_affinity 0001 0010; #指定worker進程的nice值,設定worker進程優先級 [-20,20] worker_priority number;
#worker進程所能打開的文件描述符 worker_rlimit_nofile number;
(3)用於調試及定位問題相關的配置
#是否以守護進程方式運行nginx,默認是守護進程 daemon on | off; #是否以master/worker模型運行nginx,默認為on master_process on | off; #錯誤日志文件及其級別,出於調試需要,可設定為debug,但debug僅在編譯時使用了“--with-debug”選項時才有效 error_log file [level]; 方式:file /path/logfile; stderr:發送到標准錯誤(可以將日志發送到遠程服務器上) syslog:server-address[,parameter=values]:發送到syslog memory:size內存 level:debug | info | notice | warn | error | crit | alter | emerg
(4)事件驅動相關的配置
#每個worker進程所能打開的最大並發連接數數量 worker_connections number; #總最大並發數:worker_processes * worker_connections; #指明並發連接請求的處理方法,默認自動選擇最優方法(例:use epoll;) use method; #處理新的連接請求的方法;on指由各個worker輪流處理新請求,off指每個新請求的到達都會通知(喚醒)所有的worker進程,但只有一個進程可獲得連接,造成“驚群”,影響性能 accept_mutex on | off;
2、與 http 服務相關的配置:ngx_http_core_module(http核心模塊)
1>server{
...
}配置一個虛擬主機
server { listen address[:port] port; server_name server_name; root /path/to/document_root; }
可以直接添加server到主配置文件/etc/nginx/nginx.conf中,也可以include包含調用,即可以自定義文件夾存放多個server主機,便於管理。
例:/apps/nginx/conf/*.conf //server主機存放站點目錄
在主配置文件http模塊引用:include /etc/nginx/conf/*.conf(而/etc/nginx/*.conf軟鏈接到/apps/nginx/conf/*.conf)
vim /apps/nginx/conf/www.a.com.conf
server {
...
}
vim /apps/nginx/conf/*.conf
...... //等等,每個主機單獨文件,以此方便server主機管理
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 發送緩沖區大小
server_name name...;
虛擬主機的主機名稱后可跟多個由空白字符分隔的字符串,支持*通配任意長度的任意字符
server_name *.boke.com www.boke.*
支持~起始的字符做正則表達式模式匹配,性能原因慎用
server_name ~^www\d+\.boke\.com$
說明:\d表示[0-9]
匹配優先級機制從高到低:
首先是字符串精確匹配 如:www.boke.com
左側*通配符 如:*.boke.com
右側*通配符 如:www.boke.*
正則表達式 如:~^.*\.boke\.com$
dafault_server
root:定義web資源的路徑映射,用於指明請求的URL所對應的文檔的目錄路徑
注意:
基於port;
listen port; 指令監聽在不同的端口
基於ip的虛擬主機
listen ip:port; ip地址不同
基於hostname
server_name fqdn; 指令指向不同的主機名
2>tcp_nodelay on | off;
在keepalived模式下的連接是否啟用tcp_nodelay選項
當為off時,延遲發送,合並多個請求后再發送,默認on時,不延遲發送
可用於:http,server,location
3>sendfile on | off;
是否啟用sendfile功能,在內核中封裝報文直接發送,默認off
4>server_tokens on | off | build | string;
是否在響應報文的server首部顯示nginx版本
5>location [= | ~ | ~* | ^~ | uri] {...}
說明:虛擬主機網頁文件及存放目錄:/www/site{a,b...}
虛擬主機配置目錄:/apps/nginx/conf/*.conf
配置:
[root@centos7 ~]#mkdir /www/sitea/test
[root@centos7 ~]#echo /www/sitea/test/index.html > /www/sitea/test/index.html
[root@centos7 ~]#vim /apps/nginx/conf/www.a.com.conf
server {
listen 80;
server_name www.a.com;
root /www/sitea;
location /test {
root /www/sitea/;
}
}
[root@centos7 ~]#systemctl restart nginx
測試(測試機提前做好域名解析):
[root@test ~]# curl www.a.com /www/sitea/html [root@test ~]# curl www.a.com/test/ //訪問網站www.a.com下的test/,相當於訪問/www/sitea/test/index.html,即location規則 /www/sitea/test/index.html
在一個server中location配置段可存在多個,用於實現從uri到文件系統的路徑映射,nginx會根據用戶請求的uri來檢查定義的所有location,並找出最佳匹配,而后應用其配置
=:對uri做精確匹配
^~:對uri的最左邊部分做匹配檢查,不區分字符大小寫
~:對uri做正則表達式模式匹配,區分字符大小寫
~*:對uri做正則表達式模式匹配,不區分字符大小寫
不帶符號:匹配起始於此uri的所有的uri
匹配優先級從高到低:
=,^~,~/~*,不帶符號
6>地址重寫
rewrite對稱url rewrite,即url重寫,就是把傳入web的請求重定向到其他url的過程。
(1)url rewrite最常見的應用是url偽靜態化,是將動態頁面顯示為靜態頁面方式的一種技術。即php轉換顯示為html,搜索引擎對靜態頁面的評分一般要高於動態頁面。所以,url rewrite可以讓我們網站的網頁更容易被搜索引擎所收錄,網址更簡潔。
(2)從安全角度上講,如果在url中暴露太多的參數,無疑會造成一定量的信息泄漏,所以靜態化的url地址可以給我們帶來更高的安全性。
(3)實現網站地址跳轉,例如用戶訪問 www.360buy.com,將其跳轉到 www.jd.com。例如當用戶訪問 tianyun.com 的 80 端口時,將其跳轉到 443 端口。
nginx 的 rewrite 功能需要 PCRE 軟件的支持,即通過 perl 兼容正則表達式語句進行規則匹配的。默認參數編譯 nginx 就會支持 rewrite 的模塊,但是也必須要 PCRE 的支持。
rewrite 是實現 URL 重寫的關鍵指令,根據 regex(正則表達式)部分內容,重定向到 replacement,結尾是 flag 標記。
rewrite 語法格式及參數語法說明如下:
rewrite <regex> <replacement> [flag];
關鍵字 正則 替代內容 flag 標記
關鍵字:其中關鍵字 rewrite 不能改變
正則:perl 兼容正則表達式語句進行規則匹配
替代內容:將正則匹配的內容替換成 replacement
flag 標記:rewrite 支持的 flag 標記
flag 標記說明:
last #本條規則匹配完成后,繼續向下匹配新的 location URI 規則
break #本條規則匹配完成即終止,不再匹配后面的任何規則
redirect #返回 302 臨時重定向,瀏覽器地址會顯示跳轉后的 URL 地址
permanent #返回 301 永久重定向,瀏覽器地址欄會顯示跳轉后的 URL 地址
7>alias path; 路徑別名,文檔映射的另一種機制
[root@centos7 ~]#mkdir /www/sitea/alias
[root@centos7 ~]#echo /www/sitea/alias/index.html > /www/sitea/alias/index.html
[root@centos7 ~]#vim /apps/nginx/conf/www.a.com.conf
server {
listen 80;
server_name www.a.com;
root /www/sitea;
location /bbs {
alias /www/sitea/alias/;
}
}
測試:
[root@test ~]# curl www.a.com/bbs/ /www/sitea/alias/index.html
8>index file...; 指定默認網頁文件,注意:ntp_http_index_module模塊
9>error_page code...[=[response]] uri;
模塊:ntp_http_core_module
定義錯誤頁,以指定的響應狀態碼進行響應
error_page 404 /404.html
error_page 404 =200 /404.html
[root@centos7 ~]#mkdir /www/sitea/error
[root@centos7 ~]#echo "current page error" > /www/sitea/error/404.html
[root@centos7 ~]#vim /apps/nginx/conf/www.a.com.conf
server {
listen 80;
server_name www.a.com;
root /www/sitea;
error_page 404 /404.html;
location /404.html {
root /www/sitea/error/;
}
}
[root@centos7 ~]#systemctl restart nginx
測試:
[root@test ~]# curl www.a.com/xxxxx
current page error
10>try_files file ... uri;
try_file file ... =code;
按順序檢查文件是否存在,返回第一個找到的文件或文件夾(結尾加斜線表示為文件夾),如果所有的文件或文件夾都找不到,會進行一個內部重定向到最后一個參數。只有最后一個參數可以引起一個內部重定向,之前的參數只設置內部uri的指向。最后一個參數是回退uri且必須存在,否則會出現內部505錯誤。
location /images/ { try_files $uri /images/default.html; }
11>定義客戶端請求的相關配置
keepalive_timeout timeout [header_timeout];
設定保持連接超時時長,0表示禁止長連接,默認為75s
keepalive_requests number;
在一次長連接上允許請求的資源的最大數量,默認為100
keepalive_disable none | browser ...
對那種瀏覽器禁用長連接
send_timeout time;
向客戶端發送響應報文的超時時長,此處是指兩次寫操作之間的間隔時長,而非整個響應過程的傳輸時長
client_body_buffer_size size;
用於接收每個客戶端請求報文的body部分的緩沖區大小,默認為16k。超出此大小時,其將被暫存到磁盤上的由下面client_body_temp_path指令所定義的位置
client_body_temp_path path [level1 [level2 [level3]]];
設定存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量
目錄名為16進制的數字;
client_body_temp_path /var/tmp/client body 1 2 2
1 1級目錄占1位16進制,即2^4=16個目錄0-f
2 2級目錄占2位16進制,即2^8=256個目錄00-ff
2 3級目錄占2位16進制,即2^8=256個目錄00-ff
12>對客戶端進行限制的相關配置
limit_rate rate;
限制響應給客戶端的傳輸速率,單位是bytes/second
默認值0表示無限制
limit_except method ... {...},僅用於location
限制客戶端使用除了指定的請求方法之外的其他方法
method:GET,HEAD,POST,PUT,DELETE
MKCOL,COPY,MOVE,OPTIONS,PROPFIND,PROPPATCH,LOCK,UNLOCK,PATCH
limit_except GET { allow 192.168.1.0/24; deny all; }除了GET和HEAD之外其他方法僅允許192.168.1.0/24網段主機使用
13>文件操作優化的配置
aio on | off | threads[=poll]; //是否啟用aio功能
directio size | off; //直接io
當文件大於等於給定大小時,例如directio 4M,同步(直接)寫磁盤,而非寫緩存
open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以緩存以下三種信息:
(1)文件元數據:文件的描述符、文件大小和最近一次的修改時間
(2)打開的目錄結構
(3)沒有找到的或者沒有權限訪問的文件的相關信息
max=N:可緩存的緩存項上限;達到上限后會使用LRU算法(最近最少使用算法)實現管理
inactive=time:緩存項的非活動時長,在此處指定的時長內未被命中的或命中的次數少於open_file_cache_min_uses指令所指定的次數的緩存項即為非活動項,將被刪除
open_file_cache_errors on | off;
是否緩存查找時發生錯誤的文件一類的信息,默認值為off
open_file_cache_min_uses number;
open_file_cache指令的inactive參數指定的時長內,至少被命中此處指定的次數方可被歸類為活動項,默認值為1
open_file_cache_valid time;
緩存項有效性的檢查頻率,默認值為60s
3、ngx_http_access_module模塊:實現基於ip的訪問控制功能
allow address | CIDR | unix: | all;
deny address | CIDR | unix: | all;
http,server,location,limit_except
自上而下檢查,一旦匹配,將生效,條件嚴格的置前
示例:
location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 127.0.0.0/8; allow 2001:0db8:/32; deny all; }
4、ngx_http_auth_basic module模塊:實現基於用戶的訪問控制,使用basic機制進行用戶認證
auth_basic string | off;
auth_basic_user_file file;
location /admin/ { auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/.ngxpasswd; } //對目錄進行訪問驗證
例:
[root@centos7 ~]#vim /apps/nginx/conf/www.a.com.conf
server {
listen 80;
server_name www.a.com;
root /www/sitea;
auth_basic "login info"; //設置提示信息
auth_basic_user_file "/www/sitea/.nginxuser"; //用戶密碼文件路徑(放到server里,對整個網站加密,也可以對特定目錄加密)
location /test {
root /www/sitea/;
}
error_page 404 /404.html;
location /404.html {
root /www/sitea/error/;
}
}
[root@centos7 ~]#cd /www/sitea/
[root@centos7 sitea]#htpasswd -cm .nginxuser user1 //該命令依靠httpd-tools包,沒有該命令的請安裝httpd-tools
New password:
Re-type new password:
Adding password for user user1
[root@centos7 sitea]#htpasswd -m .nginxuser user2 //第一次創建用戶生成密碼需要-c選項,第二次不需要
New password:
Re-type new password:
Adding password for user user2
[root@centos7 sitea]#cat .nginxuser
user1:$apr1$bSbhPGpb$4xbxLI7yphxRFLjn2a2GX1
user2:$apr1$d15.Dgzq$xSYRxSsZv4lPI/q0zkXw31
[root@centos7 ~]#systemctl restart nginx //重啟服務
瀏覽器測試:
用戶口令文件:
明文文本:格式name:password:comment
加密文本:由htpasswd命令實現
httpd-tools所提供
5、ngx_ http_ stub_status_ module模塊:用於輸出nginx的基本狀態信息(狀態頁),配合監控軟件實現狀態監控
輸出信息示例:
Active connections: 291 //活動連接 server accepts handled requests //服務器接收、處理的請求 16630948 16630948 31070465 //分別對應accepts,handled,requests 三個值 Reading: 6 Writing: 179 Waiting: 106
Active connections:當前狀態,活動狀態的連接數
accepts:統計總值,已經接受的客戶端請求的總數
handled:統計總值,已經處理完成的客戶端請求的總數
requests:統計總值,客戶端發來的總的請求數
Reading:當前狀態,正在讀取客戶端請求報文首部的連接的連接數
Writing:當前狀態,正在向客戶端發送響應報文過程中的連接數
Waiting:當前狀態,正在等待客戶端發出請求的空閑連接數
stub_status;
示例:
[root@centos7 sitea]#vim /apps/nginx/conf/www.a.com.conf
server {
listen 80;
server_name www.a.com;
root /www/sitea;
location /status {
stub_status;
auth_basic "login info";
auth_basic_user_file "/www/sitea/.nginxuser"; //將用戶的訪問限制放到狀態頁,對查看狀態頁信息加以限制
}
error_page 404 /404.html;
location /404.html {
root /www/sitea/error/;
}
}
[root@centos7 sitea]#systemctl restart nginx
6、ngx_http_log_module模塊:指定日志格式記錄請求,只能在http模塊
1>log_format name string ...;
string可以使用nginx核心模塊及其它模塊內嵌的變量
2>access_log path [format [buffer=size] [gzip[ =level]] [flush=time] [if=condition]]; 可以放到http、server
access_log off;
訪問日志文件路徑,格式及相關的緩沖的配置
buffer=size
flush=time
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:驗證緩存中各緩存項是否為活動項的時間間隔
7、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;
支持實現壓縮功能時緩沖區數量及每個緩存區的大小,默認:324k或168k
7>gzip_types mime-typel ...;
指明僅對哪些類型的資源執行壓縮操作,即壓縮過濾器
默認包含有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值任何一個,啟用壓縮功能
示例:
gzip on; gzip_comp_level 6; gzip_min_length 64; gzip_proxied any; gzip_types text/xml text/css application/javascript;
curl -I --compressed http://192.168.129.128/test.html //--compressed啟用壓縮
8、ngx_http_ssI_module模塊:
1>ssl on | off;
為指定虛擬機啟用HTTPS protocol,建議用listen指令代替
2>ssI_certificate file;
當前虛擬主機使用PEM格式的證書文件
3>ssl_certificate_key file;
當前虛擬主機上與其證書匹配的私鑰文件
4>ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];支持ssl協議版本,默認為后三個
5>ssI_session_cache off | none | [builtin[:size]] [shared:name:size];
none:通知客戶端支持ssI session cache,但實際不支持
builtin[:size]:使用OpenSSL內建緩存,為每worker進程私有
[shared:name:size]:在各worker之間使用一個共享的緩存
9、ngx_http_proxy_module
1>正向代理:局域網內的機器借助於代理服務器訪問局域網外的網站
這時正向代理的功能:
(1)增強局域網內部網絡安全
(2)利用正向代理可以堆局域網對外網的訪問進行必要的監控和管理
注意:正向代理服務不支持外部對內部網絡的請訪問求
2>與正向代理相反,如果局域網向外網提供資源,讓外網上的其他用戶可以訪問局域網內的資源,這時候可以設置一個代理服務器,而這個代理服務器它提供服務就叫做 反向代理服務器
3>ngx_http_proxy_module 模塊常見指令解釋
ngx_http_proxy_module 模塊允許將請求傳遞給另一個服務器
(1)proxy_pass URL;
該指令用於設置被代理服務器的協議、主機名、 IP 地址和端口等形式。
Context: location, if in location, limit_except
注意:proxy_pass 后面的路徑不帶 uri 時,其會將 location 的 uri 傳遞給后端 主機;
proxy_pass 后面的路徑是一個 uri時,其會將 location的 uri替換為 proxy_pass的 uri;
如果 location 定義其 uri 時使用了正則表達式的模式,或在 if 語句 或 limt_execept 中使用 proxy_pass 指令,則 proxy_pass 之后必須不能使用 uri; 用戶請求時傳遞的 uri 將直接附加代理到的服務的之后;
(2)proxy_set_header field value;
設定發往后端主機的請求報文的請求首部的值;
Context: http, server, location
Field:要更改信息所在的頭域
Value:更改的值,支持使用文本、變量或者變量的組合
示例:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
(3)proxy_cache_path
定義可用於 proxy 功能的緩存; Context: http
proxy_cache_path path [levels=levels] [use_temp_path=on|off]
keys_zone=name:size [inactive=time] [max_size=size]…
levels:設置在對於 path 指定目錄的第幾級 hash 目錄中緩存數據
key_zone:Nginx 服務器的緩存索引從簡進程在內存中為緩存數據建立索引,用來定義放存緩存索引的內存區域的名稱和大小
inactive:表示緩存有效時間
max_size:設置硬盤中緩存數據大大小
(4)proxy_cache zone | off;
指明要調用的緩存,或關閉緩存機制;
Context: http, server, location
(5)proxy_cache_key string;
緩存中用於 “鍵”的內容;
默認值:proxy_cache_key $scheme$proxy_host$request_uri;
(6)proxy_cache_valid [code …] time;
定義對特定響應碼的響應內容的緩存時長;
(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 …;
如果Nginx在訪問被代理服務器過程中出現被代理服務器無法訪問或者訪問錯誤等現象時,Niginx 服務器可以使用歷史緩存響應客戶端的請求,這些數據不一定和被代理服務器上的最新的數據相一致,但對於更新頻率不高的后端服務器來說,nginx 服務器的該功能在一定程度上能夠為客戶端提供不間斷訪問
(8)proxy_cache_methods GET | HEAD | POST …;
根據客戶端請求報文請求方式,來選着需要緩存的數據
(9)proxy_hide_header field;
該指令用於設置 nginx 服務器在發送響應報文時,隱藏一些頭信息
(10)proxy_connect_timeout time;
該指令來設定 nginx 服務器域后端被代理服務器嘗試連接的超時時間。默認為 60s;最長為 75s;
(11)proxy_read_timeout time;
該指令設置 nginx 服務器向后端被代理服務器發出 read 請求后,等待響應的超時時間
(12)proxy_send_timeout time;
該指令設置 nginx 服務器向后端被代理服務器發出 write 請求后,等待響應的超時時間
更多模塊學習請訪問nginx官網:https://nginx.org→[documentation]→[Modules reference]進行學習