Nginx常見問題

来源:https://www.cnblogs.com/1naonao/archive/2019/09/02/11449025.html
-Advertisement-
Play Games

Nginx常見問題 1. Nginx多Server優先順序 在開始處理一個http請求時,nginx會取出header頭中的Host變數,與nginx.conf中的每個server_name進行匹配,以此決定到底由哪一個server來處理這個請求,但nginx如何配置多個相同的server_name, ...


Nginx常見問題

1. Nginx多Server優先順序

在開始處理一個http請求時,nginx會取出header頭中的Host變數,與nginx.conf中的每個server_name進行匹配,以此決定到底由哪一個server來處理這個請求,但nginx如何配置多個相同的server_name,會導致server_name出現優先順序訪問衝突。

1.1 準備nginx對應的配置文件

[root@web01 conf.d]# cat server1.conf 
server {
    listen 80;
    server_name localhost test1.com;

    location / {
        root /code/test1;
        index index.html;
    }
}
[root@web01 conf.d]# cat server2.conf 
server {
    listen 80;
    server_name localhost test2.com;

    location / {
        root /code/test2;
        index index.html;
    }
}
[root@web01 conf.d]# cat server3.conf 
server {
    listen 80;
    server_name localhost test3.com;

    location / {
        root /code/test3;
        index index.html;
    }
}
[root@web01 conf.d]#

1.2 準備站點目錄

[root@web01 conf.d]# mkdir /code/test{1..3}
[root@web01 conf.d]# echo test1 > /code/test1/index.html
[root@web01 conf.d]# echo test2 > /code/test2/index.html
[root@web01 conf.d]# echo test3 > /code/test3/index.html

1.3 檢查語法提示衝突,忽略並重啟

[root@web01 conf.d]# nginx -t
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 conf.d]# nginx -s reload
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
[root@web01 conf.d]#

1.4 瀏覽器訪問測試

#根據功能變數名稱訪問測試正常

#根據ip訪問
#1. 用戶第一次訪問,讀取server1.conf配置返回結果
[root@lb01 ~]# curl 10.0.0.5
test1

#2. 此時將server1.conf修改為server4.conf重啟nginx
[root@lb01 conf.d]# mv server1.conf server4.conf
[root@lb01 conf.d]# nginx -s reload

#3. 再次訪問時,讀取server2.conf配置返回結果
[root@lb01 conf.d]# curl 10.0.0.5
test2

1.5 多Server_name優先順序總結

再開始處理一個HTTP請求時,Nginx會讀取header(請求頭)中的host,與每個server中的server_name進行匹配,來決定用哪一個server標簽來完成處理這個請求,有可能一個Host與多個server中的server_name都匹配,這個時候就會根據匹配優先順序來選擇實際處理的server。優先順序匹配結果如下:

1.首先選擇所有的字元串完全匹配的server_name。(完全匹配)
2.選擇通配符在前面的server_name,如.haoda.com www.haoda.com3.選擇通配符在後面的server_name,如bgx. haoda.com haoda.cn
4.最後選擇使用正則表達式匹配的server_name
5.如果全部都沒有匹配到,那麼將選擇在listen配置項後加入[default_server]的server塊
6.如果沒寫,那麼就找到匹配listen埠的第一個Server塊的配置文件

註意:當出現多個相同的server_name情況下,配置文件排序優先使用則會被調用,所以建議配置相同埠,不同功能變數名稱,這樣不會出現功能變數名稱訪問衝突。


2. Nginx禁止IP直接訪問

當用戶通過訪問IP或者未知功能變數名稱訪問你得網站的時候,你希望禁止顯示任何有效內容,可以給他返回500,目前國內很多機房都要求網站關閉空主機頭,防止未備案的功能變數名稱指向過來造成麻煩

2.1 Nginx禁止IP訪問

[root@lb01 conf.d]# cat server4.conf 
server {
    listen 80 default_server;           #預設優先返回;
    server_name _;                      #空主機頭或者IP;
    return 500;                         #直接返回500錯誤;
}

2.2 引流的方式將訪問的IP直接跳轉主站功能變數名稱

[root@lb01 conf.d]# cat server4.conf 
server {
    listen 80 default_server;
    server_name _;
    return 302 http://test1.com;
}

Nginx包含文件Include

一臺伺服器配置多個網站,如果配置都寫在nginx.conf主配置文件中,會導致nginx.conf主配置文件變得非常龐大而且可讀性非常的差。那麼後期的維護就變得麻煩。 假設現在希望快速的關閉一個站點,該怎麼辦? 1.如果是寫在nginx.conf中,則需要手動註釋,比較麻煩 2.如果是include的方式,那麼僅需修改配置文件的擴展名,即可完成註釋 Include包含的作用是為了簡化主配置文件,便於人類可讀。

inlcude /etc/nginx/online/*.conf #線上使用的配置

/etc/nginx/offline #保留配置,不啟用(下次使用在移動到online中)


Nginx路徑root與alias

root與alias路徑匹配主要區別在於nginx如何解釋location後面的uri,這會使兩者分別以不同的方式將請求映射到伺服器文件上,alias是一個目錄別名的定義,root則是最上層目錄的定義。

root的處理結果是:root路徑+location路徑alias的處理結果是:使用alias定義的路徑

1 使用root時,用戶訪問http://image.com/picture/1.jpg時,實際上Nginx會到/code/picture/目錄下找1.jpg文件

[root@lb01 conf.d]# cat image.conf 
server {
    listen 80;
    server_name image.com;

    location /picture {
        root /code;
    }
}

2 使用alias時,用戶訪問http://image.com/picture/1.jpg時,實際上Nginx會到/code/目錄下找1.jpg文件

[root@lb01 conf.d]# cat image.conf 
server {
    listen 80;
    server_name image.com;

    location /picture {
        alias /code;
    }
}

-c

3 線上一般配置

server {
    listen 80;
    server_name image.oldboy.com;

    location / {
        root /code;
    }

    location ~* ^.*\.(png|jpg|gif)$ {
        alias /code/images/;
    }
}

Nginx try_file路徑匹配

nginx的try_file路徑匹配,Nginx會按順序檢查文件及目錄是否存在(根據 root 和 alias 指令設置的參數構造完整的文件路徑),並用找到的第一個文件提供服務。在元素名後面添加斜杠 / 表示這個是目錄。如果文件和目錄都不存在,Nginx會執行內部重定向,跳轉到命令的最後一個 uri 參數定義的 URI 中。

1 Nginx try_file配置實例1

#1. 配置nginx
[root@lb01 conf.d]# vim try.conf 
server {
    listen 80;
    server_name try.haoda.com;
    root /code;
    index index.html;

    location / {
        try_files $uri /404.html;
    }
}

#2. 創建實例目錄與文件
[root@lb01 conf.d]# echo try11111 > /code/index.html 
[root@lb01 conf.d]# echo '404 404 404' > /code/404.html

#3. 嘗試訪問try.haoda.com
[root@lb01 conf.d]# curl try.haoda.com
404 404 404
#由於訪問的是try.haoda.com,而$uri取得是功能變數名稱後面我們寫的內容,它找不到,所以返回後面的內容,即404.html

#4. 嘗試訪問try.haoda.com/index.html
[root@lb01 conf.d]# curl try.haoda.com/index.html
try11111
#由於訪問的是try.haoda.com/index.html,而$uri取到了index.html所以返回/code/index.html的內容

#5. 修改配置為
location / {
    try_files $uri $uri/ /404.html;
}

#6. 再次嘗試訪問try.haoda.com
[root@lb01 conf.d]# curl try.haoda.com
try11111
#我們訪問的是try.haoda.com,而$uri我們沒有寫任何內容,於是他訪問的便是“空/”,即匹配到/code/index.html

舉例

location /images/ {
        try_files $uri $uri/ /404.html;
}

用戶請求try.haoda.com/images/image1.gif,Nginx 會首先通過用於這個 location,在本地目錄中查找這個文件。如果“image1.gif”文件不存在,Nginx 會查找“image1.gif/”目錄,即“try.haoda.com/images/image1.gif/”,如果都不存在,會重定向到“/404.html”

2 Nginx try_file配置實例2

#1. 配置nginx
[root@lb01 conf.d]# cat try.conf 
server {
    listen 80;
    server_name try.haoda.com;
    root /code;
    index index.html;

    location / {
        try_files $uri $uri/ @java;             #當$uri和$uri/都匹配不到時,由後端的java來進行處理,名字可自定義,但一定要加@
    }

    location @java {
    proxy_pass http://172.16.1.8:8080;          #配置後端tomcat
    }
}

#2. 配置後端tomcat
[root@web02 ~]# cd /usr/share/tomcat/webapps/ROOT
[root@web02 ROOT]# echo 'i am tomcat' > index.html
[root@web02 ROOT]# systemctl start tomcat

#3. 把文件都挪走
[root@lb01 code]# mv index.html index1.html /tmp/

#4. 測試訪問
[root@lb01 code]# curl http://try.haoda.com/index.html
i am tomcat

Nginx調整上傳文件大小

在nginx使用上傳文件的過程中,通常需要設置保溫大小限制,避免出現413 Request Entity Too Large

nginx上傳文件大小限制配置語法

Syntax:  client_max_body_size size;
Default: client_max_body_size 1m;
Context: http, server, location

nginx長傳文件大小限制配置示例

#也可以放入http層,全局生效
server {
    listen 80;
    server_name _;
    client_max_body_size 200m;
}

Nginx優雅顯示錯誤頁面

error_page錯誤日誌

1 第一種配置情況(跳轉網路地址)

#error_page配置的是http這種的網路地址
[root@lb01 conf.d]# cat error.conf 
server {
    listen       80;
    server_name  www.haoda.com;
    root /code;
    #error_page  404  http://www.baidu.com;

    location / {
        index index.html;
        error_page  404  http://www.baidu.com;
    }    
}

2 第二種配置情況(跳轉本地地址)

[root@lb01 conf.d]# cat error.conf 
server {
    listen 80;
    server_name error.haoda.com;
    root /code;

    location / {
        index index.html;
    }

    #error_page  403 404  /404.jpg;

    error_page 403 404 /404.html;
    location = /404.html {
        root /code;
        index index.html;   
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • .NET Core ASP.NET Core Basic 1 2 本節內容為控制反轉與依賴註入 簡介 控制反轉IOC 這個內容事實上在我們的C 高級篇就已經有所講解,控制反轉是一種設計模式,你可以這樣理解控制反轉,假設有一個人他有一部A品牌手機,他用手機進行聽歌、打游戲,那麼你可以創建一個手機類和一 ...
  • ==>>點擊查看本系列文章目錄 上節中有談到的是通信主機(TransportHost),本節中主機(ServiceHost)負責管理服務的生命周期。 項目中將兩個主機拆分開,實現不同的功能: 通信主機:用於啟動通信監聽埠; 生命周期管理的主機:負責模塊功能的依賴註入,管理生命周期。 先看一下啟動服 ...
  • windows terminal 是今年微軟Build大會上推出的一款的全新終端,用來代替cmder之類的第三方終端。具有亞克力透明、多標簽、Unicode支持(中文,Emoji)、自帶等寬字體等這些特性。 現在可以在微軟商店裡面進行安裝,系統要求是win10 1903及以上,不過目前還是previ ...
  • 最近做項目的時候遇見了一個問題,通過jq將動態節點綁定到dom節點上,並且為動態節點綁定方法,此方法再次為動態節點添加動態節點,但在刷新之後,動態節點上的方法失效了,過程為:創建動態節點->動態節點綁定方法->添加動態節點->刷新後點擊動態節點方法失效。 <!DOCTYPE html><html> ...
  • 仿照Ubuntu下的磁碟使用情況分析器用WPF做了個類似的軟體,參考https://github.com/Caliburn-Micro/Caliburn.Micro/tree/3.2.0/samples/features/Features.WPF使用Caliburn.Micro框架完成 項目地址:h ...
  • 1.新建用戶wwweee000 2.#Port 22欄位刪掉,將22改為其他不被使用的埠,伺服器埠最大可以開到65536.//註意Port是大寫的"P" 上面還是不能滿足輸出結果:我們只要Port 22的答案. -n顯示行號;\反斜杠實質定義 3.不使用vi/vim進行修改Port 22 為 4 ...
  • 全能系統監控工具dstat dstat 是一個可以取代vmstat,iostat,netstat和ifstat這些命令的多功能產品。dstat剋服了這些命令的局限並增加了一些另外的功能,增加了監控項,也變得更靈活了。dstat可以很方便監控系統運行狀況並用於基準測試和排除故障。 dstat可以讓你實 ...
  • 問題產生原因: 手動設置MSSQLSERVER 運行記憶體,設置值未達到MSSQLSERVER 服務運行記憶體最低值(max server memory 所允許的最小記憶體量是 128 MB。),導致MSSQLSERVER 服務啟動失敗; 處理方法: 根據網上資料獲知,可從DOS界面啟動MSSQLSERV ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...