I/O類型:模塊的同步和異步
同步和異步:synchronous, asyncronous
則返回即是最終結果;
調用發出之後,被調用方立即返回消息,但返回的並非最終結果;被調用者通過狀態、通知機制等來通知調用者,或通過回調函數來處理結果;
I/O模型:
一次讀請求操作
1 等待數據準備好:從磁盤到內核內存;
2 從內核內存複製到進程內存;
blocking IO:阻塞式IO
調用者發送請求後,就被掛起,等待數據從磁盤到內核內存,並等待從內核內存複製到進程內存,最後返回數據,完成一次I/O;
nonblocking IO:非阻塞IO
調用者發送請求後,不被掛起,但需要不斷的想內核詢問,直到數據從磁盤到內核內存;但在等待從內核內存複製到進程內存時,被掛起,直到返回數據,完成一次I/O
IO multiplexing:複用型IO
select(), poll()
調用者發送請求後,就被掛起,等待在數據從磁盤到內核內存,但是阻塞在select上,而不是內核上,select還可以接收其他I/O請求;但第二階段還是阻塞的,阻塞在自己的調用上,而不是select上
signal driven IO:事件驅動式IO
通知:
水平觸發:多次通知;
邊緣觸發:只通知一次;
調用者發送請求後,不會被掛起,而數據從磁盤到內核內存完成後會通知調用者;但第二階段還是阻塞的
asynchronous IO:異步IO
調用者發送請求後,不會被掛起,而是在所有階段都已完成後會通知調用者
web服務器要處理兩路I/O:網絡I/O [ 通過內核接收用戶請求 ]和磁盤I/O [ 通過內核向磁盤發出請求 ]
Nginx:
Nginx: engine X
Tengine nginx淘寶的二次開發版
模塊:
Nginx特性:
模塊化設計、較好的擴展性;
nginx不支持動態裝卸載而Tengine支持
高可靠
使用主控進程master+工作進程worker組成,master不負責處理用戶請求而是啓動一個worker,並將用戶請求交個一個worker去處理
低內存消耗的數據
一個線程響應多個請求
10000個keep-alive模式下的connection,僅需要2.5MB的內存;
支持熱部署
不停機而更新配置文件、日誌文件滾動、升級程序版本;
支持事件驅動event、異步I/O[AIO]、內存映射[mmap];
基本功能:
靜態資源的web服務器,能緩存打開的文件描述符;
http、smtp、pop3協議的反向代理服務器;
緩存加速、負載均衡;
支持FastCGI(fpm, LNMP), uWSGI(Python)等;
模塊化(非DSO機制)、過濾器zip、SSI及圖像的大小調整;
支持SSL;
定製訪問日誌、支持使用日誌緩衝區提供日誌存儲性能;
支持url rewrite
支持路徑別名
支持基於IP及用戶的訪問控制
支持速率限制,支持併發數限制
Nginx的基本架構:
一個master進程,生成一個或多個worker進程;
事件驅動:epoll(默認使用邊緣觸發)
I/O複用器支持:select, poll, rt signal
支持sendfile, sendfile64:磁盤從內核空間直接構建響應報文發送,而不再經過用戶空間。
支持異步I/O [ AIO ]
支持內存映射[mmap]
nginx的工作模式:非阻塞、事件驅動、由一個master進程生成多個worker線程,每個worker響應n個請求;
支持的併發連接數:worker * n,但是受限於套接字數量[65535]限制
郵件模塊,模塊類型:核心模塊
Standard HTTP modules 標準的HTTP協議模塊
Optional HTTP modules 可選的HTTP協議模塊
Mail modules 郵件模塊
3rd party modules 第三方模塊
程序包安裝方法:
源碼:編譯安裝
製作好的程序包:rpm包,在epel源中
編譯安裝:
# useradd -r nginx
# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
# make && make install
# mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi,uwsgi}
--prefix=/usr/local/nginx
指定安裝路徑
--conf-path=/etc/nginx/nginx.conf
指定配置文件生成路徑
--user=nginx
指定運行時以哪個用戶的身份運行
--group=nginx
設置工作組
--error-log-path=/var/log/nginx/error.log
設置錯誤日誌位置
--http-log-path=/var/log/nginx/access.log
設置訪問日誌位置
--pid-path=/var/run/nginx/nginx.pid
設置pid文件位置
--lock-path=/var/lock/nginx.lock
設置鎖文件位置
--with-http_ssl_module
支持https
--with-http_stub_status_module
支持server-status狀態頁查看
--with-http_gzip_static_module
支持gzip壓縮
--with-http_flv_module
支持流媒體
--with-http_mp4_module
支持MP4
--http-client-body-temp-path=/var/tmp/nginx/client
指定客戶端臨時的body目錄
--http-proxy-temp-path=/var/tmp/nginx/proxy
指定臨時的proxy目錄
環境變量
# vim /etc/profile.d/nginx.sh
export PATH='/usr/local/nginx/sbin':$PATH
# . /etc/profile.d/nginx.sh
啓動:nginx
若設置環境變量就用這種啓動/usr/local/nginx/sbin/nginx
新改動配置生效的方式:nginx -s reload
支持的參數
nginx -s reload | stop| quit |reopen
配置文件:
官方文檔:http://nginx.org/en/docs/ngx_core_module.html
main配置段:全局配置段
event{}: 定義event模型工作特性
配置指令:要以分號結尾,語法格式:
directive value1 [value2...]
主配置段的指令:
用於調試、定位問題
main主配置段的指令:
正常運行的必備配置:
1、user USERNAME [GROUPNAME];
指定運行worker進程的用戶和組;若在編譯安裝時指定,會被註釋用默認指定的用戶
user nginx nginx;
2、pid /path/to/pid_file;
指定nginx守護進程的pid文件;
pid /var/run/nginx/nginx.pid;
3、worker_rlimit_nofile #;
指定所有worker進程所能夠打開的最大文件數;需要手動添加這一行一般設爲51200,
性能優化相關的配置:
1、worker_processes #;
worker進程的個數;通常應該略少於CPU物理核心數;總核心數-1或-2
2、worker_cpu_affinity cpumask ...;
將工作進程綁定到cpu的設置
優點:提升緩存的命中率;
cpumask:
假設一共有四顆cpu,表示方法,超過8顆使用更多的位數
cpu1:0000 0001
cpu2:0000 0010
3、timer_resolution
計時器解析度;若對時間解析度要求不高應降低此值,可減少gettimeofday()系統調用的次數;此值越高,精準度越高,消耗的資源越高;反之,越低
timer_resolution 100ms
4、worker_priority number
指明worker進程的優先級,使用的是nice值;
-20, 19
worker_priority number -10
事件相關的配置:
1、accept_mutex {off|on};
master調度用戶請求至各worker進程時使用的負載均衡鎖;on表示能讓多個worker輪流地、序列化地去響應新請求;
應啓用:accept_mutex on;
2、lock_file file;
accept_mutex互斥鎖用到的鎖文件路徑;
3、use [epoll|rtsig|select|poll];
指明使用的事件模型;建議讓Nginx自行選擇;
4、worker_connections #;
設定單個worker進程所能夠處理的最大併發連接數量;
一般設爲:worker_connections 51200;
用戶問題:
必須編譯時--with-debug纔可以使用
1、daemon {on|off};
是否以守護進程方式運行nginx;調試時應該設置爲Off,就會把調試信息輸出到前臺;
2、master_process {on|off};
是否以master/worker模型來運行nginx; 調試時可以設置爲off;
3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
error_log 位置 級別; 級別可以省略,使用默認級別
error_log /var/log/nginx/err.log
若要使用debug級別,需要在編譯nginx時使用了--with-debug選項;
Nginx作爲web服務器時使用的配置:
http {}:由ngx_http_core_module模塊所引入;
配置http {
upstream {
...
}
server {
location URL {
root "/path/to/somedir";
...
}
# 類似於httpd中的<Location>,用於定義URL與本地文件系統的映射關係;
location URL {
注意:與http相關的指令僅能夠放置於http、server、location、upstream、if上下文,但有些指令僅應用於這5種上下文中的某些種;
指令:
1、server {}
定義一個虛擬主機;
server {
//監聽IP和端口,ip可以省略listen 80
listen 172.16.37.10:80;
2、server_name NAME [...];
後可跟多個主機;名稱還可以使用正則表達式(~)或通配符;
(1) 先做精確匹配檢查;
(2) 左側通配符匹配檢查:*.lixin.com
(3) 右側通配符匹配檢查:如mail.*
(4) 正則表達式匹配檢查:如 ~^.*\.lixin\.com$
(5) default_server;
3、location [ = | ~ | ~* | ^~ ] uri { ... }
功能:允許根據用戶請求的URI來匹配定義的各location;匹配到時,此請求將被相應的location配置塊中的配置所處理,例如做訪問控制等功能;
server {
listen 80;
server_name www.lixin.com;
location / {
root "/vhosts/web1";
}
location /bbs/ {
root /;
index index.html index.htm;
}
location ~*/bbs {
root "/";
}
}
http://www.lixin.com/index.html --> /vhosts/web1/index.html
http://www.lixin.com/bbs/index.html --> /bbs/index.html 匹配到第3個location,以表示把http://www.lixin.com/bbs/ 當做 /
4、alias path;
用於location配置段,定義路徑別名
location /images/ {
root "/vhosts/web1";
}
http://www.lixin.com/images/a.jpg -->/vhosts/web1/images/a.jpg
注意:root表示指明路徑爲對應的location "/" URL; alias表示路徑映射,即location指令後定義的URL是相對於alias所指明的路徑而言;
5、error_page code [...] [=code] URI | @name
根據http響應狀態碼來指明特用的錯誤頁面;
error_page 404 /404_customed.html
[=code]:以指定的響應碼進行響應,而不是默認的原來的響應;默認表示以新資源的響應碼爲其響應碼;
6、基於IP的訪問控制
allow IP/Network;
deny IP/Network;
例:
allow 172.16.0.0/16;
deny all;
7、基於用戶的訪問控制
auth_basic "顯示提示信息";
auth_basic_user_file "/PATH/TO/PASSWORD_FILE";
賬號密碼文件建議使用htpasswd來創建;
例:
9、stub_status {on|off};
開啓狀態頁
僅能用於location上下文;
8:
location /status {
stub_status on;
allow 172.16.0.0/16;
deny all;
}
Reading: 0 Writing: 1 Waiting: 5
Reading:正處於接收請求狀態的連接數;
Writing: 請求已經接收完成,正處於處理請求或發送響應的過程中的連接數;
Waiting:保持連接模式,且處於活動狀態的連接數;
10、URL重寫
語法:rewrite 正則表達式 替換 flag;
例如:
...
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
rewrite ^/imgs/(.*\.jpg)$ /images/$1 break;
....
http://www.lixin.com/images/a/b/c/1.jpg --> http://www.lixin.com/imgs/a/b/c/1.jpg
11、if
語法:if (condition) {...}
應用環境:server, location
condition:
(1) 變量名;變量值爲空串,或者以“0”開始,則爲false;其它的均爲true;(2) 以變量爲操作數構成的比較表達式可使用=, !=類似的比較操作符進行測試;(3) 正則表達式的模式匹配操作~: 區分大小寫的模式匹配檢查
~*: 不區分大小寫的模式匹配檢查
!~和!~*:對上面兩種測試取反
(4) 測試路徑爲文件可能性:-f, !-f
(5) 測試指定路徑爲目錄的可能性:-d, !-d
(6) 測試文件的存在性:-e, !-e
(7) 檢查文件是否有執行權限:-x, !-x
例如:
if ($http_user_agent ~* MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
12、防盜鏈
location ~* \.(jpg|gif|jpeg|png)$ {
# 允許www.lixin.com這個網站對這些種類圖片的引用是合法的
valid_referer none blocked www.lixin.com;
# $invalid_referer表示除了上面定義的合法的引用,其他都被歸爲$invalid_refere這個不合法的引用
if ($invalid_referer) {
rewrite ^/ http://www.lixin.com/403.html;
}
}
13、自定義訪問日誌格式
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 logs/access.log main;
注意:此處可用變量爲nginx各模塊內建變量;
fastcgi的相關配置:
LNMP:php啓用fpm模型;
location ~ \.php$ {
root /var/www/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_scri pt_name;
# fastcgi_params在/etc/nginx/下 ,若編譯時沒指定配置文件則在/usr/local/nginx/conf/下
include fastcgi_params;
}