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 返回成功
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 在容器重新加載配置文件
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)用者輸入輸出操作。
同步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)
? ? ? ? }
}
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