一、HTTP服務器
Nginx本身也是一個靜態(tài)資源的服務器,當只有靜態(tài)資源的時候,就可以使用Nginx來做服務器,如果一個網(wǎng)站只是靜態(tài)頁面的話,那么就可以通過這種方式來實現(xiàn)部署。
1、 首先在文檔根目錄Docroot(/usr/local/var/www)
下創(chuàng)建html目錄, 然后在html中放一個test.html;
2、 配置nginx.conf
中的server
usermengdaystaff;
http{
server{
listen80;
server_namelocalhost;
client_max_body_size1024M;
#默認location
location/{
root/usr/local/var/www/html;
indexindex.htmlindex.htm;
}
}
}
3、訪問測試
-
http://localhost/
指向/usr/local/var/www/index.html
, index.html是安裝nginx自帶的html -
http://localhost/test.html
指向/usr/local/var/www/html/test.html
注意:如果訪問圖片出現(xiàn)403 Forbidden錯誤,可能是因為nginx.conf 的第一行user配置不對,默認是#user nobody;是注釋的,linux下改成user root; macos下改成user 用戶名 所在組; 然后重新加載配置文件或者重啟,再試一下就可以了, 用戶名可以通過who am i 命令來查看。
4、指令簡介
- server : 用于定義服務,http中可以有多個server塊
- listen : 指定服務器偵聽請求的IP地址和端口,如果省略地址,服務器將偵聽所有地址,如果省略端口,則使用標準端口
- server_name : 服務名稱,用于配置域名
- location : 用于配置映射路徑uri對應的配置,一個server中可以有多個location, location后面跟一個uri,可以是一個正則表達式, / 表示匹配任意路徑, 當客戶端訪問的路徑滿足這個uri時就會執(zhí)行l(wèi)ocation塊里面的代碼
-
root : 根路徑,當訪問
http://localhost/test.html
,“/test.html”會匹配到”/”uri, 找到root為/usr/local/var/www/html
,用戶訪問的資源物理地址=root + uri = /usr/local/var/www/html + /test.html=/usr/local/var/www/html/test.html
-
index : 設置首頁,當只訪問
server_name
時后面不跟任何路徑是不走root直接走index指令的;如果訪問路徑中沒有指定具體的文件,則返回index設置的資源,如果訪問http://localhost/html/
則默認返回index.html
5、location uri正則表達式
-
.
:匹配除換行符以外的任意字符 -
?
:重復0次或1次 -
+
:重復1次或更多次 -
*
:重復0次或更多次 -
d
:匹配數(shù)字 -
^
:匹配字符串的開始 -
$
:匹配字符串的結(jié)束 -
{n}
:重復n次 -
{n,}
:重復n次或更多次 -
[c]
:匹配單個字符c -
[a-z]
:匹配a-z小寫字母的任意一個 -
(a|b|c)
: 屬線表示匹配任意一種情況,每種情況使用豎線分隔,一般使用小括號括括住,匹配符合a字符 或是b字符 或是c字符的字符串 - 反斜杠:用于轉(zhuǎn)義特殊字符
小括號()之間匹配的內(nèi)容,可以在后面通過$1
來引用,$2
表示的是前面第二個()里的內(nèi)容。正則里面容易讓人困惑的是轉(zhuǎn)義特殊字符。
基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
二、靜態(tài)服務器
在公司中經(jīng)常會遇到靜態(tài)服務器,通常會提供一個上傳的功能,其他應用如果需要靜態(tài)資源就從該靜態(tài)服務器中獲取。
1、在/usr/local/var/www
下分別創(chuàng)建images和img目錄,分別在每個目錄下放一張test.jpg
http{
server{
listen80;
server_namelocalhost;
set$doc_root/usr/local/var/www;
#默認location
location/{
root/usr/local/var/www/html;
indexindex.htmlindex.htm;
}
location^~/images/{
root$doc_root;
}
location~*.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)${
root$doc_root/img;
}
}
}
自定義變量使用set指令,語法 set 變量名值;引用使用變量名值;引用使用變量名; 這里自定義了doc_root變量。
靜態(tài)服務器location的映射一般有兩種方式:
- 使用路徑,如 /images/ 一般圖片都會放在某個圖片目錄下,
- 使用后綴,如 .jpg、.png 等后綴匹配模式
訪問http://localhost/test.jpg
會映射到 $doc_root/img
訪問http://localhost/images/test.jpg
當同一個路徑滿足多個location時,優(yōu)先匹配優(yōu)先級高的location,由于^~
的優(yōu)先級大于 ~
, 所以會走/images/
對應的location
常見的location路徑映射路徑有以下幾種:
-
=
進行普通字符精確匹配。也就是完全匹配。 -
^~
前綴匹配。如果匹配成功,則不再匹配其他location。 -
~
表示執(zhí)行一個正則匹配,區(qū)分大小寫 -
~*
表示執(zhí)行一個正則匹配,不區(qū)分大小寫 -
/xxx/
常規(guī)字符串路徑匹配 -
/
通用匹配,任何請求都會匹配到
location優(yōu)先級
當一個路徑匹配多個location時究竟哪個location能匹配到時有優(yōu)先級順序的,而優(yōu)先級的順序于location值的表達式類型有關(guān),和在配置文件中的先后順序無關(guān)。相同類型的表達式,字符串長的會優(yōu)先匹配。
以下是按優(yōu)先級排列說明:
- 等號類型(=)的優(yōu)先級最高。一旦匹配成功,則不再查找其他匹配項,停止搜索。
-
^~
類型表達式,不屬于正則表達式。一旦匹配成功,則不再查找其他匹配項,停止搜索。 -
正則表達式類型(
~ ~*
)的優(yōu)先級次之。如果有多個location的正則能匹配的話,則使用正則表達式最長的那個。 - 常規(guī)字符串匹配類型。按前綴匹配。
- / 通用匹配,如果沒有匹配到,就匹配通用的
優(yōu)先級搜索問題:不同類型的location映射決定是否繼續(xù)向下搜索
-
等號類型、
^~
類型:一旦匹配上就停止搜索了,不會再匹配其他location了 -
正則表達式類型(
~ ~*
),常規(guī)字符串匹配類型/xxx/
: 匹配到之后,還會繼續(xù)搜索其他其它location,直到找到優(yōu)先級最高的,或者找到第一種情況而停止搜索
location優(yōu)先級從高到底:
(location =
) > (location 完整路徑
) > (location ^~ 路徑
) > (location ~,~* 正則順序
) > (location 部分起始路徑
) > (/
)
location=/{
#精確匹配/,主機名后面不能帶任何字符串/
[configurationA]
}
location/{
#匹配所有以/開頭的請求。
#但是如果有更長的同類型的表達式,則選擇更長的表達式。
#如果有正則表達式可以匹配,則優(yōu)先匹配正則表達式。
[configurationB]
}
location/documents/{
#匹配所有以/documents/開頭的請求,匹配符合以后,還要繼續(xù)往下搜索。
#但是如果有更長的同類型的表達式,則選擇更長的表達式。
#如果有正則表達式可以匹配,則優(yōu)先匹配正則表達式。
[configurationC]
}
location^~/images/{
#匹配所有以/images/開頭的表達式,如果匹配成功,則停止匹配查找,停止搜索。
#所以,即便有符合的正則表達式location,也不會被使用
[configurationD]
}
location~*.(gif|jpg|jpeg)${
#匹配所有以 gif jpg jpeg結(jié)尾的請求。
#但是以/images/開頭的請求,將使用ConfigurationD,D具有更高的優(yōu)先級
[configurationE]
}
location/images/{
#字符匹配到/images/,還會繼續(xù)往下搜索
[configurationF]
}
location=/test.htm{
root/usr/local/var/www/htm;
indexindex.htm;
}
注意:location的優(yōu)先級與location配置的位置無關(guān)
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
三、反向代理
反向代理應該是Nginx使用最多的功能了,反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡上的服務器,并將從服務器上得到的結(jié)果返回給internet上請求連接的客戶端,此時代理服務器對外就表現(xiàn)為一個反向代理服務器。
簡單來說就是真實的服務器不能直接被外部網(wǎng)絡訪問,所以需要一臺代理服務器,而代理服務器能被外部網(wǎng)絡訪問的同時又跟真實服務器在同一個網(wǎng)絡環(huán)境,當然也可能是同一臺服務器,端口不同而已。
反向代理通過proxy_pass
指令來實現(xiàn)。
啟動一個Java Web項目,端口號為8081
server{
listen80;
server_namelocalhost;
location/{
proxy_passhttp://localhost:8081;
proxy_set_headerHost$host:$server_port;
#設置用戶ip地址
proxy_set_headerX-Forwarded-For$remote_addr;
#當請求服務器出錯去尋找其他服務器
proxy_next_upstreamerrortimeoutinvalid_headerhttp_500http_502http_503;
}
}
當我們訪問localhost的時候,就相當于訪問 localhost:8081
了
四、負載均衡
負載均衡也是Nginx常用的一個功能,負載均衡其意思就是分攤到多個操作單元上進行執(zhí)行,例如Web服務器、FTP服務器、企業(yè)關(guān)鍵應用服務器和其它關(guān)鍵任務服務器等,從而共同完成工作任務。
簡單而言就是當有2臺或以上服務器時,根據(jù)規(guī)則隨機的將請求分發(fā)到指定的服務器上處理,負載均衡配置一般都需要同時配置反向代理,通過反向代理跳轉(zhuǎn)到負載均衡。而Nginx目前支持自帶3種負載均衡策略,還有2種常用的第三方策略。
負載均衡通過upstream指令來實現(xiàn)。
1. RR(round robin :輪詢 默認)
每個請求按時間順序逐一分配到不同的后端服務器,也就是說第一次請求分配到第一臺服務器上,第二次請求分配到第二臺服務器上,如果只有兩臺服務器,第三次請求繼續(xù)分配到第一臺上,這樣循環(huán)輪詢下去,也就是服務器接收請求的比例是 1:1, 如果后端服務器down掉,能自動剔除。輪詢是默認配置,不需要太多的配置
同一個項目分別使用8081和8082端口啟動項目
upstreamweb_servers{
serverlocalhost:8081;
serverlocalhost:8082;
}
server{
listen80;
server_namelocalhost;
#access_loglogs/host.access.logmain;
location/{
proxy_passhttp://web_servers;
#必須指定HeaderHost
proxy_set_headerHost$host:$server_port;
}
}
訪問地址仍然可以獲得響應 http://localhost/api/user/login?username=zhangsan&password=111111
,這種方式是輪詢的
2. 權(quán)重
指定輪詢幾率,weight和訪問比率成正比, 也就是服務器接收請求的比例就是各自配置的weight的比例,用于后端服務器性能不均的情況,比如服務器性能差點就少接收點請求,服務器性能好點就多處理點請求。
upstreamtest{
serverlocalhost:8081weight=1;
serverlocalhost:8082weight=3;
serverlocalhost:8083weight=4backup;
}
示例是4次請求只有一次被分配到8081上,其他3次分配到8082上。backup是指熱備,只有當8081和8082都宕機的情況下才走8083
3. ip_hash
上面的2種方式都有一個問題,那就是下一個請求來的時候請求可能分發(fā)到另外一個服務器,當我們的程序不是無狀態(tài)的時候(采用了session保存數(shù)據(jù)),這時候就有一個很大的很問題了,比如把登錄信息保存到了session中,那么跳轉(zhuǎn)到另外一臺服務器的時候就需要重新登錄了,所以很多時候我們需要一個客戶只訪問一個服務器,那么就需要用iphash了,iphash的每個請求按訪問ip的hash結(jié)果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。
upstreamtest{
ip_hash;
serverlocalhost:8080;
serverlocalhost:8081;
}
4. fair(第三方)
按后端服務器的響應時間來分配請求,響應時間短的優(yōu)先分配。這個配置是為了更快的給用戶響應
upstreambackend{
fair;
serverlocalhost:8080;
serverlocalhost:8081;
}
5. url_hash(第三方)
按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。在upstream中加入hash語句,server語句中不能寫入weight等其他的參數(shù),hash_method
是使用的hash算法
upstreambackend{
hash$request_uri;
hash_methodcrc32;
serverlocalhost:8080;
serverlocalhost:8081;
}
以上5種負載均衡各自適用不同情況下使用,所以可以根據(jù)實際情況選擇使用哪種策略模式,不過fair和url_hash需要安裝第三方模塊才能使用。
五、動靜分離
動靜分離是讓動態(tài)網(wǎng)站里的動態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動靜資源做好了拆分以后,我們就可以根據(jù)靜態(tài)資源的特點將其做緩存操作,這就是網(wǎng)站靜態(tài)化處理的核心思路。
upstreamweb_servers{
serverlocalhost:8081;
serverlocalhost:8082;
}
server{
listen80;
server_namelocalhost;
set$doc_root/usr/local/var/www;
location~*.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)${
root$doc_root/img;
}
location/{
proxy_passhttp://web_servers;
#必須指定HeaderHost
proxy_set_headerHost$host:$server_port;
}
error_page500502503504/50x.html;
location=/50x.html{
root$doc_root;
}
}
六、其他
1.return指令
返回http狀態(tài)碼 和 可選的第二個參數(shù)可以是重定向的URL
location/permanently/moved/url{
return301http://www.example.com/moved/here;
}
2. rewrite指令
重寫URI請求 rewrite,通過使用rewrite指令在請求處理期間多次修改請求URI,該指令具有一個可選參數(shù)和兩個必需參數(shù)。
第一個(必需)參數(shù)是請求URI必須匹配的正則表達式。
第二個參數(shù)是用于替換匹配URI的URI。
可選的第三個參數(shù)是可以停止進一步重寫指令的處理或發(fā)送重定向(代碼301或302)的標志
location/users/{
rewrite^/users/(.*)$/show?user=$1break;
}
3. error_page指令
使用error_page指令,您可以配置NGINX返回自定義頁面以及錯誤代碼,替換響應中的其他錯誤代碼,或?qū)g覽器重定向到其他URI。在以下示例中,error_page
指令指定要返回404頁面錯誤代碼的頁面(/404.html)。
error_page404/404.html;
4. 日志
訪問日志:需要開啟壓縮 gzip on; 否則不生成日志文件,打開log_format
、access_log
注釋
log_formatmain'$remote_addr-$remote_user[$time_local]"$request"'
'$status$body_bytes_sent"$http_referer"'
'"$http_user_agent""$http_x_forwarded_for"';
access_log/usr/local/etc/nginx/logs/host.access.logmain;
gzipon;
5. deny 指令
#禁止訪問某個目錄
location~*.(txt|doc)${
root$doc_root;
denyall;
}
6. 內(nèi)置變量
nginx的配置文件中可以使用的內(nèi)置變量以美元符$
開始,也有人叫全局變量。其中,部分預定義的變量的值是可以改變的。
-
$args
:#
這個變量等于請求行中的參數(shù),同$query_string
-
$content_length
:請求頭中的Content-length字段。 -
$content_type
:請求頭中的Content-Type字段。 -
$document_root
:當前請求在root指令中指定的值。 -
$host
:請求主機頭字段,否則為服務器名稱。 -
$http_user_agent
:客戶端agent信息 -
$http_cookie
:客戶端cookie信息 -
$limit_rate
:這個變量可以限制連接速率。 -
$request_method
:客戶端請求的動作,通常為GET或POST。 -
$remote_addr
:客戶端的IP地址。 -
$remote_port
:客戶端的端口。 -
$remote_user
:已經(jīng)經(jīng)過Auth Basic Module驗證的用戶名。 -
$request_filename
:當前請求的文件路徑,由root或alias指令與URI請求生成。 -
$scheme
:HTTP方法(如http,https)。 -
$server_protocol
:請求使用的協(xié)議,通常是HTTP/1.0或HTTP/1.1。 -
$server_addr
:服務器地址,在完成一次系統(tǒng)調(diào)用后可以確定這個值。 -
$server_name
:服務器名稱。 -
$server_port
:請求到達服務器的端口號。 -
$request_uri
:包含請求參數(shù)的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz
”。 -
$uri
:不帶請求參數(shù)的當前URI,$uri
不包含主機名,如”/foo/bar.html
”。 -
$document_uri
:與$uri
相同
審核編輯 :李倩
-
服務器
+關(guān)注
關(guān)注
12文章
8965瀏覽量
85087 -
代碼
+關(guān)注
關(guān)注
30文章
4723瀏覽量
68237 -
nginx
+關(guān)注
關(guān)注
0文章
142瀏覽量
12154
原文標題:Nginx 的 5 大應用場景,太實用了!
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論