龍崗個(gè)性化網(wǎng)站建設(shè)價(jià)格低南寧網(wǎng)站運(yùn)營(yíng)優(yōu)化平臺(tái)
關(guān)于 Nginx 的哪些事
- 1、Nginx 主要功能
- 2、Nginx 的常用命令
- 2.1、啟動(dòng)Nginx
- 2.2、停止 Nginx
- 2.3、重新加載Nginx 配置
- 2.4、檢查Nginx配置文件
- 2.5、指定配置文件
- 2.6、檢查Nginx版本
- 2.7、顯示Nginx幫助信息
- 3、Nginx 配置文件 nginx.conf
- 3.1、Nginx 配置文件(nginx.conf)組成部分
- 3.2、Nginx 配置文件(nginx.conf)示例
- 4、反向代理
- 4.1、簡(jiǎn)單示例
- 4.2、location 語(yǔ)法
- 4.2.1、精準(zhǔn)匹配(=)
- 4.2.2、普通匹配(^~)
- 4.2.3、正則匹配(~)
- 4.2.4、默認(rèn)根路徑匹配(/)
- 4.2.5、nginx內(nèi)部跳轉(zhuǎn)(@)
- 4.2.6、location URI結(jié)尾帶不帶 /
- 5、負(fù)載均衡
- 5.1、簡(jiǎn)單示例
- 5.2、常用負(fù)載均衡策略
- 5.2.1、輪詢
- 5.2.2、權(quán)重輪詢
- 5.2.3、IP哈希
- 5.2.4、最少連接
- 6、動(dòng)靜分離
- 7、Nginx 限流
- 7.1、基于IP限流
- 7.2、基于URL限流
1、Nginx 主要功能
?
Nginx主要功能:
-
正向代理:需要在客戶端配置代理服務(wù)器,進(jìn)行指定網(wǎng)站訪問(wèn)。
-
反向代理:反向代理是Nginx的常見功能之一。當(dāng)客戶端向服務(wù)器發(fā)送請(qǐng)求時(shí),首先經(jīng)過(guò)Nginx服務(wù)器,然后Nginx將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部的Web服務(wù)器。這種代理方式使得外部網(wǎng)絡(luò)無(wú)法直接訪問(wèn)內(nèi)部的Web服務(wù)器,提高了安全性。
-
負(fù)載均衡:它將網(wǎng)絡(luò)流量分擔(dān)到多個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)上,并行處理請(qǐng)求,從而提高網(wǎng)絡(luò)系統(tǒng)的處理能力,減少前端用戶等待響應(yīng)的時(shí)間。
-
動(dòng)靜分離:將動(dòng)態(tài)網(wǎng)頁(yè)和靜態(tài)頁(yè)面分開處理。通過(guò)動(dòng)靜分離,Nginx可以充分利用其高并發(fā)、高性能的特點(diǎn),同時(shí)減輕后端服務(wù)器的負(fù)載,提高網(wǎng)站的訪問(wèn)速度和可維護(hù)性。
?
2、Nginx 的常用命令
?
2.1、啟動(dòng)Nginx
?
# 首先進(jìn)入 Nginx 目錄 (一般在該目錄,具體根據(jù)實(shí)際安裝情況而定)
cd /usr/local/nginx
# 啟動(dòng) Nginx
./sbin/nginx# 或者直接執(zhí)行
/usr/local/nginx/sbin/nginx
?
2.2、停止 Nginx
?
# 首先進(jìn)入 Nginx 目錄 (一般在該目錄,具體根據(jù)實(shí)際安裝情況而定)
cd /usr/local/nginx
# 停止 Nginx
./sbin/nginx -s stop
# 或者在 Nginx 目錄執(zhí)行
./sbin/nginx -s quit# 或者直接執(zhí)行
/usr/local/nginx/sbin/nginx -s stop
# 或
/usr/local/nginx/sbin/nginx -s quit
?
2.3、重新加載Nginx 配置
?
# 首先進(jìn)入 Nginx 目錄 (一般在該目錄,具體根據(jù)實(shí)際安裝情況而定)
cd /usr/local/nginx
# 重新加載Nginx 配置
./sbin/nginx -s reload
?
2.4、檢查Nginx配置文件
?
# 首先進(jìn)入 Nginx 目錄 (一般在該目錄,具體根據(jù)實(shí)際安裝情況而定)
cd /usr/local/nginx
# 檢查Nginx配置文件是否正確
./sbin/nginx -t
?
2.5、指定配置文件
?
# 首先進(jìn)入 Nginx 目錄 (一般在該目錄,具體根據(jù)實(shí)際安裝情況而定)
cd /usr/local/nginx
# 指定配置文件:在命令行中添加 -c 參數(shù)。例如:
./sbin/nginx -c /usr/local/nginx/conf/nginx.conf
?
2.6、檢查Nginx版本
?
# 首先進(jìn)入 Nginx 目錄 (一般在該目錄,具體根據(jù)實(shí)際安裝情況而定)
cd /usr/local/nginx
# 檢查Nginx版本
./sbin/nginx -V
# 或者在Nginx目錄中執(zhí)行
./sbin/nginx -v
?
2.7、顯示Nginx幫助信息
?
# 首先進(jìn)入 Nginx 目錄 (一般在該目錄,具體根據(jù)實(shí)際安裝情況而定)
cd /usr/local/nginx
# 顯示Nginx幫助信息
./sbin/nginx -h
?
3、Nginx 配置文件 nginx.conf
?
???????Nginx 配置文件路徑,一般在 /etc/nginx/nginx.conf
或 /usr/local/nginx/conf/nginx.conf
?
3.1、Nginx 配置文件(nginx.conf)組成部分
?
-
① 全局塊:從配置文件開始到events塊之間的內(nèi)容,主要設(shè)置一些影響nginx服務(wù)器整體運(yùn)行的配置命令,如worker_processes、worker_processes值等。
-
② events塊:主要配置Nginx服務(wù)器與用戶的網(wǎng)絡(luò)連接,包括是否開啟對(duì)多work process下的網(wǎng)絡(luò)連接進(jìn)行序列化,是否允許同時(shí)接收多個(gè)網(wǎng)絡(luò)連接等。
-
③ http塊:這是Nginx服務(wù)器配置中最頻繁的部分,包括http全局塊、server塊等。http全局塊配置指令包括文件引入、MIME-TYPE定義、日志定義、連接超時(shí)時(shí)間、單鏈接請(qǐng)求數(shù)上限等。
此外,Nginx還支持對(duì)stream和server塊的配置,stream塊用于配置HTTP和SMTP代理服務(wù)器的代理設(shè)置,server塊用于配置虛擬主機(jī)的設(shè)置。
?
3.2、Nginx 配置文件(nginx.conf)示例
?
# 指定Nginx服務(wù)器的用戶
user nginx;
# 指定Nginx服務(wù)器的工作進(jìn)程數(shù)。
worker_processes 1;
# 指定錯(cuò)誤日志存放路徑
error_log /var/log/nginx/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;# 指定Nginx進(jìn)程的存放路徑。
pid /var/run/nginx.pid; events { # 指定每個(gè)worker process的最大連接數(shù)worker_connections 1024; # 指定Nginx服務(wù)器的工作進(jìn)程數(shù)。# worker_processes 20;# 指定是否允許一個(gè)worker process同時(shí)接收多個(gè)網(wǎng)絡(luò)連接。multi_accept on;
} http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # gzip:開啟gzip壓縮,減少傳輸數(shù)據(jù)量。# gzip on;# 該 server 配置了Nginx作為反向代理服務(wù)器,# 將所有以example.com為域名的HTTP請(qǐng)求轉(zhuǎn)發(fā)到192.168.1.100:8080的目標(biāo)服務(wù)器。server { # listen:指定Nginx監(jiān)聽的端口號(hào)。例如,listen 80,表示Nginx將監(jiān)聽80端口。listen 80; # server_name:指定服務(wù)器名稱,可以是一個(gè)域名或多個(gè)域名。# 指定Nginx要代理的域名,表示Nginx將代理example.com域名的請(qǐng)求。server_name example.com; # charset:設(shè)置字符集。# charset koi8-r;# access_log logs/host.access.log main;# 指定要代理的請(qǐng)求路徑。例,location / { ... }表示Nginx將對(duì)所有請(qǐng)求進(jìn)行代理# location /:匹配所有以該主機(jī)名開頭的URL路徑。location / { # 指定代理的目標(biāo)服務(wù)器。# 這里指Nginx將所有請(qǐng)求代理到192.168.1.100:8080的目標(biāo)服務(wù)器。proxy_pass http://192.168.1.100:8080; # index:指定默認(rèn)頁(yè)面,可以是index.html、index.htm或index.nginx-debian.html。# index index.html index.htm;# try_files:用于嘗試訪問(wèn)本地文件或定義的其他動(dòng)作,如重定向、返回特定狀態(tài)碼等。# try_files $uri $uri/ /index.html;} # error_page:指定錯(cuò)誤頁(yè)面,用于處理特定錯(cuò)誤碼的頁(yè)面。#error_page 404 /404.html;# redirect server error pages to the static page /50x.html# error_page:指定錯(cuò)誤頁(yè)面,用于處理特定錯(cuò)誤碼的頁(yè)面。error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}} # 該server段落,配置了Nginx作為反向代理和HTTPS代理服務(wù)器。# 這里將所有以example.com為域名的HTTPS請(qǐng)求,轉(zhuǎn)發(fā)到192.168.1.100:8080的目標(biāo)服務(wù)器, # 并使用SSL證書進(jìn)行加密傳輸。server { # listen:指定Nginx監(jiān)聽的端口號(hào)。listen 443 ssl; # server_name:指定服務(wù)器名稱,可以是一個(gè)域名或多個(gè)域名。# 指定Nginx要代理的域名,表示Nginx將代理example.com域名的請(qǐng)求。server_name example.com; # ssl_certificate:指定SSL證書的路徑。# 這里表示Nginx將使用位于/etc/nginx/ssl/nginx.crt的SSL證書。ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; # ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location 用于匹配特定URL,并定義相應(yīng)的代理規(guī)則或靜態(tài)文件路徑。location / { # proxy_pass:定義反向代理規(guī)則。proxy_pass http://192.168.1.100:8080; } } # #server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index:指定默認(rèn)頁(yè)面,可以是index.html、index.htm或index.nginx-debian.html。# index index.html index.htm;# }#}}
?
4、反向代理
?
4.1、簡(jiǎn)單示例
?
???????在下面示例中,Nginx作為反向代理服務(wù)器,將所有以example.com為域名的HTTP請(qǐng)求轉(zhuǎn)發(fā)到192.168.1.100:8080的目標(biāo)服務(wù)器。同時(shí),通過(guò)proxy_set_header指令設(shè)置了一些必要的請(qǐng)求頭信息,以便目標(biāo)服務(wù)器正確地處理請(qǐng)求。該示例僅適用于HTTP協(xié)議的代理配置。
?
server { listen 80; server_name example.com; # location /:匹配所有以該主機(jī)名開頭的URL路徑。location / { proxy_pass http://192.168.1.100:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
}
?
注意:目標(biāo)服務(wù)器,需要對(duì)外開放訪問(wèn)的端口
# 以下是基于 CentOS7 版本的防火墻相關(guān)命令。# 查看防火墻狀態(tài)
firewall-cmd --state# 如果防火墻處于關(guān)閉狀態(tài),先啟動(dòng)它
systemctl start firewalld.service# 防火墻開放8080 端口號(hào)
firewall-cmd --add-port=8080/tcp --permanent# 重啟防火墻以使更改生效
systemctl restart firewalld.service# 重新加載防火墻配置
firewall-cmd –reload# 查看已經(jīng)開放的端口號(hào)
firewall-cmd --list-all
?
4.2、location 語(yǔ)法
?
????????在NGINX中,location
指令用于定義請(qǐng)求匹配的URL路徑和相應(yīng)的配置。它是在NGINX配置文件中的server
塊內(nèi)使用的。下面是location
指令的基本語(yǔ)法:
?
location [=|~|~*|^~] /path { # 配置指令
}# 說(shuō)明:
= :表示完全匹配指定的路徑。
~ :表示使用正則表達(dá)式匹配路徑。
~* :表示不區(qū)分大小寫的正則表達(dá)式匹配路徑。
^~ :表示前綴匹配路徑,但不使用正則表達(dá)式。
?
location 匹配優(yōu)先級(jí):
=
大于 ^~
大于 ~ | ~*
大于 最長(zhǎng)前綴匹配
大于 /
?
4.2.1、精準(zhǔn)匹配(=)
?
精準(zhǔn)匹配的符號(hào)標(biāo)記為“=”,示例:
# 如果請(qǐng)求URI和精準(zhǔn)匹配的模式字符串/api完全相同,那么精準(zhǔn)匹配通過(guò).
# 在所有的匹配類型中,精準(zhǔn)匹配的優(yōu)先級(jí)最高.
location = /api {proxy_pass http://192.168.1.100:8080;
}# 假設(shè) server_name example.com;
# 只匹配http://example.com/abc
# http://example.com/api [匹配成功]
# http://example.com/api/index [匹配失敗]
?
4.2.2、普通匹配(^~)
?
普通匹配的符號(hào)標(biāo)記為“~”,普通匹配是前綴匹配,也是Nginx默認(rèn)的匹配類型。類型符號(hào)“~”可以省略,如果location沒(méi)有任何匹配類型,就為普通的前綴匹配。示例:
# 普通匹配:如果請(qǐng)求路徑URI頭部,匹配到location的模式字符串,那么匹配成功。
# 如果匹配到多個(gè)前綴,那么最長(zhǎng)模式匹配優(yōu)先
# 匹配以"/api/"開頭的所有請(qǐng)求
location ^~ /api/ {proxy_pass http://192.168.1.100:8080;
}location ^~ /api/demo {proxy_pass http://192.168.1.101:8081;
}# 假設(shè) server_name example.com;
#以 /api/ 開頭的請(qǐng)求,都會(huì)匹配上
#http://example.com/api/index.page [匹配成功]
#http://example.com/error/error.page [匹配失敗]# 以上 http://example.com/api/demo/index.page 請(qǐng)求 [匹配成功]
# 且 http://example.com/api/demo/index.page 請(qǐng)求,優(yōu)先匹配目標(biāo):http://192.168.1.101:8081location ^~ /api/ {proxy_pass http://192.168.1.100:8080;
}
# 等同于
location /api/ {proxy_pass http://192.168.1.100:8080;
}
?
4.2.3、正則匹配(~)
?
正則匹配的類型,根據(jù)類型符號(hào)的不同,可以細(xì)分為以下4種 :
-
~:標(biāo)準(zhǔn)正則匹配,區(qū)分字母大小寫,進(jìn)行正則表達(dá)式測(cè)試,若測(cè)試成功,則匹配成功。
-
~*:標(biāo)準(zhǔn)正則匹配,不區(qū)分字母大小寫,進(jìn)行正則表達(dá)式測(cè)試,若測(cè)試成功,則匹配成功。
-
!~:反向正則匹配,區(qū)分字母大小寫,進(jìn)行正則表達(dá)式測(cè)試,若測(cè)試不成功,則匹配成功。
-
!~*:反向正則匹配,不區(qū)分字母大小寫,進(jìn)行正則表達(dá)式測(cè)試,若測(cè)試不成功,則匹配成功。
?
# ~ :區(qū)分字母大小寫
location ~ /Api/ {proxy_pass http://192.168.1.100:8080;
}
# 假設(shè) server_name example.com;
#http://example.com/Api/ [匹配成功]
#http://example.com/api/ [匹配失敗]# ~* :不區(qū)分字母大小寫
location ~* /Api/ {proxy_pass http://192.168.1.100:8080;
}
# 假設(shè) server_name example.com;
# 則會(huì)忽略 uri 部分的大小寫
#http://example.com/Api/ [匹配成功]
#http://example.com/api/ [匹配成功]
4.2.4、默認(rèn)根路徑匹配(/)
?
根路徑的路徑規(guī)則就是使用單個(gè)“/”符號(hào),示例:
?
# 匹配所有以該主機(jī)名開頭的URL路徑。
location / {proxy_pass http://192.168.1.100:8080;
}
4.2.5、nginx內(nèi)部跳轉(zhuǎn)(@)
?
location /index/ {error_page 404 @index_error;
}
location @index_error {.....
}
#以 /index/ 開頭的請(qǐng)求,如果鏈接的狀態(tài)為 404。則會(huì)匹配到 @index_error 這條規(guī)則上。
?
4.2.6、location URI結(jié)尾帶不帶 /
?
????????在 Nginx 中,location
指令用于匹配請(qǐng)求的 URL,并根據(jù)匹配的結(jié)果來(lái)配置相應(yīng)的代理、重定向、靜態(tài)文件服務(wù)等操作。在 location
指令中,URL最后是否帶有斜杠(/
)會(huì)對(duì)匹配的結(jié)果產(chǎn)生一些區(qū)別。瀏覽器在發(fā)起請(qǐng)求的時(shí)候,默認(rèn)加上了 / 。雖然很多瀏覽器在地址欄里也不會(huì)顯示 /
。
- URL最后帶有斜杠(
/
):- 當(dāng) URL 以斜杠結(jié)尾時(shí),
location
指令會(huì)精確匹配該 URL。例如,如果配置了location /foo/
,則只有請(qǐng)求的 URL 為/foo/
時(shí)才會(huì)匹配,但不匹配/foo
或/foo123
等。 - 如果請(qǐng)求的 URL 是
/foo/bar
,則不會(huì)匹配location /foo/
,因?yàn)樽詈笥幸粋€(gè)額外的路徑片段(bar
)。 - 如果需要匹配以
foo
結(jié)尾的所有 URL,包括/foo/
和/foo/bar
等,可以使用正則表達(dá)式,例如location ~ ^/foo/$
。
- 當(dāng) URL 以斜杠結(jié)尾時(shí),
- URL最后沒(méi)有斜杠(
/
):- 當(dāng) URL 不以斜杠結(jié)尾時(shí),
location
指令會(huì)匹配以該 URL 為前綴的所有 URL。例如,如果配置了location /foo
,則請(qǐng)求的 URL 為/foo
、/foobar
、/foo/bar
等以/foo
為前綴的 URL 都會(huì)匹配。 - 如果請(qǐng)求的 URL 是
/foo/bar
,則會(huì)匹配location /foo
,因?yàn)?code>/foo是該 URL 的前綴。
- 當(dāng) URL 不以斜杠結(jié)尾時(shí),
?
????????總結(jié)起來(lái),是否在 location
指令的 URL 最后加上斜杠,決定了是精確匹配還是前綴匹配。具體使用哪種方式取決于你的需求,如果需要精確匹配某個(gè) URL,可以使用斜杠結(jié)尾;如果需要匹配某個(gè)前綴的所有 URL,則可以去掉斜杠。
?
5、負(fù)載均衡
?
5.1、簡(jiǎn)單示例
?
# 使用 upstream 塊定義了一個(gè)名為 backend 的后端服務(wù)器組。
# 在該后端服務(wù)器組中,列出了三個(gè)后端服務(wù)器
# 192.168.1.100:8080、192.168.1.101:8081 和 192.168.1.102:8082
upstream backend { server 192.168.1.100:8080; server 192.168.1.101:8081; server 192.168.1.102:8082;
} server { listen 80; server_name example.com; location / { proxy_pass http://backend; # 在這里配置其他相關(guān)的反向代理設(shè)置 }
}
?
5.2、常用負(fù)載均衡策略
?
以下是幾種常見的策略:輪詢、權(quán)重、IP哈希、最少連接。
?
5.2.1、輪詢
?
????????輪詢(Round Robin):每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器。如果后端服務(wù)器down掉,Nginx會(huì)自動(dòng)剔除該服務(wù)器。
?
# 默認(rèn)采用輪詢策略,示例:
upstream backserver { server 192.168.0.14; server 192.168.0.15;
}
?
5.2.2、權(quán)重輪詢
?
????????權(quán)重輪詢(Weighted Round Robin):在輪詢策略的基礎(chǔ)上,指定每個(gè)后端服務(wù)器的輪詢幾率,權(quán)重值越高的服務(wù)器被選擇的可能性就越大。
?
# 使用示例:
upstream backserver { server 192.168.0.14 weight=2; server 192.168.0.15 weight=1;
}
?
5.2.3、IP哈希
?
????????IP哈希(IP Hash):指定負(fù)載均衡器按照基于客戶端IP的分配方式。這個(gè)方法確保了相同的客戶端的請(qǐng)求一直發(fā)送到相同的后端服務(wù)器,以保持會(huì)話一致性。
?
# 使用示例:
upstream backserver { ip_hash; server 192.168.0.14; server 192.168.0.15;
}
?
5.2.4、最少連接
?
????????最少連接(Least Connections):把請(qǐng)求轉(zhuǎn)發(fā)給連接數(shù)最少的后端服務(wù)器。輪詢算法是把請(qǐng)求平均的轉(zhuǎn)發(fā)給各個(gè)后端,使它們的負(fù)載大致相同;但是,有些請(qǐng)求占用的時(shí)間很長(zhǎng),會(huì)導(dǎo)致其所在的后端負(fù)載較高。使用最少連接策略可以更好地平衡負(fù)載。
?
# 使用示例:
upstream backserver { least_conn; server 192.168.0.14; server 192.168.0.15;
}
?
6、動(dòng)靜分離
?
Nginx 的動(dòng)靜分離,是指將動(dòng)態(tài)請(qǐng)求和靜態(tài)請(qǐng)求,分發(fā)到不同的后端處理。
動(dòng)態(tài)請(qǐng)求通常需要與數(shù)據(jù)庫(kù)等進(jìn)行交互,處理邏輯較為復(fù)雜。而靜態(tài)請(qǐng)求,則是指只需要直接返回靜態(tài)文件或資源的請(qǐng)求,處理速度較快。
通過(guò)動(dòng)靜分離,可以將動(dòng)態(tài)請(qǐng)求交給專門的動(dòng)態(tài)服務(wù)器處理,而靜態(tài)請(qǐng)求則可以由更高效的靜態(tài)服務(wù)器處理,從而提高整體的處理性能和響應(yīng)速度。
?
server { listen 80; server_name example.com; # 動(dòng)態(tài)請(qǐng)求location /dynamic { proxy_pass http://dynamic_server;}location /css { # root指令用于指定靜態(tài)文件的根目錄root /path/to/css; } location /js { # root指令用于指定靜態(tài)文件的根目錄root /path/to/js; } # 頁(yè)面訪問(wèn)方式一:location /front {root /data;index index.html;}# 頁(yè)面訪問(wèn)方式二:location /web {alias /data/front;index index.html;}# 圖片訪問(wèn)方式一:location /static {root /data/front; }# 圖片訪問(wèn)方式二:location /photo {alias /data/front/static;}
}
?
注意:alias
和root
指令都是用于指定文件路徑的,但它們的使用方式和效果有所不同。
alias
指令用于指定匹配的URL段對(duì)應(yīng)的文件或目錄的路徑。當(dāng)請(qǐng)求的URL匹配location
塊中配置的URL段時(shí),NGINX會(huì)將其重定向到alias
指令指定的路徑下對(duì)應(yīng)的文件或目錄。這意味著請(qǐng)求的URL將會(huì)發(fā)生變化,從原來(lái)的URL變?yōu)樾碌腢RL。
例如,下面的配置將請(qǐng)求的URL為/images/example.jpg
重定向到/var/www/html/images/example.jpg
location /images { alias /var/www/html/images;
}
?
root
指令則是指定最上層目錄的定義,它不會(huì)改變請(qǐng)求的URL。當(dāng)請(qǐng)求的URL匹配location
塊中配置的URL段時(shí),NGINX會(huì)在指定的目錄下查找對(duì)應(yīng)的文件。
例如,下面的配置將請(qǐng)求的URL為/images/example.jpg
映射到/var/www/html/images/example.jpg
location /images { root /var/www/html;
}
?
7、Nginx 限流
?
nginx可以通過(guò)以下方式實(shí)現(xiàn)限流:基于IP限流、基于URL限流、基于時(shí)間限流。
?
7.1、基于IP限流
?
????????基于IP的限流,可以有效地控制每個(gè)IP地址的請(qǐng)求頻率和請(qǐng)求數(shù),有助于防止惡意攻擊和保護(hù)服務(wù)器的性能。
????????需要注意的是,限流區(qū)域的配置和限流指令的應(yīng)用,需要根據(jù)實(shí)際需求進(jìn)行調(diào)整和優(yōu)化。
?
示例配置:
# 創(chuàng)建限流區(qū)域one,限制每個(gè)IP的請(qǐng)求頻率為1次/秒
# $binary_remote_addr 是用于存儲(chǔ)限流信息的共享內(nèi)存名稱,使用了10MB的共享內(nèi)存
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
# 創(chuàng)建限流區(qū)域two,限制每個(gè)IP的請(qǐng)求頻率為2次/秒
limit_req_zone $binary_remote_addr zone=two:10m rate=2r/s; server { location / { # 使用limit_req指令,指定使用one限流區(qū)域# 設(shè)置burst參數(shù)為1,表示允許每個(gè)IP在突發(fā)情況下最多多發(fā)送一個(gè)請(qǐng)求。limit_req zone=one burst=1; ... }
}
?
-
限流算法:
-
nginx的限流算法使用了漏桶算法。
-
當(dāng)請(qǐng)求到達(dá)時(shí),會(huì)先檢查對(duì)應(yīng)的限流桶中的請(qǐng)求數(shù)量是否已經(jīng)達(dá)到限制速率。
-
如果未達(dá)到限制速率,則允許請(qǐng)求通過(guò),并在限流桶中增加一個(gè)請(qǐng)求。
-
如果達(dá)到限制速率,則需要檢查是否允許突發(fā)請(qǐng)求。
-
如果允許突發(fā)請(qǐng)求,則允許請(qǐng)求通過(guò),并在限流桶中增加一個(gè)請(qǐng)求,同時(shí)記錄突發(fā)請(qǐng)求數(shù);
-
如果不允許突發(fā)請(qǐng)求,則直接拒絕請(qǐng)求。
-
-
?
7.2、基于URL限流
?
????????基于URL的限流,可以有效地控制每個(gè)URL的請(qǐng)求頻率和請(qǐng)求數(shù),有助于保護(hù)服務(wù)器的性能和防止濫用。
????????基于URL的限流方式,適用于限制某些頻繁訪問(wèn)的URL,或者限制對(duì)某些重要接口的請(qǐng)求頻率,以保護(hù)服務(wù)器資源或者控制某些URL的使用。
????????需要注意的是,限流區(qū)域的配置和限流指令的應(yīng)用,需要根據(jù)實(shí)際需求進(jìn)行調(diào)整和優(yōu)化。
示例配置:
# 實(shí)現(xiàn)基于URL的限流,要先配置限流區(qū)域 limit_req_zone,限流區(qū)域是一個(gè)存儲(chǔ)URL和相關(guān)統(tǒng)計(jì)信息的緩存區(qū)。
# $uri 用于存儲(chǔ)限流信息的共享內(nèi)存名稱,這里創(chuàng)建了一個(gè)名為one的限流區(qū)域,使用了10MB的共享內(nèi)存。
# rate 是每個(gè)URL的請(qǐng)求限制速率,這里限制了每個(gè)URL的請(qǐng)求頻率為1次/秒。
limit_req_zone $uri zone=one:10m rate=1r/s;location /api/ { # 針對(duì)/api/路徑進(jìn)行限流,limit_req指令來(lái)指定使用限流區(qū)域?yàn)閛ne# burst參數(shù)為10,表示允許每個(gè)URL在突發(fā)情況下最多多發(fā)送10個(gè)請(qǐng)求。limit_req zone=one burst=10; ...
}
?
- 限流算法:
- nginx的限流算法使用了漏桶算法。
- 當(dāng)請(qǐng)求到達(dá)時(shí),會(huì)先檢查對(duì)應(yīng)的限流桶中的請(qǐng)求數(shù)量,是否已經(jīng)達(dá)到限制速率。
- 如果未達(dá)到限制速率,則允許請(qǐng)求通過(guò),并在限流桶中增加一個(gè)請(qǐng)求。
- 如果達(dá)到限制速率,則需要檢查是否允許突發(fā)請(qǐng)求。
- 如果允許突發(fā)請(qǐng)求,則允許請(qǐng)求通過(guò),并在限流桶中增加一個(gè)請(qǐng)求,同時(shí)記錄突發(fā)請(qǐng)求數(shù);
- 如果不允許突發(fā)請(qǐng)求,則直接拒絕請(qǐng)求。
?
?
?
?
?
?
?
?
.