了解nginx
參考文檔:http://www.nginx.cn/doc/
nginx是一款高性能的HTTP和反向代理服務(wù)器軟件,也是一個IMAP/POP3/SMTP代理服務(wù)器,可以運(yùn)行在Unix, GNU/Linux,BSD,MacOS x,以及Windows等操作系統(tǒng)中。
Nginx與Apache的異同
相同點(diǎn):
都是一個HTTP服務(wù)器軟件。支持正、反向代理,虛擬主機(jī),url重寫,壓縮傳輸,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、查詢要安裝的軟件是否存在
brew search nginx ?
2、查看nginx是否安裝
brew info nginx

顯示本地已安裝nginx,版本1.15.3,未安裝執(zhí)行第三步。
3、安裝nginx
brew install nginx
4、查看nginx安裝目錄(是否如info所說)
open /usr/local/etc/nginx/
open /usr/local/Cellar/nginx ? ? //其實(shí)這個才是nginx被安裝到的目錄
5、啟動nginx,終端輸入如下命令:
nginx
沒有報錯即為啟動成功。
6、打開瀏覽器訪問localhost:8080, 如出現(xiàn)以下界面,說明安裝成功

Nginx命令參數(shù)
nginx -t:測試配置文件是否正確
nginx -s reload, 作用:加載最新配置
nginx -s stop,作用:立即停止?
nginx -s quit,作用:優(yōu)雅停止 (當(dāng)前存在訪問,直到訪問結(jié)束才停止)
nginx -s reopen,作用:重新打開日志
nginx 配置
在nginx.conf的注釋符號位#
nginx文件結(jié)構(gòu):

1、全局塊:配置影響nginx全局的指令。一般有運(yùn)行nginx服務(wù)器的用戶組,nginx進(jìn)程pid存放路徑,日志存放路徑,配置文件引入,允許生成worker process數(shù)等。
2、events塊:配置影響nginx服務(wù)器或與用戶的網(wǎng)絡(luò)連接。有每個進(jìn)程的最大連接數(shù),選取哪種事件驅(qū)動模型處理連接請求,是否允許同時接受多個網(wǎng)路連接,開啟多個網(wǎng)絡(luò)連接序列化等。
3、http塊:可以嵌套多個server,配置代理,緩存,日志定義等絕大多數(shù)功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數(shù)等。
4、server塊:配置虛擬主機(jī)的相關(guān)參數(shù),一個http中可以有多個server。
5、location塊:配置請求的路由,以及各種頁面的處理情況。
示例配置文件
########### 每個指令必須有分號結(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;? #制定日志路徑,級別。這個設(shè)置可以放入全局塊,http塊,server塊,級別以此為: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è)置一個進(jìn)程是否同時接受多個網(wǎng)絡(luò)連接,默認(rèn)為off
? ? #use epoll;? ? ? #事件驅(qū)動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
? ? worker_connections? 1024;? ? #最大連接數(shù),默認(rèn)為512
}
http {
? ? include? ? ? mime.types;? #文件擴(kuò)展名與文件類型映射表
? ? default_type? application/octet-stream; #默認(rèn)文件類型,默認(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;? #每個進(jìn)程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值,默認(rèn)為0,即不設(shè)上限。
? ? keepalive_timeout 65;? #連接超時時間,默認(rèn)為75s,可以在http,server,location塊。
? ? #gzip on; #開啟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; #錯誤頁
? ? server {
? ? ? ? keepalive_requests 120; #單連接請求上限次數(shù)。
? ? ? ? listen? ? ? 4545;? #監(jiān)聽端口
? ? ? ? server_name? 127.0.0.1;? #監(jiān)聽地址? ? ?
? ? ? ? location? ~*^.+$ {? ? ? #請求的url過濾,正則匹配,~為區(qū)分大小寫,~*為不區(qū)分大小寫。
? ? ? ? ? #root path;? #根目錄
? ? ? ? ? #index vv.txt;? #設(shè)置默認(rèn)頁
? ? ? ? ? proxy_pass? http://mysvr;? #請求轉(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:用來記錄客戶端用戶名稱;
$time_local:?用來記錄訪問時間與時區(qū);
$request:?用來記錄請求的url與http協(xié)議;
$status:?用來記錄請求狀態(tài);成功是200,
$body_bytes_sent?:記錄發(fā)送給客戶端文件主體內(nèi)容大小;
$http_referer:用來記錄從那個頁面鏈接訪問過來的;
$http_user_agent:記錄客戶瀏覽器的相關(guān)信息;
nginx之location配置
語法規(guī)則:location [=|~|~*|^~] /uri/ { … }
=?開頭表示精確匹配?
^~?開頭表示uri以某個常規(guī)字符串開頭,理解為匹配 url路徑即可。
~開頭表示區(qū)分大小寫的正則匹配。
~*開頭表示不區(qū)分大小寫的正則匹配。
!~和!~*分別為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配?的正則。
/?通用匹配,任何請求都會匹配到。
多個location配置的情況下匹配順序?yàn)椋?br>
首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最后是交給 / 通用匹配。當(dāng)有匹配成功時候,停止匹配,按當(dāng)前匹配規(guī)則處理請求。
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)生的效果如下:
訪問根目錄/, 比如http://localhost/ 將匹配規(guī)則A
訪問 http://localhost/login 將匹配規(guī)則B,
http://localhost/register 則匹配規(guī)則H
訪問 http://localhost/static/a.html 將匹配規(guī)則C
訪問 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
訪問 http://localhost/a.PNG 則匹配規(guī)則E, 而不會匹配規(guī)則D,因?yàn)橐?guī)則E不區(qū)分大小寫。
訪問 http://localhost/a.xhtml 不會匹配規(guī)則F和規(guī)則G,http://localhost/a.XHTML不會匹配規(guī)則G,因?yàn)椴粎^(qū)分大小寫。規(guī)則F,規(guī)則G屬于排除法,符合匹配規(guī)則但是不會匹配到,所以想想看實(shí)際應(yīng)用中哪里會用到。
訪問 http://localhost/category/id/1111 則最終匹配到規(guī)則H,因?yàn)橐陨弦?guī)則都不匹配,這個時候應(yīng)該是nginx轉(zhuǎn)發(fā)請求給后端應(yīng)用服務(wù)器,比如FastCGI(php),tomcat(jsp),nginx作為方向代理服務(wù)器存在。
location常見配置指令,alias、root、proxy_pass
1、【alias】——別名配置,用于訪問文件系統(tǒng),在匹配到location配置的URL路徑后,指向【alias】配置的路徑。如:
location /test/
{
? ? alias/first/second/img/;
}
即:請求/test/1.jpg(省略了協(xié)議與域名),將會返回文件/first/second/img/1.jpg。
2、【root】——根路徑配置,用于訪問文件系統(tǒng),在匹配到location配置的URL路徑后,指向【root】配置的路徑,并把location配置路徑附加到其后。如:
location /test/
{
? ? root /first/second/img/;
}
即:請求/test/1.jpg(省略了協(xié)議與域名),將會返回文件/first/second/img/test/1.jpg,相較于alias,使用root會把/test/附加到根目錄之后。
3、【proxy_pass】——反向代理配置,用于代理請求,適用于前后端負(fù)載分離或多臺機(jī)器、服務(wù)器負(fù)載分離的場景,在匹配到location配置的URL路徑后,轉(zhuǎn)發(fā)請求到【proxy_pass】配置的URL,是否會附加location配置路徑與【proxy_pass】配置的路徑后是否有"/"有關(guān),有"/"則不附加,如:
location /test/
{
? ? proxy_pass http://127.0.0.1:8080/;
}
即:請求/test/1.jpg(省略了協(xié)議與域名),將會被nginx轉(zhuǎn)發(fā)請求到http://127.0.0.1:8080/1.jpg(未附加/test/路徑)。
location /test/
{
? ? proxy_pass http://127.0.0.1:8080;
}
即:請求/test/1.jpg(省略了協(xié)議與域名),將會被nginx轉(zhuǎn)發(fā)請求到http://127.0.0.1:8080/test/1.jpg(附加/test/路徑)。
location/test/
{
? ? proxy_pass http://127.0.0.1:8080/img;
}
即:請求/test/1.jpg(省略了協(xié)議與域名),將會被nginx轉(zhuǎn)發(fā)請求到http://127.0.0.1:8080/img1.jpg(未附加/test/路徑,但附加了/test/之后的路徑)。
解決nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed錯誤?
解決方法:
使用nginx -c的參數(shù)指定nginx.conf文件的位置