Nginx的配置1
Nginx:
http協議:web服務器(類似於httpd)、http reverse proxy(類似於httpd)、imap/pop3 reverse proxy
NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server.
解決C10K(10K Connections)問題而發展起來的web服務
Tengine, OpenResty.
http協議:
URL:shceme://username:[email protected]
http事務:
request:
<method> <URL> <VERSION>
HEADERS
<body>
response:
<VERSION> <STATUS> <REASON-PHRASE>
HEADERS
<body>
Method:GET/HEAD/POST, PUT/DELETE, TRACES, OPTIONS
Status Code:
1xx:
2xx:成功類響應碼,200
3xx:重定向類的響應碼,301, 302, 304
4xx:客戶端錯誤,403,404
5xx:服務器端錯誤,502
認證:
基於ip認證
基於用戶認證 :basic/digest
httpd MPM:
prefork:進程模型,兩級結構,主進程master負責生成子進程,
每個子進程負責響應一個請求;
worker: 線程模型,三級結構,主進程master負責生成子進程,
每個子進程負責生成多個線程,每個線程響應一個請求;
event:主進程master負責生成子進程,每個子進程響應多個請求;
Nginx的程序架構:
master/worker
一個master進程:
負載加載和分析配置文件、管理worker進程、平滑升級
一個或多個worker進程
處理並響應用戶請求
緩存相關的進程:
cache loader:載入緩存對象
cache manager:管理緩存對象
特性:異步、事件驅動和非阻塞
並發請求處理:通過kevent/epoll/select,/dev/poll
文件IO:高級IO sendfile,異步,mmap
nginx高度模塊:高度模塊化,但其模塊早期不支持DSO機制;近期版本支持動態裝載和卸載;
模塊分類:
核心模塊:core module
標準模塊:
HTTP modules:
Standard HTTP modules
Optional HTTP modules
Mail modules
Stream modules
3rd party modules
nginx的功用:
靜態的web資源服務器;(圖片服務器,或js/css/html/txt等靜態資源服務器)
結合FastCGI/uwSGI/SCGI等協議反代動態資源請求;
http/https協議的反向代理;
imap4/pop3協議的反向代理;
tcp/udp協議的請求轉發;
nginx的安裝配置:
官方的預制包:
http://nginx.org/packages/centos/7/x86_64/RPMS/
Fedora-EPEL:
編譯安裝:
~]# yum install pcre-devel openssl-devel zlib-devel
~]# useradd -r nginx
~]# ./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
make && make install
配置文件的組成部分:
主配置文件:nginx.conf
include conf.d/.conf
fastcgi, uwsgi,scgi等協議相關的配置文件
mime.types:支持的mime類型
主配置文件的配置指令:
directive value [value2 …];
註意:
(1) 指令必須以分號結尾;
(2) 支持使用配置變量;
內建變量:由Nginx模塊引入,可直接引用;
自定義變量:由用戶使用set命令定義;
set variable_name value;
引用變量:$variable_name
主配置文件結構:
main block:主配置段,也即全局配置段;
event {
…
}:事件驅動相關的配置;
http {
…
}:http/https 協議相關的配置段;
mail {
…
}
stream {
…
}
http協議相關的配置結構
http {
…
…:各server的公共配置
server {
…
}:每個server用於定義一個虛擬主機;
server {
…
listen
server_name
root
alias
location [OPERATOR] URL {
…
if CONDITION {
…
}
}
}
}
nginx:master/worker
master:配置文件分析和加載、管理worker、平滑升級;
worker:處理用戶請求;
cache loader, cache manager:緩存加載和緩存管理
高度模塊化:
HTTP module
Standard HTTP Module
Optional HTTP Module
Mail Module
Stream Module
main配置段常見的配置指令:
分類:
正常運行必備的配置
優化性能相關的配置
用於調試及定位問題相關的配置
事件驅動相關的配置
正常 運行必備的配置:
1、user
Syntax: user user [group];
Default: user nobody nobody;
Context: main
Defines user and group credentials used by worker processes. If group is omitted, a group whose name equals that of user is used.
2、pid /PATH/TO/PID_FILE;
指定存儲nginx主進程進程號碼的文件路徑;
3、include file | mask;
指明包含進來的其它配置文件片斷;
4、load_module file;
指明要裝載的動態模塊;
性能優化相關的配置:
1、worker_processes number | auto;
worker進程的數量;通常應該為當前主機的cpu的物理核心數;
2、worker_cpu_affinity cpumask …;
worker_cpu_affinity auto [cpumask];
CPU MASK:
00000001:0號CPU
00000010:1號CPU
… …
3、worker_priority number;
指定worker進程的nice值,設定worker進程優先級;[-20,20]
4、worker_rlimit_nofile number;
worker進程所能夠打開的文件數量上限;
調試、定位問題:
1、daemon on|off;
是否以守護進程方式運行Nignx;
2、master_process on|off;
是否以master/worker模型運行nginx;默認為on;
3、error_log file [level];
事件驅動相關的配置:
events {
…
}
1、worker_connections number;
每個worker進程所能夠打開的最大並發連接數數量;
worker_processes * worker_connections
2、use method;
指明並發連接請求的處理方法;
use epoll;
3、accept_mutex on | off;
處理新的連接請求的方法;on意味著由各worker輪流處理新請求,Off意味著每個新請求的到達都會通知所有的worker進程;
http協議的相關配置:
http {
… …
server {
…
server_name
root
location [OPERATOR] /uri/ {
…
}
}
server {
…
}
}
與套接字相關的配置:
1、server { … }
配置一個虛擬主機;
server {
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}
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:發送緩沖區大小;
3、server_name name …;
指明虛擬主機的主機名稱;後可跟多個由空白字符分隔的字符串
支持通配任意長度的任意字符;server_name .magedu.com www.magedu.
支持~起始的字符做正則表達式模式匹配;server_name ~^www\d+.magedu.com$
匹配機制:
(1) 首先是字符串精確匹配;
(2) 左側通配符;
(3) 右側通配符;
(4) 正則表達式;
4、tcp_nodelay on | off;
在keepalived模式下的連接是否啟用TCP_NODELAY選項;
5、sendfile on | off;
是否啟用sendfile功能;
定義路徑相關的配置:
6、root path;
設置web資源路徑映射;用於指明用戶請求的url所對應的本地文件系統上的文檔所在目錄路徑;可用的位置:http, server, location, if in location;
7、location [ = | ~ | ~* | ^~ ] uri { … }
在一個server中location配置段可存在多個,用於實現從uri到文件系統的路徑映射;ngnix會根據用戶請求的URI來檢查定義的所有location,並找出一個最佳匹配,而後應用其配置;
=:對URI做精確匹配;例如, http://www.magedu.com/, http://www.magedu.com/index.html
location = / {
…
}
~:對URI做正則表達式模式匹配,區分字符大小寫;
~:對URI做正則表達式模式匹配,不區分字符大小寫;
^~:對URI的左半部分做匹配檢查,不區分字符大小寫;
不帶符號:匹配起始於此uri的所有的url;
匹配優先級:=, ^~, ~/~,不帶符號;
root /vhosts/www/htdocs/
http://www.magedu.com/index.html –> /vhosts/www/htdocs/index.html
server {
root /vhosts/www/htdocs/
location /admin/ {
root /webapps/app1/data/
}
}
8、alias path;
定義路徑別名,文檔映射的另一種機制:僅能用於location上下文
註意:location中使用root指令和alias指令的意義不同;
(a) root,給定的路徑對應於location中的/uri/左側的/;
(b) alias,給定的路徑對應於location中的/uri/右側的/
9、index file …;
默認資源;http, server, location;
10、error_page code … [=[response]] uri;
Defines the URI that will be shown for the specified errors.
11、try_files file … uri;
定義客戶端請求的相關配置
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;超出此大小時,其將被暫存到磁盤上的由client_body_temp_path指令所定義的位置;
17、client_body_temp_path path [level1 [level2 [level3]]];
設定用於存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量;
16進制的數字;
client_body_temp_path path /var/tmp/client_body 2 1 1
1:表示用一位16進制數字表示一級子目錄;0-f
2:表示用2位16進程數字表示二級子目錄:00-ff
2:表示用2位16進程數字表示三級子目錄:00-ff
對客戶端進行限制的相關配置:
18、limit_rate rate;
限制響應給客戶端的傳輸速率,單位是bytes/second,0表示無限制;
19、limit_except method … { … }
限制對指定的請求方法之外的其它方法的使用客戶端;
limit_except GET {
allow 192.168.1.0/24;
deny all;
}
文件操作優化的配置
20、aio on | off | threads[=pool];
是否啟用aio功能;
21、directio size | off;
在Linux主機啟用O_DIRECT標記,此處意味文件大於等於給定的大小時使用,例如directio 4m;
22、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指令所指定的次數的緩存項即為非活動項;
23、open_file_cache_valid time;
緩存項有效性的檢查頻率;默認為60s;
24、open_file_cache_min_uses number;
在open_file_cache指令的inactive參數指定的時長內,至少應該被命中多少次方可被歸類為活動項;
25、open_file_cache_errors on | off;
是否緩存查找時發生錯誤的文件一類的信息;
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模塊
實現基於用戶的訪問控制,使用basic機制進行用戶認證;
28、auth_basic string | off; #sting加上引號表示說明
29、auth_basic_user_file file;
location /admin/ {
alias /webapps/app1/data/;
auth_basic “Admin Area”;
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
註意:htpasswd命令由httpd-tools所提供;
ngx_http_stub_status_module模塊
用於輸出nginx的基本狀態信息;
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
Active connections: 活動狀態的連接數;
accepts:已經接受的客戶端請求的總數;
handled:已經處理完成的客戶端請求的總數;
requests:客戶端發來的總的請求數;
Reading:處於讀取客戶端請求報文首部的連接的連接數;
Writing:處於向客戶端發送響應報文過程中的連接數;
Waiting:處於等待客戶端發出請求的空閑連接數;
30、stub_status;
配置示例:
location /basic_status {
stub_status;
}
ngx_http_log_module模塊
he ngx_http_log_module module writes request logs in the specified format.
31、log_format name string …;
string可以使用nginx核心模塊及其它模塊內嵌的變量;
課外作業:為nginx定義使用類似於httpd的combined格式的訪問日誌;
32、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
訪問日誌文件路徑,格式及相關的緩沖的配置;
buffer=size
flush=time
33、open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
緩存各日誌文件相關的元數據信息;
max:緩存的最大文件描述符數量;
min_uses:在inactive指定的時長內訪問大於等於此值方可被當作活動項;
inactive:非活動時長;
valid:驗正緩存中各緩存項是否為活動項的時間間隔;
Nginx的配置1