第四周,nginx

1贮尖,編譯安裝nginx應(yīng)用薇组,提供wordpress服務(wù)


wget?http://nginx.org/download/nginx-1.14.2.tar.gz #下載nginx源碼包? ??

tar?-zxf?nginx-1.12.1.tar.gz? #解壓包

yum groupinstall "Development Tools"? #下載編譯包組

yum?install?openssl-devel?pcre-devel?libevent-devel?-y #下載所需依賴的包

cd nginx-1.14.2 #進(jìn)入解壓目錄


nginx-1.14.2]#?./configure?\? #執(zhí)行編譯操作指定選項(xiàng)

--prefix=/usr/local/nginx?\

--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/lock/subsys/nginx.lock?\

--user=nginx?--group=nginx?\

--with-http_ssl_module?\

--with-http_v2_module?\

--with-http_dav_module?\

--with-threads?\

--with-file-aio?\

--with-http_stub_status_module


make?&&?make?install #編譯并且復(fù)制文件到指定的目錄下

nginx-1.14.2]#?useradd?nginx??#同名組自動(dòng)創(chuàng)建

因?yàn)樵谶M(jìn)行編譯配置的時(shí)候我們就將nginx的二進(jìn)制文件寫到了“/usr/sbin/”下,所以我們可以直接使用命令來(lái)啟動(dòng)nginx:

nginx-1.14.2]#?nginx

接下來(lái)我們使用命令來(lái)查看nginx是否啟動(dòng)成功:

nginx-1.14.1=2]# ss -tnl

使用命令停掉httpd(如果沒(méi)啟動(dòng)就不用管了):

~]#?service?httpd?stop

????此時(shí)在真實(shí)主機(jī)上就可以通過(guò)瀏覽器訪問(wèn)“192.168.1.198”(這個(gè)IP是剛才虛擬機(jī)的IP)


這樣的Nginx的配置就完成了郑兴,下面開始配置1個(gè)虛擬主機(jī),1個(gè)虛擬主機(jī)的根目錄我存放在“/myweb/wordpress

?mkdir?-pv?/myweb/wordpress

nginx-1.12.1]#?vim?/etc/nginx/nginx.conf

在“http”的大括號(hào)中添加下面這條:

include?/etc/nginx/conf/*.conf"

? ? 接下來(lái)我們?cè)凇?etc/nginx/conf/”下創(chuàng)建一個(gè)以“.conf”結(jié)尾的片段配置文件并寫入內(nèi)容:

server?{

??listen?80;

??server_name?myweb.wordpress.com;

??location?/?{

????root?/myweb/wordpress;

????index?index.html;

??}

}

?保存并退出之后贝乎,使用“nginx -t”命令檢查配置文件是否有錯(cuò)誤情连,如果沒(méi)有錯(cuò)誤,就使用“nginx -s reload”命令重新載入配置:

wordpress需要依賴數(shù)據(jù)庫(kù)览效,所以需要先安裝數(shù)據(jù)庫(kù)却舀,我這里默認(rèn)安裝為mariadb

yum install mariadb-server

https://cn.wordpress.org/latest-zh_CN.zip

然后分別解壓到各自對(duì)應(yīng)的目錄中:

~]# tar -zxf?wordpress-4.9.4-zh_CN.tar.gz?-C /myweb/wordpress/

systemctl start mariadb 啟動(dòng)數(shù)據(jù)庫(kù)

CREATE USER 'wordpress'@'%' IDENTIFIED BY '123456';?這種方法允許任何遠(yuǎn)程連接

[root@centos7 wordpress]# cp ../wordpress/wp-config-sample.php ./wp-config.php

[root@centos7 wordpress]# vim wp-config.php

先拷貝一份wordpress自帶的配置文件,并修改其配置信息:


yum install php php-fpm && systemctl start php #安裝并啟動(dòng)phpfpm協(xié)議

置完成之后锤灿,我們還需要回到剛才配置虛擬主機(jī)那里把剛才的配置增加幾條選項(xiàng)挽拔,變成下面的樣子(因?yàn)镹ginx默認(rèn)將PHP注釋掉了,需要我們自己開啟):

server?{

??listen?80;

??server_name?192.168.1.198;??

??location?/?{

????root?/myweb/wordpress/wordpress;

????index?index.html?index.php;

??}?????

??location?~?\.php$?{

????root?/myweb/wordpress/wordpress;

??include????????fastcgi_params;

??fastcgi_pass???127.0.0.1:9000;

??fastcgi_index??index.php;

??fastcgi_param??SCRIPT_FILENAME??$document_root$fastcgi_script_name;

??}?????

}

yum install php php-fpm && systemctl start php #安裝并啟動(dòng)phpfpm協(xié)議

搭建成功





2但校,簡(jiǎn)述nginx特性螃诅,并與apache簡(jiǎn)單對(duì)比

程序環(huán)境

配置文件的組成部分:

主配置文件:nginx.conf

include conf.d/*.conf

fastcgi, uwsgi状囱,scgi等協(xié)議相關(guān)的配置文件

mime.types:支持的mime類型

主程序文件:/usr/sbin/nginx

Unit File:nginx.service


注意:

(1) 指令必須以分號(hào)結(jié)尾术裸;

(2) 支持使用配置變量;

內(nèi)建變量:由Nginx模塊引入亭枷,可直接引用袭艺;

自定義變量:由用戶使用set命令定義;

set variable_name value;

引用變量:$variable_name

主配置文件結(jié)構(gòu):

main block:主配置段叨粘,也即全局配置段猾编;

event {

...

}:事件驅(qū)動(dòng)相關(guān)的配置瘤睹;

http {

...

}:http/https 協(xié)議相關(guān)的配置段;

mail {

...

}

stream {

...

}

http協(xié)議相關(guān)的配置結(jié)構(gòu)

http {

...

...:各server的公共配置也稱全局配置

server {

...

}:每個(gè)server用于定義一個(gè)虛擬主機(jī)答倡;

server {

...

listen

server_name

root

alias

location [OPERATOR] URL {

...

if CONDITION {

...

Nginx(2)

配置指令:

main配置段常見(jiàn)的配置指令:

分類:

正常運(yùn)行必備的配置

優(yōu)化性能相關(guān)的配置

用于調(diào)試及定位問(wèn)題相關(guān)的配置

事件驅(qū)動(dòng)相關(guān)的配置

正常運(yùn)行必備的配置:

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;

指定存儲(chǔ)nginx主進(jìn)程進(jìn)程號(hào)碼的文件路徑苇羡;

3绸吸、include file | mask;

指明包含進(jìn)來(lái)的其它配置文件片斷;

4设江、load_module file;

指明要裝載的動(dòng)態(tài)模塊锦茁;

性能優(yōu)化相關(guān)的配置:

1、worker_processes number | auto;

worker進(jìn)程的數(shù)量叉存;通常應(yīng)該等于小于當(dāng)前主機(jī)的cpu的物理核心數(shù)码俩;

auto:當(dāng)前主機(jī)物理CPU核心數(shù);

2歼捏、worker_cpu_affinity cpumask ...;

worker_cpu_affinity auto [cpumask];

CPU MASK:

00000000:

00000001:0號(hào)CPU

00000010:1號(hào)CPU

... ...

3稿存、worker_priority number;

指定worker進(jìn)程的nice值,設(shè)定worker進(jìn)程優(yōu)先級(jí)瞳秽;[-20,20]

4瓣履、worker_rlimit_nofile number;

worker進(jìn)程所能夠打開的文件數(shù)量上限;

調(diào)試练俐、定位問(wèn)題:

1袖迎、daemon on|off;

是否以守護(hù)進(jìn)程方式運(yùn)行Nignx;

2腺晾、master_process on|off;

是否以master/worker模型運(yùn)行nginx燕锥;默認(rèn)為on;

3悯蝉、error_log file [level];

事件驅(qū)動(dòng)相關(guān)的配置:

events {

...

}

1归形、worker_connections number;

每個(gè)worker進(jìn)程所能夠打開的最大并發(fā)連接數(shù)數(shù)量;

worker_processes * worker_connections

2鼻由、use method;

指明并發(fā)連接請(qǐng)求的處理方法暇榴;

use epoll;

3、accept_mutex on | off;

處理新的連接請(qǐng)求的方法嗡靡;on意味著由各worker輪流處理新請(qǐng)求跺撼,Off意味著每個(gè)新請(qǐng)求的到達(dá)都會(huì)通知所有的worker進(jìn)程;


web服務(wù)中的http中字段配置

1讨彼、server { ... }

配置一個(gè)虛擬主機(jī)歉井;

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:設(shè)定為默認(rèn)虛擬主機(jī)哈误;

ssl:限制僅能夠通過(guò)ssl連接提供服務(wù)哩至;

backlog=number:后援隊(duì)列長(zhǎng)度躏嚎;

rcvbuf=size:接收緩沖區(qū)大小菩貌;

sndbuf=size:發(fā)送緩沖區(qū)大新丁;

3箭阶、server_name name ...;

指明虛擬主機(jī)的主機(jī)名稱虚茶;后可跟多個(gè)由空白字符分隔的字符串;

支持*通配任意長(zhǎng)度的任意字符仇参;server_name *.magedu.com? www.magedu.*

支持~起始的字符做正則表達(dá)式模式匹配嘹叫;server_name ~^www\d+\.magedu\.com$

匹配機(jī)制:

(1) 首先是字符串精確匹配;

(2) 左側(cè)*通配符;

(3) 右側(cè)*通配符诈乒;

(4) 正則表達(dá)式罩扇;

定義路徑相關(guān)的配置:

6、root path;

設(shè)置web資源路徑映射怕磨;用于指明用戶請(qǐng)求的url所對(duì)應(yīng)的本地文件系統(tǒng)上的文檔所在目錄路徑喂饥;可用的位置:http, server, location, if in location;

7肠鲫、location [ = | ~ | ~* | ^~ ] uri { ... }

Sets configuration depending on a request URI.

在一個(gè)server中l(wèi)ocation配置段可存在多個(gè)员帮,用于實(shí)現(xiàn)從uri到文件系統(tǒng)的路徑映射;ngnix會(huì)根據(jù)用戶請(qǐng)求的URI來(lái)檢查定義的所有l(wèi)ocation导饲,并找出一個(gè)最佳匹配集侯,而后應(yīng)用其配置;

=:對(duì)URI做精確匹配帜消;例如, http://www.magedu.com/, http://www.magedu.com/index.html

location? =? / {

...

}

~:對(duì)URI做正則表達(dá)式模式匹配,區(qū)分字符大小寫浓体;

~*:對(duì)URI做正則表達(dá)式模式匹配泡挺,不區(qū)分字符大小寫;

^~:對(duì)URI的左半部分做匹配檢查命浴,不區(qū)分字符大小寫娄猫;

不帶符號(hào):匹配起始于此uri的所有的url;

匹配優(yōu)先級(jí):=, ^~, ~/~*生闲,不帶符號(hào)媳溺;

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/

}

}

alias path;

定義路徑別名,文檔映射的另一種機(jī)制碍讯;僅能用于location上下文悬蔽;

注意:location中使用root指令和alias指令的意義不同;

(a) root捉兴,給定的路徑對(duì)應(yīng)于location中的/uri/左側(cè)的/蝎困;

(b) alias录语,給定的路徑對(duì)應(yīng)于location中的/uri/右側(cè)的/;

9禾乘、index file ...;

默認(rèn)資源澎埠;http, server, location;

10始藕、error_page code ... [=[response]] uri;

Defines the URI that will be shown for the specified errors.

# error_page 404 /404.html; #自定義404的錯(cuò)誤頁(yè)面

#? ? ? ? ? ? location = /40x.html {

#? ? ? ? }

ngx_http_access_module模塊:

實(shí)現(xiàn)基于ip的訪問(wèn)控制功能

location / {

? ? deny? 192.168.1.1;

? ? allow 192.168.1.0/24;

? ? allow 10.1.1.0/16;

? ? allow 2001:0db8::/32;

? ? deny? all;

}


ngx_http_stub_status_module模塊

用于輸出nginx的基本狀態(tài)信息蒲稳;

Active connections: 291

server accepts handled requests

16630948 16630948 31070465

Reading: 6 Writing: 179 Waiting: 106

Active connections: 活動(dòng)狀態(tài)的連接數(shù);

accepts:已經(jīng)接受的客戶端請(qǐng)求的總數(shù)伍派;

handled:已經(jīng)處理完成的客戶端請(qǐng)求的總數(shù)江耀;

requests:客戶端發(fā)來(lái)的總的請(qǐng)求數(shù);

Reading:處于讀取客戶端請(qǐng)求報(bào)文首部的連接的連接數(shù)拙已;

Writing:處于向客戶端發(fā)送響應(yīng)報(bào)文過(guò)程中的連接數(shù)决记;

Waiting:處于等待客戶端發(fā)出請(qǐng)求的空閑連接數(shù);



ngx_http_log_module模塊

he ngx_http_log_module module writes request logs in the specified format.

31倍踪、log_format name string ...;

string可以使用nginx核心模塊及其它模塊內(nèi)嵌的變量系宫;

32、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

access_log off;

訪問(wèn)日志文件路徑建车,格式及相關(guān)的緩沖的配置扩借;

buffer=size

flush=time

33、open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

open_log_file_cache off;

緩存各日志文件相關(guān)的元數(shù)據(jù)信息缤至;

max:緩存的最大文件描述符數(shù)量潮罪;

min_uses:在inactive指定的時(shí)長(zhǎng)內(nèi)訪問(wèn)大于等于此值方可被當(dāng)作活動(dòng)項(xiàng);

inactive:非活動(dòng)時(shí)長(zhǎng)领斥;

valid:驗(yàn)正緩存中各緩存項(xiàng)是否為活動(dòng)項(xiàng)的時(shí)間間隔嫉到;

格式內(nèi)容

log_format compression '$remote_addr - $remote_user [$time_local] '

? ? ? ? ? ? ? ? ? ? ? '"$request" $status $bytes_sent '

? ? ? ? ? ? ? ? ? ? ? '"$http_referer" "$http_user_agent" "$gzip_ratio"';

access_log /spool/logs/nginx-access.log compression buffer=32k;

http://nginx.org/en/docs/varindex.html?nginx常用變量查看



ngx_http_gzip_module:#nginx的壓縮模塊

ngx_http_gzip_module模塊是一個(gè)使用“gzip”方法壓縮響應(yīng)的過(guò)濾器。 這通常有助于將傳輸數(shù)據(jù)的大小減少一半甚至更多月洛。

1何恶、gzip on | off;

Enables or disables gzipping of responses.

2、gzip_comp_level level;

設(shè)置響應(yīng)的gzip壓縮級(jí)別嚼黔。 可接受的值范圍為1到9细层。

3、 gzip_disable regex ...;

對(duì)具有與任何指定正則表達(dá)式匹配的“User-Agent”標(biāo)頭字段的請(qǐng)求禁用gzipping響應(yīng)唬涧。

4疫赎、 gzip_min_length length;

啟用壓縮功能的響應(yīng)報(bào)文大小閾值(下限);

5碎节、gzip_buffers number size;

支持實(shí)現(xiàn)壓縮功能時(shí)為其配置的緩沖區(qū)數(shù)量及每個(gè)緩存區(qū)的大信醺恪;

6、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;

nginx作為代理服務(wù)器接收到從被代理服務(wù)器發(fā)送的響應(yīng)報(bào)文后实牡,在何種條件下啟用壓縮功能的陌僵;

off:對(duì)代理的請(qǐng)求不啟用

no-cache, no-store,private:表示從被代理服務(wù)器收到的響應(yīng)報(bào)文首部的Cache-Control的值為此三者中任何一個(gè)创坞,則啟用壓縮功能碗短;

示例:

gzip? on;#開啟壓縮

gzip_comp_level 6;#壓縮登記

gzip_min_length 64;#低于64字節(jié)不壓縮

gzip_proxied any; #任何被代理的也需要壓縮

gzip_types text/xml text/css? application/javascript; #壓縮類型


Module ngx_http_ssl_module


http { .

????.. server{?

?listen 443 ssl;

keepalive_timeout 70; #連接超時(shí)時(shí)長(zhǎng)

ssl_protocols ???? TLSv1 TLSv1.1 TLSv1.2;?

?ssl_ciphers ???? AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;

?ssl_certificate ???? /usr/local/nginx/conf/cert.pem;? ##私鑰

?ssl_certificate_key ????/usr/local/nginx/conf/cert.key;#證書路徑

#ssl_session_cache??? ??shared:SSL:10m;#ssl會(huì)話

ssl_session_timeout?? ??10m;##會(huì)話超時(shí)時(shí)長(zhǎng)

?}

mkdir /etc/nginx/certs

? 100? cd /etc/nginx/certs/

?openssl genrsa-out nginx.key 2048

openssl genrsa -out nginx.key 2048? openssl req -new -x509 -key nginx.key -out nginx.cert -days 3650 -subj "/CN www.ilinux.io"

?openssl req -new -x509 -key nginx.key -out nginx.cert -days 3650 -subj "/CN=www.ilinux.io"

生成秘鑰并且自簽名證書實(shí)現(xiàn)ssl



ngx_http_rewrite_module模塊:

The ngx_http_rewrite_module module is used to change request URI using PCRE regular expressions, return redirects, and conditionally select configurations.

bbs.magedu.com/ --> www.magedu.com/bbs/,? http://www.magedu.com/ --> https://www.magedu.com/

http://www.magedu.com/login.php;username=tom --> http://www.magedu.com/tom/

http://www.ilinux.io/bbs/ --> http://bbs.ilinux.io/

將用戶請(qǐng)求的URI基于regex所描述的模式進(jìn)行檢查,而后完成替換题涨;

1偎谁、rewrite regex replacement [flag]

將用戶請(qǐng)求的URI基于regex所描述的模式進(jìn)行檢查,匹配到時(shí)將其替換為replacement指定的新的URI纲堵;

注意:如果在同一級(jí)配置塊中存在多個(gè)rewrite規(guī)則巡雨,那么會(huì)自下而下逐個(gè)檢查;被某條件規(guī)則替換完成后席函,會(huì)重新一輪的替換檢查铐望,因此,隱含有循環(huán)機(jī)制茂附;[flag]所表示的標(biāo)志位用于控制此循環(huán)機(jī)制正蛙;

如果replacement是以http://或https://開頭,則替換結(jié)果會(huì)直接以重向返回給客戶端营曼;

301:永久重定向乒验;

[flag]:

last:重寫完成后停止對(duì)當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其它重寫操作,而后對(duì)新的URI啟動(dòng)新一輪重寫檢查蒂阱;提前重啟新一輪循環(huán)锻全;

break:重寫完成后停止對(duì)當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其它重寫操作,而后直接跳轉(zhuǎn)至重寫規(guī)則配置塊之后的其它配置录煤;結(jié)束循環(huán)鳄厌;

redirect:重寫完成后以臨時(shí)重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發(fā)起請(qǐng)求妈踊;不能以http://或https://開頭部翘;302

permanent:重寫完成后以永久重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發(fā)起請(qǐng)求响委;301



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.

1、valid_referers none | blocked | server_names | string ...;

定義referer首部的合法可用值窖梁;

none:請(qǐng)求報(bào)文首部沒(méi)有referer首部赘风;

blocked:請(qǐng)求報(bào)文的referer首部沒(méi)有值;

server_names:參數(shù)纵刘,其可以有值作為主機(jī)名或主機(jī)名模式邀窃;

arbitrary_string:直接字符串,但可使用*作通配符;

regular expression:被指定的正則表達(dá)式模式匹配到的字符串瞬捕;要使用~打頭鞍历,例如 ~.*\.magedu\.com;

配置示例:

valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.;

if($invalid_referer) {

return http://www.magedu.com/invalid.jpg;

}

ngx_http_proxy_module模塊:

The ngx_http_proxy_module module allows passing requests to another server.

1肪虎、proxy_pass URL;

Context: location, if in location, limit_except

注意:proxy_pass后面的路徑不帶uri時(shí)劣砍,其會(huì)將location的uri傳遞給后端主機(jī);

server {

...

server_name HOSTNAME;

location /uri/ {

proxy http://hos[:port];

}

...

}

http://HOSTNAME/uri --> http://host/uri

proxy_pass后面的路徑是一個(gè)uri時(shí)扇救,其會(huì)將location的uri替換為proxy_pass的uri刑枝;

server {

...

server_name HOSTNAME;

location /uri/ {

proxy http://host/new_uri/;

}

...

}

http://HOSTNAME/uri/ --> http://host/new_uri/

如果location定義其uri時(shí)使用了正則表達(dá)式的模式,或在if語(yǔ)句或limt_execept中使用proxy_pass指令迅腔,則proxy_pass之后必須不能使用uri; 用戶請(qǐng)求時(shí)傳遞的uri將直接附加代理到的服務(wù)的之后装畅;

server {

...

server_name HOSTNAME;

location ~|~* /uri/ {

proxy http://host;

}

...

}

http://HOSTNAME/uri/ --> http://host/uri/;

docker run --name websrv1 -it -v /vols/websrv1:/web/htdocs busybox #啟動(dòng)容器充當(dāng)后端服務(wù)器 并且添加首頁(yè)文件沧烈,運(yùn)行程序在前端

/ # httpd -f -h /web/htdocs/

[root@centos7 websrv1]# curl 172.17.0.2 #請(qǐng)求

hello proxy web1 返回成功


配置代理服務(wù)掠兄,指向后端服務(wù)器


2、proxy_set_header field value;?

設(shè)定發(fā)往后端主機(jī)的請(qǐng)求報(bào)文的請(qǐng)求首部的值锌雀;Context: http, server, location

proxy_set_header X-Real-IP? $remote_addr; #修改向后端發(fā)送請(qǐng)求的真正客戶段ip地址

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;



修改容器中的日志格式IP地址為X-Real-IP選項(xiàng)指定為真實(shí)機(jī)器ip


修改nginx代理添加首部X-Real-IP 和ip地址至后端

kill -1 在容器重新加載配置文件

測(cè)試成功



9蚂夕、proxy_hide_header field;

默認(rèn)情況下,nginx不會(huì)從代理服務(wù)器對(duì)客戶端的響應(yīng)中傳遞標(biāo)題字段“Date”汤锨,“Server”双抽,“X-Pad”和“X-Accel -...”。 proxy_hide_header指令設(shè)置了不會(huì)傳遞的其他字段闲礼。

proxy_connect_timeout time;

定義與代理服務(wù)器建立連接的超時(shí)牍汹。 應(yīng)該注意,此超時(shí)通常不會(huì)超過(guò)75秒柬泽。

proxy_read_timeout time;

定義從代理服務(wù)器讀取響應(yīng)的超時(shí)慎菲。 僅在兩個(gè)連續(xù)的讀操作之間設(shè)置超時(shí),而不是為整個(gè)響應(yīng)的傳輸锨并。

proxy_send_timeout time;

設(shè)置將請(qǐng)求傳輸?shù)酱矸?wù)器的超時(shí)露该。 僅在兩次連續(xù)寫操作之間設(shè)置超時(shí),而不是為整個(gè)請(qǐng)求的傳輸第煮。 如果代理服務(wù)器在此時(shí)間內(nèi)未收到任何內(nèi)容解幼,則關(guān)閉連接。


ngx_http_fastcgi_module模塊:

The ngx_http_fastcgi_module module allows passing requests to a FastCGI server.

配置示例1:

前提:配置好fpm server和mariadb-server服務(wù)包警;

location ~* \.php$ {

root? ? ? ? ? /usr/share/nginx/html;?

fastcgi_pass? 127.0.0.1:9000;#指定fpm地址和端口

fastcgi_index? index.php; #指定首頁(yè)

fastcgi_param? SCRIPT_FILENAME? /usr/share/nginx/html$fastcgi_script_name;#指定參數(shù)撵摆,fastcgi_script_name為uri路徑變量,前面的路徑為fastcgi協(xié)議網(wǎng)頁(yè)的根目錄

include? ? ? ? fastcgi_params; #包含/etc/nginx/fast_param的文件

}

配置示例2:通過(guò)/pm_status和/ping來(lái)獲取fpm server狀態(tài)信息害晦;

location ~* ^/(pm_status|ping)$ {

include? ? ? ? fastcgi_params;

fastcgi_pass 127.0.0.1:9000;

fastcgi_param? SCRIPT_FILENAME? $fastcgi_script_name;

}

4特铝、fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

定義fastcgi的緩存;緩存位置為磁盤上的文件系統(tǒng),由path所指定路徑來(lái)定義鲫剿;

levels=levels:緩存目錄的層級(jí)數(shù)量鳄逾,以及每一級(jí)的目錄數(shù)量;levels=ONE:TWO:THREE

leves=1:2:2

keys_zone=name:size

k/v映射的內(nèi)存空間的名稱及大小

inactive=time

非活動(dòng)時(shí)長(zhǎng)

max_size=size

磁盤上用于緩存數(shù)據(jù)的緩存空間上限

5灵莲、fastcgi_cache zone | off;

調(diào)用指定的緩存空間來(lái)緩存數(shù)據(jù)雕凹;http, server, location

6、fastcgi_cache_key string;

定義用作緩存項(xiàng)的key的字符串笆呆;

7请琳、fastcgi_cache_methods GET | HEAD | POST ...;

為哪些請(qǐng)求方法使用緩存;

8赠幕、fastcgi_cache_min_uses number;

緩存空間中的緩存項(xiàng)在inactive定義的非活動(dòng)時(shí)間內(nèi)至少要被訪問(wèn)到此處所指定的次數(shù)方可被認(rèn)作活動(dòng)項(xiàng)俄精;

9、fastcgi_cache_valid [code ...] time;

不同的響應(yīng)碼各自的緩存時(shí)長(zhǎng)榕堰;

示例:

http {

...

fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgi:20m inactive=120s;

...

server {

...

location ~* \.php$ {

...

fastcgi_cache fcgi;

fastcgi_cache_key $request_uri;

fastcgi_cache_valid 200 302 10m;

fastcgi_cache_valid 301 1h;

fastcgi_cache_valid any 1m;

...

}

...

}

...

}


3竖慧,簡(jiǎn)述I/O模型及同步/異步消息通知機(jī)制

普及:

用戶空間與內(nèi)核空間:

?? ?現(xiàn)在操作系統(tǒng)都是采用虛擬存儲(chǔ)器,那么對(duì)32位操作系統(tǒng)而言逆屡,它的尋址空間(虛擬存儲(chǔ)空間)為4G(2的32次方)圾旨。操作系統(tǒng)的核心是內(nèi)核,獨(dú)立于普通的應(yīng)用程序魏蔗,可以訪問(wèn)受保護(hù)的內(nèi)存空間砍的,也有訪問(wèn)底層硬件設(shè)備的所有權(quán)限。為了保證用戶進(jìn)程不能直接操作內(nèi)核(kernel)莺治,保證內(nèi)核的安全廓鞠,操作系統(tǒng)將虛擬空間劃分為兩部分,一部分為內(nèi)核空間谣旁,一部分為用戶空間床佳。針對(duì)linux操作系統(tǒng)而言,將最高的1G字節(jié)(從虛擬地址0xC0000000到0xFFFFFFFF)榄审,供內(nèi)核使用砌们,稱為內(nèi)核空間,而將較低的3G字節(jié)(從虛擬地址0x00000000到0xBFFFFFFF)搁进,供各個(gè)進(jìn)程使用浪感,稱為用戶空間。

進(jìn)程切換:

?? ?為了控制進(jìn)程的執(zhí)行饼问,內(nèi)核必須有能力掛起正在CPU上運(yùn)行的進(jìn)程篮撑,并恢復(fù)以前掛起的某個(gè)進(jìn)程的執(zhí)行。這種行為被稱為進(jìn)程切換匆瓜。因此可以說(shuō),任何進(jìn)程都是在操作系統(tǒng)內(nèi)核的支持下運(yùn)行的,是與內(nèi)核緊密相關(guān)的驮吱。

從一個(gè)進(jìn)程的運(yùn)行轉(zhuǎn)到另一個(gè)進(jìn)程上運(yùn)行茧妒,這個(gè)過(guò)程中經(jīng)過(guò)下面這些變化:

保存處理機(jī)上下文,包括程序計(jì)數(shù)器和其他寄存器左冬。

更新PCB信息桐筏。

把進(jìn)程的PCB移入相應(yīng)的隊(duì)列,如就緒拇砰、在某事件阻塞等隊(duì)列梅忌。

選擇另一個(gè)進(jìn)程執(zhí)行,并更新其PCB除破。

更新內(nèi)存管理的數(shù)據(jù)結(jié)構(gòu)牧氮。

恢復(fù)處理機(jī)上下文。

注:總而言之就是很耗資源瑰枫,具體的可以參考這篇文章:

http://guojing.me/linux-kernel-architecture/posts/process-switch/

進(jìn)程阻塞:

?? ?正在執(zhí)行的進(jìn)程踱葛,由于期待的某些事件未發(fā)生,如請(qǐng)求系統(tǒng)資源失敗光坝、等待某種操作的完成尸诽、新數(shù)據(jù)尚未到達(dá)或無(wú)新工作做等,則由系統(tǒng)自動(dòng)執(zhí)行阻塞原語(yǔ)(Block)盯另,使自己由運(yùn)行狀態(tài)變?yōu)樽枞麪顟B(tài)性含。可見(jiàn)鸳惯,進(jìn)程的阻塞是進(jìn)程自身的一種主動(dòng)行為商蕴,也因此只有處于運(yùn)行態(tài)的進(jìn)程(獲得CPU),才可能將其轉(zhuǎn)為阻塞狀態(tài)悲敷。當(dāng)進(jìn)程進(jìn)入阻塞狀態(tài)究恤,是不占用CPU資源的。

文件描述符:

?? ?文件描述符(File descriptor)是計(jì)算機(jī)科學(xué)中的一個(gè)術(shù)語(yǔ)后德,是一個(gè)用于表述指向文件的引用的抽象化概念部宿。

文件描述符在形式上是一個(gè)非負(fù)整數(shù)。實(shí)際上瓢湃,它是一個(gè)索引值理张,指向內(nèi)核為每一個(gè)進(jìn)程所維護(hù)的該進(jìn)程打開文件的記錄表。當(dāng)程序打開一個(gè)現(xiàn)有文件或者創(chuàng)建一個(gè)新文件時(shí)绵患,內(nèi)核向進(jìn)程返回一個(gè)文件描述符雾叭。在程序設(shè)計(jì)中,一些涉及底層的程序編寫往往會(huì)圍繞著文件描述符展開落蝙。但是文件描述符這一概念往往只適用于UNIX织狐、Linux這樣的操作系統(tǒng)暂幼。

緩存IO:

?? ?緩存 IO 又被稱作標(biāo)準(zhǔn) IO,大多數(shù)文件系統(tǒng)的默認(rèn) IO 操作都是緩存 IO移迫。在 Linux 的緩存 IO 機(jī)制中旺嬉,操作系統(tǒng)會(huì)將 IO 的數(shù)據(jù)緩存在文件系統(tǒng)的頁(yè)緩存( page cache )中,也就是說(shuō)厨埋,數(shù)據(jù)會(huì)先被拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū)中邪媳,然后才會(huì)從操作系統(tǒng)內(nèi)核的緩沖區(qū)拷貝到應(yīng)用程序的地址空間。

緩存IO的缺點(diǎn):

?? ?數(shù)據(jù)在傳輸過(guò)程中需要在應(yīng)用程序地址空間和內(nèi)核進(jìn)行多次數(shù)據(jù)拷貝操作荡陷,這些數(shù)據(jù)拷貝操作所帶來(lái)的 CPU 以及內(nèi)存開銷是非常大的雨效。

Linux IO模型:

?? ?網(wǎng)絡(luò)IO的本質(zhì)是socket的讀取,socket在linux系統(tǒng)中被抽象為流,IO可以理解為對(duì)流的操作.對(duì)于一次IO訪問(wèn),數(shù)據(jù)會(huì)先被拷到操作系統(tǒng)內(nèi)核的緩沖區(qū)中,然后才會(huì)從操作系統(tǒng)內(nèi)核的緩沖區(qū)拷貝到應(yīng)用程序的地址空間,所以說(shuō)當(dāng)一個(gè)read操作發(fā)生時(shí),它會(huì)經(jīng)理兩個(gè)階段:

1

2

第一階段:等待數(shù)據(jù)準(zhǔn)備 (Waiting?for?the data to be ready)。

第二階段:將數(shù)據(jù)從內(nèi)核拷貝到進(jìn)程中 (Copying the data from the kernel to the process)废赞。

?? ?對(duì)socket流而言:

1

2

第一步:通常涉及等待網(wǎng)絡(luò)上的數(shù)據(jù)分組到達(dá)徽龟,然后被復(fù)制到內(nèi)核的某個(gè)緩沖區(qū)。

第二步:把數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到應(yīng)用進(jìn)程緩沖區(qū)蛹头。

網(wǎng)絡(luò)應(yīng)用需要處理的無(wú)非就是兩大類問(wèn)題顿肺,網(wǎng)絡(luò)IO,數(shù)據(jù)計(jì)算渣蜗。相對(duì)于后者屠尊,網(wǎng)絡(luò)IO的延遲,給應(yīng)用帶來(lái)的性能瓶頸大于后者耕拷。網(wǎng)絡(luò)IO的模型大致有如下幾種:


同步模型(synchronous IO)

???阻塞IO(bloking IO)

???非阻塞IO(non-blocking IO)

???多路復(fù)用IO(multiplexing IO)

???信號(hào)驅(qū)動(dòng)式IO(signal-driven IO)

異步IO(asynchronous IO)

同步4個(gè):阻塞IO讼昆、非阻塞IO、多路復(fù)用IO骚烧、信號(hào)驅(qū)使式IO

異步1個(gè):異步IO

注:由于信號(hào)驅(qū)動(dòng)式(signal driven IO)在實(shí)際中并不常用浸赫,所以我這只提及剩下的四種IO Model。

在深入介紹Linux IO各種模型之前赃绊,讓我們先來(lái)探索一下基本 Linux IO 模型的簡(jiǎn)單矩陣酵颁。如下圖所示:


每個(gè) IO 模型都有自己的使用模式署恍,它們對(duì)于特定的應(yīng)用程序都有自己的優(yōu)點(diǎn)择懂。

同步和異步主要針對(duì)C(client)端

同步:

所謂的同步耗帕,就是在c端發(fā)出一個(gè)功能調(diào)用時(shí),在沒(méi)有得到結(jié)果之前忠售,該調(diào)用步返回传惠,也就是說(shuō)必須一件一件事做,等前一件事完了之后才做后一件事稻扬。

如:普通的B/S模式(同步):提交請(qǐng)求->等待服務(wù)器處理->處理完畢返回卦方,這期間客戶端瀏覽器不能干任何事

異步:

與同步相對(duì)。當(dāng)C端一個(gè)異步過(guò)程調(diào)用發(fā)出之后泰佳,調(diào)用者不能立即得到結(jié)果盼砍,實(shí)際處理這個(gè)調(diào)用的部件在完成后尘吗,通過(guò)狀態(tài),通知和回調(diào)來(lái)通知調(diào)用者浇坐。

如:請(qǐng)求通過(guò)事件觸發(fā)->服務(wù)器處理(瀏覽器仍然可以做其他事情)->處理完畢

阻塞和非阻塞主要針對(duì)S端(server)

阻塞:

阻塞調(diào)用是指調(diào)用結(jié)果返回之前摇予,當(dāng)前線程會(huì)被掛起(線程進(jìn)入非可執(zhí)行狀態(tài),在這個(gè)狀態(tài)吗跋,cpu不會(huì)分配時(shí)間片,線程暫停運(yùn)行)函數(shù)只有得到結(jié)果返回宁昭。

阻塞調(diào)用和同步調(diào)用的區(qū)別:對(duì)同步來(lái)說(shuō)跌宛,很多時(shí)候當(dāng)前線程還是激活的,只是邏輯上沒(méi)有返回积仗,如疆拘,在socket編程中調(diào)用recv函數(shù),如果緩沖區(qū)沒(méi)有數(shù)據(jù)寂曹,這個(gè)函數(shù)就會(huì)一直等待哎迄,直到有數(shù)據(jù)返回。而此前當(dāng)前線程還有可能繼續(xù)處理各種各樣的消息隆圆。

阻塞的例子:比如去取A樓一層(假設(shè)是內(nèi)核緩沖區(qū))取快遞漱挚,但是比不知道什么時(shí)候來(lái),你有不能干別的事情渺氧,只能死等著但是可以睡覺(jué)(進(jìn)程處于休眠狀態(tài))旨涝,因?yàn)槟阒揽爝f把貨送來(lái)時(shí)一定會(huì)給比大電話

非阻塞:

非阻塞與阻塞概念想對(duì)應(yīng),指在不能立即得到結(jié)果之前侣背,該函數(shù)不會(huì)阻塞當(dāng)前線程白华,而會(huì)立即返回。

非阻塞的例子:還是等快遞贩耐,如果用輪詢的方式弧腥,每隔5分鐘去A樓一層(內(nèi)核緩沖區(qū))去看快遞來(lái)了沒(méi),沒(méi)來(lái)潮太,立即返回管搪,如果快遞來(lái)了,就放到A樓一層消别,等你去取抛蚤。

對(duì)象是否處于阻塞模式和函數(shù)是不是阻塞調(diào)用有很強(qiáng)的相關(guān)性,但不是一一對(duì)應(yīng)的寻狂。阻塞對(duì)象上可以有非阻塞的調(diào)用方式岁经,我們可以通過(guò)輪詢狀態(tài),在適當(dāng)?shù)臅r(shí)候調(diào)用阻塞函數(shù)蛇券,就可以避免阻塞缀壤,而對(duì)于非阻塞對(duì)象樊拓,調(diào)用函數(shù)可以進(jìn)入阻塞調(diào)用,對(duì)于select:

1:同步?

1我客戶端(C端調(diào)用者)一個(gè)功能塘慕,該功能沒(méi)有結(jié)束前筋夏,我死等結(jié)果。

2:異步


我(c端調(diào)用者)調(diào)用一個(gè)功能图呢,不知道該功能結(jié)果条篷,該功能有結(jié)果后通知我,即回調(diào)通知

同步和異步主要針對(duì)c端蛤织,但是跟s端不是完全沒(méi)關(guān)系赴叹,同步和異步必須s端配合才能實(shí)現(xiàn),同步和異步由c端控制指蚜,但是s端是否為阻塞還是非阻塞乞巧,c端不關(guān)心。

3:阻塞

1就是調(diào)用我(s端被調(diào)用者摊鸡,函數(shù))绽媒,我(s端被調(diào)用者,函數(shù))沒(méi)有完全接受完數(shù)據(jù)或者沒(méi)有得到結(jié)果之前免猾,我不會(huì)返回是辕。

4:非阻塞

1就是調(diào)用我(s端被調(diào)用者,函數(shù))掸刊,我(s端被調(diào)用者免糕,函數(shù))立即返回,通過(guò)select通知調(diào)用者

同步I/O與異步I/O的區(qū)別在與數(shù)據(jù)訪問(wèn)的時(shí)候進(jìn)程是否阻塞

阻塞I/O與非阻塞I/O的區(qū)別在與:應(yīng)該程序的調(diào)用是否立即返回忧侧。

阻塞和非阻塞是指server端的進(jìn)程訪問(wèn)的數(shù)據(jù)如果尚未就緒石窑,進(jìn)程是否需要等待,簡(jiǎn)單說(shuō)這相當(dāng)于函數(shù)內(nèi)部的實(shí)現(xiàn)區(qū)別蚓炬,也就是未就緒時(shí)時(shí)直接返回還是等待就緒松逊。

就同步和異步是指client端訪問(wèn)數(shù)據(jù)的機(jī)制,同步一般指主動(dòng)請(qǐng)求并等待I/O操作完畢的方式肯夏,當(dāng)數(shù)據(jù)就緒后再讀寫額時(shí)候必須阻塞经宏,異步則指主動(dòng)請(qǐng)求數(shù)據(jù)后便可以繼續(xù)處理其他任務(wù),隨后等待I/O驯击,操作完畢的通知烁兰。

一、阻塞I/O模型:

簡(jiǎn)介:進(jìn)程會(huì)一直阻塞徊都,直到數(shù)據(jù)拷貝完成

應(yīng)用程序調(diào)用一個(gè)I/O函數(shù)沪斟,導(dǎo)致應(yīng)用程序阻塞,等待數(shù)據(jù)準(zhǔn)備好暇矫,如果數(shù)據(jù)沒(méi)有準(zhǔn)備好主之,一直等待择吊。。數(shù)據(jù)準(zhǔn)備好槽奕,從內(nèi)核拷貝到用戶空間几睛,I/O函數(shù)返回成功

阻塞I/O模型圖:在調(diào)用recv()/recvfrom(),發(fā)生在內(nèi)核中等待數(shù)據(jù)和復(fù)制數(shù)據(jù)過(guò)程粤攒。


當(dāng)調(diào)用recv()函數(shù)時(shí)所森,系統(tǒng)首先檢查是否有準(zhǔn)備好的數(shù)據(jù),如果數(shù)據(jù)沒(méi)有準(zhǔn)備好夯接,那么系統(tǒng)就處于等待狀態(tài)必峰,當(dāng)數(shù)據(jù)準(zhǔn)備好后,將數(shù)據(jù)從系統(tǒng)緩沖區(qū)復(fù)制到用戶空間钻蹬,然后函數(shù)返回。在套接應(yīng)用程序中凭需,當(dāng)調(diào)用recv()函數(shù)時(shí)问欠,未必用戶空間就已經(jīng)存在數(shù)據(jù),那么此時(shí)recv()函數(shù)處于等待狀態(tài)

二粒蜈、非阻塞I/O模型:

簡(jiǎn)介:我們把一個(gè)套接口設(shè)置為非阻塞就是告訴內(nèi)存顺献,當(dāng)所請(qǐng)求的I/O操作無(wú)法完成時(shí),不要驚進(jìn)程睡眠枯怖,而是返回一個(gè)錯(cuò)誤注整,河陽(yáng)I/O函數(shù)會(huì)不斷的測(cè)試數(shù)據(jù)是否準(zhǔn)備好,沒(méi)有準(zhǔn)備好度硝,繼續(xù)測(cè)試肿轨,直到數(shù)據(jù)準(zhǔn)備好為止。在測(cè)試的過(guò)程中會(huì)占用大量的CPU時(shí)間蕊程。

三椒袍、I/O復(fù)用模型:

簡(jiǎn)介:主要是select和epoll;對(duì)于一個(gè)I/O端口藻茂,兩次調(diào)用驹暑,兩次返回,比阻塞I/O并沒(méi)有什么優(yōu)勢(shì)辨赐,只是能實(shí)現(xiàn)同時(shí)對(duì)多個(gè)I/O端口進(jìn)行監(jiān)聽优俘。

I/O復(fù)用模型會(huì)調(diào)用select,poll函數(shù)掀序,這幾個(gè)函數(shù)也會(huì)使進(jìn)程阻塞帆焕,但是和阻塞I/O不同的,這個(gè)函數(shù)可以同時(shí)阻塞多個(gè)I/O操作森枪,而且可以同時(shí)對(duì)多個(gè)讀操作视搏,多個(gè)寫操作的I/O函數(shù)進(jìn)行檢測(cè)审孽,直到有數(shù)據(jù)可讀或可寫時(shí),才真正調(diào)用I/O操作函數(shù)浑娜。

四佑力、信號(hào)驅(qū)動(dòng)I/O:

簡(jiǎn)介:兩次調(diào)用,兩次返回

首先允許套接口進(jìn)行信號(hào)驅(qū)動(dòng)I/O筋遭,并安裝一個(gè)信號(hào)處理函數(shù)打颤,進(jìn)程繼續(xù)運(yùn)行并不阻塞。昂數(shù)據(jù)準(zhǔn)備好時(shí)漓滔,進(jìn)程會(huì)收到一個(gè)SIGIO信號(hào)编饺,可以在信號(hào)處理函數(shù)中調(diào)用I/O操作函數(shù)處理數(shù)據(jù)。

五响驴、異步I/O模型:

簡(jiǎn)介:數(shù)據(jù)拷貝的時(shí)候進(jìn)程無(wú)需阻塞

當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后透且,調(diào)用者不能立刻得到結(jié)果。實(shí)際處理這個(gè)調(diào)用的部件在完成后豁鲤,通過(guò)狀態(tài)秽誊,通知和回調(diào)通知調(diào)用者輸入輸出操作。

ki

同步I/O引起進(jìn)程阻塞琳骡,直到I/O操作完成

異步I/O不會(huì)引起進(jìn)程阻塞

I/O復(fù)用先通過(guò)select調(diào)用阻塞


NGINX:

nginx 支持多種并發(fā)模型锅论,并發(fā)模型的具體實(shí)現(xiàn)根據(jù)系統(tǒng)平臺(tái)而有所不同。

在支持多種并發(fā)模型的平臺(tái)上楣号,nginx 自動(dòng)選擇最高效的模型最易。但我們也可以使用 use 指令在配置文件中顯式地定義某個(gè)并發(fā)模型。

NGINX中支持的并發(fā)模型:

select:

1IO多路復(fù)用炫狱、標(biāo)準(zhǔn)并發(fā)模型藻懒。在編譯 nginx 時(shí),如果所使用的系統(tǒng)平臺(tái)沒(méi)有更高效的并發(fā)模型视译,select?模塊將被自動(dòng)編譯束析。configure 腳本的選項(xiàng):--with-select_module 和 --without-select_module 可被用來(lái)強(qiáng)制性地開啟或禁止?select?模塊的編譯

poll:

1IO多路復(fù)用、標(biāo)準(zhǔn)并發(fā)模型憎亚。與?select?類似员寇,在編譯 nginx 時(shí),如果所使用的系統(tǒng)平臺(tái)沒(méi)有更高效的并發(fā)模型第美,poll 模塊將被自動(dòng)編譯蝶锋。configure 腳本的選項(xiàng):--with-poll_module 和 --without-poll_module 可用于強(qiáng)制性地開啟或禁止 poll 模塊的編譯

epoll:

1IO多路復(fù)用、高效并發(fā)模型什往,可在 Linux 2.6+ 及以上內(nèi)核可以使用

kqueue:

1IO多路復(fù)用扳缕、高效并發(fā)模型,可在 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0, and Mac OS X 平臺(tái)中使用

/dev/poll:

1高效并發(fā)模型,可在 Solaris 7 11/99+, HP/UX?11.22+ (eventport), IRIX 6.5.15+, and Tru64 UNIX 5.1A+ 平臺(tái)使用

eventport:

1高效并發(fā)模型躯舔,可用于 Solaris 10 平臺(tái)驴剔,PS:由于一些已知的問(wèn)題,建議 使用/dev/poll替代粥庄。


為什么epoll快丧失?

比較一下Apache常用的select,和Nginx常用的epoll

select:


1惜互、最大并發(fā)數(shù)限制布讹,因?yàn)橐粋€(gè)進(jìn)程所打開的 FD (文件描述符)是有限制的,由 FD_SETSIZE 設(shè)置训堆,默認(rèn)值是 1024/2048?描验,因此 Select 模型的最大并發(fā)數(shù)就被相應(yīng)限制了。自己改改這個(gè) FD_SETSIZE 坑鱼?想法雖好膘流,可是先看看下面吧 …

2、效率問(wèn)題鲁沥,?select?每次調(diào)用都會(huì)線性掃描全部的 FD 集合睡扬,這樣效率就會(huì)呈現(xiàn)線性下降,把 FD_SETSIZE 改大的后果就是黍析,大家都慢慢來(lái),什么屎开?都超時(shí)了阐枣。

3、內(nèi)核 / 用戶空間 內(nèi)存拷貝問(wèn)題奄抽,如何讓內(nèi)核把 FD 消息通知給用戶空間呢蔼两?在這個(gè)問(wèn)題上?select?采取了內(nèi)存拷貝方法,在FD非常多的時(shí)候逞度,非常的耗費(fèi)時(shí)間额划。

總結(jié)為:1、連接數(shù)受限 2档泽、查找配對(duì)速度慢 3俊戳、數(shù)據(jù)由內(nèi)核拷貝到用戶態(tài)消耗時(shí)間

epoll:


1、Epoll 沒(méi)有最大并發(fā)連接的限制馆匿,上限是最大可以打開文件的數(shù)目抑胎,這個(gè)數(shù)字一般遠(yuǎn)大于 2048, 一般來(lái)說(shuō)這個(gè)數(shù)目和系統(tǒng)內(nèi)存關(guān)系很大 ,具體數(shù)目可以?cat?/proc/sys/fs/file-max?查看渐北。

2阿逃、效率提升, Epoll 最大的優(yōu)點(diǎn)就在于它只管你“活躍”的連接 ,而跟連接總數(shù)無(wú)關(guān)恃锉,因此在實(shí)際的網(wǎng)絡(luò)環(huán)境中搀菩, Epoll 的效率就會(huì)遠(yuǎn)遠(yuǎn)高于?select?和 poll 。

3破托、內(nèi)存共享肪跋, Epoll 在這點(diǎn)上使用了“共享內(nèi)存 ”,這個(gè)內(nèi)存拷貝也省略了炼团。


4,澎嚣,實(shí)現(xiàn)lnmp提供多個(gè)虛擬主機(jī),nginx和php使用不同主機(jī)

使用容器搭建

docker pull php:7-fpm-alpine?

docker run --name fpmsrv1 -d --network bridge -v /vols/phpsrv1:/appdata php:7-fpm-alpine #創(chuàng)建容器


[root@centos7 nginx]# vim /vols/phpsrv1/index.php #創(chuàng)建測(cè)試頁(yè)

<?php

? ? ? ? phpinfo();

?>

[root@centos7 nginx]# vim /etc/nginx/nginx.conf #修改配置文件

server {

? ? ? ? listen 8080;

? ? ? ? server_name 192.168.1.198;

? ? ? ? root "/web/nginx/html";

? ? ? ? location / {

? ? ? ? ? ? ? ? root "/web/nginx/html";

? ? ? ? ? ? ? ? index index.html;


? ? ? ? }

? ? ? ? location = /ngx_status {

? ? ? ? ? ? ? ? stub_status;


? ? ? ? }

? ? ? ? location /bbs/ {

? ? ? ? ? ? ? ? rewrite ^/bbs/(.*)$ /froum/$1 break;

? ? ? ? }

? ? ? ? location ~* \.php$ {

? ? ? ? ? ? ? ? fastcgi_pass 172.17.0.3:9000;

? ? ? ? ? ? ? ? fastcgi_index index.php;

? ? ? ? ? ? ? ? fastcgi_param SCRIPT_FILENAME /appdata$fastcgi_script_name;將后端fpm地址映射至本地路徑

? ? ? ? ? ? ? ? include fastcgi_params;#將本地的/etc/nginx/fastcgi_params包含進(jìn)來(lái)

? ? ? ? }

}

測(cè)試成功

5瘟芝,自定義錯(cuò)誤404和5xx錯(cuò)誤頁(yè)易桃,文本靜態(tài)內(nèi)容傳輸壓縮

10、error_page code ... [=[response]] uri;

Defines the URI that will be shown for the specified errors.

# error_page 404 /404.html; #自定義404的錯(cuò)誤頁(yè)面

#? ? ? ? ? ? location = /40x.html {

#? ? ? ? }


error_page 502 503 /50x.html;

location = /50x.html {

? ? root /usr/share/nginx/50x.html;

}?

error_page 404 403 /40x.html;

location = /50x.html {

? ? root /usr/share/nginx40x.html;

}?

error_page 404 /404.html 可顯示自定義404頁(yè)面內(nèi)容锌俱,正常返回404狀態(tài)碼晤郑。

error_page 404 = /404.html 可顯示自定義404頁(yè)面內(nèi)容,但返回200狀態(tài)碼贸宏。

error_page 404 /404.php 如果是動(dòng)態(tài)404錯(cuò)誤頁(yè)面造寝,包含 header 代碼(例如301跳轉(zhuǎn)),將無(wú)法正常執(zhí)行吭练。正常返回404代碼诫龙。

error_page 404 = /404.php 如果是動(dòng)態(tài)404錯(cuò)誤頁(yè)面,包含 header 代碼(例如301跳轉(zhuǎn))鲫咽,加等號(hào)配置可以正常執(zhí)行签赃,返回php中定義的狀態(tài)碼。但如果php中定義返回404狀態(tài)碼分尸,404狀態(tài)碼可以正常返回锦聊,但無(wú)法顯示自定義頁(yè)面內(nèi)容(出現(xiàn)系統(tǒng)默認(rèn)404頁(yè)面),這種情況可以考慮用410代碼替代( header("HTTP/1.1 410 Gone"); 正常返回410狀態(tài)碼箩绍,且可正常顯示自定義內(nèi)容)孔庭。




ngx_http_gzip_module:#nginx的壓縮模塊

ngx_http_gzip_module模塊是一個(gè)使用“gzip”方法壓縮響應(yīng)的過(guò)濾器。 這通常有助于將傳輸數(shù)據(jù)的大小減少一半甚至更多材蛛。

1圆到、gzip on | off;

Enables or disables gzipping of responses.

2、gzip_comp_level level;

設(shè)置響應(yīng)的gzip壓縮級(jí)別卑吭。 可接受的值范圍為1到9构资。

3、 gzip_disable regex ...;

對(duì)具有與任何指定正則表達(dá)式匹配的“User-Agent”標(biāo)頭字段的請(qǐng)求禁用gzipping響應(yīng)陨簇。

4吐绵、 gzip_min_length length;

啟用壓縮功能的響應(yīng)報(bào)文大小閾值(下限)迹淌;

5、gzip_buffers number size;

支持實(shí)現(xiàn)壓縮功能時(shí)為其配置的緩沖區(qū)數(shù)量及每個(gè)緩存區(qū)的大屑旱ァ唉窃;

6、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;

nginx作為代理服務(wù)器接收到從被代理服務(wù)器發(fā)送的響應(yīng)報(bào)文后纹笼,在何種條件下啟用壓縮功能的纹份;

off:對(duì)代理的請(qǐng)求不啟用

no-cache, no-store,private:表示從被代理服務(wù)器收到的響應(yīng)報(bào)文首部的Cache-Control的值為此三者中任何一個(gè)廷痘,則啟用壓縮功能蔓涧;

示例:

gzip? on;#開啟壓縮

gzip_comp_level 6;#壓縮登記

gzip_min_length 64;#低于64字節(jié)不壓縮

gzip_proxied any; #任何被代理的也需要壓縮

gzip_types text/xml text/css? application/javascript; #壓縮類型


6,實(shí)現(xiàn)4個(gè)虛擬主機(jī)笋额,混合使用三種類型的虛擬主機(jī)元暴,僅開放給來(lái)自于本地網(wǎng)絡(luò)中的主機(jī)訪問(wèn)

server {

? ? ? ? listen 8088;

? ? ? ? server_name www.stephenzhong.com;

? ? ? ? proxy_set_header X-Real-IP $remote_addr;

? ? ? ? location / {

? ? ? ? ? ? ? ? proxy_pass http://172.17.0.2/;

? ? ? ? }

? ? ? ? location ~* \.(jpg|jepg|png) {

? ? ? ? ? ? ? ? proxy_pass http://172.17.0.2;

? ? ? ? }

}? ? ? ?

? ? server {

? ? ? ? listen 8080;

? ? ? ? server_name 192.168.1.198;

? ? ? ? root "/web/nginx/html";

? ? ? ? location / {

? ? ? ? ? ? ? ? root "/web/nginx/html";

? ? ? ? ? ? ? ? index index.html;


? ? ? ? }

? ? ? ? location = /ngx_status {

? ? ? ? ? ? ? ? stub_status;


? ? ? ? }

? ? ? ? location /bbs/ {

? ? ? ? ? ? ? ? rewrite ^/bbs/(.*)$ /froum/$1 break;

? ? ? ? }

? ? ? ? location ~* \.php$ {

? ? ? ? ? ? ? ? fastcgi_pass 172.17.0.3:9000;

? ? ? ? ? ? ? ? fastcgi_index index.php;

? ? ? ? ? ? ? ? fastcgi_param SCRIPT_FILENAME /appdata$fastcgi_script_name;

? ? ? ? ? ? ? ? include fastcgi_params;

? ? ? ? }

}

mkdir /etc/nginx/certs

? 100? cd /etc/nginx/certs/

?openssl genrsa-out nginx.key 2048

openssl genrsa -out nginx.key 2048? openssl req -new -x509 -key nginx.key -out nginx.cert -days 3650 -subj "/CN www.ilinux.io"

?openssl req -new -x509 -key nginx.key -out nginx.cert -days 3650 -subj "/CN=www.ilinux.io"

生成秘鑰并且自簽名證書實(shí)現(xiàn)ssl














7,實(shí)現(xiàn)lnmp兄猩,提供多個(gè)虛擬主機(jī)?

? ? 1)http茉盏,提供wordpress

wget?http://nginx.org/download/nginx-1.14.2.tar.gz #下載nginx源碼包? ??

tar?-zxf?nginx-1.12.1.tar.gz? #解壓包

yum groupinstall "Development Tools"? #下載編譯包組

yum?install?openssl-devel?pcre-devel?libevent-devel?-y #下載所需依賴的包

cd nginx-1.14.2 #進(jìn)入解壓目錄

nginx-1.14.2]#?./configure?\? #執(zhí)行編譯操作指定選項(xiàng)

--prefix=/usr/local/nginx?\

--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/lock/subsys/nginx.lock?\

--user=nginx?--group=nginx?\

--with-http_ssl_module?\

--with-http_v2_module?\

--with-http_dav_module?\

--with-threads?\

--with-file-aio?\

--with-http_stub_status_module

make?&&?make?install #編譯并且復(fù)制文件到指定的目錄下

nginx-1.14.2]#?useradd?nginx??#同名組自動(dòng)創(chuàng)建

因?yàn)樵谶M(jìn)行編譯配置的時(shí)候我們就將nginx的二進(jìn)制文件寫到了“/usr/sbin/”下,所以我們可以直接使用命令來(lái)啟動(dòng)nginx:

nginx-1.14.2]#?nginx

接下來(lái)我們使用命令來(lái)查看nginx是否啟動(dòng)成功:

nginx-1.14.1=2]# ss -tnl

使用命令停掉httpd(如果沒(méi)啟動(dòng)就不用管了):

~]#?service?httpd?stop

????此時(shí)在真實(shí)主機(jī)上就可以通過(guò)瀏覽器訪問(wèn)“192.168.1.198”(這個(gè)IP是剛才虛擬機(jī)的IP)

這樣的Nginx的配置就完成了枢冤,下面開始配置1個(gè)虛擬主機(jī)鸠姨,1個(gè)虛擬主機(jī)的根目錄我存放在“/myweb/wordpress

?mkdir?-pv?/myweb/wordpress

nginx-1.12.1]#?vim?/etc/nginx/nginx.conf

在“http”的大括號(hào)中添加下面這條:

include?/etc/nginx/conf/*.conf"

? ? 接下來(lái)我們?cè)凇?etc/nginx/conf/”下創(chuàng)建一個(gè)以“.conf”結(jié)尾的片段配置文件并寫入內(nèi)容:

server?{

??listen?80;

??server_name?myweb.wordpress.com;

??location?/?{

????root?/myweb/wordpress;

????index?index.html;

??}

}

?保存并退出之后,使用“nginx -t”命令檢查配置文件是否有錯(cuò)誤淹真,如果沒(méi)有錯(cuò)誤讶迁,就使用“nginx -s reload”命令重新載入配置:

wordpress需要依賴數(shù)據(jù)庫(kù),所以需要先安裝數(shù)據(jù)庫(kù)核蘸,我這里默認(rèn)安裝為mariadb

yum install mariadb-server

https://cn.wordpress.org/latest-zh_CN.zip

然后分別解壓到各自對(duì)應(yīng)的目錄中:

~]# tar -zxf?wordpress-4.9.4-zh_CN.tar.gz?-C /myweb/wordpress/

systemctl start mariadb 啟動(dòng)數(shù)據(jù)庫(kù)

CREATE USER 'wordpress'@'%' IDENTIFIED BY '123456';?這種方法允許任何遠(yuǎn)程連接

[root@centos7 wordpress]# cp ../wordpress/wp-config-sample.php ./wp-config.php

[root@centos7 wordpress]# vim wp-config.php

先拷貝一份wordpress自帶的配置文件巍糯,并修改其配置信息:

yum install php php-fpm && systemctl start php #安裝并啟動(dòng)phpfpm協(xié)議

置完成之后,我們還需要回到剛才配置虛擬主機(jī)那里把剛才的配置增加幾條選項(xiàng)值纱,變成下面的樣子(因?yàn)镹ginx默認(rèn)將PHP注釋掉了,需要我們自己開啟):

server?{

??listen?80;

??server_name?192.168.1.198;??

??location?/?{

????root?/myweb/wordpress/wordpress;

????index?index.html?index.php;

??}?????

??location?~?\.php$?{

????root?/myweb/wordpress/wordpress;

??include????????fastcgi_params;

??fastcgi_pass???127.0.0.1:9000;

??fastcgi_index??index.php;

??fastcgi_param??SCRIPT_FILENAME??$document_root$fastcgi_script_name;

??}?????

}

yum install php php-fpm && systemctl start php #安裝并啟動(dòng)phpfpm協(xié)議

搭建成功

? ? 2)https坯汤,提供pma

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虐唠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惰聂,更是在濱河造成了極大的恐慌疆偿,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搓幌,死亡現(xiàn)場(chǎng)離奇詭異杆故,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)溉愁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門处铛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事撤蟆∞人埽” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵家肯,是天一觀的道長(zhǎng)龄砰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)讨衣,這世上最難降的妖魔是什么换棚? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮反镇,結(jié)果婚禮上固蚤,老公的妹妹穿的比我還像新娘。我一直安慰自己愿险,他們只是感情好颇蜡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辆亏,像睡著了一般风秤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扮叨,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天缤弦,我揣著相機(jī)與錄音,去河邊找鬼彻磁。 笑死碍沐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衷蜓。 我是一名探鬼主播累提,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼磁浇!你這毒婦竟也來(lái)了斋陪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤置吓,失蹤者是張志新(化名)和其女友劉穎无虚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衍锚,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡友题,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戴质。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片度宦。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踢匣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斗埂,到底是詐尸還是另有隱情符糊,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布呛凶,位于F島的核電站男娄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏漾稀。R本人自食惡果不足惜模闲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崭捍。 院中可真熱鬧尸折,春花似錦、人聲如沸殷蛇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)粒梦。三九已至亮航,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匀们,已是汗流浹背缴淋。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泄朴,地道東北人重抖。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像祖灰,于是被迫代替她去往敵國(guó)和親钟沛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • I/O模型Nginx介紹Nginx的安裝和目錄結(jié)構(gòu)Nginx的配置Nginx的編譯安裝 一局扶、I/O模型 (一)I/...
    哈嘍別樣閱讀 889評(píng)論 0 4
  • Nginx簡(jiǎn)介 解決基于進(jìn)程模型產(chǎn)生的C10K問(wèn)題,請(qǐng)求時(shí)即使無(wú)狀態(tài)連接如web服務(wù)都無(wú)法達(dá)到并發(fā)響應(yīng)量級(jí)一萬(wàn)的現(xiàn)...
    魏鎮(zhèn)坪閱讀 1,988評(píng)論 0 9
  • I/O模型: 阻塞型恨统、非阻塞型、復(fù)用型详民、信號(hào)驅(qū)動(dòng)型延欠、異步 同步/異步:關(guān)注消息通知機(jī)制 消息通知:同步:等待對(duì)方返...
    Net夜風(fēng)閱讀 1,992評(píng)論 0 1
  • 1.簡(jiǎn)介: ? Nginx:engine X 陌兑,2002年沈跨,開源,商業(yè)版? http協(xié)議:web服務(wù)器(類似于ht...
    尛尛大尹閱讀 1,860評(píng)論 0 3
  • 大多數(shù) Nginx 新手都會(huì)頻繁遇到這樣一個(gè)困惑兔综,那就是當(dāng)同一個(gè)location配置塊使用了多個(gè) Nginx 模塊...
    SkTj閱讀 7,584評(píng)論 0 12