主頁 >  其他 > Nginx常用配置及和基本功能講解

Nginx常用配置及和基本功能講解

2023-04-27 07:57:56 其他

作者:京東物流 殷世杰

Nginx已經廣泛應用于J-one和Jdos的環境部署上,本文對Nginx的常用的配置和基本功能進行講解,適合Nginx入門學習,

1 核心配置

找到Nginx安裝目錄下的conf目錄下nginx.conf檔案,Nginx的基本功能配置是由它提供的,

Nginx的組態檔(conf/nginx.conf)整體上分為如下幾個部分: :

區域 職責
全域塊 配置和Nginx運行相關的全域配置
events塊 配置和網路鏈接相關的配置
http塊 配置代理、快取、日志記錄、虛擬主機等配置
server塊 配置虛擬主機的相關引數,一個http快中可以有多個server塊
location塊 配置請求的路由,以及各種頁面的處理情況

配置層級圖如下所示,

1.2 組態檔示例

一個比較全的組態檔示例如下,

# 以下是全域段配置
#user administrator administrators;  #配置用戶或者組,默認為nobody nobody,
#worker_processes 2;  #設定行程數,默認為1
#pid /nginx/pid/nginx.pid; #指定nginx行程運行檔案存放地址
error_log log/error.log debug;  #制定日志路徑,級別:debug|info|notice|warn|error|crit|alert|emerg
# events段配置資訊
events {
    accept_mutex on;   #設定網路連接序列化,防止驚群現象發生,默認為on
    multi_accept on;  #設定一個行程是否同時接受多個網路連接,默認為off
    #use epoll;      #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大連接數,默認為512
}
# http、配置請求資訊
http {
    include       mime.types;   #檔案擴展名與檔案型別映射表
    default_type  application/octet-stream; #默認檔案型別,默認為text/plain
    #access_log off; #取消服務日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
    access_log log/access.log myFormat;  #combined為日志格式的默認值
    sendfile on;   #允許sendfile方式傳輸檔案,默認為off,可以在http塊,server塊,location塊,
    sendfile_max_chunk 100k;  #每個行程每次呼叫傳輸數量不能大于設定的值,默認為0,即不設上限,
    keepalive_timeout 65;  #連接超時時間,默認為75s,可以在http,server,location塊,


    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #熱備
    }
    error_page 404 https://www.baidu.com; #錯誤頁
    # 第一個Server區塊開始,表示一個獨立的虛擬主機站點
    server {
        keepalive_requests 120; #單連接請求上限次數,
        listen       4545;   #監聽埠
        server_name  127.0.0.1;   #監聽地址       
        location  ~*^.+$ {       #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫,
           #root path;  #根目錄
           #index vv.txt;  #設定默認頁
           proxy_pass  http://mysvr;  #請求轉向mysvr 定義的服務器串列
           deny 127.0.0.1;  #拒絕的ip
           allow 172.18.5.54; #允許的ip           
        } 
    }
}


1.3 locat路徑映射講解

1.3.1格式:

location [ = | ~ | ~* | !~ | !~* | @ ] uri {...}

1.3.2解釋:

= 表示精確匹配,如果找到,立即停止搜索并立即處理此請求,
表示執行一個正則匹配,區分大小寫匹配

~* 表示執行一個正則匹配,不區分大小寫匹配

!~ 區分大小寫不匹配

!~* 不區分大小寫不匹配

^~ 即表示只匹配普通字符(空格),使用前綴匹配,^表示“非”,即不查詢正則運算式,如果匹配成功,則不再匹配其他location,

@ 指定一個命名的location,一般只用于內部重定向請求,例如 error_page, try_files

uri 是待匹配的請求字串,可以不包含正則運算式,也可以包含正則運算式;

1.3.3優先級和示例:

  • [不加] < [/*] < [^~] < [=]

  • 示例如下:

location = / {
    # 精確匹配/,主機名后面不能帶任何字串 /
    # 只匹配http://abc.com
    # http://abc.com [匹配成功]
    # http://abc.com/index [匹配失敗]
}
location ^~ /img/ {
      #以 /img/ 開頭的請求,都會匹配上
    #http://abc.com/img/a.jpg   [成功]
    #http://abc.com/img/b.mp4  [成功]
    }
location ~* /Example/ {
  # 則會忽略 uri 部分的大小寫
  #http://abc.com/test/Example/ [匹配成功]
  #http://abc.com/example/ [匹配成功]
}
location /documents {
    # 如果有正則運算式可以匹配,則優先匹配正則運算式,
    #http://abc.com/documentsabc [匹配成功]
}
location / {
    #http://abc.com/abc [匹配成功]
}


2 反向代理

2.1 反向代理概念:

反向代理(Reverse Proxy)是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網路上的服務器,并將從服務器上得到的結果回傳給internet上請求連接的客戶端,真實的服務器不能直接被外部網路訪問,所以需要一臺代理服務器,而代理服務器能被外部網路訪問的同時又跟真實服務器在同一個網路環境,當然也可能是同一臺服務器,埠不同而已,

反向代理通過proxy_pass指令來實作,

2.2 反向代理示例:

server {
    listen       80;
    server_name  localhost;


    location / {
         proxy_pass http://localhost:8081;
         proxy_set_header Host $host:$server_port;#為請求頭添加Host欄位,用于指定請求服務器的域名/IP地址和埠號,  


         # 設定用戶ip地址
         proxy_set_header X-Forwarded-For $remote_addr;#為請求頭添加XFF欄位,值為客戶端的IP地址,
         # 當請求服務器出錯去尋找其他服務器
         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
    


當我們訪問localhost的時候,ngnix就將我們的請求轉到 localhost:8081了

3 負載均衡

3.1 負載均衡概念:

當有2臺或以上服務器時,代理服務器根據規則將請求分發到指定的服務器上處理,

3.2 負載均衡策略及示例:

Nginx目前支持多種負載均衡策略,這里講解常用的6種,

3.2.1RR(round robin :輪詢 默認):

每個請求按時間順序逐一分配到不同的后端服務器,也就是說第一次請求分配到第一臺服務器上,第二次請求分配到第二臺服務器上,如果只有兩臺服務器,第三次請求繼續分配到第一臺上,這樣回圈輪詢下去,也就是服務器接收請求的比例是 1:1, 如果后端服務器down掉,能自動剔除,輪詢是默認配置,不需要太多的配置

同一個專案分別使用8081和8082埠啟動專案

upstream web_servers {
   server localhost:8081;
   server localhost:8082;
}




server {
    listen       80;
    server_name  localhost;
    #access_log  logs/host.access.log  main;
    location / {
        proxy_pass http://web_servers;
        proxy_set_header Host $host:$server_port;
    }
 


3.2.2 熱備:

假設有2臺服務器,當一臺服務器發生事故時,才啟用第二臺服務器給提供服務,服務器處理請求的順序:AAAAAA突然A掛了,服務器處理請求的順序:BBBBBBBBBBBBBB.....

upstream web_servers {
      server 127.0.0.1:7878; 
      server 192.168.10.121:3333 backup;  #熱備     
    }


3.2.3 權重

跟據配置的權重的大小而分發給不同服務器不同數量的請求,如果不設定,則默認為1,下面服務器的請求順序為:ABBABBABBABBABB....,

upstream web_servers {
    server localhost:8081 weight=1;
    server localhost:8082 weight=2;
}


3.2.4 ip_hash

這樣每個ip地址固定訪問一個后端服務器,可以解決session的問題,

upstream test {
    ip_hash;
    server localhost:8080;
    server localhost:8081;
}


3.2.5 fair(第三方)

按后端服務器的回應時間來分配請求,回應時間短的優先分配,這個配置是為了更快的給用戶回應,

upstream backend {
    fair;
    server localhost:8080;
    server localhost:8081;
}


3.2.6 url_hash(第三方)

按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為快取時比較有效,在upstream中加入hash陳述句,hash_method是使用的hash演算法

upstream backend {
    hash_method crc32;
    hash $request_uri;
    server localhost:8080;
    server localhost:8081;
}


以上6種負載均衡各自適用不同情況下單獨或者混合使用,可以根據實際情況選擇使用,fair和url_hash需要安裝第三方模塊才能使用,

4 動靜分離:

4.1 動靜分離概念:

動靜分離是指在web服務器架構中,將靜態頁面與動態頁面或者靜態內容介面和動態內容介面分開不同系統訪問的架構設計方法,進而提升整個服務訪問性能和可維護性,

4.2 動靜分離示例:

upstream web_servers {
       server localhost:8081;
       server localhost:8082;
}
server {
    listen       80;
    server_name  localhost;
    set $doc_root /usr/local/var/www;


    location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
       root $doc_root/img;
    }
    location / {
        proxy_pass http://web_servers;
        proxy_set_header Host $host:$server_port;
    }
    error_page 500 502 503 504  /50x.html;  #出現 500 502 503 504錯誤時走內部跳轉
    location = /50x.html { 
        root $doc_root;
    }
 }


結果:訪問http://localhost/test.jpg時直接回傳/usr/local/var/www/img路徑下的圖片.

訪問http://localhost/index.html就會訪問后端服務器(tomcat等)

5 其他常用的指令:

5.1.return指令

回傳http狀態碼和可選的第二個引數可以是重定向的URL

return code [text];
return code URL;
return URL;
例如:
location / {
 return 404; # 直接回傳狀態碼
}
location / {
 return 404 "pages not found"; # 回傳狀態碼 + 一段文本
}
location / {
 return 302 /bbs ; # 回傳狀態碼 + 重定向地址
}
location / {
 return https://www.baidu.com ; # 回傳重定向地址
}


5.2 rewrite指令

重寫URI請求 rewrite,通過使用rewrite指令在請求處理期間多次修改請求URI,該指令具有一個可選引數和兩個必需引數,

第一個(必需)引數是請求URI必須匹配的正則運算式,

第二個引數是用于替換匹配URI的URI,

可選的第三個引數重寫策略

  • last 重寫后的 URL 發起新請求,再次進入 server 段,重試 location 的中的匹配;

  • break 直接使用重寫后的 URL ,不再匹配其它 location 中陳述句;

  • redirect 回傳302臨時重定向;

  • permanent 回傳301永久重定向;

location /users/ {
    rewrite ^/users/(.*)$ /show?user=$1 break;
}


5.3 error_page指令

使用error_page指令,您可以配置NGINX回傳自定義頁面以及錯誤代碼,替換回應中的其他錯誤代碼,或將瀏覽器重定向到其他URI,在以下示例中,error_page指令指定要回傳404頁面錯誤代碼的頁面(/404.html),

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


5.4 日志

訪問日志:需要開啟壓縮 gzip on; 否則不生成日志檔案,打開log_format、access_log注釋

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  /usr/local/etc/nginx/logs/host.access.log  main;




gzip 


5.5 deny 、allow指令

#禁止訪問某個目錄
location / {
    allow 192.168.0.0;
    allow 127.0.0.1;
    deny all;
#這段配置值允許192.168.0./24網段和127.0.0.1的請求,其他來源IP全部拒絕,
}




5.6 內置變數

nginx的組態檔中可以使用的內置變數以美元符$開始,其中,大部分預定義的變數的值由客戶端發送攜帶,

  • \(args :#這個變數等于請求行中的引數,同\)query_string

  • $content_length :請求頭中的Content-length欄位,

  • $content_type :請求頭中的Content-Type欄位,

  • $document_root :當前請求在root指令中指定的值,

  • $host :請求行的主機名,為空則為請求頭欄位 Host 中的主機名,再為空則與請求匹配的server_name

  • $http_user_agent :客戶端agent資訊

  • $http_cookie :客戶端cookie資訊

  • $limit_rate :這個變數可以限制連接速率,

  • $request_method :客戶端請求的動作,通常為GET或POST,

  • $remote_addr :客戶端的IP地址,

  • $remote_port :客戶端的埠,

  • $remote_user :已經經過Auth Basic Module驗證的用戶名,

  • $request_filename :當前請求的檔案路徑,由root或alias指令與URI請求生成,

  • $scheme :HTTP方法(如http,https),

  • $server_protocol :請求使用的協議,通常是HTTP/1.0或HTTP/1.1,

  • $server_addr :服務器地址,在完成一次系統呼叫后可以確定這個值,

  • $server_name :服務器名稱,

  • $server_port :請求到達服務器的埠號,

  • $request_uri :包含請求引數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”,

  • \(uri :不帶請求引數的當前URI,\)uri不包含主機名,如”/foo/bar.html”,

  • \(document_uri :與\)uri相同

6 總結

Ngnix是一款高性能反向代理服務器,學習它非常有必要,本文講解了Ngnix核心配置,介紹了反向代理,負載均衡,動靜分離三大功能,最后擴展了一些常用的指令,本文介紹了Ngnix的基礎用法,后續的Ngnix內核以及原理部分有待研究,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/551302.html

標籤:其他

上一篇:如何在jmeter中把回應中的資料提取出來并參考

下一篇:返回列表

標籤雲
其他(158186) Python(38107) JavaScript(25394) Java(18001) C(15217) 區塊鏈(8260) C#(7972) AI(7469) 爪哇(7425) MySQL(7148) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5870) 数组(5741) R(5409) Linux(5329) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4562) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2431) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1960) Web開發(1951) HtmlCss(1927) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1855) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • Nginx常用配置及和基本功能講解

    Nginx已經廣泛應用于J-one和Jdos的環境部署上,本文對Nginx的常用的配置和基本功能進行講解,適合Nginx入門學習。 ......

    uj5u.com 2023-04-27 07:57:56 more
  • 如何在jmeter中把回應中的資料提取出來并參考

    jmeter做介面測驗程序中,經常遇到請求需要用到token的時候,我們可以把回傳token的介面用后置處理器提取出來,但是在這種情況下,只能適用于當前的執行緒組,其他執行緒組無法參考到提取的token變數值,所以必須要生成全域變數讓測驗計劃下的所有執行緒組都可以參考變數。 ......

    uj5u.com 2023-04-27 07:57:17 more
  • 【Excel統計分析插件】上海道寧為您提供統計分析、資料可視化和

    Analyse-it與許多Excel加載項開發人員不同,使用完善的軟體開發和QA實踐,包括單元/集成/系統測驗、敏捷開發、代碼審查、問題跟蹤和用于變更管理的、源代碼控制 ......

    uj5u.com 2023-04-27 07:50:57 more
  • 04-1 氣體燃料燃燒:擴散火焰與預混火焰、層流火焰傳播速度

    擴散火焰與預混火焰的火焰形式 擴散火焰:燃料和訊訓劑邊混合邊燃燒,這時由于擴散作用對燃燒起控制作用,又稱擴散燃燒。 預混火焰:燃料和訊訓劑預先混合好,這時化學動力學因素對燃燒起控制作用,亦稱動力燃燒。 可以看出火焰區別,層流外表面相對光滑,湍流外表面不平整;部分預混火焰有內焰和外焰;全預混火焰不明亮 ......

    uj5u.com 2023-04-27 07:35:19 more
  • 吾日三省吾身|最近反思-2023-04-27

    做專案得出對自我的認知 最近接了一個后臺管理的專案,由于自己身處自由狀態,且很多課很多事情沒有完成,也不知這個專案會不會給自己增加物質上的回饋,本身可能由于處女座吧,又不能直接放手,前幾天很是糾結,覺得自己應該做其他更重要的事。昨天想放棄了,但是又不能直接撒手不管,那要是直接放棄了,萬一這件事對人家 ......

    uj5u.com 2023-04-27 07:33:03 more
  • 打工人逃不開「單人單崗」

    「閑」到停不下來,「忙」到無事可做! 01 年后開始,研發團隊一直「單人單崗」; 為什么? 就是所謂的追求降本,無非裁員的手段,最終的目的就是讓團隊的人員結構簡化到極致; 雖然符合公司預期,但是與打工人的預期強烈不符; 然而,這不重要; 打工人的難處,老板不一定關心;但是老板的難處,打工人必然被關心 ......

    uj5u.com 2023-04-27 07:32:59 more
  • 讀書筆記丨遠程服務呼叫和RESTful,如何分析和抉擇?

    摘要:相信未來REST規范將會變得更加流行和普及。 本文分享自華為云社區《云原生時代,遠程服務呼叫和RESTful,如何分析和抉擇?》,作者:breakDawn 。 隨著云原生的概念越來越火,服務的架構應該如何發展和演進,成為很多程式員關心的話題。大名鼎鼎的《深入理解java虛擬機》一書作者于21年 ......

    uj5u.com 2023-04-27 07:32:51 more
  • 位元組超全學習流程圖流出,100天漲薪10k,從功能測驗到自動化測驗

    今年年初,由于經濟壓力讓我下定決心進階自動化測驗,已經24的我做了3年功能測驗,坐標廣州薪資定格在8k,可能是生活過的太安逸,覺得8000的工資也夠了。
    努力終究是有回報的,在前幾天跳槽成功工資到達了一個新高12k,雖然比不上一些社會精英,但是我也滿足了,經過此次事見之后,我也相信我的工資絕不會止步... ......

    uj5u.com 2023-04-27 07:32:36 more
  • 支撐百萬商戶、千億級呼叫:微盟如何通過鏈路設計降本40%?

    一分鐘精華速覽 在典型的分布式系統中,用戶的一個請求到達組合的前端服務后,前端服務會分發請求到內部的各個服務,每次呼叫都涉及跨系統的一次請求和一次回應。在有大規模、高并發請求量的系統中,如何標識這些請求及存盤這些呼叫資訊,并形成呼叫鏈?如果系統的某兩個服務間出了問題,又如何為業務方提供可視化的展現形 ......

    uj5u.com 2023-04-27 07:31:39 more
  • 億級榷訓業務穩如磐石,華為云CodeArts PerfTest發布

    摘要:近日,華為云性能測驗服務CodeArts PerfTest全新上線,提供低門檻、低成本的一站式云化性能測驗解決方案。 本文分享自華為云社區《億級榷訓業務穩如磐石,華為云CodeArts PerfTest發布》,作者:華為云頭條 。 計算機軟體作為人類邏輯智慧的偉大結晶之一,已經滲透到了人類社會 ......

    uj5u.com 2023-04-27 07:30:59 more