===========================================
Nginx官網:http://nginx.org/
Nginx官網下載地址(選擇 Stable version 穩定版):http://nginx.org/en/download.html
官網安裝介紹:http://nginx.org/en/linux_packages.html
一:安裝
nginx 顯示目錄
http {
autoindex on; # 自動顯示目錄
autoindex_exact_size off; # 人性化方式顯示文件大小否則以byte顯示
autoindex_localtime on; # 按服務器時間顯示,否則以gmt時間顯示
}
二:配置
2.1:
2.2:
配置:
配置文件 的組成部分:
主配置文件:nginx.conf
include conf.d/*.conf
facscgi, scgi, uwscgi的相關配置
mime.types
配置指令(必須以分號結尾):
directive value1 [value2...];
支持使用變量:
內置變量:由模塊引入,可直接引用;
自定義變量:set variable_name value;
引用變量:$variable_name
配置文件結構:
main block:全局配置;
event {
...
}:事件驅動的相關配置;
http {
...
}:http協議的相關配置
mail {
...
}:mail相關的配置;
http相關的配置:
http {
...
...
server {
...
server_name
root
alias
location /uri/ {
...
}
...
}
server {
...
...
}
}
main block:
配置指令的類別:
正常運行必備的配置;
優化性能的配置;
用於調試、定位問題的配置;
正常運行必備的配置:
1、user USERNAME [GROUPNAME];
指定用於運行worker進程的用戶和組;
user nginx nginx;
2、pid /PATH/TO/PID_FILE;
指定nginx進程的pid文件路徑;
pid /var/run/nginx.pid;
3、worker_rlimit_nofile number;
單個worker進程所能夠打開的最大文件數;
性能優化相關的配置:
1、 worker_processes number | auto;
worker的進程數;通常應該爲CPU的核心數減1;
2、worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
CPUMASK:
0000 0001
0000 0010
0000 0100
0000 1000
0001 0000
...
3、worker_priority nice;
[-20,19]
100-139
調試、定位問題:
1、daemon on | off;
是否以守護進程方式啓動nginx進程;
2、master_process on | off;
是否以master/worker模型啓動nignx進程;
3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
錯誤日誌文件的記錄方式,及其日誌級別:
方式:
file /PATH/TO/SOME_LOG_FILE;
stderr:發送到錯誤輸出;
syslog:server=address[,parameter=value]:發送給syslog服務器;
memory:size
日誌級別:
debug依賴於configure時的--with-debug選項;
回顧:IO模型、nginx
IO模型:
阻塞式
非阻塞式
IO複用(select, poll)
信號驅動的IO(epoll, kqueue, /dev/poll)
AIO
階段:等待數據準備完成,複製數據(從內核緩衝區到進程的地址空間)
nginx:master/worker
master
worker()
cache loader
cache manager
模塊類別:核心模塊、標準模塊(http標準模塊,http可選模塊,mail模塊)、3rd模塊
nginx.conf
main block
event {
...
}
http {
...
server {
...
server_name
root
location /uri/ {
...
}
}
server {
...
}
}
Nginx(2)
nginx.conf:
main block
events {
...
}
1、worker_connections number;
每個worker進程所能夠併發打開的最大連接數;
worker_processes * worker_connections
2、use method;
指明併發連接請求處理時使用的方法;
use epoll;
3、accept_mutex on | off;
啓用時,表示用於讓多個worker輪流地、序列化地響應新請求;
http {
...
}
定義套接字相關功能
1、server { ... }
配置一個虛擬主機;
server {
listen PORT;
server_name HOSTNAME;
root /PATH/TO/DOCUMENTROOT;
...
}
注意:
(1) 基於port的虛擬主機:
listen指令要使用不同的端口;
(2) 基於Hostname的虛擬主機;
server_name指令指向不同的主機名;
(3) 基於ip的虛擬主機:
listen IP:PORT;
2、listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
listen port [default_server] [ssl];
listen unix:path [default_server] [ssl] ;
default_server:默認虛擬主機;
ssl:限制只能通過ssl連接提供服務;
backlog:後緩隊列的長度;
rcvbuf:接收緩衝大小;
sndbuf:發送緩衝區大小;
3、server_name name ...;
指明當前server的主機名;後可跟一個或空白字符分隔的多個主機;
支持使用*任意長度的任意字符;
支持~起始的正則表達式模式字符串;
應用策略:
(1) 首先精確匹配;
(2) 左則*通配符匹配;
(3) 右側*通配符匹配;
(4) 正則表達式模式匹配;
server_name www.magedu.com;
server_name *.magedu.com;
server_name www.magedu.*;
server_name ~^.*\.magedu\..*$;
mail.magedu.com, www.magedu.com
4、tcp_nodelay on|off;
對keepalived模式下的連接是否啓用TCP_NODELAY選項;
5、sendfile on | off;
是否啓用sendfile功能;
定義路徑相關配置
6、root path;
設置web資源路徑映射;用於指明用戶請求的url所對應的本地文件系統上的文檔所在目錄路徑;
可用上下文:http, server, location, if
7、location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
根據用戶請求的URI來匹配定義的location,匹配到時,此請求將被相應的location塊中的指令所處理;
server {
...
location {
}
location {
...
}
}
=:URI精確匹配;
~:做正則表達式模式匹配,區分字符大小寫;
~*:做正則表達式模式匹配,不區分字符大小寫;
^~:對URI的左半部分做匹配檢查,不區分字符大小寫;
匹配優先級:=、^~、~/~*、不帶符號;
8、alias path;
定義路徑別名,文檔映射的一種機制;僅能用於location上下文;
alias /bbs/ /web/forum/
http://www.magedu.com/bbs/a.jpg
location /bbs/ {
alias /web/forum/;
}
/web/forum/a.jpg
location /bbs/ {
root /web/forum/;
}
/web/forum/bbs/a.jpg
注意:
root指令:給定的路徑對應於location中的/uri/左側的/;
alias指令:給定的路徑對應於location中的/uri/右側的/;
9、index file ...;
可用位置:http, server, location
默認主面;
10、error_page code ... [=[response]] uri;
根據用戶請求的資源的http響應的狀態碼實現錯誤頁重定向;
http://www.magedu.com/hello.html --> 因爲資源不存在而被改爲對
http://www.magedu.com/404.html
11、
定義客戶端請求的相關配置
12、keepalive_timeout timeout [header_timeout];
設定保持連接的超時時長,0表示禁止長連接 ;默認爲75s;
13、keepalive_requests number;
在一次長連接上所允許請求的資源的最大數量,默認爲100;
14、keepalive_disable none | browser ...;
對哪種瀏覽器禁用長連接;
15、send_timeout time;
向客戶端發送響應報文的超時時長; 特別地,是指兩次寫操作之間的間隔時長;
16、client_body_buffer_size size;
用於接收客戶端請求報文的body部分的緩衝區大小;默認爲16k;超時此大小時,其將被暫存到磁盤上;
17、client_body_temp_path path [level1 [level2 [level3]]];
設定用於存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量;
/var/tmp/body 2 1 2
00-ff
對客戶的請求進行限制的相關配置:
18、limit_rate rate;
限制響應給客戶端的傳輸速率,單位是bytes/second,0表示無限制;
19、limit_except method ... { ... };
限制對指定的請求方法之外的其它方法的使用客戶端;
limit_except GET POST {
allow 172.18.0.0/16;
deny all;
}
表示除了GET和POST之外的其它方法僅允許172.18.0.0/16中的主機使用;
文件操作優化的配置:
20、aio on | off | threads[=pool];
是否啓用aio功能;
21、directio size | off;
22、open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以緩存以下三種信息:
(1) 文件的描述符、文件大小和最近一次的修改時間;
(2) 打開的目錄的結構;
(3) 沒有找到的或者沒有權限訪問的文件的相關信息;
max=N:可緩存的緩存項上限;達到上限後會使用LRU算法實現緩存管理;
inactive=time:緩存項的超時時長,在此處指定的時長內未被命中的緩存項即爲非活動項;
23、open_file_cache_errors on | off;
是否緩存查找時發生錯誤的文件一類的信息;
24、open_file_cache_min_uses number;
在open_file_cache指令的inactive參數指定的時長內,至少命中此處指定的次數方可不被歸類到非活動項;
25、open_file_cache_valid time;
緩存項有效性的檢查頻率;默認是60s;
ngx_http_access_module模塊:
實現基於ip的訪問控制功能;
26、allow address | CIDR | unix: | all;
27、deny address | CIDR | unix: | all;
可用上下文:http, server, location, limit_except
ngx_http_auth_basic_module模塊:
28、auth_basic string | off;
使用basic機制進行用戶認證;
29、auth_basic_user_file file;
認證用的賬號密碼文件;
文件格式:
name:password:commet
密碼格式:
htpasswd命令;
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
ngx_http_stub_status_module模塊:
用於輸出nginx的基本狀態信息;
Active connections: 1
server accepts handled requests
155 155 298
Reading: 0 Writing: 1 Waiting: 0
Active connections: 處於活動狀態的客戶端連接的數量;
accepts:已經接受的客戶端請求的總數;
handled:已經處理完成的客戶端請求的總數;
requests:客戶端發來的總的請求數;
Reading:處於讀取客戶端請求報文首部的連接數;
Writing:處於向客戶端發送響應報文過程中的連接數;
Waiting:處於等待客戶端發出請求的空閒連接數;
ngx_http_referer_module模塊:
The ngx_http_referer_module module is used to block access to a site for requests with invalid values in the “Referer” header field.
30、valid_referers none | blocked | server_names | string ...;
定義合法的referer數據;
none:請求報文首部沒有referer首部;
blocked:請求報文的referer首部沒有值;
server_names:其值是主機名;
arbitrary string:直接字符串,可以使用*作爲通配符;
regular expression:被指定的正則表達式模式匹配到的字符串;要使用~起始;
valid_referers none blocked server_names *.magedu.com magedu.* ~\.magedu\.;
if ($invalid_referer) {
return 403;
}
回顧:
master/worker
nginx.conf:
main block
events {
...
}
http {
...
server {
...
listen
server_name
location [=|^~|~|~*] /uri/ {
root
...
}
...
}
Nginx(3)
ngx_http_ssl_module
ssl on | off;
是否啓用當前虛擬主機的ssl功能;
ssl_certificate file;
當前虛擬主機使用的PEM格式的證書文件;
ssl_certificate_key file;
當前虛擬機使用的證書文件中的公鑰配對兒的私鑰文件路徑,PEM格式;
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
SSL協議的版本;
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
指明ssl會話的緩存機制;
builtin:使用openssl內建的緩存機制,此爲各worker獨有;
shared:由各worker共享的緩存;
name:緩存空間的名稱;
size:字節爲單位的緩存空間的大小;每1MB內存空間可緩存4000個會話;
ssl_session_timeout time;
ssl會話超時時長,指ssl session cache中緩存條目有效時長;
ngx_http_log_module
The ngx_http_log_module module writes request logs in the specified format.
access_log path [format [buffer=size [flush=time]] [if=condition]];
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
access_log syslog:server=address[,parameter=value] [format [if=condition]];
access_log off;
log_format name string ...;
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
max:最大緩存條目;
inactive=time:非活動時長;
min_uses:最少使用次數;
valid:驗正緩存條目有效性的頻率;
ngx_http_rewrite_module
rewrite regex replacement [flag];
把用戶請求的URI基於regex做檢查,匹配到時將替換爲replacement指定的字符串;
在同一個location中存在的多個rewrite規則會自上而下逐個被檢查(循環);可以使用flag控制此循環功能;
如果replacement是以http://或https://開頭,則替換結果會直接以重定向方式返回給客戶端;
[flag]:
last:重寫完成後停止對當前uri在當前location中的後續其它重寫操作,改爲對新uri的新一輪處理;
break:重寫完成後停止對當前uri在當前location中的後續其它重寫操作;
redirect:重寫完成後以臨時重定向方式直接返回重寫後生成的新URL給客戶端,由客戶對新URL進行請求;(302)
permanent:重寫完成後以永久重定向方式直接返回重寫後生成的新URL給客戶端,由客戶對新URL進行請求;(301)
rewrite_log on | off;
是否啓用重寫日誌;啓用時,日誌信息被髮往錯誤日誌;
if (condition) { ... }:
條件判斷機制,在條件滿足時,執行配置塊中的配置;
引入了一個新的配置上下文;
condition:
比較表達式:
==, !=
~:模式匹配,區分字母大小寫;
~*:模式匹配,不區分字符大小寫;
!~:模式不匹配,區分字母大小寫;
!~*:模式不匹配,不區分字母大小寫;
文件及目錄存在性判斷:
-f, !-f:文件
-d, !-d:目錄
-e, !-e:存在
-x, !-x:執行
return:
return code [text];
return code URL;
return URL;
set $variable value;
用戶自定義變量;
ngx_http_gzip_module
過濾器,對指定類型的資源壓縮傳輸以節約帶寬;
gzip on | off;
啓用或禁用gzip壓縮響應報文;
gzip_comp_level level;
指定壓縮比,1-9,默認爲1;
gzip_disable regex ...;
regex是匹配客戶端瀏覽器類型的模式,表示對所有匹配到的瀏覽器不執行壓縮響應;
gzip_min_length length;
觸發啓用壓縮功能的響應報文的最小長度;
gzip_http_version 1.0 | 1.1;
設定啓用壓縮響應功能時,協議的最小版本;
gzip_types mime-type ...;
指定僅執行壓縮的資源內容類型;默認爲text/html;
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
對代理的請求基於何種屬性判斷其是否應該啓用壓縮功能;
示例:
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_disable msie6;
gzip_min_length 2;
gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script;
ngx_http_fastcgi_module
LAMP:
httpd+php:
modules
cgi
fastcgi
proxy_fastcgi_module
LNMP:
nginx+php:
fastcgi
php:編譯時,支持fpm;
./configure ... --enable-fpm ...
php-fpm工作方式(類似於httpd的prefork):
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic | static
pm.start_servers:啓動fpm進程時啓動的工作進程數量;
pm.min_spare_servers:最少空閒進程數;
pm.max_spare_servers:最大空閒進程數;
pm.max_children:最大工作進程數;
user = USERNAME
group = GROUPNAME
fastcgi模塊指令:
fastcgi_pass address;
address是fpm服務器監聽的地址和端口;
示例: fastcgi 127.0.0.1:9000;
fastcgi_index name;
fastcgi應用的主頁名稱;
fastcgi_param parameter value [if_not_empty];
傳遞給fpm服務器的參數及其值;
fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [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:定義此路徑下的多大空間用於存儲緩存數據;
levels=#[:#[:#]]:緩存目錄層級定義;
levels=1:2
keys_zone=name:size
內存中用於緩存k/v映射關係的空間名稱及大小;
inactive=time
注意:只能定義在http上下文 ;
fastcgi_cache zone | off;
是否啓用cache,如果啓用,數據緩存於哪個cache中;
fastcgi_cache_key string;
定義要使用的緩存鍵;
例如: fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET | HEAD | POST ...;
緩存哪些類型的請求的相關數據;
fastcgi_cache_min_uses number;
fastcgi_cache_valid [code ...] time;
對不同響應碼設定其可緩存時長;
注意:調用緩存時,至少應該 指定三個參數
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid
Nginx:
web服務器:http協議;
http協議:html,MIME(多用途互聯網郵件擴展)
major/minor:
text/html, text/plain, image/jpeg, ...
web資源:URL (scheme://server:port/path/to/source)
方法:GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,...
WEBDAV
http事務:request <--> response
request:
<method> <URL> <version>
<HEADERS>
...
<body>
response:
<version> <status> <reason phrase>
<HEADERS>
...
<body>
status:
1xx:信息類
2xx:成功類,200
3xx:重定向,301, 302, 304
4xx:錯誤類,客戶端錯誤,404,403
5xx:錯誤類,服務器端錯誤,502
認證:basic, digest
httpd:MPM
prefork, worker, event
I/O模型:
同步/異步:
關注的是消息通知機制
同步:synchronous,
異步:asynchronous,
消息通知:
同步:等待對方返回消息;
異步:被調用者通過狀態、通知或回調通知調用者
狀態:調用者每隔一段時間就需要檢查一次;
通知:
回調:
阻塞/非阻塞
關注調用者等等結果返回之前所處的狀態;
阻塞:block,調用結果返回之前,調用者會被掛起;
非阻塞:nonblock,調用結果返回之前,調用者不會被掛起;
I/O:
網絡IO:本質是socket讀取;
磁盤IO:流;
每次IO,都會經由兩個階段:
第一步:數據先加載至內核內存空間(緩衝區);
第二步:數據從內核緩衝區複製到用戶空間的進程的內存中去;
等待數據準備完成;
數據內核複製到進程;
I/O模型:
同步阻塞:
同步非阻塞:
IO multipexing:select, poll
Signal Driven IO:
Asynchronous IO:
Nginx:
C10k, http://nginx.org/
engin X: nginx
二次開發版:tengine, openresty
Nginx的特性:
模塊化設計,較好的擴展性;
高可靠性
master/worker
支持熱部署
不停機更新配置文件、更換日誌文件、更新服務器程序版本;
低內存消耗
10000個keep-alive連接模式下的非活動連接僅消耗2.5M內存;
event-driven, aio, mmap
基本功能:
靜態資源的web服務器;
http協議反向代理服務器;
pop3/imap4協議反射代理服務器;
FastCGI(lnmp), uWSGI等協議;
模塊化(非DSO),著名有zip, SSL, ...;
web服務器相關的功能:
虛擬主機、keepalive、訪問日誌、url rewrite、路徑別名、基於ip及用戶的訪問控制、支付速率限制及併發數限制,...;
Nginx的程序架構:
master/worker
一個master進程,可生成一個或多個worker進程;
master:加載配置文件、管理worker進程、平滑升級、...
worker:http服務、http代理、fastcgi代理、...
模塊類型:
核心模塊: core module
標準模塊:
Standard HTTP modules
Optional HTTP modules
Mail modules
3rd party modules:
nginx用來做什麼?
靜態資源的web服務器
http協議反向代理
nginx的安裝:
# yum -y install pcre-devel openssl-devel zlib-devel
# ./configure \
--prefix=/usr/local
--sbin-path=/usr/sbin/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
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
--user=nginx
--group=nginx
--with-http_ssl_module
--with-http_realip_module
--with-http_addition_module
--with-http_sub_module
--with-http_dav_module
--with-http_flv_module
--with-http_mp4_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_random_index_module
--with-http_secure_link_module
--with-http_stub_status_module
--with-http_auth_request_module
--with-threads
--with-stream
--with-stream_ssl_module
--with-http_slice_module
--with-file-aio
--with-http_v2_module
# make && make install
配置:
配置文件 的組成部分:
主配置文件:nginx.conf
include conf.d/*.conf
facscgi, scgi, uwscgi的相關配置
mime.types
配置指令(必須以分號結尾):
directive value1 [value2...];
支持使用變量:
內置變量:由模塊引入,可直接引用;
自定義變量:set variable_name value;
引用變量:$variable_name
配置文件結構:
main block:全局配置;
event {
...
}:事件驅動的相關配置;
http {
...
}:http協議的相關配置
mail {
...
}:mail相關的配置;
http相關的配置:
http {
...
...
server {
...
server_name
root
alias
location /uri/ {
...
}
...
}
server {
...
...
}
}
main block:
配置指令的類別:
正常運行必備的配置;
優化性能的配置;
用於調試、定位問題的配置;
正常運行必備的配置:
1、user USERNAME [GROUPNAME];
指定用於運行worker進程的用戶和組;
user nginx nginx;
2、pid /PATH/TO/PID_FILE;
指定nginx進程的pid文件路徑;
pid /var/run/nginx.pid;
3、worker_rlimit_nofile number;
單個worker進程所能夠打開的最大文件數;
性能優化相關的配置:
1、 worker_processes number | auto;
worker的進程數;通常應該爲CPU的核心數減1;
2、worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
CPUMASK:
0000 0001
0000 0010
0000 0100
0000 1000
0001 0000
...
3、worker_priority nice;
[-20,19]
100-139
調試、定位問題:
1、daemon on | off;
是否以守護進程方式啓動nginx進程;
2、master_process on | off;
是否以master/worker模型啓動nignx進程;
3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
錯誤日誌文件的記錄方式,及其日誌級別:
方式:
file /PATH/TO/SOME_LOG_FILE;
stderr:發送到錯誤輸出;
syslog:server=address[,parameter=value]:發送給syslog服務器;
memory:size
日誌級別:
debug依賴於configure時的--with-debug選項;
回顧:IO模型、nginx
IO模型:
阻塞式
非阻塞式
IO複用(select, poll)
信號驅動的IO(epoll, kqueue, /dev/poll)
AIO
階段:等待數據準備完成,複製數據(從內核緩衝區到進程的地址空間)
nginx:master/worker
master
worker()
cache loader
cache manager
模塊類別:核心模塊、標準模塊(http標準模塊,http可選模塊,mail模塊)、3rd模塊
nginx.conf
main block
event {
...
}
http {
...
server {
...
server_name
root
location /uri/ {
...
}
}
server {
...
}
}
Nginx(2)
nginx.conf:
main block
events {
...
}
1、worker_connections number;
每個worker進程所能夠併發打開的最大連接數;
worker_processes * worker_connections
2、use method;
指明併發連接請求處理時使用的方法;
use epoll;
3、accept_mutex on | off;
啓用時,表示用於讓多個worker輪流地、序列化地響應新請求;
http {
...
}
定義套接字相關功能
1、server { ... }
配置一個虛擬主機;
server {
listen PORT;
server_name HOSTNAME;
root /PATH/TO/DOCUMENTROOT;
...
}
注意:
(1) 基於port的虛擬主機:
listen指令要使用不同的端口;
(2) 基於Hostname的虛擬主機;
server_name指令指向不同的主機名;
(3) 基於ip的虛擬主機:
listen IP:PORT;
2、listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
listen port [default_server] [ssl];
listen unix:path [default_server] [ssl] ;
default_server:默認虛擬主機;
ssl:限制只能通過ssl連接提供服務;
backlog:後緩隊列的長度;
rcvbuf:接收緩衝大小;
sndbuf:發送緩衝區大小;
3、server_name name ...;
指明當前server的主機名;後可跟一個或空白字符分隔的多個主機;
支持使用*任意長度的任意字符;
支持~起始的正則表達式模式字符串;
應用策略:
(1) 首先精確匹配;
(2) 左則*通配符匹配;
(3) 右側*通配符匹配;
(4) 正則表達式模式匹配;
server_name www.magedu.com;
server_name *.magedu.com;
server_name www.magedu.*;
server_name ~^.*\.magedu\..*$;
mail.magedu.com, www.magedu.com
4、tcp_nodelay on|off;
對keepalived模式下的連接是否啓用TCP_NODELAY選項;
5、sendfile on | off;
是否啓用sendfile功能;
定義路徑相關配置
6、root path;
設置web資源路徑映射;用於指明用戶請求的url所對應的本地文件系統上的文檔所在目錄路徑;
可用上下文:http, server, location, if
7、location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
根據用戶請求的URI來匹配定義的location,匹配到時,此請求將被相應的location塊中的指令所處理;
server {
...
location {
}
location {
...
}
}
=:URI精確匹配;
~:做正則表達式模式匹配,區分字符大小寫;
~*:做正則表達式模式匹配,不區分字符大小寫;
^~:對URI的左半部分做匹配檢查,不區分字符大小寫;
匹配優先級:=、^~、~/~*、不帶符號;
8、alias path;
定義路徑別名,文檔映射的一種機制;僅能用於location上下文;
alias /bbs/ /web/forum/
http://www.magedu.com/bbs/a.jpg
location /bbs/ {
alias /web/forum/;
}
/web/forum/a.jpg
location /bbs/ {
root /web/forum/;
}
/web/forum/bbs/a.jpg
注意:
root指令:給定的路徑對應於location中的/uri/左側的/;
alias指令:給定的路徑對應於location中的/uri/右側的/;
9、index file ...;
可用位置:http, server, location
默認主面;
10、error_page code ... [=[response]] uri;
根據用戶請求的資源的http響應的狀態碼實現錯誤頁重定向;
http://www.magedu.com/hello.html --> 因爲資源不存在而被改爲對
http://www.magedu.com/404.html
11、
定義客戶端請求的相關配置
12、keepalive_timeout timeout [header_timeout];
設定保持連接的超時時長,0表示禁止長連接 ;默認爲75s;
13、keepalive_requests number;
在一次長連接上所允許請求的資源的最大數量,默認爲100;
14、keepalive_disable none | browser ...;
對哪種瀏覽器禁用長連接;
15、send_timeout time;
向客戶端發送響應報文的超時時長; 特別地,是指兩次寫操作之間的間隔時長;
16、client_body_buffer_size size;
用於接收客戶端請求報文的body部分的緩衝區大小;默認爲16k;超時此大小時,其將被暫存到磁盤上;
17、client_body_temp_path path [level1 [level2 [level3]]];
設定用於存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量;
/var/tmp/body 2 1 2
00-ff
對客戶的請求進行限制的相關配置:
18、limit_rate rate;
限制響應給客戶端的傳輸速率,單位是bytes/second,0表示無限制;
19、limit_except method ... { ... };
限制對指定的請求方法之外的其它方法的使用客戶端;
limit_except GET POST {
allow 172.18.0.0/16;
deny all;
}
表示除了GET和POST之外的其它方法僅允許172.18.0.0/16中的主機使用;
文件操作優化的配置:
20、aio on | off | threads[=pool];
是否啓用aio功能;
21、directio size | off;
22、open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以緩存以下三種信息:
(1) 文件的描述符、文件大小和最近一次的修改時間;
(2) 打開的目錄的結構;
(3) 沒有找到的或者沒有權限訪問的文件的相關信息;
max=N:可緩存的緩存項上限;達到上限後會使用LRU算法實現緩存管理;
inactive=time:緩存項的超時時長,在此處指定的時長內未被命中的緩存項即爲非活動項;
23、open_file_cache_errors on | off;
是否緩存查找時發生錯誤的文件一類的信息;
24、open_file_cache_min_uses number;
在open_file_cache指令的inactive參數指定的時長內,至少命中此處指定的次數方可不被歸類到非活動項;
25、open_file_cache_valid time;
緩存項有效性的檢查頻率;默認是60s;
ngx_http_access_module模塊:
實現基於ip的訪問控制功能;
26、allow address | CIDR | unix: | all;
27、deny address | CIDR | unix: | all;
可用上下文:http, server, location, limit_except
ngx_http_auth_basic_module模塊:
28、auth_basic string | off;
使用basic機制進行用戶認證;
29、auth_basic_user_file file;
認證用的賬號密碼文件;
文件格式:
name:password:commet
密碼格式:
htpasswd命令;
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
ngx_http_stub_status_module模塊:
用於輸出nginx的基本狀態信息;
Active connections: 1
server accepts handled requests
155 155 298
Reading: 0 Writing: 1 Waiting: 0
Active connections: 處於活動狀態的客戶端連接的數量;
accepts:已經接受的客戶端請求的總數;
handled:已經處理完成的客戶端請求的總數;
requests:客戶端發來的總的請求數;
Reading:處於讀取客戶端請求報文首部的連接數;
Writing:處於向客戶端發送響應報文過程中的連接數;
Waiting:處於等待客戶端發出請求的空閒連接數;
ngx_http_referer_module模塊:
The ngx_http_referer_module module is used to block access to a site for requests with invalid values in the “Referer” header field.
30、valid_referers none | blocked | server_names | string ...;
定義合法的referer數據;
none:請求報文首部沒有referer首部;
blocked:請求報文的referer首部沒有值;
server_names:其值是主機名;
arbitrary string:直接字符串,可以使用*作爲通配符;
regular expression:被指定的正則表達式模式匹配到的字符串;要使用~起始;
valid_referers none blocked server_names *.magedu.com magedu.* ~\.magedu\.;
if ($invalid_referer) {
return 403;
}
回顧:
master/worker
nginx.conf:
main block
events {
...
}
http {
...
server {
...
listen
server_name
location [=|^~|~|~*] /uri/ {
root
...
}
...
}
Nginx(3)
ngx_http_ssl_module
ssl on | off;
是否啓用當前虛擬主機的ssl功能;
ssl_certificate file;
當前虛擬主機使用的PEM格式的證書文件;
ssl_certificate_key file;
當前虛擬機使用的證書文件中的公鑰配對兒的私鑰文件路徑,PEM格式;
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
SSL協議的版本;
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
指明ssl會話的緩存機制;
builtin:使用openssl內建的緩存機制,此爲各worker獨有;
shared:由各worker共享的緩存;
name:緩存空間的名稱;
size:字節爲單位的緩存空間的大小;每1MB內存空間可緩存4000個會話;
ssl_session_timeout time;
ssl會話超時時長,指ssl session cache中緩存條目有效時長;
ngx_http_log_module
The ngx_http_log_module module writes request logs in the specified format.
access_log path [format [buffer=size [flush=time]] [if=condition]];
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
access_log syslog:server=address[,parameter=value] [format [if=condition]];
access_log off;
log_format name string ...;
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
max:最大緩存條目;
inactive=time:非活動時長;
min_uses:最少使用次數;
valid:驗正緩存條目有效性的頻率;
ngx_http_rewrite_module
rewrite regex replacement [flag];
把用戶請求的URI基於regex做檢查,匹配到時將替換爲replacement指定的字符串;
在同一個location中存在的多個rewrite規則會自上而下逐個被檢查(循環);可以使用flag控制此循環功能;
如果replacement是以http://或https://開頭,則替換結果會直接以重定向方式返回給客戶端;
[flag]:
last:重寫完成後停止對當前uri在當前location中的後續其它重寫操作,改爲對新uri的新一輪處理;
break:重寫完成後停止對當前uri在當前location中的後續其它重寫操作;
redirect:重寫完成後以臨時重定向方式直接返回重寫後生成的新URL給客戶端,由客戶對新URL進行請求;(302)
permanent:重寫完成後以永久重定向方式直接返回重寫後生成的新URL給客戶端,由客戶對新URL進行請求;(301)
rewrite_log on | off;
是否啓用重寫日誌;啓用時,日誌信息被髮往錯誤日誌;
if (condition) { ... }:
條件判斷機制,在條件滿足時,執行配置塊中的配置;
引入了一個新的配置上下文;
condition:
比較表達式:
==, !=
~:模式匹配,區分字母大小寫;
~*:模式匹配,不區分字符大小寫;
!~:模式不匹配,區分字母大小寫;
!~*:模式不匹配,不區分字母大小寫;
文件及目錄存在性判斷:
-f, !-f:文件
-d, !-d:目錄
-e, !-e:存在
-x, !-x:執行
return:
return code [text];
return code URL;
return URL;
set $variable value;
用戶自定義變量;
ngx_http_gzip_module
過濾器,對指定類型的資源壓縮傳輸以節約帶寬;
gzip on | off;
啓用或禁用gzip壓縮響應報文;
gzip_comp_level level;
指定壓縮比,1-9,默認爲1;
gzip_disable regex ...;
regex是匹配客戶端瀏覽器類型的模式,表示對所有匹配到的瀏覽器不執行壓縮響應;
gzip_min_length length;
觸發啓用壓縮功能的響應報文的最小長度;
gzip_http_version 1.0 | 1.1;
設定啓用壓縮響應功能時,協議的最小版本;
gzip_types mime-type ...;
指定僅執行壓縮的資源內容類型;默認爲text/html;
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
對代理的請求基於何種屬性判斷其是否應該啓用壓縮功能;
示例:
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_disable msie6;
gzip_min_length 2;
gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script;
ngx_http_fastcgi_module
LAMP:
httpd+php:
modules
cgi
fastcgi
proxy_fastcgi_module
LNMP:
nginx+php:
fastcgi
php:編譯時,支持fpm;
./configure ... --enable-fpm ...
php-fpm工作方式(類似於httpd的prefork):
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic | static
pm.start_servers:啓動fpm進程時啓動的工作進程數量;
pm.min_spare_servers:最少空閒進程數;
pm.max_spare_servers:最大空閒進程數;
pm.max_children:最大工作進程數;
user = USERNAME
group = GROUPNAME
fastcgi模塊指令:
fastcgi_pass address;
address是fpm服務器監聽的地址和端口;
示例: fastcgi 127.0.0.1:9000;
fastcgi_index name;
fastcgi應用的主頁名稱;
fastcgi_param parameter value [if_not_empty];
傳遞給fpm服務器的參數及其值;
fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [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:定義此路徑下的多大空間用於存儲緩存數據;
levels=#[:#[:#]]:緩存目錄層級定義;
levels=1:2
keys_zone=name:size
內存中用於緩存k/v映射關係的空間名稱及大小;
inactive=time
注意:只能定義在http上下文 ;
fastcgi_cache zone | off;
是否啓用cache,如果啓用,數據緩存於哪個cache中;
fastcgi_cache_key string;
定義要使用的緩存鍵;
例如: fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET | HEAD | POST ...;
緩存哪些類型的請求的相關數據;
fastcgi_cache_min_uses number;
fastcgi_cache_valid [code ...] time;
對不同響應碼設定其可緩存時長;
注意:調用緩存時,至少應該 指定三個參數
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid
Nginx(5)
ngx_http_proxy_module
(1) proxy_pass URL;
location, if in location, limit_except
proxy_pass後面的路徑不帶uri時,其會將location的uri傳遞給後端主機;
location /uri/ {
proxy_pass http://HOST;
}
proxy_pass後面路徑是一個uri時,其會將location的uri替換爲proxy_pass後端主機的uri;
location /uri/ {
proxy_pass http://HOST/new_uri/;
}
如果location定義其uri時使用了正則表達模式匹配機制,則proxy_pass後的路徑必須不能使用uri;
location ~|~* PATTERN {
proxy_pass http://HOST;
}
http://www.magedu.com/bbs/ --> http://172.16.100.7/bbs/
http://www.magedu.com/bbs/ --> http://172.16.100.7/
(2) proxy_set_header
proxy_set_header field value;
設定向後端主機發送的請求報文的首部及其值;
示例:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwared_for;
緩存相關的選項(緩存要先定義,後調用)
(3) proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] ;
用於http上下文 ;
(4) proxy_cache zone | off;
調用緩存,默認爲off;
(5) proxy_cache_key string;
定義緩存鍵;
proxy_cache_key $request_uri
proxy_cache_key $scheme$proxy_host$request_uri
(6) proxy_cache_valid [code ...] time;
爲不同的響應碼設定其緩存的時長;
示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
(7) proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
Determines in which cases a stale cached response can be used when an error occurs during communication with the proxied server.
回顧:
nginx:proxy
正向代理
反向代理
ngx_http_proxy_module:
proxy_pass
proxy_set_header
proxy_cache_path (http)
proxy_cache
proxy_cache_key
proxy_cache_valid
proxy_cache_use_stale
Nginx(6)
ngx_http_proxy_module模塊
跟連接相關的指令
(8) proxy_connect_timeout time;
與後端服務器建立連接的超時時長,默認爲60s,最長爲75s;
(9) proxy_read_timeout time;
等待後端主機發送響應報文的超時時長,默認爲60s;
(10) proxy_send_timeout time;
向後端服務發送請求報文的超時時長,默認爲60s;
ngx_http_headers_module
用於在響應給客戶端的報文中添加首部;
(1) add_header name value [always];
向響應報文添加自定義首部,並賦值;
http, server, location, if in location
add_header X-Via $server_addr;
(2) expires [modified] time;
expires epoch | max | off;
用於添加Expire及Cache-Control首部或修改首部的值;
ngx_http_upstream_module
將多個後端主機定義爲服務器組,而後可由proxy_pass, fastcgi_pass, memcached_pass等進行引用;
(1) upstream name { ... }
定義後端服務器組;引入新的上下文;只能用於http上下文;
name:名稱,直接字符串;
(2) server
server address [parameters];
定義服務器的地址和相關的參數;
地址格式:
IP[:port]
HOSTNAME[:port]
unix:/PATH/TO/SOME_SOCK_FILE
參數:
weight=number:服務器權重;
max_fails=number:最大失敗嘗試次數;
fail_timeout=time:設置服務器不可用超時時長;
backup:備用主機;
down:手動標記其不再處理任何用戶請求;
(3) ip_hash
源地址哈希調度算法;
(4) least_conn
最少連接調度算法;
(5) health_check [parameters];
定義後端主機的健康狀態檢測機制;只能用於location上下文;
可用參數:
interval=#:檢測的頻度,默認爲5秒;
fails=number:判定爲失敗的檢測次數;
passes=number:判定爲成功的檢測次數;
uri=uri:執行健康狀態檢測時請求的uri;
match=name:基於哪個match做檢測結果爲“成功”或“失敗”的判定;
port=number:向服務器的哪個端口發起健康狀態檢測請求;
(6) match name { ... }
僅能用於http上下文 ;對後端主機做健康狀態檢測時,定義其結果判斷標準;
專用指令:
status:期望的響應碼;
status CODE
status ! CODE
status CODE-CODE
header:基於響應首部進行判斷
header HEADER=VALUE
header HEADER!=VALUE
header [!] HEADER
header HEADER ~ VALUE
body:期望的響應報文的主體部分應該有的內容;
body ~ "CONTENT"
body !~ "CONTENT"
(7) hash key [consistent];
定義調度方法,可自定義基於何種信息(key)進行綁定;
hash $remote_addr
hash $request_uri
hash $cookie_username
補充:內置變量的調用,向客戶端展示緩存命令與否:
add_header X-Cache $upstream_cache_status;
課外作業:嘗試使用tengine實現此前的講到的所有內容;
博客作業:nginx的所有內容,重點實現:
url rewrite, gzip, https, upstream, fastcgi
memcached:
數據結構模型:
結構化數據:關係型數據庫;
半結構化數據:xml, json, ... (NoSQL);
非結構化數據:文件系統;
k/v:
memcached:存儲於內存中;
redis:存儲於內存中,週期性地將數據同於輔存上;
memcached:
LiveJournal旗下的Danga Interactive
特性:
k/v緩存:可序列化數據;存儲項:key, value, flag, expire time;
功能的實現一半依賴於服務端,一半依賴客戶端;
分佈式緩存:互不通信的分佈式集羣;
O(1)的執行效率;
清理過期數據:LRU
緩存項過期
緩存空間用盡
緩存系統的種類:
代理式緩存;
旁路式緩存;
分佈式系統主機路由:
取模法
一致性hash;
memcached:
11211/tcp, 11211/udp
主程序:memcached
環境配置文件:/etc/sysconfig/memcached
協議格式
文本協議
二進制協議
命令:
統計類:stats,stats items, stats slabs, stats sizes
存儲類:set, add, replace, append, prepend
獲取數據類:get, delete, incr/decr
清空:flush_all
memcached程序的常用選項:
-l <ip_addr>: 監聽的地址;
-m <num>:緩存空間大小,單位爲MB;默認爲64;
-c <num>:最大併發連接數,默認爲1024;
-p <num>:Listen on TCP port <num>, the default is port 11211.
-U <num>:Listen on UDP port <num>, the default is port 11211, 0 is off.
-M:緩存空間耗盡時,向請求者返回錯誤信息,而不是基於LRU算法進行緩存清理;
-f <factor>:growth factor,增長因子;
-t <threads>:處理用於請求的線程數;
memcached默認沒有認證機制,但可藉助於SASL進行認證;
php連接memcached服務的模塊:
memcache:php-pecl-memcache
memcached:php-pecl-memcached
可提供工具程序的程序包:libmemcached;
LB Cluster保持會話的方法:
session sticky
session cluster
session server
博客作業:
nginx負載均衡用戶請求至後端多個ammp主機,php的會話保存於memcached中;