A2-Nginx-應(yīng)用篇2021年5月21日 22:51:42

Nginx-文章總綱

http://www.reibang.com/p/07cdd29d2a50

友情鏈接

1蒋困、基礎(chǔ)篇:ngxin 的簡(jiǎn)介葱峡,安裝,目錄說(shuō)明,配置文件詳解(理論為主)
http://www.reibang.com/p/d46dc6bce6ed
2茄猫、應(yīng)用篇:靜態(tài)部署,后端配置难述,反向代碼妻往,負(fù)載均衡,緩存集成(實(shí)操為主)
http://www.reibang.com/p/3a39e18550b5
3载碌、集群篇:集群搭建猜嘱,高可用解決方案,制作下載站點(diǎn)和用戶認(rèn)證(提升)
http://www.reibang.com/p/2e9ca678ef73
4嫁艇、模塊篇:ngx-lua的結(jié)合使用朗伶,lua基本語(yǔ)法介紹(綜合)
http://www.reibang.com/p/2e9ca678ef73

一、Nginx服務(wù)器基礎(chǔ)配置案例

1步咪、根據(jù)下面需求實(shí)現(xiàn)案例

(1)有如下訪問(wèn):
http://106.52.23.202:8081/server1/location1 訪問(wèn)的是:index_sr1_location1.html http://106.52.23.202:8081/server1/location2 訪問(wèn)的是:index_sr1_location2.html http://106.52.23.202:8082/server2/location1 訪問(wèn)的是:index_sr2_location1.html http://106.52.23.202:8082/server2/location2 訪問(wèn)的是:index_sr2_location2.html
(2)如果訪問(wèn)的資源不存在论皆, 返回自定義的404頁(yè)面
(3)將/server1和/server2的配置使用不同的配置文件分割 將文件放到/home/www/conf.d目錄下,然后使用include進(jìn)行 合并
(4)為/server1和/server2各自創(chuàng)建一個(gè)訪問(wèn)日志文件

2猾漫、準(zhǔn)備相關(guān)文件点晴,目錄如下:

image.png

3、開(kāi)始配置

(1)/usr/nginx/conf/nginx.conf 核心配置文件

##全局塊 begin##
#配置允許運(yùn)行Nginx工作進(jìn)程的用戶和用戶組 
user www;
#配置運(yùn)行Nginx進(jìn)程生成的worker進(jìn)程數(shù) 
worker_processes 2;
#配置Nginx服務(wù)器運(yùn)行對(duì)錯(cuò)誤日志存放的路徑 
error_log logs/error.log;
#配置Nginx服務(wù)器允許時(shí)記錄Nginx的master進(jìn)程的PID:文件路徑和名稱
pid logs/nginx.pid;
#配置Nginx服務(wù)是否以守護(hù)進(jìn)程方法啟動(dòng),默認(rèn)就是以下配置
#daemon on; 
###全局塊 end##


#events塊 begin## 
events{
     #設(shè)置Nginx網(wǎng)絡(luò)連接序列化 
     accept_mutex on;
     #設(shè)置Nginx的worker進(jìn)程是否可以同時(shí)接收多個(gè)請(qǐng)求 
     multi_accept on;
     #設(shè)置Nginx的worker進(jìn)程最大的連接數(shù) 
     worker_connections 1024;
     #設(shè)置Nginx使用的事件驅(qū)動(dòng)模型 
     use epoll;
}
##events塊 end## ##http塊 start##


##http塊 start## 
http{
     #定義MIME-Type 
     include mime.types; 
     default_type application/octet-stream;
     #配置允許使用sendfile方式運(yùn)輸 
     sendfile on;
     #配置連接超時(shí)時(shí)間 
     keepalive_timeout 65;
     #配置請(qǐng)求處理日志格式 
     log_format server1 '===>server1 access log';
     log_format server2 '===>server2 access log';

     ##server塊 開(kāi)始## 
     include /home/www/conf.d/*.conf;
     ##server塊 結(jié)束## 
}
##http塊 end##

(2)server1.conf

server{

     #配置監(jiān)聽(tīng)端口和主機(jī)名稱
     listen 8081;
     server_name localhost;
     #配置請(qǐng)求處理日志存放路徑
     access_log /home/www/myweb/server1/logs/access.log server1;

     #配置錯(cuò)誤頁(yè)面
     error_page 404 /404.html;

     #配置處理/server1/location1請(qǐng)求的location
     location /server1/location1{
        root /home/www/myweb;
        index index_sr1_location1.html;
     }

     #配置處理/server1/location2請(qǐng)求的location
     location /server1/location2{
        root /home/www/myweb;
        index index_sr1_location2.html;
     }

     #配置錯(cuò)誤頁(yè)面轉(zhuǎn)向
     location = /404.html {
        root /home/www/myweb; 
        index 404.html;
     }
}

(3)server2.conf

server{

     #配置監(jiān)聽(tīng)端口和主機(jī)名稱
     listen 8082;
     server_name localhost;
     #配置請(qǐng)求處理日志存放路徑
     access_log /home/www/myweb/server2/logs/access.log server2;

     #配置錯(cuò)誤頁(yè)面
     error_page 404 /404.html;

     #配置處理/server2/location1請(qǐng)求的location
     location /server2/location1{
        root /home/www/myweb;
        index index_sr2_location1.html;
     }

     #配置處理/server2/location2請(qǐng)求的location
     location /server2/location2{
        root /home/www/myweb;
        index index_sr2_location2.html;
     }

     #配置錯(cuò)誤頁(yè)面轉(zhuǎn)向
     location = /404.html {
        root /home/www/myweb; 
        index 404.html;
     }
}

(4)訪問(wèn)測(cè)試:


image.png

(5)測(cè)試循環(huán)實(shí)時(shí)打印日志輸出:tail -f /home/www/myweb/server2/logs/access.log

image.png

image.png

(6)可能遇到的問(wèn)題:指令輸錯(cuò)了悯周,配置文件寫(xiě)法缺胳膊少腿的


image.png

二粒督、Nginx服務(wù)操作的問(wèn)題

經(jīng)過(guò)前面的操作,我們會(huì)發(fā)現(xiàn)禽翼,如果想要啟動(dòng)屠橄、關(guān)閉或重新加載nginx配置文件,都需要先進(jìn)入到nginx
的安裝目錄的sbin目錄捐康,然后使用nginx的二進(jìn)制可執(zhí)行文件來(lái)操作仇矾,相對(duì)來(lái)說(shuō)操作比較繁瑣,這塊該如
何優(yōu)化解总?另外如果我們想把Nginx設(shè)置成隨著服務(wù)器啟動(dòng)就自動(dòng)完成啟動(dòng)操作贮匕,又該如何來(lái)實(shí)現(xiàn)?這就需
要用到以下兩種方式:

1、Nginx配置成系統(tǒng)服務(wù)

把Nginx應(yīng)用服務(wù)設(shè)置成為系統(tǒng)服務(wù)花枫,方便對(duì)Nginx服務(wù)的啟動(dòng)和停止等相關(guān)操作刻盐,具體實(shí)現(xiàn)步驟:
(1) 在/usr/lib/systemd/system目錄下添加nginx.service,內(nèi)容如下:
vim /usr/lib/systemd/system/nginx.service


[Unit]
Description=nginx web service
Documentation=http://nginx.org/en/docs/
After=network.target

[Service]
Type=forking
#-----------------------這塊內(nèi)容要配置自己的路徑----------------------
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c
/usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
#-----------------------這塊內(nèi)容要配置自己的路徑----------------------
PrivateTmp=true

[Install]
WantedBy=default.target

(2)添加完成后如果權(quán)限有問(wèn)題需要進(jìn)行權(quán)限設(shè)置
chmod 755 /usr/lib/systemd/system/nginx.service

(3)使用系統(tǒng)命令來(lái)操作Nginx服務(wù)
啟動(dòng): systemctl start nginx
停止: systemctl stop nginx
重啟: systemctl restart nginx
重新加載配置文件: systemctl reload nginx
查看nginx狀態(tài): systemctl status nginx
開(kāi)機(jī)啟動(dòng): systemctl enable nginx

2、Nginx命令配置到系統(tǒng)環(huán)境

(1)修改/etc/profile文件:vim /etc/profile

#在最后一行添加 
export PATH=$PATH:/usr/local/nginx/sbin

(2)使之立即生效:source /etc/profile
(3)執(zhí)行nginx命令:nginx -V

三劳翰、Nginx靜態(tài)資源部署

1敦锌、Nginx靜態(tài)資源概述

上網(wǎng)去搜索訪問(wèn)資源對(duì)于我們來(lái)說(shuō)并不陌生,通過(guò)瀏覽器發(fā)送一個(gè)HTTP請(qǐng)求實(shí)現(xiàn)從客戶端發(fā)送請(qǐng)求到服務(wù)器端獲取所需要內(nèi)容后并把內(nèi)容回顯展示在頁(yè)面的一個(gè)過(guò)程佳簸。這個(gè)時(shí)候乙墙,我們所請(qǐng) 求的內(nèi)容就分為兩種類型颖变,一類是靜態(tài)資源、一類是動(dòng)態(tài)資源听想。 靜態(tài)資源即指在服務(wù)器端真實(shí)存在并且能直接拿來(lái)展示的一些文件腥刹,比如常見(jiàn)的html頁(yè)面、css文件汉买、js文件衔峰、圖 片、視頻等資源蛙粘; 動(dòng)態(tài)資源即指在服務(wù)器端真實(shí)存在但是要想獲取需要經(jīng)過(guò)一定的業(yè)務(wù)邏輯處理垫卤,根據(jù)不同的條件展示在頁(yè)面不同這 一部分內(nèi)容,比如說(shuō)報(bào)表數(shù)據(jù)展示出牧、根據(jù)當(dāng)前登錄用戶展示相關(guān)具體數(shù)據(jù)等資源穴肘;

Nginx處理靜態(tài)資源的內(nèi)容,我們需要考慮下面這幾個(gè)問(wèn)題:

(1)靜態(tài)資源的配置指令
(2)靜態(tài)資源的配置優(yōu)化
(3)靜態(tài)資源的壓縮配置指令
(4)靜態(tài)資源的緩存處理
(5)靜態(tài)資源的訪問(wèn)控制舔痕,包括跨域問(wèn)題和防盜鏈問(wèn)題

2梢褐、Nginx靜態(tài)資源的配置指令

1、listen指令

(1)listen:用來(lái)配置監(jiān)聽(tīng)端口赵讯。

語(yǔ)法 listen address[:port] [default_server]...;
listen port [default_server]...;
默認(rèn)值 listen *:80 | *:8000
位置 server

(2)listen的設(shè)置比較靈活,我們通過(guò)幾個(gè)例子來(lái)把常用的設(shè)置方式熟悉下:

listen 127.0.0.1:8000; // listen localhost:8000 監(jiān)聽(tīng)指 定的IP和端口 
listen 127.0.0.1; 監(jiān)聽(tīng)指定IP的所有端口 
listen 8000; 監(jiān)聽(tīng)指定端口上的連接 
listen *:8000; 監(jiān)聽(tīng)指定端口上的連接

(3)default_server屬性是標(biāo)識(shí)符耿眉,用來(lái)將此虛擬主機(jī)設(shè)置成默認(rèn)主機(jī)边翼。所謂的默認(rèn)主機(jī)指的是如果
沒(méi)有匹配到對(duì)應(yīng)的address:port,則會(huì)默認(rèn)執(zhí)行的鸣剪。如果不指定默認(rèn)使用的是第一個(gè)server组底。

server{ 
    listen 8080; 
    server_name 127.0.0.1; 
    location /{ 
        root html; 
        index index.html; 
    } 
}

server{ 
    listen 8080
    default_server; 
    server_name localhost; 
    default_type text/plain; 
    return 444 'This is a error request';
}
2、server_name指令

(1)server_name:用來(lái)設(shè)置虛擬主機(jī)服務(wù)名稱筐骇。
eg:127.0.0.1 债鸡、 localhost 、域名[www.baidu.com | www.jd.com]

語(yǔ)法 server_name name ...;
name 可以提供多個(gè)中間用空格分隔
默認(rèn)值 server_name "";
位置 server

(2)server_name的配置方式有三種
① 配置方式一:精確配置

server { 
    listen 80; 
    server_name www.xinlang.cn  www.baidu.cn; 
    ... 
}

補(bǔ)充小知識(shí)點(diǎn):

hosts是一個(gè)沒(méi)有擴(kuò)展名的系統(tǒng)文件铛纬,可以用記事本等工具打開(kāi)厌均,其作用 就是將一些常用的網(wǎng)址域名與其對(duì)應(yīng)的IP地址建立一個(gè)關(guān)聯(lián)“數(shù)據(jù)庫(kù)”,當(dāng) 用戶在瀏覽器中輸入一個(gè)需要登錄的網(wǎng)址時(shí)告唆,系統(tǒng)會(huì)首先自動(dòng)從hosts文 件中尋找對(duì)應(yīng)的IP地址,一旦找到擒悬,系統(tǒng)會(huì)立即打開(kāi)對(duì)應(yīng)網(wǎng)頁(yè),如果沒(méi)有 找到,則系統(tǒng)會(huì)再將網(wǎng)址提交DNS域名解析服務(wù)器進(jìn)行IP地址的解析畜侦。
windows:C:\Windows\System32\drivers\etc
centos:/etc/hosts

vim /etc/hosts 

127.0.0.1 www.xinlang.cn 
127.0.0.1 www.baidu.cn

② 配置方式二:通配符配置

server_name中支持通配符"*",但需要注意的是通配符不能出現(xiàn)在域名的中間元扔,只能出現(xiàn)在首段或尾段,如:

server { 
    listen 80; 
    server_name *.itcast.cn www.itheima.*; 
    # www.xinlang.cn  abc.xinlang.cn  www.baidu.cn  www.baidu.com 
    ... 
}

下面的配置就會(huì)報(bào)錯(cuò)

server { 
    listen 80; 
    server_name www.*.cn  www.baidu.c* 
    ... 
}

③ 配置方式二:正則表達(dá)式配置
server_name中可以使用正則表達(dá)式夏伊,并且使用~作為正則表達(dá)式字符串的開(kāi)始標(biāo)記摇展。

代碼 說(shuō)明
^ 匹配搜索字符串開(kāi)始位置
$ 匹配搜索字符串結(jié)束位置
. 匹配除換行符\n之外的任何單個(gè)字符
\ 轉(zhuǎn)義字符,將下一個(gè)字符標(biāo)記為特殊字符
[xyz] 字符集溺忧,與任意一個(gè)指定字符匹配
[a-z] 字符范圍咏连,匹配指定范圍內(nèi)的任何字符
\w 與以下任意字符匹配 A-Z a-z 0-9 和下劃線,等效于[A-Za-z0-9_]
\d 數(shù)字字符匹配,等效于[0-9]
{n} 正好匹配n次
{n,} 至少匹配n次
{n,m} 匹配至少n次至多m次 * 零次或多次鲁森,等效于{0,}
+ 一次或多次祟滴,等效于{1,}
? 零次或一次,等效于{0,1}

配置如下:

server{ 
    listen 80; 
    server_name ~^www\.(\w+)\.com$; 
    default_type text/plain; 
    return 200 $1 $2 ..; 
}
注意 ~后面不能加空格歌溉,括號(hào)可以取值

匹配執(zhí)行順序:由于server_name指令支持通配符和正則表達(dá)式垄懂,因此在包含多個(gè)虛擬主機(jī)的配置文件中,可能會(huì)出現(xiàn)一個(gè)名稱被多個(gè)虛擬主機(jī)的server_name匹配成功痛垛,當(dāng)遇到這種情況草慧,當(dāng)前的請(qǐng)求交給誰(shuí)來(lái)處理呢?

server{ 
    listen 80; 
    server_name www.baidu.com; 
    default_type text/plain; 
    return 200 'exact_success'; 
}

server{ 
    listen 80; 
    server_name ~^www\.\w+\.com$; 
    default_type text/plain; 
    return 200 'regex_success'; 
}

server{ 
    listen 80; 
    server_name *.baidu.com;
    default_type text/plain; 
    return 200 'wildcard_before_success'; 
}

server{ 
    listen 80; 
    server_name www.baidu.*; 
    default_type text/plain; 
    return 200 'wildcard_after_success'; 
}

server{ 
    listen 80 
    default_server; 
    server_name _; 
    default_type text/plain; 
    return 444 'default_server not found server'; 
}

輸出結(jié)論:

No1:準(zhǔn)確匹配server_name --------------輸出:exact_success
No2:通配符在開(kāi)始時(shí)匹配server_name成功 --------------輸出:regex_success
No3:通配符在結(jié)束時(shí)匹配server_name成功 --------------輸出: wildcard_before_success
No4:正則表達(dá)式匹配server_name成功 ----------------- 輸出:wildcard_after_success
No5:被默認(rèn)的default_server處理匙头,如果沒(méi)有指定默認(rèn)找第一個(gè) server ----------輸出:default_server not found server

3漫谷、location指令
server{ 
    listen 80; 
    server_name localhost; 
    location / { 

    }
    location /abc{ 
        
    }
    ... 
}

location:用來(lái)設(shè)置請(qǐng)求的URI

語(yǔ)法 location [ = | ~ | ~* | ^~ |@ ] uri{...}
默認(rèn)值
位置 server,location

uri變量是待匹配的請(qǐng)求字符串,可以不包含正則表達(dá)式蹂析,也可以包含正則表達(dá)式舔示,那么nginx服務(wù)器在搜索匹配location
的時(shí)候,是先使用不包含正則表達(dá)式進(jìn)行匹配电抚,找到一個(gè)匹配度最高的一個(gè)惕稻,然后在通過(guò)包含正則表達(dá)式的進(jìn)行匹配,
如果能匹配到直接訪問(wèn)蝙叛,匹配不到俺祠,就使用剛才匹配度最高的那個(gè)location來(lái)處理請(qǐng)求。

(1)不帶符號(hào)借帘,要求必須以指定模式開(kāi)始

server { 
    listen 80; 
    server_name 127.0.0.1; 
    location /abc{ 
        default_type text/plain; 
        return 200 "access success"; 
    } 
}
#以下訪問(wèn)都是正確的 (四個(gè))
http://192.168.200.133/abc          http://192.168.200.133/abc?p1=TOM 
http://192.168.200.133/abc/                  http://192.168.200.133/abcdef

(2)=號(hào) : 用于不包含正則表達(dá)式的uri前锻煌,必須與指定的模式精確匹配

server { 
    listen 80; 
    server_name 127.0.0.1; 
    location =/abc{ 
        default_type text/plain; 
        return 200 "access success";
    }
}
#可以匹配到 
http://192.168.200.133/abc   
http://192.168.200.133/abc?p1=TOM 
#匹配不到 
http://192.168.200.133/abc/ 
http://192.168.200.133/abcdef

(3)~號(hào) : 用于表示當(dāng)前uri中包含了正則表達(dá)式,并且區(qū)分大小寫(xiě)
~*號(hào): 用于表示當(dāng)前uri中包含了正則表達(dá)式姻蚓,并且不區(qū)分大小寫(xiě)宋梧。
換句話說(shuō),如果uri包含了正則表達(dá)式狰挡,需要用上述兩個(gè)符號(hào)來(lái)標(biāo)識(shí)


server { 
    listen 80; 
    server_name 127.0.0.1; 
    location ~^/abc\w${ 
        default_type text/plain; 
        return 200 "access success"; 
    } 
}

server { 
    listen 80; 
    server_name 127.0.0.1; 
    location ~*^/abc\w${ 
        default_type text/plain; 
        return 200 "access success"; 
    } 
}

(4)^~: 用于不包含正則表達(dá)式的uri前捂龄,功能和不加符號(hào)的一致释涛,唯一不同的是,如果模式匹配倦沧,
那么就停止搜索其他模式了唇撬。

server { 
    listen 80; 
    server_name 127.0.0.1; 
    location ^~/abc{ 
        default_type text/plain; 
        return 200 "access success"; 
    } 
}
4、設(shè)置請(qǐng)求資源的目錄root / alias

(1)root:設(shè)置請(qǐng)求的根目錄

語(yǔ)法 root path;
默認(rèn)值 root html;
位置 http展融、server窖认、location

path為Nginx服務(wù)器接收到請(qǐng)求以后查找資源的根目錄路徑氢妈。

(2)alias:用來(lái)更改location的URI

語(yǔ)法 alias path;
默認(rèn)值
位置 location

path為修改后的根路徑握爷。

以上兩個(gè)指令都可以來(lái)指定訪問(wèn)資源的路徑,那么這兩者之間的區(qū)別是什么?
舉例說(shuō)明:
① 在/usr/local/nginx/html目錄下創(chuàng)建一個(gè) images目錄,并在目錄下放入一張圖片mv.png圖片

location /images { 
    root /usr/local/nginx/html; 
}

訪問(wèn)圖片的路徑為:http://192.168.200.133/images/mv.png

② 如果把root改為alias

location /images { 
    alias /usr/local/nginx/html; 
}

再次訪問(wèn)上述地址梁丘,頁(yè)面會(huì)出現(xiàn)404的錯(cuò)誤燕偶,查看錯(cuò)誤日志會(huì)發(fā)現(xiàn)是因?yàn)榈刂凡粚?duì)喝噪,所以驗(yàn)證了:

root的處理結(jié)果是: root路徑+location路徑
/usr/local/nginx/html/images/mv.png 

alias的處理結(jié)果是:使用alias路徑替換location路徑 
/usr/local/nginx/html/images

需要在alias后面路徑改為:

location /images { 
    alias /usr/local/nginx/html/images; 
}

③ 如果location路徑是以/結(jié)尾,則alias也必須是以/結(jié)尾,root沒(méi)有要求:
將上述配置修改為:

location /images/ { 
    alias /usr/local/nginx/html/images; 
}

訪問(wèn)就會(huì)出問(wèn)題指么,查看錯(cuò)誤日志還是路徑不對(duì)酝惧,所以需要把a(bǔ)lias后面加上 /

小結(jié):

root的處理結(jié)果是: root路徑+location路徑 

alias的處理結(jié)果是:使用alias路徑替換location路徑 
alias是一個(gè)目錄別名的定義,root則是最上層目錄的含義伯诬。 
如果location路徑是以/結(jié)尾,則alias也必須是以/結(jié)尾晚唇,root沒(méi)有要 求
5、index指令

index:設(shè)置網(wǎng)站的默認(rèn)首頁(yè)

語(yǔ)法 index file ...;
默認(rèn)值 index index.html;
位置 http盗似、server缺亮、location

index后面可以跟多個(gè)設(shè)置,如果訪問(wèn)的時(shí)候沒(méi)有指定具體訪問(wèn)的資源桥言,則會(huì)依次進(jìn)行查找,找到第一個(gè)為止葵礼。

舉例說(shuō)明:

location / { 
    root /usr/local/nginx/html; 
    index index.html index.htm; 
}

訪問(wèn)該location的時(shí)候号阿,可以通過(guò) http://ip:port/,地址后面如果 不添加任何內(nèi)容鸳粉,則默認(rèn)依次訪問(wèn)index.html和index.htm扔涧,找到第一 個(gè)來(lái)進(jìn)行返回

6、error_page指令

error_page:設(shè)置網(wǎng)站的錯(cuò)誤頁(yè)面

語(yǔ)法 error_page code ... [=[response]] uri;
默認(rèn)值
位置 http届谈、server枯夜、location......

當(dāng)出現(xiàn)對(duì)應(yīng)的響應(yīng)code后,如何來(lái)處理艰山。
舉例說(shuō)明:
(1)可以指定具體跳轉(zhuǎn)的地址

server { 
    error_page 404 http://www.baidu.cn; 
}

(2)可以指定重定向地址

server{ 
    error_page 404 /50x.html; 
    error_page 500 502 503 504 /50x.html; 
    location =/50x.html{ 
        root html; 
    } 
}

(3)使用location的@符合完成錯(cuò)誤信息展示

server{ 
    error_page 404 @jump_to_error; 
    location @jump_to_error { 
        default_type text/plain; 
        return 404 'Not Found Page...'; 
    } 
}

可選項(xiàng)=[response]的作用是用來(lái)將相應(yīng)代碼更改為另外一個(gè)

server{ 
    error_page 404 =200 /50x.html; 
    location =/50x.html{ 
        root html; 
    } 
}

這樣的話湖雹,當(dāng)返回404找不到對(duì)應(yīng)的資源的時(shí)候,在瀏覽器上可以看到曙搬, 最終返回的狀態(tài)碼是200摔吏,這塊需要注意下鸽嫂,
編寫(xiě)error_page后面的內(nèi) 容,404后面需要加空格征讲,200前面不能加空格

3据某、靜態(tài)資源優(yōu)化配置語(yǔ)法

Nginx對(duì)靜態(tài)資源如何進(jìn)行優(yōu)化配置。這里從三個(gè)屬性配置進(jìn)行優(yōu)化:

sendfile on;
tcp_nopush on;
tcp_nodeplay on;

(1)sendfile诗箍,用來(lái)開(kāi)啟高效的文件傳輸模式

語(yǔ)法 sendfile on |off;
默認(rèn)值 sendfile off;
位置 http癣籽、server、location...

請(qǐng)求靜態(tài)資源的過(guò)程:客戶端通過(guò)網(wǎng)絡(luò)接口向服務(wù)端發(fā)送請(qǐng)求滤祖,操作系統(tǒng)將這些客戶端的請(qǐng)求傳遞給服務(wù)器端應(yīng)用程序筷狼,服務(wù)器端應(yīng)用程序會(huì)處理這些請(qǐng)求,請(qǐng)求處理完成以后氨距,操作系統(tǒng)還需要將處理得到的結(jié)果通過(guò)網(wǎng)絡(luò)適配器傳遞回去桑逝。

如:

server { 
    listen 80; 
    server_name localhost; 
    location / { 
        root html; 
        index index.html; 
    } 
}
在html目錄下有一個(gè)welcome.html頁(yè)面俏让,
訪問(wèn)地址:http://192.168.200.133/welcome.html

圖解:


image.png
image.png

(2)tcp_nopush:該指令必須在sendfile打開(kāi)的狀態(tài)下才會(huì)生效楞遏,主要是用來(lái)提升網(wǎng)絡(luò)包的傳輸'效率'

語(yǔ)法 tcp_nopush on|off;
默認(rèn)值 tcp_nopush off;
位置 http、server首昔、location

(3)tcp_nodelay:該指令必須在keep-alive連接開(kāi)啟的情況下才生效寡喝,來(lái)提高網(wǎng)絡(luò)包傳輸?shù)?實(shí)時(shí)性'

語(yǔ)法 tcp_nodelay on|off;
默認(rèn)值 tcp_nodelay on;
位置 http、server勒奇、location
image.png

(4)小結(jié):
經(jīng)過(guò)剛才的分析预鬓,"tcp_nopush"和”tcp_nodelay“看起來(lái)是"互斥的",那么為什么要將這兩個(gè)值都打開(kāi)赊颠,這個(gè)大家需要知道的是在linux2.5.9以后的版本中兩者是可以兼容的格二,三個(gè)指令都開(kāi)啟的好處是,sendfile可以開(kāi)啟高效的文件傳輸模式竣蹦,tcp_nopush開(kāi)啟可以確保在發(fā)送到客戶端之前數(shù)據(jù)包已經(jīng)充分“填滿”顶猜, 這大大減少了網(wǎng)絡(luò)開(kāi)銷(xiāo),并加快了文件發(fā)送的速度痘括。 然后长窄,當(dāng)它到達(dá)最后一個(gè)可能因?yàn)闆](méi)有“填滿”而暫停的數(shù)據(jù)包時(shí),Nginx會(huì)忽略tcp_nopush參數(shù)纲菌, 然后挠日,tcp_nodelay強(qiáng)制套接字發(fā)送數(shù)據(jù)。由此可知翰舌,TCP_NOPUSH可以與TCP_NODELAY一起設(shè)置嚣潜,它比單獨(dú)配置TCP_NODELAY具有更強(qiáng)的性能。所以我們可以使用如下配置來(lái)優(yōu)化Nginx靜態(tài)資源的處理

sendfile on;
tcp_nopush on;
tcp_nodelay on;

4椅贱、Nginx靜態(tài)資源壓縮實(shí)戰(zhàn)

經(jīng)過(guò)上述內(nèi)容的優(yōu)化郑原,我們?cè)俅嗡伎家粋€(gè)問(wèn)題唉韭,假如在滿足上述優(yōu)化的前提下,我們傳送一個(gè)1M的數(shù)據(jù)和一個(gè)10M的數(shù)據(jù)那個(gè)效率高?犯犁,答案顯而易見(jiàn)属愤,傳輸內(nèi)容小,速度就會(huì)快酸役。那么問(wèn)題又來(lái)了住诸,同樣的內(nèi)容,如果把大小降下來(lái)涣澡,我們腦袋里面要蹦出一個(gè)詞就是"壓縮"贱呐,接下來(lái),我們來(lái)學(xué)習(xí)Nginx的靜態(tài)資源壓縮模塊入桂。

在Nginx的配置文件中可以通過(guò)配置gzip來(lái)對(duì)靜態(tài)資源進(jìn)行壓縮奄薇,相關(guān)的指令可以配置在http塊、
server塊和location塊中抗愁,Nginx可以通過(guò)

ngx_http_gzip_module模塊
ngx_http_gzip_static_module模塊
ngx_http_gunzip_module模塊

1馁蒂、Gzip模塊配置指令

下面的壓縮指令都來(lái)自ngx_http_gzip_module模塊,該模塊會(huì)在nginx安裝的時(shí)候內(nèi)置到nginx的安裝環(huán)境中蜘腌,
也就是說(shuō)我們可以直接使用這些指令沫屡。

(1) gzip指令:該指令用于開(kāi)啟或者關(guān)閉gzip功能

語(yǔ)法 gzip on|off;
默認(rèn)值 gzip off;
位置 http、server沮脖、location...

注意只有該指令為打開(kāi)狀態(tài),下面的指令才有效果

http{
    gzip on; 
}

(2)gzip_types指令:該指令可以根據(jù)響應(yīng)頁(yè)的MIME類型選擇性地開(kāi)啟 Gzip壓縮功能

語(yǔ)法 gzip_types mime-type ...;
默認(rèn)值 gzip_types text/html;
位置 http芯急、server勺届、location

所選擇的值可以從mime.types文件中進(jìn)行查找,也可以使用"*"代表所有娶耍。

http{
    gzip_types application/javascript;
}

(3)gzip_comp_level指令:該指令用于設(shè)置Gzip壓縮程度免姿,級(jí)別從1-9, 1表示要是程度最低,要是效率最高伺绽,9剛好相反,壓縮程度最高嗜湃,但是效率最低最費(fèi)時(shí)間奈应。

語(yǔ)法 gzip_comp_level level;
默認(rèn)值 gzip_comp_level 1;
位置 http、server购披、location
http{
    gzip_comp_level 6; 
}

(4)gzip_vary指令:該指令用于設(shè)置使用Gzip進(jìn)行壓縮發(fā)送是否攜帶“Vary:Accept-Encoding”頭域的響應(yīng)頭部杖挣。主要是告訴接收方,所發(fā)送的數(shù)據(jù)經(jīng)過(guò)了Gzip壓縮處理

語(yǔ)法 gzip_vary on|off;
默認(rèn)值 gzip_vary off;
位置 http刚陡、server惩妇、location
image.png

(5)gzip_buffers指令:該指令用于處理請(qǐng)求壓縮的緩沖區(qū)數(shù)量和大小

語(yǔ)法 gzip_buffers number size;
默認(rèn)值 gzip_buffers 32 4k|16 8k;
位置 http株汉、server、location

其中numbe:指定Nginx服務(wù)器向系統(tǒng)申請(qǐng)緩存空間個(gè)數(shù)歌殃,size指的是每個(gè)緩存空間的大小乔妈。主要實(shí)現(xiàn)的是申請(qǐng)
number個(gè)每個(gè)大小為size的內(nèi)存空間。這個(gè)值的設(shè)定一般會(huì)和服務(wù)器的操作系統(tǒng)有關(guān)氓皱,所以建議此項(xiàng)不設(shè)置路召,
使用默認(rèn)值即可

gzip_buffers 4 16K; #緩存空間大小

(6)gzip_disable指令:針對(duì)不同種類客戶端發(fā)起的請(qǐng)求,可以選擇性地開(kāi)啟和關(guān)閉Gzip功能波材。

語(yǔ)法 gzip_disable regex ...;
默認(rèn)值
位置 http股淡、server、location

regex:根據(jù)客戶端的瀏覽器標(biāo)志(user-agent)來(lái)設(shè)置廷区,支持使用正則表達(dá)式唯灵。指定的瀏覽器標(biāo)志不使用Gzip.
該指令一般是用來(lái)排除一些明顯不支持Gzip的瀏覽器。

gzip_disable "MSIE [1-6]\.";

(7)gzip_http_version指令:針對(duì)不同的HTTP協(xié)議版本隙轻,可以選擇性地開(kāi)啟和關(guān)閉Gzip功能

語(yǔ)法 gzip_http_version 1.0|1.1;
默認(rèn)值 gzip_http_version 1.1;
位置 http埠帕、server、location

該指令是指定使用Gzip的HTTP最低版本大脉,該指令一般采用默認(rèn)值即可

(8)gzip_min_length指令:該指令針對(duì)傳輸數(shù)據(jù)的大小搞监,可以選擇性地開(kāi)啟和關(guān)閉Gzip功能

語(yǔ)法 gzip_min_length length;
默認(rèn)值 gzip_min_length 20;
位置 http、server镰矿、location
nignx計(jì)量大小的單位:bytes[字節(jié)] / kb[千字節(jié)] / M[兆] 例如: 1024 / 10k|K / 10m|M

Gzip壓縮功能對(duì)大數(shù)據(jù)的壓縮效果明顯琐驴,但是如果要壓縮的數(shù)據(jù)比較小的化,可能出現(xiàn)越壓縮數(shù)據(jù)量越大的情況秤标,
因此我們需要根據(jù)響應(yīng)內(nèi)容的大小來(lái)決定是否使用Gzip功能绝淡,響應(yīng)頁(yè)面的大小可以通過(guò)頭信息中的
Content-Length來(lái)獲取。但是如何使用了Chunk編碼動(dòng)態(tài)壓縮苍姜,該指令將被忽略牢酵。建議設(shè)置為1K或以上。

(9)gzip_proxied指令:該指令設(shè)置是否對(duì)服務(wù)端返回的結(jié)果進(jìn)行Gzip壓縮

語(yǔ)法 gzip_proxied off|expired|no-cache| no-store|private|no_last_modified|no_etag|auth|any;
默認(rèn)值 gzip_proxied off;
位置 http衙猪、server馍乙、location

off - 關(guān)閉Nginx服務(wù)器對(duì)后臺(tái)服務(wù)器返回結(jié)果的Gzip壓縮 expired - 啟用壓縮,如果header頭中包含 "Expires" 頭信息
no-cache - 啟用壓縮垫释,如果header頭中包含 "Cache-Control:no-cache" 頭信息 no-store - 啟用壓縮丝格,如果header頭中
包含 "Cache-Control:no-store" 頭信息 private -啟用壓縮,如果header頭中包含 "Cache-Control:private" 頭信息
no_last_modified - 啟用壓縮,如果header頭中不包含 "Last-Modified"頭信息 no_etag - 啟用壓縮 ,如果header頭中不包
含 "ETag" 頭信息 auth - 啟用壓縮 , 如果header頭中包含 "Authorization" 頭信息 any - 無(wú)條件啟用壓縮

2棵譬、案例:Gzip壓縮功能的配置
gzip on; #開(kāi)啟gzip功能 
gzip_types *; #壓縮源文件類型,根據(jù)具體的訪問(wèn)資源類型設(shè)定
gzip_comp_level 6; #gzip壓縮級(jí)別 
gzip_min_length 1024; #進(jìn)行壓縮響應(yīng)頁(yè)面的最小長(zhǎng)度,
content- length gzip_buffers 4 16K; #緩存空間大小 
gzip_http_version 1.1; #指定壓縮響應(yīng)所需要的最低HTTP請(qǐng)求版本
gzip_vary on; #往頭信息中添加壓縮標(biāo)識(shí) 
gzip_disable "MSIE [1-6]\."; #對(duì)IE6以下的版本都不進(jìn)行壓縮 
gzip_proxied off显蝌; #nginx作為反向代理壓縮服務(wù)端返回?cái)?shù)據(jù)的條件

這些配置在很多地方可能都會(huì)用到,所以我們可以將這些內(nèi)容抽取到一個(gè)配置文件中订咸,然后通過(guò)include指令把
配置文件再次加載到nginx.conf 配置文件中曼尊,方法使用酬诀。
① 待引入文件:nginx_gzip.conf:

gzip on; gzip_types *; 
gzip_comp_level 6; 
gzip_min_length 1024; 
gzip_buffers 4 16K; 
gzip_http_version 1.1; 
gzip_vary on; 
gzip_disable "MSIE [1-6]\."; 
gzip_proxied off;

② nginx.conf:

include nginx_gzip.conf
3、Gzip和sendfile的共存問(wèn)題

前面在講解sendfile的時(shí)候骆撇,提到過(guò)瞒御,開(kāi)啟sendfile以后,在讀取磁盤(pán)上的靜態(tài)資源文件的時(shí)候艾船,可以減少拷貝的次數(shù)葵腹,
可以不經(jīng)過(guò)用戶進(jìn)程將靜態(tài)文件通過(guò)網(wǎng)絡(luò)設(shè)備發(fā)送出去,但是Gzip要想對(duì)資源壓縮屿岂,是需要經(jīng)過(guò)用戶進(jìn)程進(jìn)行操作的践宴。所以如何解決兩個(gè)設(shè)置的共存問(wèn)題。
可以使用 ngx_http_gzip_static_module模塊的gzip_static指令來(lái)解決爷怀。

gzip_static指令
gzip_static: 檢查與訪問(wèn)資源同名的.gz文件時(shí)阻肩,response中以gzip相關(guān)的header返回.gz文件的內(nèi)容

語(yǔ)法 gzip_static on | off | always;
默認(rèn)值 gzip_static off;
位置 http、server运授、location

添加上述命令后烤惊,會(huì)報(bào)一個(gè)錯(cuò)誤,unknown directive吁朦,"gzip_static"主要的原因是Nginx默認(rèn)是沒(méi)有添加
ngx_http_gzip_static_module模塊柒室。

★:具體實(shí)現(xiàn)步驟

步驟一:查詢當(dāng)前Nginx的配置參數(shù),nginx -V
步驟二:將nginx安裝目錄下sbin目錄中的nginx二進(jìn)制文件進(jìn)行更名

cd /usr/local/nginx/sbin 
mv nginx nginxold

步驟三:進(jìn)入Nginx的安裝目錄逗宜,cd /root/nginx/core/nginx-1.16.1
步驟四:執(zhí)行make clean清空之前編譯的內(nèi)容雄右,make clean
步驟五:使用configure來(lái)配置參數(shù),./configure --with-http_gzip_static_module
步驟六:使用make命令進(jìn)行編譯纺讲,make
步驟七:將objs目錄下的nginx二進(jìn)制執(zhí)行文件移動(dòng)到nginx安裝目錄下的sbin目錄中
mv objs/nginx /usr/local/nginx/sbin
步驟八:執(zhí)行更新命令擂仍,make upgrade

5、靜態(tài)資源的緩存處理

1熬甚、什么是緩存

緩存(cache),原始意義是指訪問(wèn)速度比一般隨機(jī)存取存儲(chǔ)器(RAM) 快的一種高速存儲(chǔ)器乡括,通常它不像系統(tǒng)主存那樣使用DRAM技術(shù)肃廓,而使用昂 貴但較快速的SRAM技術(shù)。緩存的設(shè)置是所有現(xiàn)代計(jì)算機(jī)系統(tǒng)發(fā)揮高性能的 重要因素之一诲泌。

2盲赊、什么是web緩存

Web緩存是指一個(gè)Web資源(如html頁(yè)面,圖片档礁,js角钩,數(shù)據(jù)等)存在于 Web服務(wù)器和客戶端(瀏覽器)之間的副本吝沫。緩存會(huì)根據(jù)進(jìn)來(lái)的請(qǐng)求保存 輸出內(nèi)容的副本呻澜;當(dāng)下一個(gè)請(qǐng)求來(lái)到的時(shí)候递礼,如果是相同的URL,緩存會(huì) 根據(jù)緩存機(jī)制決定是直接使用副本響應(yīng)訪問(wèn)請(qǐng)求羹幸,還是向源服務(wù)器再次發(fā) 送請(qǐng)求脊髓。比較常見(jiàn)的就是瀏覽器會(huì)緩存訪問(wèn)過(guò)網(wǎng)站的網(wǎng)頁(yè),當(dāng)再次訪問(wèn)這 個(gè)URL地址的時(shí)候栅受,如果網(wǎng)頁(yè)沒(méi)有更新将硝,就不會(huì)再次下載網(wǎng)頁(yè),而是直接 使用本地緩存的網(wǎng)頁(yè)屏镊。只有當(dāng)網(wǎng)站明確標(biāo)識(shí)資源已經(jīng)更新依疼,瀏覽器才會(huì)再 次下載網(wǎng)頁(yè)

3、web緩存的種類

客戶端緩存
?????瀏覽器緩存
服務(wù)端緩存
?????Nginx / Redis / Memcached等

4而芥、瀏覽器緩存

為了節(jié)約網(wǎng)絡(luò)的資源加速瀏覽律罢,瀏覽器在用戶磁盤(pán)上對(duì)最近請(qǐng)求過(guò)的文 檔進(jìn)行存儲(chǔ),當(dāng)訪問(wèn)者再次請(qǐng)求這個(gè)頁(yè)面時(shí)棍丐,瀏覽器就可以從本地磁盤(pán)顯 示文檔误辑,這樣就可以加速頁(yè)面的閱覽.

5、為什么要用瀏覽器緩存

成本最低的一種緩存實(shí)現(xiàn)
減少網(wǎng)絡(luò)帶寬消耗
降低服務(wù)器壓力
減少網(wǎng)絡(luò)延遲歌逢,加快頁(yè)面打開(kāi)速度

6巾钉、瀏覽器緩存的執(zhí)行流程

HTTP協(xié)議中和頁(yè)面緩存相關(guān)的字段,我們先來(lái)認(rèn)識(shí)下:

header 說(shuō)明
Expires 緩存過(guò)期的日期和時(shí)間
Cache-Control 設(shè)置和緩存相關(guān)的配置信息
Last-Modified 請(qǐng)求資源最后修改時(shí)間
ETag 請(qǐng)求變量的實(shí)體標(biāo)簽的當(dāng)前值秘案,比如文件的MD5值
image.png

(1)用戶首次通過(guò)瀏覽器發(fā)送請(qǐng)求到服務(wù)端獲取數(shù)據(jù)砰苍,客戶端是沒(méi)有對(duì)應(yīng)的緩存,所以需要發(fā)送request請(qǐng)求來(lái)獲取數(shù)據(jù)踏烙;
(2)服務(wù)端接收到請(qǐng)求后师骗,獲取服務(wù)端的數(shù)據(jù)及服務(wù)端緩存的允許后,返回200的成功狀態(tài)碼并且在響應(yīng)頭上附上對(duì)
應(yīng)資源以及緩存信息讨惩;
(3)當(dāng)用戶再次訪問(wèn)相同資源的時(shí)候辟癌,客戶端會(huì)在瀏覽器的緩存目錄中查找是否存在響應(yīng)的緩存文件
(4)如果沒(méi)有找到對(duì)應(yīng)的緩存文件,則走(2)步
(5)如果有緩存文件荐捻,接下來(lái)對(duì)緩存文件是否過(guò)期進(jìn)行判斷黍少,過(guò)期的判斷標(biāo)準(zhǔn)是(Expires)
(6)如果沒(méi)有過(guò)期,則直接從本地緩存中返回?cái)?shù)據(jù)進(jìn)行展示
(7)如果Expires過(guò)期处面,接下來(lái)需要判斷緩存文件是否發(fā)生過(guò)變化
(8)判斷的標(biāo)準(zhǔn)有兩個(gè)厂置,一個(gè)是ETag(Entity Tag),一個(gè)是Last-Modified
(9)判斷結(jié)果是未發(fā)生變化,則服務(wù)端返回304魂角,直接從緩存文件中獲取數(shù)據(jù)
(10)如果判斷是發(fā)生了變化昵济,重新從服務(wù)端獲取數(shù)據(jù),并根據(jù)緩存協(xié)商(服務(wù)端所設(shè)置的是否需要進(jìn)行緩
存數(shù)據(jù)的設(shè)置)來(lái)進(jìn)行數(shù)據(jù)緩存。

7访忿、瀏覽器緩存相關(guān)指令

1瞧栗、expires指令
expires:該指令用來(lái)控制頁(yè)面緩存的作用『C可以通過(guò)該指令控制HTTP應(yīng)答中的“Expires"和”Cache-Control"


image.png

time:可以整數(shù)也可以是負(fù)數(shù)迹恐,指定過(guò)期時(shí)間,如果是負(fù)數(shù)卧斟,Cache?Control則為no-cache,如果為整數(shù)或0殴边,則Cache-Control的值為max?age=time;
epoch: 指定Expires的值為'1 January,1970,00:00:01 GMT'(1970-01-0100:00:00),Cache-Control的值no-cache
max:指定Expires的值為'31 December2037 23:59:59GMT' (2037-12-31 23:59:59) 珍语,Cache-Control的值為10年

off:默認(rèn)不緩存

2锤岸、add_header指令
add_header指令是用來(lái)添加指定的響應(yīng)頭和響應(yīng)值。


image.png

Cache-Control作為響應(yīng)頭信息板乙,可以設(shè)置如下值:


image.png

緩存響應(yīng)指令:


image.png

6能耻、Nginx的跨域問(wèn)題解決

1、同源策略
瀏覽器的同源策略:是一種約定亡驰,是瀏覽器最核心也是最基本的安全功能晓猛,如果瀏覽器少了同源策略,則瀏覽器的
正常功能可能都會(huì)受到影響凡辱。
同源: 協(xié)議戒职、域名(IP)、端口相同即為同源


http://192.168.200.131/user/1 
https://192.168.200.131/user/1 

http://192.168.200.131/user/1 
http://192.168.200.132/user/1 

http://192.168.200.131/user/1 
http://192.168.200.131:8080/user/1 

http://www.nginx.com/user/1 
http://www.nginx.org/user/1 

http://192.168.200.131/user/1 
http://192.168.200.131:8080/user/1

// 以上幾組都不滿足透乾,以下一組滿足

http://www.nginx.org:80/user/1 
http://www.nginx.org/user/1

2洪燥、跨域問(wèn)題:
有兩臺(tái)服務(wù)器分別為A,B,如果從服務(wù)器A的頁(yè)面發(fā)送異步請(qǐng)求到服務(wù)器B獲 取數(shù)據(jù),如果服務(wù)器A和服務(wù)器B不滿足
同源策略乳乌,則就會(huì)出現(xiàn)跨域問(wèn)題捧韵。

3、解決方案:
使用add_header指令汉操,該指令可以用來(lái)添加一些頭信息


image.png

此處用來(lái)解決跨域問(wèn)題再来,需要添加兩個(gè)頭信息,一個(gè)是Access- Control-Allow-Origin , Access-Control-Allow-Methods

Access-Control-Allow-Origin: 直譯過(guò)來(lái)是允許跨域訪問(wèn)的源地址信息磷瘤,可以配置多個(gè)(多個(gè)用逗號(hào)分隔)芒篷,也可以
使用*代表所有源

Access-Control-Allow-Methods:直譯過(guò)來(lái)是允許跨域訪問(wèn)的請(qǐng)求方式,值可以為 GET POST PUT DELETE...,
可以全部設(shè)置采缚,也可以根據(jù)需要設(shè)置针炉,多個(gè)用逗號(hào)分隔

具體配置方式

location /getUser{ 
    add_header Access-Control-Allow-Origin *; 
    add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE; 
    default_type application/json; 
    return 200 '{"id":1,"name":"TOM","age":18}'; 
}

7、靜態(tài)資源防盜鏈

1扳抽、什么是資源盜鏈
資源盜鏈指的是此內(nèi)容不在自己服務(wù)器上篡帕,而是通過(guò)技術(shù)手段殖侵,繞過(guò)別人的限制將別人的內(nèi)容放到自己頁(yè)面上
最終展示給用戶。以此來(lái)盜取大網(wǎng)站的空間和流量镰烧。簡(jiǎn)而言之就是用別人的東西成就自己的網(wǎng)站愉耙。

比如準(zhǔn)備一個(gè)頁(yè)面引用京東和百度的圖片


image.png

從上面的效果,可以看出來(lái)拌滋,下面的圖片地址添加了防止盜鏈的功能急波,
京東這邊我們可以直接使用其圖片熊榛。

2黑界、Nginx防盜鏈的實(shí)現(xiàn)原理:
了解防盜鏈的原理之前讥此,我們得先學(xué)習(xí)一個(gè)HTTP的頭信息Referer,當(dāng)瀏覽器向web服務(wù)器發(fā)送請(qǐng)求的時(shí)候撼嗓,
一般都會(huì)帶上Referer,來(lái)告訴瀏覽器該網(wǎng)頁(yè)是從哪個(gè)頁(yè)面鏈接過(guò)來(lái)的所袁。


image.png

后臺(tái)服務(wù)器可以根據(jù)獲取到的這個(gè)Referer信息來(lái)判斷是否為自己信任的網(wǎng)站地址监婶,如果是則放行繼續(xù)訪問(wèn)屉佳,如果不是
則可以返回403(服務(wù)端拒絕訪問(wèn))的狀態(tài)信息览芳。

在本地模擬上述的服務(wù)器效果:


image.png

Nginx防盜鏈的具體實(shí)現(xiàn):
valid_referers:nginx會(huì)通就過(guò)查看referer自動(dòng)和valid_referers后面的內(nèi)容進(jìn)行匹配斜姥,如果匹配到了就將$invalid_referer
變量置0,如果沒(méi)有匹配到沧竟,則將$invalid_referer變量置為1铸敏,匹配的過(guò)程中不區(qū)分大小寫(xiě)。


image.png

none: 如果Header中的Referer為空悟泵,允許訪問(wèn)
blocked:在Header中的Referer不為空杈笔,但是該值被防火墻或代理進(jìn)行偽裝過(guò),如不帶"http://" 糕非、"https://"等協(xié)議頭的資源允許訪問(wèn)蒙具。
server_names:指定具體的域名或者IP
string: 可以支持正則表達(dá)式和*的字符串。如果是正則表達(dá)式朽肥,需要以~開(kāi)頭表示禁筏,例如

location ~*\.(png|jpg|gif){ 
    valid_referers none blocked www.baidu.com 
192.168.200.222 
*.example.com example.* 
www.example.org 
~\.google\.; 

    if ($invalid_referer){ 
    return 403; 
    }
    root /usr/local/nginx/html; 
}

針對(duì)目錄進(jìn)行防盜鏈:

location /images { 
    valid_referers none 
    blocked www.baidu.com 
        192.168.200.222 
        *.example.com example.* 
        www.example.org ~\.google\.; 
        if ($invalid_referer){ 
            return 403; 
        }root /usr/local/nginx/html; 
}

8、Rewrite 功能配置

Rewrite是Nginx服務(wù)器提供的一個(gè)重要基本功能衡招,是Web服務(wù)器產(chǎn)品中幾乎必備的功能篱昔。主要的作用是用來(lái)實(shí)現(xiàn)
URL的重寫(xiě)。注意:Nginx服務(wù)器的Rewrite功能的實(shí)現(xiàn)依賴于PCRE的支持始腾,因此在編譯安裝Nginx服務(wù)器之前旱爆,
需要安裝PCRE庫(kù)。Nginx使用的是 ngx_http_rewrite_module模塊來(lái)解析和處理Rewrite功能的相關(guān)配置窘茁。

"地址重寫(xiě)"與"地址轉(zhuǎn)發(fā)"區(qū)別

1怀伦、地址重寫(xiě)瀏覽器地址會(huì)發(fā)生變化而地址轉(zhuǎn)發(fā)則不變
2、一次地址重寫(xiě)會(huì)產(chǎn)生兩次請(qǐng)求而一次地址轉(zhuǎn)發(fā)只會(huì)產(chǎn)生一次請(qǐng)求
3山林、地址重寫(xiě)到的頁(yè)面必須是一個(gè)完整的路徑而地址轉(zhuǎn)發(fā)則不需要
4房待、地址重寫(xiě)因?yàn)槭莾纱握?qǐng)求所以request范圍內(nèi)屬性不能傳遞給新頁(yè)面而地址轉(zhuǎn)發(fā)因?yàn)槭且淮握?qǐng)求所以可以傳遞值
5邢羔、地址轉(zhuǎn)發(fā)速度快于地址重寫(xiě)

1、set指令

該指令用來(lái)設(shè)置一個(gè)新的變量桑孩。


image.png

variable:變量的名稱拜鹤,該變量名稱要用"$"作為變量的第一個(gè)字符,且不能與Nginx服務(wù)器預(yù)設(shè)的全局變量同名流椒。
value:變量的值敏簿,可以是字符串、其他變量或者變量的組合等宣虾。

2惯裕、Rewrite常用全局變量
image.png

image.png

image.png
3、if指令

該指令用來(lái)支持條件判斷绣硝,并根據(jù)條件判斷結(jié)果選擇不同的Nginx配置蜻势。


image.png

condition為判定條件,可以支持以下寫(xiě)法:

  1. 變量名鹉胖。如果變量名對(duì)應(yīng)的值為空或者是0握玛,if都判斷為false,其他條
    件為true。
if ($param){ 
}
  1. 使用"="和"!="比較變量和字符串是否相等甫菠,滿足條件為true挠铲,不滿 足為false
if ($request_method = POST){ 
        return 405; 
}

注意:此處和Java不太一樣的地方是字符串不需要添加引號(hào)。
windown dos命令 發(fā)送POS請(qǐng)求

curl -X POST http://192.168.200.122:8081/testif
  1. 使用正則表達(dá)式對(duì)變量進(jìn)行匹配寂诱,匹配成功返回true市殷,否則返回false。變量與正則表達(dá)式之間使用
"~","~*","!~","!~*"來(lái)連接刹衫。
"~"代表匹配正則表達(dá)式過(guò)程中區(qū)分大小寫(xiě)醋寝,
"~*"代表匹配正則表達(dá)式過(guò)程中不區(qū)分大小寫(xiě)
"!~"和"!~*"剛好和上面取相反值,如果匹配上返回false,匹配不上返回true
if ($http_user_agent ~ MSIE){ 
       #$http_user_agent的值中是否包含MSIE字符串带迟,如果包含返回 true 
}

注意:正則表達(dá)式字符串一般不需要加引號(hào)音羞,但是如果字符串中包含"}"或者是";"等字符時(shí),
就需要把引號(hào)加上仓犬。

  1. 判斷請(qǐng)求的文件是否存在使用"-f"和"!-f",
    當(dāng)使用"-f"時(shí)嗅绰,如果請(qǐng)求的文件存在返回true,不存在返回false搀继。當(dāng)使用"!f"時(shí)窘面,如果請(qǐng)求文件不存在,
    但該文件所在目錄存在返回 true,文件和目錄都不存在返回false,如果文件存在返回false
if (-f $request_filename){ 
    #判斷請(qǐng)求的文件是否存在 
}
if (!-f $request_filename){ 
    #判斷請(qǐng)求的文件是否不存在 
}
  1. 判斷請(qǐng)求的目錄是否存在使用"-d"和"!-d"
    當(dāng)使用"-d"時(shí)叽躯,如果請(qǐng)求的目錄存在财边,if返回true,如果目錄不存在則返回false
    當(dāng)使用"!-d"時(shí)点骑,如果請(qǐng)求的目錄不存在但該目錄的上級(jí)目錄存在則返回true酣难,該目錄和它上級(jí)目錄都不存在則返回false,如果請(qǐng)求目錄存在也返回false.

  2. 判斷請(qǐng)求的目錄或者文件是否存在使用"-e"和"!-e"
    當(dāng)使用"-e",如果請(qǐng)求的目錄或者文件存在時(shí)谍夭,if返回true,否則返回 false.
    當(dāng)使用"!-e",如果請(qǐng)求的文件和文件所在路徑上的目錄都不存在返回 true,否則返回false

  3. 判斷請(qǐng)求的文件是否可執(zhí)行使用"-x"和"!-x"
    當(dāng)使用"-x",如果請(qǐng)求的文件可執(zhí)行,if返回true,否則返回false
    當(dāng)使用"!-x",如果請(qǐng)求文件不可執(zhí)行憨募,返回true,否則返回false

4紧索、break指令

該指令用于中斷當(dāng)前相同作用域中的其他Nginx配置。與該指令處于同一作用域的Nginx配置中菜谣,位于它前面的指令
配置生效珠漂,位于后面的指令配置無(wú)效。


image.png
location /{ 
    if ($param){ 
        set $id $1; 
        break; 
        limit_rate 10k; 
    } 
}
5尾膊、return指令

該指令用于完成對(duì)請(qǐng)求的處理媳危,直接向客戶端返回響應(yīng)狀態(tài)代碼。在 return后的所有Nginx配置都是無(wú)效的眯停。


image.png

code:為返回給客戶端的HTTP狀態(tài)代理∏湓螅可以返回的狀態(tài)代碼為0~999的任意HTTP狀態(tài)代理
text:為返回給客戶端的響應(yīng)體內(nèi)容莺债,支持變量的使用
URL:為返回給客戶端的URL地址

6、rewrite指令

該指令通過(guò)正則表達(dá)式的使用來(lái)改變URI签夭∑氚睿可以同時(shí)存在一個(gè)或者多個(gè)指令,按照順序依次對(duì)URL進(jìn)行匹配和處理第租。

URL和URI的區(qū)別:
1措拇、URI:統(tǒng)一資源標(biāo)識(shí)符
2、URL:統(tǒng)一資源定位符

image.png

regex:用來(lái)匹配URI的正則表達(dá)式
replacement:匹配成功后慎宾,用于替換URI中被截取內(nèi)容的字符串丐吓。如果
該字符串是以"http://"或者"https://"開(kāi)頭的,則不會(huì)繼續(xù)向下對(duì)URI進(jìn)行
其他處理趟据,而是直接返回重寫(xiě)后的URI給客戶端券犁。

flag:用來(lái)設(shè)置rewrite對(duì)URI的處理行為,可選值有如下:
last:
break
redirect
permanent

7汹碱、rewrite_log指令

該指令配置是否開(kāi)啟URL重寫(xiě)日志的輸出功能粘衬。

image.png

9、Rewrite 的案例

1咳促、域名跳轉(zhuǎn)

先來(lái)看案例稚新,如果我們想訪問(wèn)京東網(wǎng)站,大家都知道我們可以輸入 www.jd.com ,但是同樣的我們也可以輸入www.360buy.com同樣也都能訪問(wèn)到京東網(wǎng)站跪腹。這個(gè)其實(shí)是因?yàn)榫〇|剛開(kāi)始的時(shí)候域名就是www.360.buy.com褂删,
后面由于各種原因把自己的域名換成了www.jd.com, 雖然說(shuō)域名變量,但是對(duì)于以前只記住了www.360buy.com
的用戶來(lái)說(shuō)冲茸,我們?nèi)绾伟堰@部分用戶也遷移到我們新域名的訪問(wèn)上來(lái)笤妙,針對(duì)于這個(gè)問(wèn)題冒掌,我們就可以使用Nginx中
Rewrite的域名跳轉(zhuǎn)來(lái)解決。

1蹲盘、環(huán)境準(zhǔn)備

vim /etc/hosts

以下配置:
192.168.200.133 www.360buy.com 
192.168.200.133 www.jd.com

在/usr/local/nginx/html/kk目錄下創(chuàng)建一個(gè)訪問(wèn)頁(yè)面

<html>
<title></title>
<body>
    <h1>歡迎來(lái)到林被的網(wǎng)站</h1>
</body>
</html>

通過(guò)Nginx實(shí)現(xiàn)當(dāng)訪問(wèn)www.訪問(wèn)到系統(tǒng)的首頁(yè)

server { 
    listen 80; 
    server_name www.lb.com; 
    location /{ 
        root /usr/local/nginx/html/kk; 
        index index.html; 
    } 
}

通過(guò)Rewrite完成將www.360buy.com的請(qǐng)求跳轉(zhuǎn)到www.jd.com

server { 
    listen 80; 
    server_name www.360buy.com; 
    rewrite ^/ http://www.jd.com permanent; 
}

問(wèn)題描述:如何在域名跳轉(zhuǎn)的過(guò)程中攜帶請(qǐng)求的URI股毫?
修改配置信息

server { 
    listen 80; 
    server_name www.kjk.com; 
    rewrite ^(.*) http://www.lb.com$1 permanent; 
}
2、域名鏡像

上述案例中召衔,將www.360buy.comwww.jingdong.com都能跳轉(zhuǎn)到w
ww.jd.com铃诬,那么www.jd.com我們就可以把它起名叫主域名,其他兩個(gè)
就是我們所說(shuō)的鏡像域名苍凛,當(dāng)然如果我們不想把整個(gè)網(wǎng)站做鏡像趣席,只想
為其中某一個(gè)子目錄下的資源做鏡像,我們可以在location塊中配置
rewrite功能醇蝴,比如:

server { 
    listen 80; 
    server_name rewrite.myweb.com; 
    location ^~ /source1{ 
        rewrite ^/resource1(.*) http://rewrite.myweb.com/web$1 last; 
    }
    location ^~ /source2{ 
        rewrite ^/resource2(.*) http://rewrite.myweb.com/web$1 last; 
    } 
}
3宣肚、獨(dú)立域名

一個(gè)完整的項(xiàng)目包含多個(gè)模塊,比如購(gòu)物網(wǎng)站有商品商品搜索模塊悠栓、商品詳情模塊已經(jīng)購(gòu)物車(chē)模塊等霉涨,那么
我們?nèi)绾螢槊恳粋€(gè)模塊設(shè)置獨(dú)立的域名。

需求:
http://search.kk.com 訪問(wèn)商品搜索模塊
http://item.kk.com 訪問(wèn)商品詳情模塊
http://cart.k.com 訪問(wèn)商品購(gòu)物車(chē)模塊

配置:

server{ 
    listen 80; 
    server_name search.kk.com; 
    rewrite ^(.*) http://www.kk.com/bbs$1 last; 
}
server{ 
    listen 81; 
    server_name item.kk.com; 
    rewrite ^(.*) http://www.kk.com/item$1 last; 
}
server{ 
    listen 82; 
    server_name cart.kk.com; 
    rewrite ^(.*) http://www.kk.com/cart$1 last; 
}
4惭适、目錄自動(dòng)添加"/"

通過(guò)一個(gè)例子來(lái)演示下問(wèn)題:

server { 
    listen 80; 
    server_name localhost; 
    location / { 
        root html; 
        index index.html; 
    } 
}

要想訪問(wèn)上述資源笙瑟,很簡(jiǎn)單,只需要通過(guò)http://192.168.200.133直接就能訪問(wèn)癞志,地址后面不需要加/往枷,
但是如果將上述的配置修改為如下內(nèi)容:

server { 
    listen 80; 
    server_name localhost; 
    location /kk { 
        root html; 
        index index.html; 
    } 
}

這個(gè)時(shí)候,要想訪問(wèn)上述資源凄杯,按照上述的訪問(wèn)方式错洁,我們可以通過(guò)http://192.168.200.133/kk/來(lái)訪問(wèn),
但是如果地址后面不加斜杠,頁(yè)面就會(huì)出問(wèn)題戒突。如果不加斜杠墓臭,Nginx服務(wù)器內(nèi)部會(huì)自動(dòng)做一個(gè)301的重定
向,重定向的地址會(huì)有一個(gè)指令叫server_name_in_redirect on|off;來(lái)決定重定向的地址:

如果該指令為on 
     重定向的地址為: http://server_name/目錄名/; 
如果該指令為off 
     重定向的地址為: http://原URL中的域名/目錄名/;

所以就拿剛才的地址來(lái)說(shuō)妖谴,http://192.168.200.133/kk如果不加斜杠窿锉,那么按照上述規(guī)則,如果指令server_name_in_redirect為on膝舅,則301重定向地址變?yōu)?http://localhost/kk/,如果為off嗡载,則301重定向地址
變?yōu)?a target="_blank">http://192.168.200.133/kkx/。后面這個(gè)是正常的仍稀,前面地址就有問(wèn)題洼滚。
注意server_name_in_redirect指令在Nginx的0.8.48版本之前默認(rèn)都是on,之后改成了off,所以現(xiàn)在我們這個(gè)版本
不需要考慮這個(gè)問(wèn)題技潘,但是如果是0.8.48以前的版本并且server_name_in_redirect設(shè)置為on遥巴,我們?nèi)绾瓮ㄟ^(guò)rewrite
來(lái)解決這個(gè)問(wèn)題千康?

解決方案:使用rewrite功能為末尾沒(méi)有斜杠的URL自動(dòng)添加一個(gè)斜杠

server { 
    listen 80; 
    server_name localhost; 
    server_name_in_redirect on; 
    location /kk { 
        if (-d $request_filename){ 
            rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
        } 
    } 
}
5、合并目錄

搜索引擎優(yōu)化(SEO)是一種利用搜索引擎的搜索規(guī)則來(lái)提供目的網(wǎng)站的有關(guān)搜索引擎內(nèi)排名的方式铲掐。
我們?cè)趧?chuàng)建自己的站點(diǎn)時(shí)拾弃,可以通過(guò)很多中方式來(lái)有效的提供搜索引擎優(yōu)化的程度。其中有一項(xiàng)就包含URL
的目錄層級(jí)一般不要超過(guò)三層摆霉,否則的話不利于搜索引擎的搜索也給客戶端的輸入帶來(lái)了負(fù)擔(dān)豪椿,但是將所有
的文件放在一個(gè)目錄下又會(huì)導(dǎo)致文件資源管理混亂并且訪問(wèn)文件的速度也會(huì)隨著文件增多而慢下來(lái),這兩個(gè)
問(wèn)題是相互矛盾的携栋,那么使用rewrite如何解決上述問(wèn)題?

舉例搭盾,網(wǎng)站中有一個(gè)資源文件的訪問(wèn)路徑時(shí) /server/11/22/33/44/20.html,也就是說(shuō)20.html存在于第5級(jí)目錄下,
如果想要訪問(wèn)該資源文件婉支,客戶端的URL地址就要寫(xiě)成 http://www.web.name/server/11/22/33/44/20.html ,

server { 
    listen 80; 
    server_name www.web.name; 
    location /server{ 
        root html; 
    } 
}

但是這個(gè)是非常不利于SEO搜索引擎優(yōu)化的鸯隅,同時(shí)客戶端也不好記.使用 rewrite我們可以進(jìn)行如下配置:

server { 
    listen 80; 
    server_name www.web.name; 
    location /server{ 
        rewrite ^/server-([0-9]+)-([0-9]+)-([0-9]+)- ([0-9]+)\.html$ /server/$1/$2/$3/$4/$5.html last; 
    } 
}

這樣的話,客戶端只需要輸入http://www.web.name/server-11-22-33-44-20.html就可以訪問(wèn)到20.html頁(yè)面了向挖。
這里也充分利用了rewrite指令支持正則表達(dá)式的特性蝌以。

6、防盜鏈

防盜鏈之前我們已經(jīng)介紹過(guò)了相關(guān)的知識(shí)户誓,在rewrite中的防盜鏈和之前將的原理其實(shí)都是一樣的饼灿,只不過(guò)通過(guò)
rewrite可以將防盜鏈的功能進(jìn)行完善下幕侠,當(dāng)出現(xiàn)防盜鏈的情況帝美,我們可以使用rewrite將請(qǐng)求轉(zhuǎn)發(fā)到自定義的一
張圖片和頁(yè)面,給用戶比較好的提示信息晤硕。下面我們就通過(guò)根據(jù)文件類型實(shí)現(xiàn)防盜鏈的一個(gè)配置實(shí)例:

server{ 
    listen 80; 
    server_name www.web.com; 
    locatin ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)${ 
        valid_referers none blocked server_names *.web.com;
        if ($invalid_referer){ 
            rewrite ^/ http://www.web.com/images/forbidden.png; 
        } 
    } 
}

根據(jù)目錄實(shí)現(xiàn)防盜鏈配置:

server{ 
    listen 80; 
    server_name www.web.com; 
    location /file/{ 
        root /server/file/; 
        valid_referers none blocked server_names *.web.com;

        if ($invalid_referer){ 
            rewrite ^/ http://www.web.com/images/forbidden.png; 
        } 
    } 
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悼潭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舞箍,更是在濱河造成了極大的恐慌舰褪,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疏橄,死亡現(xiàn)場(chǎng)離奇詭異占拍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)捎迫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)晃酒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人窄绒,你說(shuō)我怎么就攤上這事贝次。” “怎么了彰导?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵蛔翅,是天一觀的道長(zhǎng)敲茄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)山析,這世上最難降的妖魔是什么堰燎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮盖腿,結(jié)果婚禮上爽待,老公的妹妹穿的比我還像新娘。我一直安慰自己翩腐,他們只是感情好鸟款,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著茂卦,像睡著了一般何什。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上等龙,一...
    開(kāi)封第一講書(shū)人閱讀 51,610評(píng)論 1 305
  • 那天处渣,我揣著相機(jī)與錄音,去河邊找鬼蛛砰。 笑死罐栈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泥畅。 我是一名探鬼主播荠诬,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼位仁!你這毒婦竟也來(lái)了柑贞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤聂抢,失蹤者是張志新(化名)和其女友劉穎钧嘶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體琳疏,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡有决,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了空盼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片书幕。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖我注,靈堂內(nèi)的尸體忽然破棺而出按咒,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布励七,位于F島的核電站智袭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏掠抬。R本人自食惡果不足惜吼野,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望两波。 院中可真熱鬧瞳步,春花似錦、人聲如沸腰奋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)劣坊。三九已至嘀倒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間局冰,已是汗流浹背测蘑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留康二,地道東北人碳胳。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像沫勿,于是被迫代替她去往敵國(guó)和親挨约。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 配置運(yùn)行Nginx服務(wù)器用戶(組) 用于配置運(yùn)行Nginx服務(wù)器用戶(組)的指令是user藕帜,其語(yǔ)法格式為: use...
    吃瓜的東閱讀 4,495評(píng)論 0 41
  • 一烫罩、服務(wù)安裝與啟停: windows: nginx -s [ stop | quit | reopen | rel...
    夏與清風(fēng)閱讀 353評(píng)論 0 2
  • Nginx學(xué)習(xí)筆記 1惜傲、Nginx初識(shí) Nginx 是一個(gè)高性能的Http和反向代理服務(wù)器时甚。也是一個(gè)IMAP/PO...
    _FireFly_閱讀 239評(píng)論 0 0
  • tip: nginx是一款高性能的http 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器 ng...
    角角_d216閱讀 235評(píng)論 0 0
  • Nginx Note 一质欲、Nginx準(zhǔn)備工作 1又碌、Nginx安裝 linux-install-nginx 官網(wǎng)[h...
    Mason啊閱讀 430評(píng)論 0 0