基礎篇
一、環境
服務器版本:CentOS 7.2
為了保證學習階段不遇到奇怪的事情,請保證以下四點(大神選擇性無視)
1. 確認系統網絡
2. 確認yum可用
3. 確認關閉iptables
4. 確認停用selinux
#查看iptables狀態systemctlstatusfirewalld.service#關閉防火墻(臨時關閉)systemctlstopfirewalld.service#查看SELinux狀態getenforce#臨時關閉SELinuxsetenforce0
安裝一些系統基本工具,正常情況系統都會自帶(沒有在裝哦)
yum-yinstallgccgcc-c++autoconfpcrepcre-develmakeautomakeyum-yinstallwgethttpd-toolsvim
Nginx是一個開源且高性能、可靠的HTTP中間件、代理服務
其他的HTTP服務:
1. HTTPD-Apache基金會
2. IIS-微軟
3. GWS-Google(不對外開放)
近幾年,Nginx的市場占有率越來越高,一度飆升,為什么呢?接下來我們就知道了!
1. IO多路復用epoll(IO復用)
如何理解呢?舉個例子吧!
有A、B、C三個老師,他們都遇到一個難題,要幫助一個班級的學生解決課堂作業。
老師A采用從第一排開始一個學生一個學生輪流解答的方式去回答問題,老師A浪費了很多時間,并且有的學生作業還沒有完成呢,老師就來了,反反復復效率極慢。
老師B是一個忍者,他發現老師A的方法行不通,于是他使用了影分身術,分身出好幾個自己同一時間去幫好幾個同學回答問題,最后還沒回答完,老師B消耗光了能量累倒了。
老師C比較精明,他告訴學生,誰完成了作業舉手,有舉手的同學他才去指導問題,他讓學生主動發聲,分開了“并發”。
這個老師C就是Nginx。
2. 輕量級
功能模塊少 - Nginx僅保留了HTTP需要的模塊,其他都用插件的方式,后天添加
代碼模塊化 - 更適合二次開發,如阿里巴巴Tengine
3. CPU親和
把CPU核心和Nginx工作進程綁定,把每個worker進程固定在一個CPU上執行,減少切換CPU的cache miss,從而提高性能。
本人使用了鳥哥的lnmp集成包 https://lnmp.org,簡單方便-推薦!
#執行這句語句,根據指引,將安裝nginxphpMySQL可進入lnmp官網查看更詳細的過程#默認安裝目錄/usr/localwget-chttp://soft.vpser.net/lnmp/lnmp1.4.tar.gz&&tarzxflnmp1.4.tar.gz&&cdlnmp1.4&&./install.shlnmp#默認安裝目錄/usr/local
#打開主配置文件,若你是用lnmp環境安裝vim/usr/local/nginx/conf/nginx.conf----------------------------------------user#設置nginx服務的系統使用用戶worker_processes#工作進程數一般情況與CPU核數保持一致error_log#nginx的錯誤日志pid#nginx啟動時的pidevents{worker_connections#每個進程允許最大連接數use#nginx使用的內核模型}
我們使用 nginx 的 http 服務,在配置文件 nginx.conf 中的 http 區域內,配置無數個 server ,每一個 server 對應這一個虛擬主機或者域名
http{......#后面再詳細介紹http配置項目server{listen80#監聽端口;server_namelocalhost#地址location/{#訪問首頁路徑root/xxx/xxx/index.html#默認目錄indexindex.htmlindex.htm#默認文件}error_page500504/50x.html#當出現以上狀態碼時從新定義到50x.htmllocation=/50x.html{#當訪問50x.html時root/xxx/xxx/html#50x.html頁面所在位置}}server{......}}
一個 server 可以出現多個 location ,我們對不同的訪問路徑進行不同情況的配置
我們再來看看 http 的配置詳情
http{sendfileon#高效傳輸文件的模式一定要開啟keepalive_timeout65#客戶端服務端請求超時時間log_formatmainXXX#定義日志格式代號為mainaccess_log/usr/local/access.logmain#日志保存地址格式代碼main}
查看 nginx 已開啟和編聯進去的模塊,模塊太多了,就不在這長篇大論,有需要自行百度吧~
#大寫V查看所有模塊,小寫v查看版本nginx-V#查看此配置文件是否存在語法錯誤nginx-tc/usr/local/nginx/conf/nginx.conf
1.靜態資源類型
非服務器動態運行生成的文件,換句話說,就是可以直接在服務器上找到對應文件的請求
瀏覽器端渲染:HTML,CSS,JS
圖片:JPEG,GIF,PNG
視頻:FLV,MPEG
文件:TXT,任意下載文件
2.靜態資源服務場景-CDN
什么是CDN?例如一個北京用戶要請求一個文件,而文件放在的新疆的資源存儲中心,如果直接請求新疆距離太遠,延遲久。使用nginx靜態資源回源,分發給北京的資源存儲中心,讓用戶請求的動態定位到北京的資源存儲中心請求,實現傳輸延遲的最小化
2.nginx靜態資源配置
配置域:http、server、location#文件高速讀取http{sendfileon;}#在sendfile開啟的情況下,開啟tcp_nopush提高網絡包傳輸效率#tcp_nopush將文件一次性一起傳輸給客戶端,就好像你有十個包裹,快遞員一次送一個,來回十趟,開啟后,快遞員講等待你十個包裹都派件,一趟一起送給你http{sendfileon;tcp_nopushon;}#tcp_nodelay開啟實時傳輸,傳輸方式與tcp_nopush相反,追求實時性,但是它只有在長連接下才生效http{sendfileon;tcp_nopushon;tcp_nodelayon;}#將訪問的文件壓縮傳輸(減少文件資源大小,提高傳輸速度)#當訪問內容以gif或jpg結尾的資源時location~.*\.(gif|jpg)${gzipon;#開啟gzip_http_version1.1;#服務器傳輸版本gzip_comp_level2;#壓縮比,越高壓縮越多,壓縮越高可能會消耗服務器性能gzip_typestext/plainapplication/javascriptapplication/x-javascripttext/javascripttext/cssapplication/xmlapplication/xml+rssimage/jpegimage/gifimage/png;#壓縮文件類型root/opt/app/code;#對應目錄(去該目錄下尋找對應文件)}#直接訪問已壓縮文件#當訪問路徑以download開頭時,如www.baidu.com/download/test.img#去/opt/app/code目錄下尋找test.img.gz文件,返回到前端時已是可以瀏覽的img文件location~load^/download{gzip_staticon#開啟;tcp_nopushon;root/opt/app/code;}
HTTP協議定義的緩存機制(如:Expires; Cache-control等 )
減少服務端的消耗,降低延遲
1.瀏覽器無緩存
瀏覽器請求 -> 無緩存 -> 請求WEB服務器 -> 請求相應 -> 呈現
在呈現階段會根據緩存的設置在瀏覽器中生成緩存
2.瀏覽器有緩存
瀏覽器請求 -> 有緩存 -> 校驗本地緩存時間是否過期 -> 沒有過期 -> 呈現
若過期從新請求WEB服務器
3.語法配置
location~.*\.(html|htm)${expires12h;#緩存12小時}
服務器響應靜態文件時,請求頭信息會帶上 etag 和 last_modified_since 2個標簽值,瀏覽器下次去請求時,頭信息發送這兩個標簽,服務器檢測文件有沒有發生變化,如無,直接頭信息返 etag 和last_modified_since,狀態碼為304,瀏覽器知道內容無改變,于是直接調用本地緩存,這個過程也請求了服務,但是傳著的內容極少
開發nginx跨站訪問設置
location~.*\.(html|htm)${add_headerAccess-Control-Allow-Origin*;add_headerAccess-Control-Allow-MethodsGET,POST,PUT,delete,OPTIONS;#Access-Control-Allow-Credentialstrue#允許cookie跨域}
在響應中指定 Access-Control-Allow-Credentials 為 true 時,Access-Control-Allow-Origin 不能指定為 *,需要指定到具體域名
相關跨域內容可參考Laravel 跨域功能中間件使用代碼實現跨域,原理與nginx跨域配置相同
防止服務器內的靜態資源被其他網站所套用
此處介紹的 nginx 防盜鏈為基礎方式,其它更加深入的方式將在之后的文章介紹
首先,需要理解一個nginx變量
$http_referer#表示當前請求上一次頁面訪問的地址,換句話說,訪問www.baidu.com主頁,這是第一次訪問,所以$http_referer為空,但是訪問此頁面的時候還需要獲取一張首頁圖片,再請求這張圖片的時候$http_referer就為www.baidu.com
然后配置
location~.*\.(jpg|gif)${#valid_referers表示我們允許哪些$http_referer來訪問#none表示沒有帶$http_referer,如第一次訪問時$http_referer為空#blocked表示$http_referer不是標準的地址,非正常域名等#只允許此ipvalid_referersnoneblocked127.xxx.xxx.xxif($invalid_referer){#不滿足情況下變量值為1return403;}}
Nginx可以實現多種代理方式
HTTP
ICMPPOPIMAP
HTTPS
RTMP
1. 代理區別
區別在于代理的對象不一樣
正向代理代理的對象是客戶端
反向代理代理的對象是服務端
2. 反向代理
語法:proxy_passURL默認:——位置:loaction#代理端口#場景:服務器80端口開放,8080端口對外關閉,客戶端需要訪問到8080#在nginx中配置proxy_pass代理轉發時,如果在proxy_pass后面的url加/,表示絕對根路徑;如果沒有/,表示相對路徑,把匹配的路徑部分也給代理走server{listen80;location/{proxy_passhttp://127.0.0.1:8080/;proxy_redirectdefault;proxy_set_headerHost$http_host;proxy_set_headerX-Real-IP$remote_addr;#獲取客戶端真實IPproxy_connect_timeout30;#超時時間proxy_send_timeout60;proxy_read_timeout60;proxy_buffer_size32k;proxy_bufferingon;#開啟緩沖區,減少磁盤ioproxy_buffers4128k;proxy_busy_buffers_size256k;proxy_max_temp_file_size256k;#當超過內存允許儲蓄大小,存到文件}}
負載均衡的實現方法就是我們上章介紹的反向代理。將客戶的請求通過 nginx 分發(反向代理)到一組多臺不同的服務器上
這一組服務器我們稱為服務池(upstream server),池內的每一個服務器稱為一個單元,服務池內將對每一個單元進行請求輪訓,實現負載均衡
#配置語法:upstreamname...默認:——位置:httpupstream#自定義組名{serverx1.baidu.com;#可以是域名serverx2.baidu.com;#serverx3.baidu.com#down不參與負載均衡#weight=5;權重,越高分配越多#backup;預留的備份服務器#max_fails允許失敗的次數#fail_timeout超過失敗次數后,服務暫停時間#max_coons限制最大的接受的連接數#根據服務器性能不同,配置適合的參數#server106.xx.xx.xxx;可以是ip#server106.xx.xx.xxx:8080;可以帶端口號#serverunix:/tmp/xxx;支出socket方式}
假設我們有三臺服務器,并且假設它們的IP地址,前端負載均衡服務器A(127.0.0.1),后臺服務器B(127.0.0.2),后臺服務器C(127.0.0.3)
新建文件proxy.conf
,內容如下,上一章介紹的反向代理配置
proxy_redirectdefault;proxy_set_headerHost$http_host;proxy_set_headerX-Real-IP$remote_addr;proxy_connect_timeout30;proxy_send_timeout60;proxy_read_timeout60;proxy_buffer_size32k;proxy_bufferingon;proxy_buffers4128k;proxy_busy_buffers_size256k;proxy_max_temp_file_size256k;#服務器A的配置http{...upstreamxxx{server127.0.0.2;server127.0.0.3;}server{liseten80;server_namelocalhost;location/{proxy_passhttp://xxx#upstream對應自定義名稱includeproxy.conf;}}}#服務器B、服務器C的配置server{liseten80;server_namelocalhost;location/{indexindex.html}}
調度算法
輪訓:按時間順序逐一分配到不同的后端服務器
加權輪訓:weight值越大,分配到的幾率越高
ip_hash:每個請求按訪問IP的hash結果分配,這樣來自同一個IP固定訪問一個后端服務器
least_conn:最少鏈接數,哪個機器連接數少就分發給誰
url_hash:按照訪問的URL的hash結果來分配請求,每一個URL定向到同一個后端服務器
hash關鍵數值:hash自定義key
ip_hash
配置
upstreamxxx{ip_hash;server127.0.0.2;server127.0.0.3;}
ip_hash存在缺陷,當前端服務器再多一層時,將獲取不到用戶的正確IP,獲取的將是前一個前端服務器的IP,因此 nginx1.7.2版本推出了 url_hash
url_hash
配置
upstreamxxx{hash$request_uri;server127.0.0.2;server127.0.0.3;}
1. 緩存類型
服務端緩存:緩存存儲在后端服務器,如redis,memcache
代理緩存:緩存存儲在代理服務器或者中間件上,它的內容是從后端服務器獲取的,但是保存在自己本地
客戶端緩存:緩存在瀏覽器內的
2. nginx 代理緩存
客戶端請求nginx,nginx查看本地是否有緩存數據,若有直接返回給客戶端,若沒有再去后端服務器請求
http{proxy_cache_path/var/www/cache#緩存地址levels=1:2#目錄分級keys_zone=test_cache:10m#開啟的keys空間名字:空間大小(1m可以存放8000個key)max_size=10g#目錄最大大小(超過時,不常用的將被刪除)inactive=60m#60分鐘內沒有被訪問的緩存將清理use_temp_path=pff;#是否開啟存放臨時文件目錄,關閉默認存儲在緩存地址server{...location/{proxy_cachetest_cache;#開啟緩存對應的名稱,在keys_zone命名好proxy_cache_valid20030412h;#狀態碼為200304的緩存12小時proxy_cache_validany10m;#其他狀態緩存10小時proxy_cache_key$host$uri$is_args$args;#設置key值add_headerNginx-Cache"$upstream_cache_status";}}}
當有個特定請求我們不需要緩存的時候,在上面配置的內容中加入以下配置
server{...if($request_uri~^/(login|register)){#當請求地址有login或register時set$nocache=1;#設置一個自定義變量為true}location/{proxy_no_cache$nocache$arg_nocache$arg_comment;proxy_no_cache$http_pragma$http_authoriztion;}}
3. 分片請求
早期版本 nginx 對大文件的分片請求不支持緩存,1.9版本后slice模塊實現了這個功能
前端發起請求,nginx去獲取這個請求文件的大小,若超過我們的定義slice的大小,會進行切片,分割成多個小的請求去請求后端,到前端就成為一個一個獨立的緩存文件
tips:歡迎關注微信公眾號:Java后端,獲取每日技術博文推送。
優勢:每個子請求收到的數據都會形成獨立文件,一個請求中斷了,其他請求不受影響,原本情況請求中斷,再次請求文件將從頭開始,而開啟分片請求,就接下去獲取未請求的小文件
劣勢:當文件很大或者slice很小時,可能會導致文件描述符耗盡等情況
語法:slicesize;#當大文件請求時,設置size為每個小文件的大小默認:slice0;位置:http/server/location
#當出現虛擬主機域名相同的情況,重啟nginx時,會出現警告??處理,但是并不不會阻止nginx繼續使用server{listen80;server_namewww.baidu.com...}server{listen80;server_namewww.baidu.com...}...優先選擇最新讀取到的配置文件,當多個文件是通過include時,文件排序越靠前,越早被讀取
=#進行普通字符精確匹配,完全匹配^~#進行普通字符匹配,當前表示前綴匹配~\~*#表示執行一個正則匹配()#當程序使用精確匹配時,一但匹配成功,將停止其他匹配#當正則匹配成功時,會繼續接下來的匹配,尋找是否還有更精準的匹配
按順序檢查文件是否存在
location/{try_files$uri$uri//index.php;}#先查找$uri下是否有文件存在,若存在直接返回給用戶#若$url下沒有文件存在,再次訪問$uri/的路徑是否有文件存在#還是沒有文件存在,交給index.php處理例:location/{root/test/index.htmltry_files$uri@test}location@test{proxy_passhttp://127.0.0.1:9090;}#訪問/時,查看/test/index.html文件是否存在#若不存在,讓9090端口的程序去處理這個請求
location/request_path/image/{root/local_path/image/;}#當我們訪問https://cache.yisu.com/upload/information/20210524/347/786645.png時#將訪問https://cache.yisu.com/upload/information/20210524/347/786646.png下的文件location/request_path/image/{alias/local_path/image/;}#當我們訪問https://cache.yisu.com/upload/information/20210524/347/786645.png時#將訪問https://cache.yisu.com/upload/information/20210524/347/786647.png下的文件
當一個請求通過多個代理服務器時,用戶的IP將會被代理服務器IP覆蓋
#在第一個代理服務器中設置setx_real_ip=$remote_addr#最后一個代理服務器中獲取$x_real_ip=IP1
413RequestEntityTooLarge#上傳文件過大,設置client_max_body_size503badgateway#后端服務無響應504GatewayTime-out#后端服務執行超時
感謝各位的閱讀,以上就是“Nginx的概念和用法”的內容了,經過本文的學習后,相信大家對Nginx的概念和用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是本站,小編將為大家推送更多相關知識點的文章,歡迎關注!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
最近這段時間總有小伙伴問小編找本女主是NPC的網游小說是什么,小編為此在網上搜尋了一些有關于找本女主是NPC的網游小說的知識送給大家,希望能解答各位小伙伴的疑惑。1、《網游之夢幻現實》作者:云天空;2、《娶個NPC夫人》作者:黃花梨;【資料圖】3、《菜鳥老公》作者:末尚尚;4、《網游之丑娘》作者:小小魚水中游;5、《千里佳期我來赴》作者:舒嘉妍;6、《全服第二》作者:落日薔薇;7、《網游之冬至秋離...
哈嘍小伙伴們 ,今天給大家科普一個小知識。在日常生活中我們或多或少的都會接觸到經濟危機的根源在于方面的一些說法,有的小伙伴還不是很了解,今天就給大家詳細的介紹一下關于經濟危機的根源在于的相關內容。經濟危機產生的根源在于資本剝削雇傭勞動生產方式的基本矛盾,也就是資本主義生產關系與生產力之間的矛盾。經濟危機在早期的商品生產中就已經出現,當然和貨幣作為市場流通手段是有著緊密聯系的。后期由于社會的進步發展...
市場表現方面,風能概念股平均下跌1.2%,上漲的有41只,漲停的有星辰科技,下跌的有142只,其中跌停的有*ST紅相和高瀾股份。南方財富網趨勢選股系統為您整理風能龍頭股的相關信息。(資料圖片)本文目錄:一、風能龍頭股一覽二、風能概念股有哪些上市公司一、風能龍頭股一覽1、特變電工:龍頭2022年第二季度特變電工公司主營為新能源產業及工程、煤炭業務、變壓器產品等,收入為129.55億元、81.32億元...