nginx使用詳解:轉發規則、負載均衡、server_name

文章目錄

  • 一、nginx常用的轉發規則
    • location 指令說明
    • location轉發使用
  • 二、upstream負載均衡使用
  • 三、server_name使用
  • 四、其他常用配置
    • 限制請求類型
    • 處理靜態資源目錄遍歷問題
    • 限制客戶端使用的ip或者域名
  • 五、需要注意的地方
    • location /api1 探討
    • location ~ /api1 探討(正則表達式)
    • $host 和 $remote_addr 的區別
  • 其他
    • Rewrite命令語法
    • springboot 打印請求路徑
    • springboot打印controller被調用的方法
    • Controller獲取請求頭的內容
  • 參考文檔

一、nginx常用的轉發規則

location 指令說明

  • 該指令用于匹配 URL,語法如下:
指令說明
=用于不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,如果匹配 成功,就停止繼續向下搜索并立即處理該請求。
~用于表示 uri 包含正則表達式,并且區分大小寫。
~*用于表示 uri 包含正則表達式,并且不區分大小寫。
^~用于不含正則表達式的uri前,要求Nginx服務器找到標識uri和請求字 符串匹配度最高的 location 后,立即使用此 location 處理請求,而不再使用 location 塊中的正則 uri 和請求字符串做匹配。
!~區分大小寫不匹配。
!~*不區分大小寫不匹配
/a普通前綴匹配,優先級低于帶參數前綴匹配。
/任何請求都會匹配
  • 首先匹配 =
  • 其次匹配^~,
  • 其次是按文件中順序的正則匹配
  • 最后是交給 / 通用匹配
  • 當有匹配成功時候,停止匹配,按當前匹配規則處理請求。

location轉發使用

  • location /api1/
# 如果請求的是:http://localhost:80/api1,
# 轉發形成的就會是:http://localhost:8001/location /api1/ {proxy_pass http://localhost:8001/;}       
  • location = /api1/ (精確匹配)
# 如果請求的是:http://localhost:80/api1,會被匹配到
# 轉發形成的就會是:http://localhost:8001/
# 如果請求的是:http://localhost:80/api1/test,不會被匹配到,因為是精確匹配location = /api1/ {proxy_pass http://localhost:8001/;}
  • location ~ /api1 (正則表達式匹配)
# rewrite重寫了請求路徑,break不可省略,$1為正則匹配的內容
# ^/api1/(.*)$,在這個正則表達式中,$1為(.*)中的內容
# proxy_set_header的使用并不會失效
# 如果請求的是:http://localhost:80/api1,
# 轉發形成的就會是:http://localhost:8001/location ~ /api1 {	rewrite ^/api1/(.*)$ /$1 break;proxy_set_header test001 $host:$server_port;proxy_set_header test002 $remote_addr;proxy_pass http://localhost:8001;}

二、upstream負載均衡使用

#server只能是ip+端口,不然啟動報錯upstream api{server localhost:9001;server localhost:9002;server localhost:9003;}
#proxy_pass里面的api對應的是upstream后面的apilocation /api/ {	proxy_pass http://api/;}

三、server_name使用

  • 看下列代碼,端口一樣,server_name不一樣
  • 訪問http://www.test001.com/api/test,進入第一個server,轉發的實際為http://localhost:9001/test
  • 訪問http://www.test002.com/api/test,進入第二個server,轉發的實際為http://localhost:9002/test
  • 對于沒有配置的server_name,默認進入第一個server處理
  • 訪問http://127.0.0.1/api/test,進入第一個server,轉發的實際為http://localhost:9001/test
  • 訪問http://www.test003.com/api/test,進入第一個server,轉發的實際為http://localhost:9001/test
#本機host配置
127.0.0.1 www.test001.com
127.0.0.1 www.test002.com
127.0.0.1 www.test003.com
    server {						#監聽端口listen       80;		#服務名server_name  www.test001.com;		location / {root   html;index  index.html index.htm;}location /api/ {	proxy_pass http://localhost:9001/;}#500類型錯誤處理error_page   500 502 503 504  /50x.html;#映射文件50x.htmllocation = /50x.html {	#相對路徑root   html;}}server {						#監聽端口listen       80;		#服務名server_name  www.test002.com;		location / {root   html;index  index.html index.htm;}location /api/ {	proxy_pass http://localhost:9002/;}#500類型錯誤處理error_page   500 502 503 504  /50x.html;#映射文件50x.htmllocation = /50x.html {	#相對路徑root   html;}}

四、其他常用配置

限制請求類型

  • 只允許GET和POST請求,寫在server塊
if($request_method !~ ^(GET|POST)$ ){return 403;
}

處理靜態資源目錄遍歷問題

  • 過濾…/ |…\,寫在server塊
if( $request_uri ~* \.\.[\\\\/] ){return 404;
}

限制客戶端使用的ip或者域名

  • 寫在server塊
#當寫127.0.0.1的時候,使用localhost會報500,只能使用127.0.0.1
if ( $host !~ ^127.0.0.1 ){return 500;
}

五、需要注意的地方

  • 當使用 location ~ 的時候, proxy_pass結尾不能為 / ,不然會報錯
  • access_log需要寫在log_format后面,不然啟動會報錯。
  • access_log只能打印出請求的路徑,無法打印出代理之后的路徑。

location /api1 探討

# 如果請求的是:http://localhost:80/api1,
# 轉發形成的就會是:http://localhost:8001/api1location /api1 {proxy_pass http://localhost:8001;}        
# 如果請求的是:http://localhost:80/api1,
# 轉發形成的就會是:http://localhost:8001/location /api1/ {proxy_pass http://localhost:8001/;}        
# 如果請求的是:http://localhost:80/api1,
# 轉發形成的就會是:http://localhost:8001//location /api1 {proxy_pass http://localhost:8001/;}     

location ~ /api1 探討(正則表達式)

#proxy_pass最多只能寫到端口
#比如http://localhost:9001/,多個/報錯
#比如http://localhost:9001/test,多個/test報錯
#所以正則表達式的轉發經常配合rewrite使用location ~ /api1 {	proxy_pass http://localhost:9001;}

$host 和 $remote_addr 的區別

  • $host 是客戶端使用的ip或者域名,$remote_addr是客戶端真正的ip
# $host為127.0.0.1
# $remote_addr為127.0.0.1
http://127.0.0.1/api/test# $host為www.test001.com
# $remote_addr為127.0.0.1
http://www.test001.com/api/test# $host為localhost
# $remote_addr為127.0.0.1
http://localhost/api/test# 假設我本機ip為192.168.1.27
# $host為www.baidu.com
# $remote_addr為192.168.1.27
https://www.baidu.com/s?wd=北京

其他

Rewrite命令語法

rewrite < regex > < replacement > [flag]
regex:正則表達式
replacement :跳轉后的內容
flag:rewrite支持的flag標記
flag標記說明
標記說明
last相當于Apache的【L】標記,表示完成rewrite
break本條規則匹配完成即終止,不在匹配后面的任何規則
redirect返回302臨時重定向,瀏覽器地址欄會顯示跳轉后的URL地址,爬蟲不會更新url
permanent返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址,爬蟲更新url
ast和break比較
lastbreak
使用場景一般寫在server和if中一般使用在location中
URL匹配不重質重寫后的url匹配終止重寫后的url匹配
#$1為(.*)
rewrite ^/api1/(.*)$ /$1 break;#$1為前面的(.*),$2為后面的(.*)
rewrite ^/(.*)/(.*)$ /$1 break;#當正則表達式和請求不匹配的時候,后面的/$1將不被執行,請求不會被rewrite替換
rewrite ^/apitest/(.*)$ /$1 break;

springboot 打印請求路徑

logging:level:org.springframework: debug

springboot打印controller被調用的方法

logging:level:org:springframework:web:servlet:mvc:method:annotation:RequestMappingHandlerMapping: trace

Controller獲取請求頭的內容

HttpServletRequest request;
Enumeration<String> enumeration= request.getHeaderNames();

參考文檔

  • springboot 打印請求的uri和請求參數
  • Servlet–HttpServletRequest獲取請求信息(請求頭、請求行、參數)詳解
  • Nginx配置文件
  • Nginx之正則表達式、location匹配簡介以及rewrite重寫
  • nginx 正則路徑匹配
  • Nginx的基本使用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161032.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161032.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DataFunSummit:2023年OLAP引擎架構峰會-核心PPT資料下載

一、峰會簡介 OLAP技術是當前大數據領域的熱門方向&#xff0c;該領域在各個行業都有廣泛的使用場景&#xff0c;對OLAP引擎的功能有豐富多樣的需求。同時&#xff0c;在性能、穩定性和成本方面&#xff0c;也有諸多挑戰。目前&#xff0c;OLAP技術沒有形成統一的事實標準&…

redis性能管理

redis的數據庫是存放在內存當中&#xff0c;所以對內存的監控至關重要 redis內存監控和解析 1.如何查看redis內存使用情況 [rootlocalhost utils]# redis-cli -h 20.0.0.170 -p 6379 20.0.0.170:6379> info memory used_memory:853336 //redis中數據占用的內存 use…

觸發設備離線

業務場景 業務開發過程中&#xff0c;我們經常會需要判斷遠程終端是否在線&#xff0c;當終端離線的時候我們需要發送消息告知相應的系統&#xff0c; 環形隊列 1.創建一個index從0到30的環形隊列&#xff08;本質是個數組&#xff09; 2.環上每一個slot是一個Set&#xf…

python 執行系統命令

subprocess 模塊和 os.system 或 os.popen 等函數相比&#xff0c;功能更為強大和靈活&#xff0c;是 Python 官方推薦的執行系統命令的方法。主要的優勢包括&#xff1a; 更強的錯誤處理&#xff1a;subprocess 模塊可以更精細地控制錯誤輸出和錯誤代碼&#xff0c;而 os.syst…

自定義springboot的生命周期函數在項目啟動完成后去取配置文件中的值

主要是實現smartLifecycle類 package com.ruoyi.workflow.util;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springfr…

MYSQL索引使用注意事項

索引使用注意事項&#xff1a; 1.索引列運算 不要在索引列上進行運算操作&#xff0c;否則索引將失效&#xff1b; 2.字符串不加引號 字符串類型使用時&#xff0c;不加引號&#xff0c;否則索引將失效&#xff1b; 3.模糊查詢 如果僅僅是尾部模糊匹配&#xff0c;索引將不會失…

防火墻暴露端口

如果你想開通防火墻上的端口&#xff0c;具體的操作方式可能會取決于你所使用的操作系統。以下是一些常見操作系統的步驟&#xff1a; 1. Linux&#xff08;例如&#xff0c;Ubuntu 或 CentOS&#xff09;: 使用 ufw&#xff08;適用于 Ubuntu&#xff09;&#xff1a; # 開…

RK平臺查看板子上的dts信息

簡介 dts文件描述了硬件每個模塊的信息&#xff0c;我們嵌入式軟件的調試很多時候都是在改dts文件&#xff0c;有時候我們不確定板子上的固件是否已經更新了我們的修改&#xff0c;這時候我們可以直接讀取板子上的dts信息&#xff0c;下面來演示一下。 進入uboot命令行模式 …

關于軟raid的實現及常見問題

RAID概念 磁盤陣列&#xff08;Redundant Arrays of Independent Disks&#xff0c;RAID&#xff09;&#xff0c;有“獨立磁盤構成的具有冗余能力的陣列”之意。 磁盤陣列是由很多價格較便宜的磁盤&#xff0c;以硬件&#xff08;RAID卡&#xff09;或軟件&#xff08;MDADM&…

關于用css設置input輸入框hover的時候的樣式以及當input為disabled的時候,不要讓hover樣式生效

效果如果&#xff1a; 編輯狀態下的時候&#xff1a; 只讀狀態下的時候&#xff1a; 代碼如圖&#xff1a; <input type"text" name"dataForm.exportCode" id"exportCodeItem" required :disabled"editDisabled" />input:not(…

【前端學java】語法練習-工具類的封裝(13)

往期回顧&#xff1a; 【前端學java】JAVA開發的依賴安裝與環境配置 &#xff08;0&#xff09;【前端學 java】java的基礎語法&#xff08;1&#xff09;【前端學java】JAVA中的packge與import&#xff08;2&#xff09;【前端學java】面向對象編程基礎-類的使用 &#xff08…

java.net.UnknownHostException: eureka

java.net.UnknownHostException: eureka 哦。HOST漏了 #linux /etc/hosts #windows C:\Windows\System32\drivers\etc\hosts 127.0.0.1 eureka7000 127.0.0.1 eureka7001 127.0.0.1 eureka7002

maven打包可執行jar含依賴lib

修改pom.xml <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!-- jdk8可用&#xff0c;其他jdk版本可能需改插件版本 --><version>2.3.7.RE…

sql調優

慢查詢 SQL 治理方案 一、SQL 性能下降的原因 在對 SQL 進行分析之前&#xff0c;需要明確可能導致 SQL 執行性能下降的原因進行分析&#xff0c;執行性能下降可以體現在很多方面&#xff1a; 查詢語句寫的爛索引沒加好表數據過大數據庫連接數不夠查詢的數據量過大被其他慢s…

MyBatisPlus代碼生成

基礎依賴 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

visual studio 如何建立 C 語言項目

安裝這個 模塊。 新建 空項目 創建完成 寫demo 點擊運行&#xff1a;

【1day】泛微e-office OA系統user_page接口未授權訪問漏洞學習

注:該文章來自作者日常學習筆記,請勿利用文章內的相關技術從事非法測試,如因此產生的一切不良后果與作者無關。 目錄 一、漏洞描述 二、影響版本 三、資產測繪 四、漏洞復現

Web項目從Tomcat遷移到TongWeb

注意事項 1. 使用JNDI方式獲取數據源&#xff1a; ①在TongWeb創建JDBC連接池; ②修改Web項目數據源配置. #spring.datasource.urljdbc:mysql://127.0.0.1:3306/demo #spring.datasource.usernametest #spring.datasource.passwordspring.datasource.jndi-namedemo2. 修…

Spring cloud - Hystrix源碼

其實只是Hystrix初始化部分&#xff0c;我們從源碼的角度分析一下EnableCircuitBreaker以及HystrixCommand注解的初始化過程。 從EnableCircuitBreaker入手 我們是通過在啟動類添加EnableCircuitBreaker注解啟用Hystrix的&#xff0c;所以&#xff0c;源碼解析也要從這個注解…