I/O模型與Nginx配置

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;  

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章