Nginx 入门到实战,新手必懂。
今日推薦
扔掉 Postman,一個工具全部搞定,真香!為啥查詢那么慢?還在直接用JWT做鑒權?JJWT真香推薦 15 款常用開發工具干掉 navicat:這款 DB 管理工具才是y(永)y(遠)d(的)s(神)一、環境
服務器版本:CentOS 7.2,為了保證學習階段不遇到奇怪的事情,請保證以下四點(大神選擇性無視)
確認系統網絡
確認yum可用
確認關閉iptables
確認停用selinux
安裝一些系統基本工具,正常情況系統都會自帶(沒有在裝哦)
yum -y install?gcc gcc-c++ autoconf pcre pcre-devel make automake yum -y install?wget httpd-tools vim二、Nginx是什么?
Nginx是一個開源且高性能、可靠的HTTP中間件、代理服務 其他的HTTP服務:
HTTPD-Apache基金會
IIS-微軟
GWS-Google(不對外開放)
近幾年,Nginx的市場占有率越來越高,一度飆升,為什么呢?接下來我們就知道了!三、我們為什么選擇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集成包,簡單方便-推薦!
#執行這句語句,根據指引,將安裝 nginx php mysql 可進入lnmp官網查看更詳細的過程 #默認安裝目錄/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#默認安裝目錄 /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 {listen 80 #監聽端口;server_name localhost #地址location / { #訪問首頁路徑root /xxx/xxx/index.html #默認目錄index index.html index.htm #默認文件 } error_page 500 504 /50x.html #當出現以上狀態碼時從新定義到50x.html location = /50x.html { #當訪問50x.html時root /xxx/xxx/html #50x.html 頁面所在位置} }server {... ... } }一個 server 可以出現多個 location ,我們對不同的訪問路徑進行不同情況的配置 我們再來看看 http 的配置詳情
http?{sendfile??on??????????????????#高效傳輸文件的模式 一定要開啟keepalive_timeout 65????????#客戶端服務端請求超時時間log_format main XXX #定義日志格式 代號為mainaccess_log /usr/local/access.log main #日志保存地址 格式代碼 main }四、模塊
查看 nginx 已開啟和編聯進去的模塊,模塊太多了,就不在這長篇大論,有需要自行百度吧~
#大寫V查看所有模塊,小寫v查看版本 nginx -V #?查看此配置文件 是否存在語法錯誤 nginx -tc /usr/local/nginx/conf/nginx.conf五、靜態資源 Web 服務
1. 靜態資源類型
非服務器動態運行生成的文件,換句話說,就是可以直接在服務器上找到對應文件的請求
1. 瀏覽器端渲染:HTML,CSS,JS
2. 圖片:JPEG,GIF,PNG
3. 視頻:FLV,MPEG
4. 文件:TXT,任意下載文件
2. 靜態資源服務場景-CDN
什么是CDN?例如一個北京用戶要請求一個文件,而文件放在的新疆的資源存儲中心,如果直接請求新疆距離太遠,延遲久。使用nginx靜態資源回源,分發給北京的資源存儲中心,讓用戶請求的動態定位到北京的資源存儲中心請求,實現傳輸延遲的最小化
2. nginx靜態資源配置
配置域: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協議定義的緩存機制(如:Expires; Cache-control等 ),減少服務端的消耗,降低延遲
1. 瀏覽器無緩存
瀏覽器請求 -> 無緩存 -> 請求WEB服務器 -> 請求相應 -> 呈現
在呈現階段會根據緩存的設置在瀏覽器中生成緩存
2. 瀏覽器有緩存
瀏覽器請求 -> 有緩存 -> 校驗本地緩存時間是否過期 -> 沒有過期 -> 呈現
若過期從新請求WEB服務器
3. 語法配置
location?~ .*\.(html|htm)$?{ expires?12h; }服務器響應靜態文件時,請求頭信息會帶上 etag 和 last_modified_since 2個標簽值,瀏覽器下次去請求時,頭信息發送這兩個標簽,服務器檢測文件有沒有發生變化,如無,直接頭信息返 etag 和last_modified_since,狀態碼為?304?,瀏覽器知道內容無改變,于是直接調用本地緩存,這個過程也請求了服務,但是傳著的內容極少。
七、跨站訪問
開發 nginx 跨站訪問設置
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跨域 }在響應中指定 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?none?blocked?127.xxx.xxx.xxif ($invalid_referer) { return?403;} }九、HTTP代理服務
Nginx可以實現多種代理方式
HTTP
ICMPPOPIMAP
HTTPS
RTMP
1. 代理區別
區別在于代理的對象不一樣,正向代理代理的對象是客戶端,反向代理代理的對象是服務端
2. 反向代理
語法:proxy_pass URL 默認:—— 位置: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 相關配置和場景,后面文章會介紹負載均衡和緩存服務相關知識。
來源:https://segmentfault.com/a/1190000014893012
推薦文章1、一款高顏值的 SpringBoot+JPA 博客項目2、超優 Vue+Element+Spring 中后端解決方案3、推薦幾個支付項目!4、推薦一個 Java 企業信息化系統5、一款基于 Spring Boot 的現代化社區(論壇/問答/社交網絡/博客)總結
以上是生活随笔為你收集整理的Nginx 入门到实战,新手必懂。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里神器 Arthas 有多强?教你一招
- 下一篇: 这 9 个 Java 开源项目 yyds