操作系統(tǒng):CentOS-7.8
nginx版本:1.18.0
一、概述
1饵蒂、什么是Nginx
Nginx 是一個(gè)高性能的 WEB 和反向代理服務(wù)器唇跨,同時(shí)也提供了 IMAP/POP3/SMTP(郵件) 服務(wù)。Nginx采用C語言編寫腰奋,它的作者是伊戈?duì)枴べ愃饕颍谝粋€(gè)公開版本2004年發(fā)布抱怔,截至文章編寫時(shí)nginx的最新穩(wěn)定版是1.18.0劣坊。
Nginx因?yàn)樗姆€(wěn)定性、豐富的模塊庫(kù)屈留、靈活的配置和低系統(tǒng)資源的消耗而聞名局冰,Nginx常被用來做靜態(tài)資源管理服務(wù)器和反向代理與負(fù)載均衡。
2灌危、其他常用的web服務(wù)器
- Apache
Apache是世界上廣泛使用的Web服務(wù)器軟件康二,它可以運(yùn)行在幾乎所有廣泛使用的計(jì)算機(jī)平臺(tái)上,由于其跨平臺(tái)和安全性被廣泛使用勇蝙,是最流行的Web服務(wù)器端軟件之一油额。19年之前Apache使用占有率居世界第一,可是隨著Nginx的流行胖烛,現(xiàn)在Nginx已經(jīng)占據(jù)了使用率第一的位置
- Tomcat
Tomcat 服務(wù)器是一個(gè)免費(fèi)的開放源代碼的 Web 應(yīng)用服務(wù)器谬莹,屬于輕量級(jí)應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場(chǎng)合下被普遍使用翁锡,主要用于運(yùn)行基于 Java 的 Web 應(yīng)用軟件蔓挖,Tomcat 也具有處理 HTML 頁(yè)面的功能,但是它處理靜態(tài) HTML 的能力不如 Apache 和 Nginx 服務(wù)器馆衔,所以 Tomcat 經(jīng)常僅被用來提供API接口服務(wù)瘟判。
- Jboss
Jboss 是一個(gè)基于J2EE的開放源代碼的應(yīng)用服務(wù)器。 JBoss代碼遵循LGPL許可角溃,可以任何商業(yè)應(yīng)用中免費(fèi)使用
- WebLogic
WebLogic是由Oracle出品拷获,是一個(gè)用于開發(fā)、集成减细、部署和管理大型分布式Web應(yīng)用匆瓜、網(wǎng)絡(luò)應(yīng)用和數(shù)據(jù)庫(kù)應(yīng)用的Java應(yīng)用服務(wù)器。WebLogic是一款商業(yè)軟件,是面向企業(yè)的陕壹,需付費(fèi)使用质欲。
- IIS
IIS服務(wù)器是微軟旗下的WEB服務(wù)器,也是目前最流行的Web服務(wù)器產(chǎn)品之一糠馆。
- Kangle
Kangle web服務(wù)器是一款跨平臺(tái)嘶伟、功能強(qiáng)大、安全穩(wěn)定又碌、易操作的高性能web服務(wù)器和反向代理服務(wù)器軟件九昧。
3、正向代理與反向代理
代理
代理是網(wǎng)絡(luò)信息的中轉(zhuǎn)站毕匀,是個(gè)人網(wǎng)絡(luò)和Internet服務(wù)商之間的中間機(jī)構(gòu)铸鹰,負(fù)責(zé)轉(zhuǎn)發(fā)合法的網(wǎng)絡(luò)信息,對(duì)轉(zhuǎn)發(fā)進(jìn)行控制和登記皂岔。
如下圖是一個(gè)代理與非代理的比較蹋笼,不存在代理時(shí),用戶直接與提供服務(wù)的服務(wù)器直接建立連接進(jìn)行通信躁垛,存在代理時(shí)剖毯,用戶和服務(wù)端之間需要經(jīng)過代理服務(wù)器進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā),并且代理也可以是多級(jí)的教馆。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-fP2fR3Dv-1592733017191)(http://file.te-amo.site/images/thumbnail/%E9%9C%80%E8%A6%81%E5%AD%A6%E4%BC%9A%E7%9A%84Nginx%E7%9F%A5%E8%AF%86/proxy.png)]
正向代理
正向代理是一個(gè)位于客戶端和服務(wù)端之間的服務(wù)器逊谋,客戶端向代理服務(wù)器發(fā)送一個(gè)請(qǐng)求并指定目標(biāo)服務(wù)端,然后代理服務(wù)器向指定的服務(wù)端轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶端土铺。
正向代理的過程可以將用戶和代理服務(wù)器看為一體胶滋,從用戶角度來看,服務(wù)端是可見的悲敷,用戶清楚的知道服務(wù)端的信息究恤,可以明確指定目標(biāo),而在服務(wù)端的角度來看镀迂,具體用戶是不可見的丁溅,服務(wù)端可見的是代理服務(wù)器唤蔗,至于代理服務(wù)器后面有多少具體用戶探遵,都是不可見的。如下圖所示
比如我們?cè)诠緝?nèi)網(wǎng)環(huán)境妓柜,我們的電腦主機(jī)是無法訪問外部服務(wù)器箱季,如果此時(shí)我們需要訪問外部服務(wù)器,這時(shí)我們的PC就會(huì)向代理服務(wù)器發(fā)送請(qǐng)求訪問xxx服務(wù)器棍掐,代理服務(wù)器在收到請(qǐng)求后去訪問指定服務(wù)器并將獲得的數(shù)據(jù)再返回給發(fā)送請(qǐng)求的PC藏雏,這樣就實(shí)現(xiàn)了訪問。從例子,我們可以看出作煌,我們的PC是明確知道要訪問的目標(biāo)掘殴,但是由于所有真實(shí)的請(qǐng)求都是代理服務(wù)器發(fā)出的赚瘦,所以目標(biāo)服務(wù)端只能看到代理服務(wù)器信息。
所以正向代理一般用在防火墻內(nèi)網(wǎng)中提供防火墻外部網(wǎng)絡(luò)的訪問服務(wù)奏寨,一般公司中辦公電腦訪問外部網(wǎng)站都是通過正向代理來實(shí)現(xiàn)起意,這樣可以做到對(duì)公司內(nèi)部信息的監(jiān)控和保護(hù),內(nèi)部信息向外泄露病瞳。
反向代理
反向代理是一個(gè)位于客戶端和服務(wù)端之間的服務(wù)器揽咕,反向代理服務(wù)器就相當(dāng)于目標(biāo)服務(wù)器,用戶不需要知道目標(biāo)服務(wù)器的地址套菜,用戶直接訪問反向代理服務(wù)器就可以獲得目標(biāo)服務(wù)器提供的資源亲善。
反向代理的過程是將代理服務(wù)器和服務(wù)端視為一體,在用戶角度來看逗柴,具體服務(wù)端是不可見的蛹头,用戶并不知道自己具體是從哪一個(gè)具體的服務(wù)器獲取的數(shù)據(jù),而站在服務(wù)端的角度來看戏溺,具體用戶是可見的掘而,服務(wù)端是知道是哪個(gè)用戶發(fā)來的請(qǐng)求。如下圖所示
比如我們的電腦要去訪問www.baidu.com于购,當(dāng)我們?nèi)ピL問時(shí)袍睡,我們的請(qǐng)求都是被分配到網(wǎng)站的反向代理服務(wù)器,反向代理服務(wù)器根據(jù)具體配置的規(guī)則肋僧,再將我們的請(qǐng)求轉(zhuǎn)發(fā)給網(wǎng)站內(nèi)部的具體服務(wù)器斑胜,然后再將數(shù)據(jù)返回給我們。
這樣一個(gè)過程就將一個(gè)服務(wù)集群對(duì)用戶進(jìn)行了隱藏嫌吠,用戶只能看到暴露的代理服務(wù)器止潘,而內(nèi)部服務(wù)端內(nèi)部具體的服務(wù)器是看不到的,也保證了內(nèi)部服務(wù)器的安全性辫诅。反向代理一般被用來作為Web加速和負(fù)載均衡凭戴,以提高服務(wù)的可用性和訪問效率
一個(gè)具體栗子
我們?cè)诠緝?nèi)網(wǎng)中的PC要訪問www.baidu.com。圖示如下
上圖過程可以描述為:
a.用戶PC向正向代理服務(wù)器發(fā)送請(qǐng)求炕矮,表明需要訪問www.baidu.com
b.正向代理服務(wù)器接收請(qǐng)求后么夫,向www.baidu.com發(fā)送請(qǐng)求
c.根據(jù)DNS解析出的IP指向了baidu的反向代理服務(wù)器
d.baidu的反向代理服務(wù)器收到請(qǐng)求后,根據(jù)代理策略肤视,從內(nèi)部多臺(tái)服務(wù)器中選擇一臺(tái)档痪,向其發(fā)送請(qǐng)求
e.baidu的反向代理服務(wù)器在獲取到請(qǐng)求結(jié)果后,就將結(jié)果數(shù)據(jù)返回給發(fā)來請(qǐng)求的正向代理服務(wù)器
f.正向代理服務(wù)器在收到數(shù)據(jù)后邢滑,將數(shù)據(jù)再返回給發(fā)來請(qǐng)求的PC
g.最后PC收到數(shù)據(jù)后腐螟,這個(gè)請(qǐng)求就完成了
4、Nginx特性
高并發(fā)
首先nginx整個(gè)服務(wù)采用了多進(jìn)程master-worker的設(shè)計(jì),nginx 在啟動(dòng)后乐纸,會(huì)有一個(gè) master 進(jìn)程和多個(gè)相互獨(dú)立的 worker 進(jìn)程(可配置),master進(jìn)程接收來自外界的連接衬廷,并向各worker進(jìn)程發(fā)送信號(hào),work進(jìn)程用來處理具體連接汽绢。
其次nginx的IO模型是采用基于事件驅(qū)動(dòng)的異步IO模型泵督,且nginx使用的是最新的epoll和kqueue網(wǎng)絡(luò)IO模型,
相比于select庶喜,epoll最大的好處在于它不會(huì)隨著監(jiān)聽文件句柄數(shù)目的增長(zhǎng)而降低效率小腊,并且select在內(nèi)核中也設(shè)置了監(jiān)聽句柄的上限為1024(可修改,需重新編譯內(nèi)核)久窟,所以使用epoll也是nginx可以支持更多的并發(fā)原因
內(nèi)存消耗少
nginx有設(shè)計(jì)自己的內(nèi)存池秩冈,使用內(nèi)存池可以有減少向系統(tǒng)申請(qǐng)和釋放內(nèi)存的時(shí)間開銷,也可以解決內(nèi)存頻繁分配產(chǎn)生的碎片斥扛,并且nginx的內(nèi)存也有自己特殊的設(shè)計(jì)幫助其減少內(nèi)存開銷
簡(jiǎn)單穩(wěn)定
簡(jiǎn)單一般是指nginx的配置簡(jiǎn)單入问,其核心配置就一個(gè)配置文件,且配置內(nèi)容沒有非常繁瑣復(fù)雜稀颁,對(duì)于一般的開發(fā)和使用者不會(huì)造成很大的困難芬失。
穩(wěn)定是指nginx性能比較穩(wěn)定,可以長(zhǎng)時(shí)間不間斷運(yùn)行匾灶,且支持熱加載棱烂,修改配置等操作時(shí)不用重啟服務(wù)
低成本支持多系統(tǒng)
nginx是采用BSD開源協(xié)議,允許使用者修改代碼或者發(fā)布自己的版本阶女,所以使用在商業(yè)上也可以免費(fèi)颊糜。nginx的代碼是采用C語言編寫,現(xiàn)在也已經(jīng)移植到許多體系結(jié)構(gòu)和操作系統(tǒng)秃踩,可以在不同的操作系統(tǒng)上安裝使用衬鱼。
二、nginx安裝
三憔杨、常用配置
1鸟赫、常用命令
強(qiáng)制停止nginx:
./nginx -s stop
正常關(guān)閉nginx,不再接受新連接消别,等待現(xiàn)有用戶連接處理完成后退出nginx:
./nginx -s quit
檢測(cè)配置文件的正確性:
./nginx -t
查看nginx當(dāng)前版本:
./nginx -v
查看nginx的詳細(xì)信息:
./nginx -V
指定nginx配置文件:
./nginx -c [filename]
重新加載配置文件:
./nginx -s reload
2抛蚤、nginx.conf 配置說明
先看一下nginx.conf 的包含結(jié)構(gòu)如下圖所示:
如下是一份安裝完成后的默認(rèn)配置,我將配置的說明也寫在其中
#設(shè)置worker進(jìn)程的所屬用戶,設(shè)置不同的用戶由于用戶權(quán)限不同所以對(duì)worker進(jìn)程操作文件有影響妖啥,默認(rèn)是nobody用戶霉颠,查看nginx進(jìn)程是用命令:ps -ef | grep nginx 就可以看到進(jìn)程和所屬用戶
#user nobody;
#設(shè)置worker進(jìn)程的個(gè)數(shù),默認(rèn)設(shè)置為1個(gè)
worker_processes 1;
#錯(cuò)誤日志配置荆虱,日志級(jí)別包括:debug、info、notice怀读、warn诉位、error、crit菜枷、alert苍糠、emerg
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#nginx的進(jìn)程號(hào)
#pid logs/nginx.pid;
#events模塊中包含nginx中所有處理連接的設(shè)置
events {
#選擇nginx連接所使用的IO模型,Linux下建議使用epoll
use epoll;
#每個(gè)worker允許的最大連接數(shù)
worker_connections 1024;
}
#http相關(guān)配置啤誊,內(nèi)部可以嵌套多個(gè)server岳瞭,配置代理,緩存蚊锹,日志等絕大多數(shù)功能和第三方模塊的配置
http {
#mime.type是一個(gè)文件瞳筏,里面定義了可使用的文件類型與文件拓展名的映射
include mime.types;
#默認(rèn)的文件類型
default_type application/octet-stream;
#設(shè)置一個(gè)日志格式化的格式,名字叫‘main’牡昆,里面包含的參數(shù)含義如下:
#$remote_addr 客戶端ip
#$remote_user 遠(yuǎn)程客戶端用戶名
#$time_local 時(shí)間和時(shí)區(qū)
#$request 請(qǐng)求的url以及method
#$status 響應(yīng)狀態(tài)碼
#$body_bytes_send 響應(yīng)客戶端內(nèi)容字節(jié)數(shù)
#$http_referer 記錄用戶從哪個(gè)鏈接跳轉(zhuǎn)過來的
#$http_user_agent 用戶所使用的代理姚炕,一般來時(shí)都是瀏覽器
#$http_x_forwarded_for 通過代理服務(wù)器來記錄客戶端的ip
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#設(shè)置access_log的位置并制定使用main格式進(jìn)行格式化
#access_log logs/access.log main;
#允許sendfile方式傳輸文件
sendfile on;
#開源tcp_nopush時(shí),數(shù)據(jù)包累積到一定大小時(shí)再發(fā)送丢烘,tcp_nopush必須和sendfile配合使用柱宦,是提高文件傳輸效率的
#tcp_nopush on;
#連接超時(shí)時(shí)間,單位是秒播瞳,保證客戶端多次請(qǐng)求的時(shí)候不會(huì)重復(fù)建立新的連接掸刊,節(jié)約資源損耗。設(shè)定為0時(shí)赢乓,客戶端每次連接都是新建連接
#keepalive_timeout 0;
keepalive_timeout 65;
#開啟gzip壓縮痒给,進(jìn)行數(shù)據(jù)傳輸時(shí)進(jìn)行壓縮
#gzip on;
#一個(gè)虛擬的主機(jī)配置
server {
#監(jiān)聽的端口號(hào)
listen 80;
#監(jiān)聽的地址,虛擬主機(jī)名
server_name localhost;
#字符集
#charset koi8-r;
#access日志的配置骏全,當(dāng)前只是配置當(dāng)前server的日志
#access_log logs/host.access.log main;
#路由規(guī)則配置8
location / {
#當(dāng)前路由的根目錄
root html;
#默認(rèn)主頁(yè)
index index.html index.htm;
}
#默認(rèn)404錯(cuò)誤頁(yè)配置
#error_page 404 /404.html;
#50x錯(cuò)誤頁(yè)配置
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#另一個(gè)虛擬主機(jī)配置
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
#Https的虛擬主機(jī)配置
# HTTPS server
#
#server {
# 監(jiān)聽端口
# listen 443 ssl;
# 監(jiān)聽地址
# server_name localhost;
#
# ssl安裝連接相關(guān)配置
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
3.location路由匹配規(guī)則解析
通用匹配
location / {
root html;
}
示例:http://host:port/a/b
在“/"后面值的路由都會(huì)被匹配
精確配置
location =/ {
root html;
}
示例:http://host:port/
只能配置 ‘/’ 后面如果添加其他路由是無法匹配的
正則匹配
location ~* /ca {
root html;
}
location ~ /CA {
root html;
}
正則匹配分為區(qū)分大小寫和不區(qū)分大小寫兩種苍柏。
‘’ 代表不區(qū)分大小寫,去掉‘’則匹配時(shí)區(qū)分大小寫
示例:
“~* /case”可以匹配:http://host:port/ca 姜贡、 http://host:port/Ca 试吁、 http://host:port/cA 和http://host:port/CA
“~ /CASE”只能匹配:http://host:port/CA
精準(zhǔn)前綴匹配
location ^~ /ca {
root html;
}
示例:http://host:port/ca/file
只能匹配以ca開頭的下一級(jí),例如“ca/file/a”就是無法匹配
匹配優(yōu)先級(jí)
在多個(gè)匹配規(guī)則同時(shí)存在時(shí)楼咳,精確匹配優(yōu)先級(jí)最高熄捍,其次是精準(zhǔn)前綴匹配,然后是區(qū)分大小寫的正則匹配母怜,再然后是不區(qū)分大小寫的正則匹配余耽,最后是通用匹配。
舉個(gè)例子
精確匹配:location =/ca
精確前綴匹配:location ^~ /ca
區(qū)分大小寫正則匹配:location ~ /ca
不區(qū)分大小寫正則匹配:location ~* /ca
通用匹配:location /
請(qǐng)求url:http://host:port/ca
5種規(guī)則全存在苹熏,則匹配精確匹配
2-5存在碟贾,則匹配精確前綴匹配
3-5存在币喧,則匹配區(qū)分大小寫的正則匹配
4-5存在,則匹配不區(qū)分大小寫正則匹配
僅有5存在袱耽,則匹配通用匹配
4.跨域配置與防盜鏈
在server塊的配置中進(jìn)行配置跨域支持
#允許跨域請(qǐng)求的域杀餐,*代表所有
add_header 'Access-Control-Allow-Origin' *;
#允許帶上cookie請(qǐng)求
add_header 'Access-Control-Allow-Credentials' 'true';
#允許請(qǐng)求的方法,比如 GET/POST/PUT/DELETE朱巨,*代表所有方法
add_header 'Access-Control-Allow-Methods' *;
#允許請(qǐng)求的header史翘,*代表所有的header
add_header 'Access-Control-Allow-Headers' *;
防盜鏈配置如下
#對(duì)發(fā)送請(qǐng)求的域名驗(yàn)證
valid_referers *.domain.com;
#驗(yàn)證不通過則返回404
if ($invalid_referer) {
return 404;
}
個(gè)人公眾號(hào)【愛做夢(mèng)的錘子】,全網(wǎng)同id冀续,個(gè)站 http://te-amo.site琼讽,歡迎關(guān)注,里面會(huì)分享更多有用知識(shí)洪唐,還有我的私密照片
覺得不錯(cuò)就點(diǎn)個(gè)贊叭QAQ