Nginx 入门到实战,新手必懂。
今日推薦
扔掉 Postman,一個(gè)工具全部搞定,真香!為啥查詢那么慢?還在直接用JWT做鑒權(quán)?JJWT真香推薦 15 款常用開(kāi)發(fā)工具干掉 navicat:這款 DB 管理工具才是y(永)y(遠(yuǎn))d(的)s(神)一、環(huán)境
服務(wù)器版本:CentOS 7.2,為了保證學(xué)習(xí)階段不遇到奇怪的事情,請(qǐng)保證以下四點(diǎn)(大神選擇性無(wú)視)
確認(rèn)系統(tǒng)網(wǎng)絡(luò)
確認(rèn)yum可用
確認(rèn)關(guān)閉iptables
確認(rèn)停用selinux
安裝一些系統(tǒng)基本工具,正常情況系統(tǒng)都會(huì)自帶(沒(méi)有在裝哦)
yum -y install?gcc gcc-c++ autoconf pcre pcre-devel make automake yum -y install?wget httpd-tools vim二、Nginx是什么?
Nginx是一個(gè)開(kāi)源且高性能、可靠的HTTP中間件、代理服務(wù) 其他的HTTP服務(wù):
HTTPD-Apache基金會(huì)
IIS-微軟
GWS-Google(不對(duì)外開(kāi)放)
近幾年,Nginx的市場(chǎng)占有率越來(lái)越高,一度飆升,為什么呢?接下來(lái)我們就知道了!三、我們?yōu)槭裁催x擇Nginx?
1. IO多路復(fù)用epoll(IO復(fù)用)
如何理解呢?舉個(gè)例子吧!有A、B、C三個(gè)老師,他們都遇到一個(gè)難題,要幫助一個(gè)班級(jí)的學(xué)生解決課堂作業(yè)。
老師A采用從第一排開(kāi)始一個(gè)學(xué)生一個(gè)學(xué)生輪流解答的方式去回答問(wèn)題,老師A浪費(fèi)了很多時(shí)間,并且有的學(xué)生作業(yè)還沒(méi)有完成呢,老師就來(lái)了,反反復(fù)復(fù)效率極慢。
老師B是一個(gè)忍者,他發(fā)現(xiàn)老師A的方法行不通,于是他使用了影分身術(shù),分身出好幾個(gè)自己同一時(shí)間去幫好幾個(gè)同學(xué)回答問(wèn)題,最后還沒(méi)回答完,老師B消耗光了能量累倒了。
老師C比較精明,他告訴學(xué)生,誰(shuí)完成了作業(yè)舉手,有舉手的同學(xué)他才去指導(dǎo)問(wèn)題,他讓學(xué)生主動(dòng)發(fā)聲,分開(kāi)了“并發(fā)”。這個(gè)老師C就是Nginx。
2. 輕量級(jí)
功能模塊少 - Nginx僅保留了HTTP需要的模塊,其他都用插件的方式,后天添加
代碼模塊化 - 更適合二次開(kāi)發(fā),如阿里巴巴Tengine
3. CPU親和
把CPU核心和Nginx工作進(jìn)程綁定,把每個(gè)worker進(jìn)程固定在一個(gè)CPU上執(zhí)行,減少切換CPU的cache miss,從而提高性能。
三、安裝與目錄
本人使用了鳥(niǎo)哥的lnmp集成包,簡(jiǎn)單方便-推薦!
#執(zhí)行這句語(yǔ)句,根據(jù)指引,將安裝 nginx php mysql 可進(jìn)入lnmp官網(wǎng)查看更詳細(xì)的過(guò)程 #默認(rèn)安裝目錄/usr/local wget -c http://soft.vpser.net/lnmp/lnmp1.4.tar.gz && tar zxf lnmp1.4.tar.gz && cd lnmp1.4 && ./install.sh lnmp#默認(rèn)安裝目錄 /usr/local四、基本配置
#打開(kāi)主配置文件,若你是用lnmp環(huán)境安裝 vim?/usr/local/nginx/conf/nginx.conf----------------------------------------user #設(shè)置nginx服務(wù)的系統(tǒng)使用用戶 worker_processes #工作進(jìn)程數(shù) 一般情況與CPU核數(shù)保持一致 error_log #nginx的錯(cuò)誤日志 pid #nginx啟動(dòng)時(shí)的pidevents {worker_connections????#每個(gè)進(jìn)程允許最大連接數(shù)use #nginx使用的內(nèi)核模型 }我們使用 nginx 的 http 服務(wù),在配置文件 nginx.conf 中的 http 區(qū)域內(nèi),配置無(wú)數(shù)個(gè) server ,每一個(gè) server 對(duì)應(yīng)這一個(gè)虛擬主機(jī)或者域名
http {... ... #后面再詳細(xì)介紹 http 配置項(xiàng)目server {listen 80 #監(jiān)聽(tīng)端口;server_name localhost #地址location / { #訪問(wèn)首頁(yè)路徑root /xxx/xxx/index.html #默認(rèn)目錄index index.html index.htm #默認(rèn)文件 } error_page 500 504 /50x.html #當(dāng)出現(xiàn)以上狀態(tài)碼時(shí)從新定義到50x.html location = /50x.html { #當(dāng)訪問(wèn)50x.html時(shí)root /xxx/xxx/html #50x.html 頁(yè)面所在位置} }server {... ... } }一個(gè) server 可以出現(xiàn)多個(gè) location ,我們對(duì)不同的訪問(wèn)路徑進(jìn)行不同情況的配置 我們?cè)賮?lái)看看 http 的配置詳情
http?{sendfile??on??????????????????#高效傳輸文件的模式 一定要開(kāi)啟keepalive_timeout 65????????#客戶端服務(wù)端請(qǐng)求超時(shí)時(shí)間log_format main XXX #定義日志格式 代號(hào)為mainaccess_log /usr/local/access.log main #日志保存地址 格式代碼 main }四、模塊
查看 nginx 已開(kāi)啟和編聯(lián)進(jìn)去的模塊,模塊太多了,就不在這長(zhǎng)篇大論,有需要自行百度吧~
#大寫(xiě)V查看所有模塊,小寫(xiě)v查看版本 nginx -V #?查看此配置文件 是否存在語(yǔ)法錯(cuò)誤 nginx -tc /usr/local/nginx/conf/nginx.conf五、靜態(tài)資源 Web 服務(wù)
1. 靜態(tài)資源類型
非服務(wù)器動(dòng)態(tài)運(yùn)行生成的文件,換句話說(shuō),就是可以直接在服務(wù)器上找到對(duì)應(yīng)文件的請(qǐng)求
1. 瀏覽器端渲染:HTML,CSS,JS
2. 圖片:JPEG,GIF,PNG
3. 視頻:FLV,MPEG
4. 文件:TXT,任意下載文件
2. 靜態(tài)資源服務(wù)場(chǎng)景-CDN
什么是CDN?例如一個(gè)北京用戶要請(qǐng)求一個(gè)文件,而文件放在的新疆的資源存儲(chǔ)中心,如果直接請(qǐng)求新疆距離太遠(yuǎn),延遲久。使用nginx靜態(tài)資源回源,分發(fā)給北京的資源存儲(chǔ)中心,讓用戶請(qǐng)求的動(dòng)態(tài)定位到北京的資源存儲(chǔ)中心請(qǐng)求,實(shí)現(xiàn)傳輸延遲的最小化
2. nginx靜態(tài)資源配置
配置域:http、server、location
http?{ sendfile???on; }http?{ sendfile???on;tcp_nopush?on; }http?{ sendfile???on;tcp_nopush?on;tcp_nodelay?on; }location?~ .*\.(gif|jpg)$?{ gzip?on; gzip_http_version?1.1; gzip_comp_level?2; gzip_types???text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss image/jpeg image/gif image/png; root?/opt/app/code; }location?~ load^/download?{ gzip_static?on?tcp_nopush on;root?/opt/app/code; }六、瀏覽器緩存
HTTP協(xié)議定義的緩存機(jī)制(如:Expires; Cache-control等 ),減少服務(wù)端的消耗,降低延遲
1. 瀏覽器無(wú)緩存
瀏覽器請(qǐng)求 -> 無(wú)緩存 -> 請(qǐng)求WEB服務(wù)器 -> 請(qǐng)求相應(yīng) -> 呈現(xiàn)
在呈現(xiàn)階段會(huì)根據(jù)緩存的設(shè)置在瀏覽器中生成緩存
2. 瀏覽器有緩存
瀏覽器請(qǐng)求 -> 有緩存 -> 校驗(yàn)本地緩存時(shí)間是否過(guò)期 -> 沒(méi)有過(guò)期 -> 呈現(xiàn)
若過(guò)期從新請(qǐng)求WEB服務(wù)器
3. 語(yǔ)法配置
location?~ .*\.(html|htm)$?{ expires?12h; }服務(wù)器響應(yīng)靜態(tài)文件時(shí),請(qǐng)求頭信息會(huì)帶上 etag 和 last_modified_since 2個(gè)標(biāo)簽值,瀏覽器下次去請(qǐng)求時(shí),頭信息發(fā)送這兩個(gè)標(biāo)簽,服務(wù)器檢測(cè)文件有沒(méi)有發(fā)生變化,如無(wú),直接頭信息返 etag 和last_modified_since,狀態(tài)碼為?304?,瀏覽器知道內(nèi)容無(wú)改變,于是直接調(diào)用本地緩存,這個(gè)過(guò)程也請(qǐng)求了服務(wù),但是傳著的內(nèi)容極少。
七、跨站訪問(wèn)
開(kāi)發(fā) nginx 跨站訪問(wèn)設(shè)置
location?~ .*\.(html|htm)$?{ add_header?Access-Control-Allow-Origin *;add_header?Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;#Access-Control-Allow-Credentials true #允許cookie跨域 }在響應(yīng)中指定 Access-Control-Allow-Credentials 為 true 時(shí),Access-Control-Allow-Origin 不能指定為 *,需要指定到具體域名。
相關(guān)跨域內(nèi)容可參考 Laravel 跨域功能中間件 使用代碼實(shí)現(xiàn)跨域,原理與nginx跨域配置相同
八、防盜鏈
防止服務(wù)器內(nèi)的靜態(tài)資源被其他網(wǎng)站所套用,此處介紹的 nginx 防盜鏈為基礎(chǔ)方式,其它更加深入的方式將在之后的文章介紹
首先,需要理解一個(gè)nginx變量
$http_referer #表示當(dāng)前請(qǐng)求上一次頁(yè)面訪問(wèn)的地址,換句話說(shuō),訪問(wèn) www.baidu.com 主頁(yè),這是第一次訪問(wèn),所以 $http_referer 為空,但是 訪問(wèn)此頁(yè)面的時(shí)候還需要獲取一張首頁(yè)圖片,再請(qǐng)求這張圖片的時(shí)候 $http_referer 就為 www.baidu.com。
然后配置
location?~ .*\.(jpg|gif)$?{ valid_referers?none?blocked?127.xxx.xxx.xxif ($invalid_referer) { return?403;} }九、HTTP代理服務(wù)
Nginx可以實(shí)現(xiàn)多種代理方式
HTTP
ICMPPOPIMAP
HTTPS
RTMP
1. 代理區(qū)別
區(qū)別在于代理的對(duì)象不一樣,正向代理代理的對(duì)象是客戶端,反向代理代理的對(duì)象是服務(wù)端
2. 反向代理
語(yǔ)法:proxy_pass URL 默認(rèn):—— 位置:loactionserver {listen 80;location / {proxy_pass http://127.0.0.1:8080/;proxy_redirect default;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 30; proxy_send_timeout 60;proxy_read_timeout 60;proxy_buffer_size 32k;proxy_buffering on; proxy_buffers 4?128k;proxy_busy_buffers_size 256k;proxy_max_temp_file_size 256k; } }本文介紹了 Nginx 相關(guān)配置和場(chǎng)景,后面文章會(huì)介紹負(fù)載均衡和緩存服務(wù)相關(guān)知識(shí)。
來(lái)源:https://segmentfault.com/a/1190000014893012
推薦文章1、一款高顏值的 SpringBoot+JPA 博客項(xiàng)目2、超優(yōu) Vue+Element+Spring 中后端解決方案3、推薦幾個(gè)支付項(xiàng)目!4、推薦一個(gè) Java 企業(yè)信息化系統(tǒng)5、一款基于 Spring Boot 的現(xiàn)代化社區(qū)(論壇/問(wèn)答/社交網(wǎng)絡(luò)/博客)總結(jié)
以上是生活随笔為你收集整理的Nginx 入门到实战,新手必懂。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 阿里神器 Arthas 有多强?教你一招
- 下一篇: Nginx的优点