了解nginx
參考文檔:http://www.nginx.cn/doc/
nginx是一款高性能的HTTP和反向代理服務(wù)器軟件饭弓,也是一個(gè)IMAP/POP3/SMTP代理服務(wù)器,可以運(yùn)行在Unix, GNU/Linux,BSD,MacOS x,以及Windows等操作系統(tǒng)中狼忱。
Nginx與Apache的異同
相同點(diǎn):
都是一個(gè)HTTP服務(wù)器軟件棵磷。支持正风秤、反向代理,虛擬主機(jī)缤弦,url重寫(xiě)领迈,壓縮傳輸碍沐,SSL加密傳輸?shù)取?/p>
不同點(diǎn):
Apache處理速度很慢,且占用很多內(nèi)存資源累提,而Nginx卻恰恰相反尘喝。
nginx安裝
下載地址:http://nginx.org/en/download.html
centos6 nginx 安裝?
https://www.cnblogs.com/yaoximing/p/6068622.html
Mac nginx 安裝
參考地址:https://www.cnblogs.com/meng1314-shuai/p/8335140.html
步驟:
1、查詢(xún)要安裝的軟件是否存在
brew search nginx ?
2刻恭、查看nginx是否安裝
brew info nginx
顯示本地已安裝nginx,版本1.15.3鞍匾,未安裝執(zhí)行第三步骑科。
3、安裝nginx
brew install nginx
4咆爽、查看nginx安裝目錄(是否如info所說(shuō))
open /usr/local/etc/nginx/
open /usr/local/Cellar/nginx ? ? //其實(shí)這個(gè)才是nginx被安裝到的目錄
5置森、啟動(dòng)nginx符糊,終端輸入如下命令:
nginx
沒(méi)有報(bào)錯(cuò)即為啟動(dòng)成功男娄。
6、打開(kāi)瀏覽器訪問(wèn)localhost:8080, 如出現(xiàn)以下界面模闲,說(shuō)明安裝成功
Nginx命令參數(shù)
nginx -t:測(cè)試配置文件是否正確
nginx -s reload, 作用:加載最新配置
nginx -s stop,作用:立即停止?
nginx -s quit尸折,作用:優(yōu)雅停止 (當(dāng)前存在訪問(wèn),直到訪問(wèn)結(jié)束才停止)
nginx -s reopen橄浓,作用:重新打開(kāi)日志
nginx 配置
在nginx.conf的注釋符號(hào)位#
nginx文件結(jié)構(gòu):
1收擦、全局塊:配置影響nginx全局的指令。一般有運(yùn)行nginx服務(wù)器的用戶組泪勒,nginx進(jìn)程pid存放路徑宴猾,日志存放路徑,配置文件引入沦辙,允許生成worker process數(shù)等讹剔。
2油讯、events塊:配置影響nginx服務(wù)器或與用戶的網(wǎng)絡(luò)連接。有每個(gè)進(jìn)程的最大連接數(shù)陌兑,選取哪種事件驅(qū)動(dòng)模型處理連接請(qǐng)求由捎,是否允許同時(shí)接受多個(gè)網(wǎng)路連接,開(kāi)啟多個(gè)網(wǎng)絡(luò)連接序列化等软驰。
3、http塊:可以嵌套多個(gè)server纠吴,配置代理慧瘤,緩存,日志定義等絕大多數(shù)功能和第三方模塊的配置。如文件引入蹬音,mime-type定義著淆,日志自定義,是否使用sendfile傳輸文件独泞,連接超時(shí)時(shí)間苔埋,單連接請(qǐng)求數(shù)等。
4荞膘、server塊:配置虛擬主機(jī)的相關(guān)參數(shù)玉工,一個(gè)http中可以有多個(gè)server。
5屠升、location塊:配置請(qǐng)求的路由狭郑,以及各種頁(yè)面的處理情況。
示例配置文件
########### 每個(gè)指令必須有分號(hào)結(jié)束微服。#################
#user administrator administrators;? #配置使用用戶或者組,默認(rèn)為nobody nobody糙麦。
worker_processes 2;? #允許生成的進(jìn)程數(shù)丛肮,默認(rèn)為1,CPU數(shù)量*核數(shù),通常等于CPU數(shù)量或者2倍于CPU
#pid /nginx/pid/nginx.pid;? #指定nginx進(jìn)程運(yùn)行文件存放地址
error_log log/error.log debug;? #制定日志路徑焚廊,級(jí)別习劫。這個(gè)設(shè)置可以放入全局塊,http塊袒餐,server塊谤狡,級(jí)別以此為:debug|info|notice|warn|error|crit|alert|emerg
events {
? ? accept_mutex on;? #設(shè)置網(wǎng)路連接序列化,防止驚群現(xiàn)象發(fā)生焰宣,默認(rèn)為on
? ? multi_accept on;? #設(shè)置一個(gè)進(jìn)程是否同時(shí)接受多個(gè)網(wǎng)絡(luò)連接捕仔,默認(rèn)為off
? ? #use epoll;? ? ? #事件驅(qū)動(dòng)模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
? ? worker_connections? 1024;? ? #最大連接數(shù)闸天,默認(rèn)為512
}
http {
? ? include? ? ? mime.types;? #文件擴(kuò)展名與文件類(lèi)型映射表
? ? default_type? application/octet-stream; #默認(rèn)文件類(lèi)型斜做,默認(rèn)為text/plain
? ? #access_log off; #取消服務(wù)日志? ?
? ? log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
? ? access_log log/access.log myFormat;? #combined為日志格式的默認(rèn)值
? ? sendfile on;? #允許sendfile方式傳輸文件瓤逼,默認(rèn)為off,可以在http塊贷帮,server塊诱告,location塊。
? ? sendfile_max_chunk 100k;? #每個(gè)進(jìn)程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值锄禽,默認(rèn)為0,即不設(shè)上限沃但。
? ? keepalive_timeout 65;? #連接超時(shí)時(shí)間宵晚,默認(rèn)為75s,可以在http淤刃,server逸贾,location塊。
? ? #gzip on; #開(kāi)啟gzip壓縮
? ?#charset gb2321; #設(shè)置字符編碼
? ? upstream mysvr {?
? ? ? server 127.0.0.1:7878;
? ? ? server 192.168.10.121:3333 backup;? #熱備
? ? }
? ? error_page 404 https://www.baidu.com; #錯(cuò)誤頁(yè)
? ? server {
? ? ? ? keepalive_requests 120; #單連接請(qǐng)求上限次數(shù)。
? ? ? ? listen? ? ? 4545;? #監(jiān)聽(tīng)端口
? ? ? ? server_name? 127.0.0.1;? #監(jiān)聽(tīng)地址? ? ?
? ? ? ? location? ~*^.+$ {? ? ? #請(qǐng)求的url過(guò)濾据沈,正則匹配锌介,~為區(qū)分大小寫(xiě),~*為不區(qū)分大小寫(xiě)隆敢。
? ? ? ? ? #root path;? #根目錄
? ? ? ? ? #index vv.txt;? #設(shè)置默認(rèn)頁(yè)
? ? ? ? ? proxy_pass? http://mysvr;? #請(qǐng)求轉(zhuǎn)向mysvr 定義的服務(wù)器列表
? ? ? ? ? deny 127.0.0.1;? #拒絕的ip
? ? ? ? ? allow 172.18.5.54; #允許的ip? ? ? ? ?
? ? ? ? }
? ? }
}
日志格式設(shè)置崔慧。
$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
$remote_user:用來(lái)記錄客戶端用戶名稱(chēng)温自;
$time_local:?用來(lái)記錄訪問(wèn)時(shí)間與時(shí)區(qū)皇钞;
$request:?用來(lái)記錄請(qǐng)求的url與http協(xié)議;
$status:?用來(lái)記錄請(qǐng)求狀態(tài)馆里;成功是200,
$body_bytes_sent?:記錄發(fā)送給客戶端文件主體內(nèi)容大斜摺慢哈;
$http_referer:用來(lái)記錄從那個(gè)頁(yè)面鏈接訪問(wèn)過(guò)來(lái)的卵贱;
$http_user_agent:記錄客戶瀏覽器的相關(guān)信息;
nginx之location配置
語(yǔ)法規(guī)則:location [=|~|~*|^~] /uri/ { … }
=?開(kāi)頭表示精確匹配?
^~?開(kāi)頭表示uri以某個(gè)常規(guī)字符串開(kāi)頭兰绣,理解為匹配 url路徑即可编振。
~開(kāi)頭表示區(qū)分大小寫(xiě)的正則匹配。
~*開(kāi)頭表示不區(qū)分大小寫(xiě)的正則匹配臀玄。
!~和!~*分別為區(qū)分大小寫(xiě)不匹配及不區(qū)分大小寫(xiě)不匹配?的正則畅蹂。
/?通用匹配,任何請(qǐng)求都會(huì)匹配到累贤。
多個(gè)location配置的情況下匹配順序?yàn)椋?br>
首先匹配 =少漆,其次匹配^~, 其次是按文件中順序的正則匹配,最后是交給 / 通用匹配渗磅。當(dāng)有匹配成功時(shí)候检访,停止匹配,按當(dāng)前匹配規(guī)則處理請(qǐng)求风响。
location?=?/?{??
???#規(guī)則A??
}??
location?=?/login?{??
???#規(guī)則B??
}??
location?^~?/static/?{??
???#規(guī)則C??
}??
location?~?\.(gif|jpg|png|js|css)$?{??
???#規(guī)則D??
}??
location?~*?\.png$?{??
???#規(guī)則E??
}??
location?!~?\.xhtml$?{??
???#規(guī)則F??
}??
location?!~*?\.xhtml$?{??
???#規(guī)則G??
}??
location?/?{??
???#規(guī)則H??
}??
那么產(chǎn)生的效果如下:
訪問(wèn)根目錄/状勤, 比如http://localhost/ 將匹配規(guī)則A
訪問(wèn) http://localhost/login 將匹配規(guī)則B,
http://localhost/register 則匹配規(guī)則H
訪問(wèn) http://localhost/static/a.html 將匹配規(guī)則C
訪問(wèn) http://localhost/a.gif, http://localhost/b.jpg 將匹配規(guī)則D和規(guī)則E密似,但是規(guī)則D順序優(yōu)先葫盼,規(guī)則E不起作用,而 http://localhost/static/c.png 則優(yōu)先匹配到 規(guī)則C
訪問(wèn) http://localhost/a.PNG 則匹配規(guī)則E抛猫, 而不會(huì)匹配規(guī)則D孩灯,因?yàn)橐?guī)則E不區(qū)分大小寫(xiě)。
訪問(wèn) http://localhost/a.xhtml 不會(huì)匹配規(guī)則F和規(guī)則G败匹,http://localhost/a.XHTML不會(huì)匹配規(guī)則G讥巡,因?yàn)椴粎^(qū)分大小寫(xiě)欢顷。規(guī)則F,規(guī)則G屬于排除法,符合匹配規(guī)則但是不會(huì)匹配到外里,所以想想看實(shí)際應(yīng)用中哪里會(huì)用到。
訪問(wèn) http://localhost/category/id/1111 則最終匹配到規(guī)則H鳖链,因?yàn)橐陨弦?guī)則都不匹配墩莫,這個(gè)時(shí)候應(yīng)該是nginx轉(zhuǎn)發(fā)請(qǐng)求給后端應(yīng)用服務(wù)器狂秦,比如FastCGI(php),tomcat(jsp)侧啼,nginx作為方向代理服務(wù)器存在。
location常見(jiàn)配置指令皮壁,alias哪审、root、proxy_pass
1滴须、【alias】——?jiǎng)e名配置茉稠,用于訪問(wèn)文件系統(tǒng),在匹配到location配置的URL路徑后铭污,指向【alias】配置的路徑膀篮。如:
location /test/
{
? ? alias/first/second/img/;
}
即:請(qǐng)求/test/1.jpg(省略了協(xié)議與域名)誓竿,將會(huì)返回文件/first/second/img/1.jpg。
2筷屡、【root】——根路徑配置毙死,用于訪問(wèn)文件系統(tǒng),在匹配到location配置的URL路徑后确封,指向【root】配置的路徑再菊,并把location配置路徑附加到其后。如:
location /test/
{
? ? root /first/second/img/;
}
即:請(qǐng)求/test/1.jpg(省略了協(xié)議與域名)秉剑,將會(huì)返回文件/first/second/img/test/1.jpg稠诲,相較于alias候址,使用root會(huì)把/test/附加到根目錄之后岗仑。
3聚请、【proxy_pass】——反向代理配置,用于代理請(qǐng)求炸卑,適用于前后端負(fù)載分離或多臺(tái)機(jī)器煤傍、服務(wù)器負(fù)載分離的場(chǎng)景蚯姆,在匹配到location配置的URL路徑后,轉(zhuǎn)發(fā)請(qǐng)求到【proxy_pass】配置的URL疙驾,是否會(huì)附加location配置路徑與【proxy_pass】配置的路徑后是否有"/"有關(guān)郭毕,有"/"則不附加,如:
location /test/
{
? ? proxy_pass http://127.0.0.1:8080/;
}
即:請(qǐng)求/test/1.jpg(省略了協(xié)議與域名)扳肛,將會(huì)被nginx轉(zhuǎn)發(fā)請(qǐng)求到http://127.0.0.1:8080/1.jpg(未附加/test/路徑)乘碑。
location /test/
{
? ? proxy_pass http://127.0.0.1:8080;
}
即:請(qǐng)求/test/1.jpg(省略了協(xié)議與域名)蝉仇,將會(huì)被nginx轉(zhuǎn)發(fā)請(qǐng)求到http://127.0.0.1:8080/test/1.jpg(附加/test/路徑)殖蚕。
location/test/
{
? ? proxy_pass http://127.0.0.1:8080/img;
}
即:請(qǐng)求/test/1.jpg(省略了協(xié)議與域名),將會(huì)被nginx轉(zhuǎn)發(fā)請(qǐng)求到http://127.0.0.1:8080/img1.jpg(未附加/test/路徑害驹,但附加了/test/之后的路徑)蛤育。
解決nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed錯(cuò)誤?
解決方法:
使用nginx -c的參數(shù)指定nginx.conf文件的位置