您好,登錄后才能下訂單哦!
1.什么是Nginx
Nginx來(lái)自俄羅斯的Igor Sysoev在為Rambler Media(http://www.rambler.ru/)工作期間,使用C語(yǔ)言開發(fā)了Nginx。Nginx作為Web服務(wù)器,一直為俄羅斯著名的門戶網(wǎng)站Rambler Media提供著出色、穩(wěn)定的服務(wù)。
Igor Sysoev將Nginx的代碼開源,并且賦予其最自由的2-clause BSD-like license許可證。由于Nginx使用基于事件驅(qū)動(dòng)的架構(gòu)能夠并發(fā)處理百萬(wàn)級(jí)別的TCP連接,高度模塊化的設(shè)計(jì)和自由的許可證使得擴(kuò)展Nginx功能的第三方模塊層出不窮,而且優(yōu)秀的設(shè)計(jì)帶來(lái)了極佳的穩(wěn)定性,因此其作為Web服務(wù)器被廣泛應(yīng)用到大流量的網(wǎng)站上,包括騰訊、新浪、網(wǎng)易、淘寶等訪問量巨大的網(wǎng)站。
Nginx是一個(gè)跨平臺(tái)的Web服務(wù)器,可運(yùn)行在Linux、FreeBSD、Solaris、AIX、Mac OS、Windows等操作系統(tǒng)上,并且它還可以使用當(dāng)前操作系統(tǒng)特有的一些高效API來(lái)提高自己的性能。
例如,對(duì)于高效處理大規(guī)模并發(fā)連接,它支持Linux上的epoll(epoll是Linux上處理大并發(fā)網(wǎng)絡(luò)連接的利器,9.6.1節(jié)中將會(huì)詳細(xì)說明epoll的工作原理)、Solaris上的event ports和FreeBSD上的kqueue等。
又如,對(duì)于Linux,Nginx支持其獨(dú)有的 sendfile系統(tǒng)調(diào)用,這個(gè)系統(tǒng)調(diào)用可以高效地把硬盤中的數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上(不需要先把硬盤數(shù)據(jù)復(fù)制到用戶態(tài)內(nèi)存上再發(fā)送),這極大地減少了內(nèi)核態(tài)與用戶態(tài)數(shù)據(jù)間的復(fù)制動(dòng)作。
2.為什么選擇Nginx
為什么選擇Nginx?因?yàn)樗哂幸韵绿攸c(diǎn):
(1)更快
這表現(xiàn)在兩個(gè)方面:一方面,在正常情況下,單次請(qǐng)求會(huì)得到更快的響應(yīng);另一方面,在高峰期(如有數(shù)以萬(wàn)計(jì)的并發(fā)請(qǐng)求),Nginx可以比其他Web服務(wù)器更快地響應(yīng)請(qǐng)求。
(2)高擴(kuò)展性
Nginx的設(shè)計(jì)極具擴(kuò)展性,它完全是由多個(gè)不同功能、不同層次、不同類型且耦合度極低的模塊組成。因此,當(dāng)對(duì)某一個(gè)模塊修復(fù)Bug或進(jìn)行升級(jí)時(shí),可以專注于模塊自身,無(wú)須在意其他。而且在HTTP模塊中,還設(shè)計(jì)了HTTP過濾器模塊:一個(gè)正常的HTTP模塊在處理完請(qǐng)求后,會(huì)有一串HTTP過濾器模塊對(duì)請(qǐng)求的結(jié)果進(jìn)行再處理。這樣,當(dāng)我們開發(fā)一個(gè)新的HTTP模塊時(shí),不但可以使用諸如HTTP核心模塊、events模塊、log模塊等不同層次或者不同類型的模塊,還可以原封不動(dòng)地復(fù)用大量已有的HTTP過濾器模塊。這種低耦合度的優(yōu)秀設(shè)計(jì),造就了Nginx龐大的第三方模塊,當(dāng)然,公開的第三方模塊也如官方發(fā)布的模塊一樣容易使用。
Nginx的模塊都是嵌入到二進(jìn)制文件中執(zhí)行的,無(wú)論官方發(fā)布的模塊還是第三方模塊都是如此。這使得第三方模塊一樣具備極其優(yōu)秀的性能,充分利用Nginx的高并發(fā)特性,因此,許多高流量的網(wǎng)站都傾向于開發(fā)符合自己業(yè)務(wù)特性的定制模塊。 模塊化設(shè)計(jì)、較好的擴(kuò)展性,編譯到Nginx,并隨Nginx啟動(dòng)而啟動(dòng),但是Tengine支持模塊動(dòng)態(tài)裝卸機(jī)制。
(3)高可靠性
高可靠性是我們選擇Nginx的最基本條件,因?yàn)镹ginx的可靠性是大家有目共睹的,很多家高流量網(wǎng)站都在核心服務(wù)器上大規(guī)模使用Nginx。Nginx的高可靠性來(lái)自于其核心框架代碼的優(yōu)秀設(shè)計(jì)、模塊設(shè)計(jì)的簡(jiǎn)單性;另外,官方提供的常用模塊都非常穩(wěn)定,每個(gè)worker進(jìn)程相對(duì)獨(dú)立,master進(jìn)程在1個(gè)worker進(jìn)程出錯(cuò)時(shí)可以快速“拉起”新的worker子進(jìn)程提供服務(wù)。
(4)低內(nèi)存消耗
一般情況下,10 000個(gè)非活躍的HTTP Keep-Alive連接在Nginx中僅消耗2.5MB的內(nèi)存,這是Nginx支持高并發(fā)連接的基礎(chǔ)。
(5)單機(jī)支持10萬(wàn)以上的并發(fā)連接
這是一個(gè)非常重要的特性!隨著互聯(lián)網(wǎng)的迅猛發(fā)展和互聯(lián)網(wǎng)用戶數(shù)量的成倍增長(zhǎng),各大公司、網(wǎng)站都需要應(yīng)付海量并發(fā)請(qǐng)求,一個(gè)能夠在峰值期頂住10萬(wàn)以上并發(fā)請(qǐng)求的Server,無(wú)疑會(huì)得到大家的青睞。理論上,Nginx支持的并發(fā)連接上限取決于內(nèi)存,10萬(wàn)遠(yuǎn)未封頂。當(dāng)然,能夠及時(shí)地處理更多的并發(fā)請(qǐng)求,是與業(yè)務(wù)特點(diǎn)緊密相關(guān)的,本書第8~11章將會(huì)詳細(xì)說明如何實(shí)現(xiàn)這個(gè)特點(diǎn)。
(6)熱部署
master管理進(jìn)程與worker工作進(jìn)程的分離設(shè)計(jì),使得Nginx能夠提供熱部署功能,即可以在7×24小時(shí)不間斷服務(wù)的前提下,升級(jí)Nginx的可執(zhí)行文件。當(dāng)然,它也支持不停止服務(wù)就更新配置項(xiàng)、更換日志文件等功能。
(7)最自由的BSD許可協(xié)議
這是Nginx可以快速發(fā)展的強(qiáng)大動(dòng)力。BSD許可協(xié)議不只是允許用戶免費(fèi)使用Nginx,它還允許用戶在自己的項(xiàng)目中直接使用或修改Nginx源碼,然后發(fā)布。這吸引了無(wú)數(shù)開發(fā)者繼續(xù)為Nginx貢獻(xiàn)自己的智慧。
(8)支持事件驅(qū)動(dòng)、AIO、mmap
3.Nginx基本功能:
(1)靜態(tài)資源的web服務(wù)器,能緩存打開的文件描述符。
(2)http、smtp、pop3協(xié)議的反向代理服務(wù)器(保護(hù)服務(wù)器,為服務(wù)器過濾不良用戶請(qǐng)求,并封裝用戶請(qǐng)求,扮演成某些服務(wù)區(qū),提供緩存減輕后端壓力)
(3)緩存加速、負(fù)載均衡
(4)支持FastCGI(fpm,LNMP),uWSGI(Python)
(5)模塊化(非DSO機(jī)制)過濾器,zip、ssi及圖像的大小調(diào)整
(6)支持SSL,https服務(wù)。
4.擴(kuò)展功能
基于名稱和IP的虛擬機(jī)
支持Keepalive
支持平滑升級(jí)
定制訪問日志、支持使用日志緩沖區(qū)提供日志存儲(chǔ)性能
支持url rewrite
支持路徑別名
支持基于IP及用戶的訪問控制
支持速率限制,支持并發(fā)數(shù)限制
5.Nginx的基本架構(gòu):
一個(gè)master進(jìn)程。負(fù)責(zé)生成多個(gè)worker進(jìn)程。
事件驅(qū)動(dòng):epoll(邊緣觸發(fā),Linux) kqueue(BSD)
I/O復(fù)用器:select,poll,rt signal
支持sendfile、sendfile64
支持AIO
支持mmap內(nèi)存映射
nginx的工作模式:非阻塞、事件驅(qū)動(dòng),由一個(gè)master進(jìn)程生成多個(gè)worker進(jìn)程,每個(gè)worker響應(yīng)n個(gè)請(qǐng)求。
6.模塊類型:
核心模塊、Standard HTTP modules、Optional HTTP modules、Mail modules、第三方模塊
7.源碼安裝
yum -y install gcc gcc-c++ yum -y install pcre pcre-devel yum -y install zlib zlib-devel yum -y install openssl openssl-devel tar xf nginx-VERSION.tar cd nginx-VERSION groupadd -r nginx useradd -r nginx -g nginx ./configure --help(獲取幫助) --with-xx:原本沒有啟動(dòng),啟動(dòng)起來(lái);--without-xx:原本已啟動(dòng),停止啟動(dòng) ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/conf/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/log/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 -j 4 && make install mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi,uwsgi} 啟動(dòng)nginx /usr/local/nginx/sbin/nginx
8.配置文件介紹
main配置段:全局配置段
event{}:定義event模型工作特性
http{}:定義http協(xié)議相關(guān)的配置
配置指令:要以分號(hào)結(jié)尾。
支持使用變量:
內(nèi)置變量:模塊會(huì)提供內(nèi)置變量定義
自定義變量:set var_name value;
主配置段的指令:
正常運(yùn)行必備的配置
1.user username [groupname];指定運(yùn)行worker進(jìn)程的用戶和組;
2.pid /path/to/pid_file;指定nginx守護(hù)進(jìn)程的pid文件
pid /var/run/nginx/nginx.pid
3.worker_rlimit_nofile number;指定所有worker進(jìn)程所能打開最大文件句柄數(shù)
優(yōu)化性能的配置
1.worker_processes #;worker進(jìn)程的個(gè)數(shù);通常應(yīng)該略少于CPU物理核心數(shù);支持auto
2.worker_cpu——affinity cpumask... (例子:00000001 00000010 00000100)
優(yōu)點(diǎn):提升緩存的命中率
cpumask:
0000 0001:1號(hào)cpu
0000 0010:2號(hào)cpu
3.timer_resolution:計(jì)時(shí)器解析度,降低此值,可以減少gettimeofday()系統(tǒng)調(diào)用的次數(shù)
4.worker_priotity number;指明worker進(jìn)程的nice值(越小,優(yōu)先級(jí)越高)
事件相關(guān)的配置
1.accept_mutex {off|on};
master調(diào)度用戶請(qǐng)求至各worker進(jìn)程時(shí)使用的負(fù)載均衡鎖;on表示能讓多個(gè)worker輪流地、序列化地區(qū)響應(yīng)新請(qǐng)求。
2.lock_file file;
accept-mutex用到的鎖文件路徑
3.use [epoll | rtsing | select | poll];
指明使用的事件模式,建議讓Nginx自行選擇;
4.worker_connections number;
設(shè)定單個(gè)worker進(jìn)程所能夠處理的最大并發(fā)連接數(shù)量;(但套接字有限)
worker_connections * work_processes < 60000
用于調(diào)試、定位問題(編譯時(shí)加入--with-debug)
1.daemon {on|off};
是否以守護(hù)進(jìn)程方式運(yùn)行nginx;調(diào)試時(shí)應(yīng)該設(shè)置為Off
2.master_process {on|off};
是否以master/worker模型來(lái)運(yùn)行nginx,調(diào)試時(shí)可設(shè)置為Off
3.error_log 位置級(jí)別{debug,info,notice,warn,error,crit,altert,emerg}
總結(jié):
常需要進(jìn)行調(diào)整的參數(shù):worker_processes,worker_connections,worker_cpu_affinity,worker_priority
nginx -s {stop,quit,reopen,reload}
nginx -t :測(cè)試語(yǔ)法
9.Nginx作為web服務(wù)器時(shí)使用的配置:
http{}:由ngx_http_core_module模塊所引入;
配置框架:
http{ upstream{...} server { location {...} 類似于httpd中的<Location>,用于定義URL與本地文件系統(tǒng)的映射關(guān)系,可有多個(gè) }#每個(gè)server類似于httpd中的一個(gè)<VirtualHost> }
配置指令
1.server{}:定義一個(gè)虛擬主機(jī)
server{ listen 8080; server_name www.bearlu.com; root "/vhost/web1"; }
2.listen:指定監(jiān)聽的地址和端口
listen address[:port] listen port;
3.server_name Name...:名稱還可以使用正則表達(dá)式(~開頭)通配符
(1)先做精確匹配檢查;
(2)左側(cè)通配符匹配檢查:*.magedu.com
(3)右側(cè)通配符匹配檢查:mail.*
(4)正則表達(dá)式匹配檢查:~*.*\magedu\.com$
(5)default_server
4.root path;設(shè)置資源路徑映射;用于指明請(qǐng)求的URL所對(duì)應(yīng)的資源所在的文件系統(tǒng)上的起始路徑
5.location [= | ~ | ~* | ^~ | url] {...}
location @name {...}
允許根據(jù)用戶請(qǐng)求的URL來(lái)匹配定義的各location;匹配到時(shí),此請(qǐng)求將被相應(yīng)的location配置塊中的配置所處理,例如訪問控制。
=:精確匹配檢查
~:正則表達(dá)式模式匹配檢查,區(qū)分字符大小寫
~*:正則表達(dá)式模式匹配檢查,不區(qū)分字符大小寫
^~:URI的前半部分匹配,不支持正則表達(dá)式
記住:匹配的優(yōu)先級(jí):=、^~、~、~*、不帶符號(hào)的location(越后,優(yōu)先級(jí)越低)
6.alias path;
用于location配置段,定義路徑別名;
注意:root表示指明路徑為對(duì)應(yīng)的location "/" URL
alias表示路徑映射,即location指令后定義的URL是相對(duì)與alias所指明的路徑而言;
7.index file; 默認(rèn)主頁(yè)面
8.error_page code [...] 狀態(tài)碼 [=code] URL|@name
根據(jù)http響應(yīng)狀態(tài)碼來(lái)指明特用的錯(cuò)誤頁(yè)面;
error_page 404 /404_customed.html
error_page 404 =200 /404_customed.html
[=code]:以指定的響應(yīng)碼進(jìn)行響應(yīng),而不是默認(rèn)的原來(lái)的響應(yīng),默認(rèn)表示以新資源的狀態(tài)碼為其響應(yīng)碼
9.基于IP的訪問控制
allow、deny IP/network
allow IP、網(wǎng)絡(luò)
10.基于用戶的訪問控制
basic、digest
auth_basic "驗(yàn)證原因"
auth_basic_user_file /etc/nginx/users/.htpasswd;
用htpasswd -c (第一次創(chuàng)建) -m(使用MD5碼) /etc/nginx/users/.htpasswd tom 創(chuàng)建用戶賬號(hào)和密碼文件
11.SSL
listen 443 ssl
server_name www.magedu.com
ssl_certificate /etc/nginx/ssl/nginx.crt;(證書)
ssl_certificate_key /etc/nginx/ssl/nginx.key;(私鑰)
12.stub_status {on | off};nginx狀態(tài)統(tǒng)計(jì)頁(yè)面
僅能用戶location上下文。并且allow IP; deny all;
顯示結(jié)果:
Active connections:6 -----> 當(dāng)前所有處于打開狀態(tài)的連接數(shù)
server 已接受的連接數(shù)
accepts 已處理過的連接數(shù)
handled 已處理的請(qǐng)求書,在保持連接模式下
requests
Reading 正在接收請(qǐng)求狀態(tài)的連接數(shù)
Writing 請(qǐng)求已經(jīng)接收完成,正處理請(qǐng)求或發(fā)送響應(yīng)的過程中的連接數(shù)
Waiting 處于保持Keepalive連接模式,且處于活動(dòng)狀態(tài)的連接數(shù)。
13.rewrite URL重寫
格式:rewrite regex replacement flag
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
IP/images/a/b/c/1.jpg ---> IP/imgs/a/b/c/1.jpg
作用:域名切換、重定向
flag: last:此rewrite規(guī)則重寫完成后,不再被后面其他rewrite規(guī)則處理,而由User Agent重新對(duì)重寫后URL再一次發(fā)起請(qǐng)求,并從頭開始執(zhí)行類似的過程;
break:一旦此rewrite規(guī)則重寫完成后,發(fā)起請(qǐng)求,且不會(huì)再被當(dāng)前l(fā)ocation內(nèi)的任何rewrite規(guī)則檢測(cè)
redirect:臨時(shí)重定向,以302響應(yīng)碼返回新的URL。(域名可改變)
permanent:永久重定向,以301響應(yīng)碼返回的URL。
14.if上下文
語(yǔ)法:if(condition) {...}
應(yīng)用場(chǎng)景:server、location
condition:
(1)變量名:變量值為空串,或者以“0”開始,則為false
(2)以變量為操作數(shù)構(gòu)成的比較表達(dá)式(=,!=)
(3)正則表達(dá)式的模式匹配操作
~:區(qū)分大小寫的模式匹配
~*:不區(qū)分大小寫的模式匹配
!~和!~*:對(duì)上面兩種測(cè)試取反
(4)測(cè)試路徑是否為文件:-f、!-f
(5)測(cè)試指定路徑是否為目錄:-d、!-d
(6)測(cè)試文件的存在性:-e、!-e
(7)測(cè)試文件是否有執(zhí)行權(quán)限:-x、!-x
例如:
if($http_user_agent ~* MSIE){ rewrite ^(.*)$ /msie/$1 break; }
15.防盜鏈
location ~* \.(jpg | gif | jpeg | png)$ { valid_referer none blocked www.magedu.com; if ($invalid_referer) { rewrite ^/ http://www.magedu.com/403.html } }
16.定制訪問日志格式
log_format main "$remote_addr $remote_user [$time_local] $request" access_log logs/access.log main;
此處可以使用nginx各模塊內(nèi)建變量;
17.網(wǎng)絡(luò)連接相關(guān)的配置
1. keepalive_timeout #;長(zhǎng)連接的超時(shí)時(shí)長(zhǎng)
2.keepalive_requests #;在一個(gè)長(zhǎng)連接上所能夠允許請(qǐng)求的最大資源數(shù)
3.keepalive_disable [msie6 | safari | none];為指定類型的UserAgent禁用長(zhǎng)連接
4.tcp_nodelay on|off;是否對(duì)長(zhǎng)連接使用TCP_NODELAY選項(xiàng);更優(yōu)化用戶體驗(yàn)就打開,否則,等待充足的量才返回
5.client_header_timeout #;讀取http請(qǐng)求報(bào)文首部的超時(shí)時(shí)長(zhǎng)
6.client_body_timeout #;讀取http請(qǐng)求報(bào)文body部分的超時(shí)時(shí)長(zhǎng)
7.send_timeout #;發(fā)送相應(yīng)報(bào)文的超時(shí)時(shí)長(zhǎng)
總結(jié)
以上所述是小編給大家介紹的Nginx簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。