2020最新Nginx入門到實戰(附pdf文檔供參考)


2020最新Nginx入門到實戰(附pdf文檔供參考)

Nginx入門到實戰 - 基礎篇

一、環境

服務器版本:CentOS 7.2

為了保證學習階段不遇到奇怪的事情,請保證以下四點(大神選擇性無視)

1.確認系統網絡 2.確認yum可用 3.確認關閉iptables 4.確認停用selinux

<code>#查看iptables狀態
systemctl status firewalld.service
#關閉防火牆(臨時關閉)
systemctl stop firewalld.service
#查看SELinux狀態
getenforce
#臨時關閉SELinux
setenforce 0/<code>

安裝一些系統基本工具,正常情況系統都會自帶(沒有在裝哦).

<code>yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
yum -y install wget httpd-tools vim/<code>

二、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,從而提高性能。

四、安裝與目錄

<code>#執行這句語句,根據指引,將安裝 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/<code>

五、基本配置

<code>#打開主配置文件,若你是用lnmp環境安裝
vim /usr/local/nginx/conf/nginx.conf
----------------------------------------
user #設置nginx服務的系統使用用戶
worker_processes #工作進程數 一般情況與CPU核數保持一致
error_log #nginx的錯誤日誌
pid #nginx啟動時的pid
events {
worker_connections #每個進程允許最大連接數
use #nginx使用的內核模型
}/<code>

我們使用 nginx 的 http 服務,在配置文件 nginx.conf 中的 http 區域內,配置無數個 server ,每一個 server 對應這一個虛擬主機或者域名:

<code> 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 {
... ...
}

}/<code>

一個 server 可以出現多個 location ,我們對不同的訪問路徑進行不同情況的配置.

我們再來看看 http 的配置詳情:

<code> http {
sendfile on #高效傳輸文件的模式 一定要開啟
keepalive_timeout 65 #客戶端服務端請求超時時間
log_format main XXX #定義日誌格式 代號為main
access_log /usr/local/access.log main #日誌保存地址 格式代碼 main
}/<code>

、模塊

查看 nginx 已開啟和編聯進去的模塊,模塊太多了,就不在這長篇大論,有需要自行百度吧~

<code> #大寫V查看所有模塊,小寫v查看版本
nginx -V
# 查看此配置文件 是否存在語法錯誤
nginx -tc /usr/local/nginx/conf/nginx.conf/<code>

Nginx入門到實戰 - 場景實現篇

一、靜態資源WEB服務

1.靜態資源類型

非服務器動態運行生成的文件,換句話說,就是可以直接在服務器上找到對應文件的請求:

瀏覽器端渲染:HTML,CSS,JS

視頻:FLV,MPEG

文件:TXT,任意下載文件

2.靜態資源服務場景-CDN

什麼是CDN?例如一個北京用戶要請求一個文件,而文件放在的新疆的資源存儲中心,如果直接請求新疆距離太遠,延遲久。

使用nginx靜態資源回源,分發給北京的資源存儲中心,讓用戶請求的動態定位到北京的資源存儲中心請求,實現傳輸延遲的最小化

nginx靜態資源配置:

配置域:http、server、location

<code>#文件高速讀取
http {
sendfile on;
}
#在 sendfile 開啟的情況下,開啟 tcp_nopush 提高網絡包傳輸效率
#tcp_nopush 將文件一次性一起傳輸給客戶端,就好像你有十個包裹,快遞員一次送一個,來回十趟,開啟後,快遞員講等待你十個包裹都派件,一趟一起送給你
http {
sendfile on;
tcp_nopush on;
}
#tcp_nodelay 開啟實時傳輸,傳輸方式與 tcp_nopush 相反,追求實時性,但是它只有在長連接下才生效
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
#將訪問的文件壓縮傳輸 (減少文件資源大小,提高傳輸速度)
#當訪問內容以gif或jpg結尾的資源時
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; #對應目錄(去該目錄下尋找對應文件)
}

#直接訪問已壓縮文件
#當訪問路徑以download開頭時,如www.baidu.com/download/test.img
#去/opt/app/code目錄下尋找test.img.gz文件,返回到前端時已是可以瀏覽的img文件
location ~ load^/download {
gzip_static on #開啟;
tcp_nopush on;
root /opt/app/code;
}/<code>

二、瀏覽器緩存

HTTP協議定義的緩存機制(如:Expires; Cache-control等 ) 減少服務端的消耗,降低延遲

1.瀏覽器無緩存

瀏覽器請求 -> 無緩存 -> 請求WEB服務器 -> 請求相應 -> 呈現 在呈現階段會根據緩存的設置在瀏覽器中生成緩存

2.瀏覽器有緩存

瀏覽器請求 -> 有緩存 -> 校驗本地緩存時間是否過期 -> 沒有過期 -> 呈現 若過期從新請求WEB服務器

3.語法配置:

<code>location ~ .*\\.(html|htm)$ {

expires 12h; #緩存12小時
}

服務器響應靜態文件時,請求頭信息會帶上 etag 和 last_modified_since 2個標籤值,瀏覽器下次去請求時,頭信息發送這兩個標籤,服務器檢測文件有沒有發生變化,如無,直接頭信息返 etag 和last_modified_since,狀態碼為 304 ,瀏覽器知道內容無改變,於是直接調用本地緩存,這個過程也請求了服務,但是傳著的內容極少/<code>

三、跨站訪問

開發nginx跨站訪問設置:

<code>: 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跨域
}/<code>

在響應中指定 Access-Control-Allow-Credentials 為 true 時,

Access-Control-Allow-Origin 不能指定為 *,需要指定到具體域名.

相關跨域內容可參考 Laravel 跨域功能中間件 使用代碼實現跨域,原理與nginx跨域配置相同

四、防盜鏈

防止服務器內的靜態資源被其他網站所套用

此處介紹的 nginx 防盜鏈為基礎方式,其它更加深入的方式將在之後的文章介紹 首先,

需要理解一個nginx變量:

<code>$http_referer 
#表示當前請求上一次頁面訪問的地址,換句話說,訪問 www.baidu.com 主頁,這是第一次訪問,
所以 $http_referer 為空,但是 訪問此頁面的時候還需要獲取一張首頁圖片,
再請求這張圖片的時候 $http_referer 就為/<code>

然後配置

<code> location ~ .*\\.(jpg|gif)$ {
#valid_referers 表示我們允許哪些 $http_referer 來訪問
#none 表示沒有帶 $http_referer,如第一次訪問時 $http_referer 為空
#blocked 表示 $http_referer 不是標準的地址,非正常域名等
#只允許此ip
valid_referers none blocked 127.xxx.xxx.xx
if ($invalid_referer) { #不滿足情況下變量值為1
return 403;
}

}/<code>

五、HTTP代理服務

Nginx可以實現多種代理方式

HTTP

ICMPPOPIMAP HTTPS RTMP

1. 代理區別

區別在於代理的對象不一樣 正向代理代理的對象是客戶端 反向代理代理的對象是服務端

2. 反向代理

<code>語法:proxy_pass URL
默認:——
位置:loaction
#代理端口
#場景:服務器80端口開放,8080端口對外關閉,客戶端需要訪問到8080
#在nginx中配置proxy_pass代理轉發時,如果在proxy_pass後面的url加/,表示絕對根路徑;如果沒有/,表示相對路徑,把匹配的路徑部分也給代理走
server {
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; #獲取客戶端真實IP
proxy_connect_timeout 30; #超時時間
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 32k;
proxy_buffering on; #開啟緩衝區,減少磁盤io
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k; #當超過內存允許儲蓄大小,存到文件
}
}/<code>

Nginx入門到實戰 - 負載均衡和緩存服務

一、負載均衡

負載均衡的實現方法就是我們上章介紹的反向代理 。

將客戶的請求通過 nginx 分發(反向代理)到一組多臺不同的服務器上.

這一組服務器我們稱為 服務池(upstream server),池內的每一個服務器稱為一個 單元,服務池內將對每一個單元進行請求輪訓,實現負載均衡:

<code>#配置
語法:upstream name ...
默認:——
位置:http

upstream #自定義組名 {
server x1.baidu.com; #可以是域名
server x2.baidu.com;
#server x3.baidu.com
#down 不參與負載均衡
#weight=5; 權重,越高分配越多
#backup; 預留的備份服務器
#max_fails 允許失敗的次數
#fail_timeout 超過失敗次數後,服務暫停時間
#max_coons 限制最大的接受的連接數
#根據服務器性能不同,配置適合的參數
#server 106.xx.xx.xxx; 可以是ip
#server 106.xx.xx.xxx:8080; 可以帶端口號
#server unix:/tmp/xxx; 支出socket方式
}/<code>

假設我們有三臺服務器,並且假設它們的IP地址,前端負載均衡服務器A(127.0.0.1),後臺服務器B(127.0.0.2),後臺服務器C(127.0.0.3)

新建文件 proxy.conf,內容如下,上一章介紹的反向代理配置:

<code> 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;/<code>

服務器A的配置:

<code>http {
...
upstream xxx {
server 127.0.0.2;
server 127.0.0.3;
}
server {
liseten 80;
server_name localhost;
location / {
proxy_pass http://xxx #upstream 對應自定義名稱
include proxy.conf;
}
}
}/<code>

服務器B、服務器C的配置:

<code> server {
liseten 80;
server_name localhost;
location / {
index index.html
}
}/<code>

調度算法

輪訓:按時間順序逐一分配到不同的後端服務器

加權輪訓:weight值越大,分配到的幾率越高

ip_hash:每個請求按訪問IP的hash結果分配,這樣來自同一個IP固定訪問一個後端服務器

least_conn:最少鏈接數,哪個機器連接數少就分發給誰

url_hash:按照訪問的URL的hash結果來分配請求,每一個URL定向到同一個後端服務器

hash關鍵數值:hash自定義key

ip_hash 配置:

<code> upstream xxx {
ip_hash;
server 127.0.0.2;
server 127.0.0.3;
}/<code>

ip_hash存在缺陷,當前端服務器再多一層時,將獲取不到用戶的正確IP,獲取的將是前一個前端服務器的IP,因此 nginx1.7.2版本推出了 url_hash.

url_hash 配置:

<code>upstream xxx {
hash $request_uri;
server 127.0.0.2;

server 127.0.0.3;
}/<code>

二、緩存服務

1. 緩存類型

服務端緩存:緩存存儲在後端服務器,如redis,memcache

代理緩存:緩存存儲在代理服務器或者中間件上,它的內容是從後端服務器獲取的,但是保存在自己本地

客戶端緩存:緩存在瀏覽器內的

2. nginx 代理緩存

客戶端請求nginx,nginx查看本地是否有緩存數據,若有直接返回給客戶端,若沒有再去後端服務器請求:

<code>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_cache test_cache; #開啟緩存對應的名稱,在keys_zone命名好
proxy_cache_valid 200 304 12h; #狀態碼為200 304的緩存12小時
proxy_cache_valid any 10m; #其他狀態緩存10小時
proxy_cache_key $host$uri$is_args$args; #設置key值
add_header Nginx-Cache "$upstream_cache_status";
}
}
}/<code>

當有個特定請求我們不需要緩存的時候,在上面配置的內容中加入以下配置:

<code> 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;
}
}/<code>

3. 分片請求

早期版本 nginx 對大文件的分片請求不支持緩存,1.9版本後slice模塊實現了這個功能

前端發起請求,nginx去獲取這個請求文件的大小,若超過我們的定義slice的大小,會進行切片,分割成多個小的請求去請求後端,到前端就成為一個一個獨立的緩存文件

優勢:每個子請求收到的數據都會形成獨立文件,一個請求中斷了,其他請求不受影響,原本情況請求中斷,再次請求文件將從頭開始,而開啟分片請求,就接下去獲取未請求的小文件

劣勢:當文件很大或者slice很小時,可能會導致文件描述符耗盡等情況

語法:slice size; #當大文件請求時,設置size為每個小文件的大小

默認:slice 0;

位置:http/server/location

Nginx入門到實戰 - 常見問題

一、相同 server_name 多個虛擬主機優先級

當出現虛擬主機域名相同的情況,重啟nginx時,會出現警告處理,但是並不不會阻止nginx繼續使用

<code> server {
listen 80;
server_name www.baidu.com
...
}
server {
listen 80;
server_name www.baidu.com
...
}
.../<code>

優先選擇最新讀取到的配置文件,當多個文件是通過include時,文件排序越靠前,越早被讀取 二、location 匹配優先級

<code> = #進行普通字符精確匹配,完全匹配
^~ #進行普通字符匹配,當前表示前綴匹配
~\\~* #表示執行一個正則匹配()
#當程序使用精確匹配時,一但匹配成功,將停止其他匹配
#當正則匹配成功時,會繼續接下來的匹配,尋找是否還有更精準的匹配/<code>

三、try_files的使用

按順序檢查文件是否存在:

<code> location / {
try_files $uri $uri/ /index.php;
}
#先查找$uri下是否有文件存在,若存在直接返回給用戶
#若$url下沒有文件存在,再次訪問$uri/的路徑是否有文件存在
#還是沒有文件存在,交給index.php處理/<code>

例:

<code> location / {
root /test/index.html
try_files $uri @test
}
location @test {
proxy_pass http://127.0.0.1:9090;
}
#訪問 / 時,查看 /test/index.html 文件是否存在
#若不存在,讓9090端口的程序去處理這個請求/<code>

、alias和root的區別

<code>location /request_path/image/ {
root /local_path/image/;
}
#當我們訪問 http://xxx.com/request_path/image/cat.png時
#將訪問 http://xxx.com/request_path/image/local_path/image/cat.png 下的文件
location /request_path/image/ {
alias /local_path/image/;

}
#當我們訪問 http://xxx.com/request_path/image/cat.png時
#將訪問 http://xxx.com/local_path/image/cat.png 下的文件/<code>

五、如果用戶真實IP

當一個請求通過多個代理服務器時,用戶的IP將會被代理服務器IP覆蓋.

<code>在第一個代理服務器中設置
set x_real_ip=$remote_addr
#最後一個代理服務器中獲取
$x_real_ip=IP1/<code>

六、Nginx 常見錯誤碼

413 Request Entity Too Large #上傳文件過大,

設置 client_max_body_size 503 bad gateway #後端服務無響應 504 Gateway Time-out

#後端服務執行超時yo

《Nginx入門到實戰》pdf文檔,目錄:

2020最新Nginx入門到實戰(附pdf文檔供參考)

第1章:Nginx簡介

2020最新Nginx入門到實戰(附pdf文檔供參考)

第2章:Nginx服務器的安裝與配置

2020最新Nginx入門到實戰(附pdf文檔供參考)

第3章:Nginx的基本配置與優化

2020最新Nginx入門到實戰(附pdf文檔供參考)

第4章:Nginx與PHP的安裝、配置與優化

2020最新Nginx入門到實戰(附pdf文檔供參考)

第5章:Nginx與JSP、ASP、NET、Perl的安裝與配置

2020最新Nginx入門到實戰(附pdf文檔供參考)

第6章:Nginx HTTP負載均衡和反向代理的配置與優化

2020最新Nginx入門到實戰(附pdf文檔供參考)

第7章:Nginx的Rewrite規則編寫實例

2020最新Nginx入門到實戰(附pdf文檔供參考)

第8章:Nginx模塊開發

2020最新Nginx入門到實戰(附pdf文檔供參考)

第9章:Nginx的Web緩存服務於新浪網的開源NCACHE模塊

2020最新Nginx入門到實戰(附pdf文檔供參考)

第10章:Nginx在國內知名網站中的應用案例

2020最新Nginx入門到實戰(附pdf文檔供參考)

第11章:Nginx的非典型應用實例

2020最新Nginx入門到實戰(附pdf文檔供參考)

第12章:Nginx的核心模塊

2020最新Nginx入門到實戰(附pdf文檔供參考)

第13章:Nginx的標準HTTP模塊

2020最新Nginx入門到實戰(附pdf文檔供參考)

第14章:Nginx的其他HTTP模塊

2020最新Nginx入門到實戰(附pdf文檔供參考)

第15章:Nginx的郵件模塊

2020最新Nginx入門到實戰(附pdf文檔供參考)

以上就是2020最新Nginx入門到實戰(附pdf文檔供參考),希望可以幫助到你,下面展示了部分資料,也希望也能幫助到大家,對編程感興趣想進階的朋友,如果能幫到你請點贊、點贊、點贊:

整理的 pdf 文檔:

2020最新Nginx入門到實戰(附pdf文檔供參考)

2020最新Nginx入門到實戰(附pdf文檔供參考)

2020最新Nginx入門到實戰(附pdf文檔供參考)

2020最新Nginx入門到實戰(附pdf文檔供參考)

源碼分析專題部分課程:

2020最新Nginx入門到實戰(附pdf文檔供參考)

2020最新Nginx入門到實戰(附pdf文檔供參考)

獲取方式

點贊,收藏並轉發文章後點擊小編頭像或暱稱,關注後私信回覆:【11】 即可

舉手之勞,非常感謝!!!


分享到:


相關文章: