1、Nginx
介紹Nginx
NGINX寫入解決服務器的少數之一C10K問題。不同於傳統的服務器,NGINX不依靠線程來處理請求。相反,它使用一個更可擴展的事件驅動的(異步)架構。這種結構採用小,但更重要的是,可預測的量的負荷下存儲器。即使你不希望處理成千上萬的併發請求,你仍然可以從NGINX的高性能和小內存佔用受益。NGINX擴展在所有方向:從最小的VPS一路攀升到服務器的大型集羣
[擴展]
C10k
指的是服務器同時支持成千上萬個客戶端的問題,也就是conncurrent10 000 connection;而Nginx就是能解決這樣的一個問題
Nginx的應用
Netflix, Hulu,Pinterest, CloudFlare, Airbnb, WordPress.com, GitHub, SoundCloud, Zynga,Eventbrite, Zappos, Media Temple, Heroku, RightScale, Engine Yard, MaxCDN
官方站點:
選擇一個新的程序包注意的問題:
1.序包的新功能是否是我們需要的
2.新的程序包之前必須做測試
作用:
一個自由的,開放源碼的,高性能的http和反向、代理服務器,以及一個IMAP/POP3代理服務器
Nginx的特點:
高性能,高穩定性,功能豐富,配置簡單,資源消耗低
二次開發版:tengine, openresty
Nginx的特性:
模塊化設計,較好的擴展性;
高可靠性
master/worker
支持熱部署
不停機更新配置文件、更換日誌文件、更新服務器程序版本;
低內存消耗
10000個keep-alive連接模式下的非活動連接僅消耗2.5M內存;
Nginx支持事件驅動機制,支持異步,支持內存映射
【擴展】
什麼是代理:
即代表處理,代表處理已授權的事情;
上圖知,對於客戶端來說,中間的服務器是一個代理服務器,而對於服務器來說,中間的那個服務器稱之爲反向代理
基本功能
靜態資源的web服務器;
http協議反向代理服務器;
pop3/imap4協議反向代理服務器;
支持fastCGI(lnmp), uWSGI等協議;
模塊化(非DSO),著名模塊支持的有zip, SSL等等;
web服務器相關的功能:
虛擬主機、keepalive機制、訪問日誌、錯誤日誌、url 重寫、路徑別名、基於ip及用戶的訪問控制、支持速率限制及併發數限制,...;
Nginx的程序架構:
解釋:
兩個補充的管理緩存的組件
Cache loader:負責加載/裝載緩存
Cache Manager:管理緩存的
中間的proxycache是需要開啓才能使用的,基於本地磁盤上與本地磁盤打交道時,支持高級I/O機制,支持sendfile機制,支持異步IO機制,支持mmap,支持
實現併發請求響應上可以基於kevent,epoll(需要系統調用),.select機制,使用的方式都是不一樣的
架構:
master/worker
一個master進程,可生成一個或多個worker進程;
master:加載配置文件、管理worker進程(創建和銷燬)、平滑升級、...
worker:http服務、http代理、fastcgi代理
模塊類型:
核心模塊:core module
標準模塊:自己代理的核心模塊
標準http模塊
可選的http木塊
郵件模塊
第三方模塊(3rd party modules):
模塊
配置模塊即配置模塊中的指令,沒有配置指令就沒有相對應的有效的模塊;
模塊中存在一些相關的變量;(內建變量)隨着模塊的不同而變化
Nginx能作什麼:
靜態資源的web服務器
http協議反向代理
nginx如何作爲web服務器:
安裝nginx:(nginx不再iso中,可以使用epel源安裝)
推薦epel源:http://mirrors.aliyun.com/epel/7Server/x86_64/n/
配置yum源:
[root@bogon yum.repos.d]#cat epel.repo
[epel]
name=centos epel
baseurl=http://mirrors.aliyun.com/epel/7Server/x86_64/c/
gpgcheck=0
配置nginx的yum源
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/OS/OSRELEASE/$basearch/
gpgcheck=0
enabled=1
下載nginx
wget http://nginx.org/download/nginx-1.10.0.tar.gz
編譯安裝:按需安裝
配置安裝開發環境:
準備支持的模塊
yum install –y pcre-devel openssl-devel zlib-devel
安裝開發包組
第一步:tar xfnginx-1.8.1.tar.gz
第二部:cdnginx-1.8.1
第三步:./configure\
--prefix=/etc/nginx nginx安裝的位置
--sbin-path=/usr/sbin/nginx nginx程序文件的安裝路徑
--conf-path=/etc/nginx/nginx.conf nginx的主配置文件路徑
--error-log-path=/var/log/nginx/error.log 錯誤日誌文件路徑
--http-log-path=/var/log/nginx/access.log http訪問日誌路徑
--pid-path=/var/run/nginx.pid 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
以上是臨時文件路徑,如果服務器允許使用put機制的話,客戶端可能會向服務器端請求大量的數據,服務器端收到的請求報文中的body中可能會有很多的數據,而這些數據都會存放內存中,倘若有很多的用戶併發發出請求,服務器端內存無法存放,因此就會把數據臨時存放在磁盤上的這些臨時文件內,上述都是代理服務器時緩存文件的存放路徑
--user=nginx 指明那個用戶來運行nginx的work進程
--group=nginx 組
--with-http_ssl_module 支持ssl認證
--with-http_realip_module 記錄用戶的真實ip
--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-mail
--with-mail_ssl_module
--with-file-aio 文件的異步IO機制
--with-http_v2_module
--with-ipv6
--with-* 指明編譯哪些功能
第四部:make&& make install
直接安裝:
yum install –y nginx
nginx命令
-?或者h:顯示幫助信息
-v:顯示版本信息和退出
-V:顯示版本信息和配置選項以及退出
-t:測試配置文件是否存在錯誤
-q:在配置測試過程中抑制錯誤消息
-s:發送信號給主進程(stop(平滑停止),quit(及時有人正在使用,也會立即終止),reopen,reload)
-p:設置前綴路徑
-c:設置主置文件
-g:設置全局指令的配置文件
啓動nginx
前提是關閉佔用80端口的應用程序,比如http)
[root@www ~]# nginx
Nginx配置
配置文件的組成部分:
主配置文件:nginx.conf
片段化配置文件實現:(相對於主配置文件的路徑,參照httpd)
1)創建一個conf.d目錄
2)在主配置文件中鍵入指令:include conf.d/*.conf
Fastcgi,scgi,uwscgi的相關配置以及mime.types
配置指令
注意:必須以分號結尾
指令格式:directive value1 [value2...];
支持使用變量:
內置變量:由模塊引入,可直接引用;
自定義變量:set variable_name value;
引用變量:$variable_name
整體配置文件結構:
main block:全局配置;對http及mail模塊都有效;
event{ ... }:事件驅動的相關配置;
http { ...}:http協議的相關配置
mail{ ... }:mail相關的配置;
http相關的配置:
http{ ... ...
server{ ... #一個sever一個虛擬主機
server_name #當前主機名
root #跟文檔的路徑
alias #別名映射
location/url/ { ... #這裏的url可以使用正則表達式做通配
} #定義訪問特定url目錄時的一些配置:
...}
server { ... ...
}
}
細化配置文件結構
main block:配置指令的類別:
正常運行必備的配置;
優化性能的配置;
用於調試、定位問題的配置;
正常運行必備的配置:
1、user USERNAME [GROUPNAME];指定用於運行worker進程的用戶和組;
usernginx 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上
worker_cpu_affinity auto [cpumask]; 1.8版本不支持auto
CPUMASK:cpu掩碼
00000001 第0顆
00000010 第1顆CPU
00000100
...
範例:編輯配置文件添加:
worker_processes 2;#指定運行兩個worker_processes
Worker_cpu_affinity 0010 0100;
重新加載:nginx –s reload
查看worker運行在那顆cpu上:顯示命令,進程號,cpu,優先級
psaxo command,pid,psr,ni
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選項;
nginx.conf
main block;
event{
…}
1、worker_connections number;每個worker進程所能夠併發打開的最大連接數;默認是512個
當前系統能響應的最大併發連接數:worker_processes *worker_connections
2、use method;指明併發連接請求處理時使用的方法;
use epoll;
2、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];
listenport [default_server] [ssl];
listenunix: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
定義客戶端請求的相關配置
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_exceptGET POST {
allow 172.18.0.0/16;
denyall;
}
表示除了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_cachemax=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的基本狀態信息;
Activeconnections: 1
serveraccepts handled requests
155155 298
Reading:0 Writing: 1 Waiting: 0
Activeconnections: 處於活動狀態的客戶端連接的數量;
accepts:已經接受的客戶端請求的總數;
handled:已經處理完成的客戶端請求的總數;
requests:客戶端發來的總的請求數;
Reading:處於讀取客戶端請求報文首部的連接數;
Writing:處於向客戶端發送響應報文過程中的連接數;
Waiting:處於等待客戶端發出請求的空閒連接數;
ngx_http_referer_module模塊:
Thengx_http_referer_module module is used to block access to a site for requestswith invalid values in the “Referer” header field.
30、valid_referers none | blocked |server_names | string ...;
定義合法的referer數據;
none:請求報文首部沒有referer首部;
blocked:請求報文的referer首部沒有值;
server_names:其值是主機名;
arbitrarystring:直接字符串,可以使用*作爲通配符;
regularexpression:被指定的正則表達式模式匹配到的字符串;要使用~起始;
valid_referersnone blocked server_names *.magedu.com magedu.* ~\.magedu\.;
if($invalid_referer) {
return403;
}