目錄
什麼是 Nginx?
基本指令
最小化配置
首頁 運維 Nginx Nginx基本概念是什麼

Nginx基本概念是什麼

May 16, 2023 pm 05:02 PM
nginx

Nginx基本概念是什麼

什麼是 Nginx?

Nginx 最初是作為一個 Web 伺服器建立的,用於解決 C10k 的問題。作為一個 Web 伺服器,它可以以驚人的速度為您的資料服務。但 Nginx 不僅僅是一個 Web 伺服器,你還可以將其用作反向代理,與較慢的上游伺服器(如:Unicorn 或 Puma)輕鬆整合。你可以適當地分配流量(負載平衡器)、串流媒體、動態調整圖像大小、快取內容等等。基本的 nginx 體系結構由 master 流程​​和其 worker 流程​​組成。 master 讀取設定文件,並維護 worker 進程,而 worker 則會對請求進行實際處理。

基本指令

要啟動nginx,只要輸入:

[sudo] nginx
登入後複製

當你的nginx 實例運作時,你可以透過傳送對應的訊號來管理它:

[sudo] nginx -s signal
登入後複製

可用的訊號:

  • stop – 快速關閉

  • ##quit – 優雅關閉(等待worker 執行緒完成處理)

  • reload – 重載設定檔

  • reopen – 重新開啟日誌檔案

#命令與上下文

nginx 的設定文件,預設的位置包括:

  • /etc/nginx /nginx.conf,

  • /usr/local/etc/nginx/nginx.conf,或

  • #/usr/local/nginx/conf/nginx.conf

#設定檔的由下面的部分構成:

  • 指令– 可選項,包含名稱和參數,以分號結尾

  • gzip on;
    登入後複製
  • 上下文– 分塊,你可以宣告指令– 類似於程式語言中的作用域

  • worker_processes 2; # 全局上下文指令http {              # http 上下文   gzip on;        # http 上下文中的指令 server {          # server 上下文   listen 80;      # server 上下文中的指令 }
    }
    登入後複製

指令類型

當使用相同的指令在不同的繼承模型中進行操作時,必須小心謹慎。有三種類型的指令,每種都有自己的繼承模型。

普通指令

在每個上下文只有唯一值。而且,它只能在當前上下文中定義一次。在子級上下文中覆蓋父級的值只在目前子級上下文中有效。

gzip on;
gzip off; # 非法,不能在同一个上下文中指定同一普通指令2次server {
 location /downloads {
   gzip off;
 }

 location /assets {
   # gzip is on here }
}
登入後複製

陣列指令

在同一上下文中新增多條指令,將會新增多個值,而不是完全覆寫。在子級上下文中定義指令將覆蓋給父級上下文中的值。

error_log /var/log/nginx/error.log;
error_log /var/log/nginx/error_notive.log notice;
error_log /var/log/nginx/error_debug.log debug;

server {
 location /downloads {
   # 下面的配置会覆盖父级上下文中的指令   error_log /var/log/nginx/error_downloads.log;
 }
}
登入後複製

行動指令

行動是改變事情的指令。根據模組的需要,它繼承的行為可能會有所不同。例如rewrite 指令,只要是符合的都會執行:

server {
 rewrite ^ /foobar;

 location /foobar {
   rewrite ^ /foo;
   rewrite ^ /bar;
 }
}
登入後複製

如果使用者想嘗試取得/sample:

  • server的rewrite將會執行,從/sample rewrite 到/foobar

  • location /foobar 會被符合

  • location的第一個rewrite執行,從/foobar rewrite到/foo

  • location的第二個rewrite執行,從/foo rewrite到/bar

return 指令提供的是不同的行為:

server {
 location / {
   return 200;
   return 404;
 }
}
登入後複製

在上述的情況下,立即返回200。

處理請求

在 Nginx 內部,你可以指定多個虛擬伺服器,每個虛擬伺服器都用 server{} 上下文描述。

server {
 listen      *:80 default_server;
 server_name netguru.co;

 return 200 "Hello from netguru.co";
}

server {
 listen      *:80;
 server_name foo.co;

 return 200 "Hello from foo.co";
}

server {
 listen      *:81;
 server_name bar.co;

 return 200 "Hello from bar.co";
}
登入後複製

這將告訴 Nginx 如何處理到來的請求。在檢查給定的 IP 連接埠組合時,Nginx 會先測試哪個虛擬主機有設定 listen 指令。

然後,server_name 指令的值將偵測 Host 頭(儲存主機網域)。

Nginx 將會依照下列順序選擇虛擬主機:

  1. 符合sever_name指令的IP-埠主機

  2. 擁有default_server標記的IP-埠主機

  3. 首先定義的IP-埠主機

  4. 如果沒有匹配,拒絕連線。

例如下面的範例:

Request to foo.co:80     => "Hello from foo.co"Request to www.foo.co:80 => "Hello from netguru.co"Request to bar.co:80     => "Hello from netguru.co"Request to bar.co:81     => "Hello from bar.co"Request to foo.co:81     => "Hello from bar.co"
登入後複製

server_name 指令

server_name指令接受多個值。它還處理通配符匹配和正則表達式。

server_name netguru.co www.netguru.co; # exact matchserver_name *.netguru.co;              # wildcard matchingserver_name netguru.*;                 # wildcard matchingserver_name  ~^[0-9]*\.netguru\.co$;   # regexp matching
登入後複製

當有歧義時,nginx 將使用下面的命令:

  1. #確切的名字

  2. 最長的通配符名稱以星號開始,例如“* .example.org”。

  3. 最長的通配符名稱以星號結尾,例如「mail.**」

  4. 首先匹配正規表示式(按照設定文件中的順序)

Nginx將儲存三個雜湊表,用於儲存特定名稱、以星號開頭的通配符和以星號結尾的通配符。如果結果不在任何表中,則將按順序進行正規表示式測試。

值得謹記的是

server_name .netguru.co;
登入後複製

是一個來自下面的縮寫

server_name  netguru.co  www.netguru.co  *.netguru.co;
登入後複製

有一點不同,

.netguru.co 儲存在第二張表,這意味著它比顯式聲明的慢一點。

listen 指令#

在很多情况下,能够找到 listen 指令,接受IP:端口值

listen 127.0.0.1:80;
listen 127.0.0.1;    # by default port :80 is usedlisten *:81;
listen 81;           # by default all ips are usedlisten [::]:80;      # IPv6 addresseslisten [::1];        # IPv6 addresses
登入後複製

然而,还可以指定 UNIX-domain 套接字。

listen unix:/var/run/nginx.sock;
登入後複製

你甚至可以使用主机名

listen localhost:80;
listen netguru.co:80;
登入後複製

但请慎用,由于主机可能无法启动 nginx,导致无法绑定在特定的 TCP Socket。

最后,如果指令不存在,则使用 *:80

最小化配置

有了这些知识 – 我们应该能够创建并理解运行 nginx 所需的最低配置。

# /etc/nginx/nginx.confevents {}                   # events context needs to be defined to consider config validhttp {
server {
   listen 80;
   server_name  netguru.co  www.netguru.co  *.netguru.co;

   return 200 "Hello";
 }
}
登入後複製

root, location, 和 try_files 指令

root 指令

root 指令设置请求的根目录,允许 nginx 将传入请求映射到文件系统。

server {
 listen 80;
 server_name netguru.co;
 root /var/www/netguru.co;
}
登入後複製

根据给定的请求,指定 nginx 服务器允许的内容

netguru.co:80/index.html     # returns /var/www/netguru.co/index.htmlnetguru.co:80/foo/index.html # returns /var/www/netguru.co/foo/index.html
登入後複製

location 指令

location指令根据请求的 URI 来设置配置。location [modifier] path

location /foo/ {
 # ...}
登入後複製

如果没有指定修饰符,则路径被视为前缀,其后可以跟随任何东西。

以上例子将匹配

/foo
/fooo
/foo123
/foo/bar/index.html
...
登入後複製

此外,在给定的上下文中可以使用多个 location 指令。

server {
 listen 80;
 server_name netguru.co;
 root /var/www/netguru.co;

 location / {
   return 200 "root";
 }

 location /foo/ {
   return 200 "foo";
 }
}
netguru.co:80   /       # => "root"netguru.co:80   /foo    # => "foo"netguru.co:80   /foo123 # => "foo"netguru.co:80   /bar    # => "root"
登入後複製

Nginx还有一些修饰符可以用于连接location。因为每个修饰符都有自己的优先级,所以它们会影响 location 模块在使用时的行为。

=           - Exact match
^~          - Preferential match
~ && ~*     - Regex match
no modifier - Prefix match
登入後複製

Nginx 会先检查精确匹配。如果找不到,我们会找优先级最高的。如果之前的匹配尝试失败,正则表达式会按照出现的顺序逐个进行测试。至少,最后一个前缀匹配将被使用。

location /match {
 return 200 'Prefix match: matches everything that starting with /match';
}

location ~* /match[0-9] {
 return 200 'Case insensitive regex match';
}

location ~ /MATCH[0-9] {
 return 200 'Case sensitive regex match';
}

location ^~ /match0 {
 return 200 'Preferential match';
}

location = /match {
 return 200 'Exact match';
}
/match/    # => 'Exact match'/match0    # => 'Preferential match'/match2    # => 'Case insensitive regex match'/MATCH1    # => 'Case sensitive regex match'/match-abc # => 'Prefix match: matches everything that starting with /match'
登入後複製

try_files 指令

尝试不同的路径,找到一个路径就返回。

try_files $uri index.html =404;
登入後複製

所以对于 /foo.html 请求,它将尝试按以下顺序返回文件:

  1. $uri ( /foo.html )

  2. index.html

  3. 如果什么都没找到则返回 404

有趣的是,如果我们在服务器上下文中定义 try_files,然后定义匹配的所有请求的 location —— try_files 将不会执行。

这是因为在服务器上下文中定义的 try_files 是它的 pseudo-location,这是最不可能的位置。因此,location/的定义将比pseudo-location更为明确。

server {
 try_files $uri /index.html =404;

 location / {
 }
}
登入後複製

因此,你应该避免在 server 上下文中出现 try_files:

server {
 location / {
   try_files $uri /index.html =404;
 }
}
登入後複製

以上是Nginx基本概念是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

docker容器名稱怎麼查 docker容器名稱怎麼查 Apr 15, 2025 pm 12:21 PM

可以通過以下步驟查詢 Docker 容器名稱:列出所有容器(docker ps)。篩選容器列表(使用 grep 命令)。獲取容器名稱(位於 "NAMES" 列中)。

nginx在windows中怎麼配置 nginx在windows中怎麼配置 Apr 14, 2025 pm 12:57 PM

如何在 Windows 中配置 Nginx?安裝 Nginx 並創建虛擬主機配置。修改主配置文件並包含虛擬主機配置。啟動或重新加載 Nginx。測試配置並查看網站。選擇性啟用 SSL 並配置 SSL 證書。選擇性設置防火牆允許 80 和 443 端口流量。

怎麼查看nginx是否啟動 怎麼查看nginx是否啟動 Apr 14, 2025 pm 01:03 PM

確認 Nginx 是否啟動的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 檢查端口 80 是否開放;3. 查看系統日誌中 Nginx 啟動消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

docker怎麼啟動容器 docker怎麼啟動容器 Apr 15, 2025 pm 12:27 PM

Docker 容器啟動步驟:拉取容器鏡像:運行 "docker pull [鏡像名稱]"。創建容器:使用 "docker create [選項] [鏡像名稱] [命令和參數]"。啟動容器:執行 "docker start [容器名稱或 ID]"。檢查容器狀態:通過 "docker ps" 驗證容器是否正在運行。

nginx怎麼配置雲服務器域名 nginx怎麼配置雲服務器域名 Apr 14, 2025 pm 12:18 PM

在雲服務器上配置 Nginx 域名的方法:創建 A 記錄,指向雲服務器的公共 IP 地址。在 Nginx 配置文件中添加虛擬主機塊,指定偵聽端口、域名和網站根目錄。重啟 Nginx 以應用更改。訪問域名測試配置。其他注意事項:安裝 SSL 證書啟用 HTTPS、確保防火牆允許 80 端口流量、等待 DNS 解析生效。

docker怎麼創建容器 docker怎麼創建容器 Apr 15, 2025 pm 12:18 PM

在 Docker 中創建容器: 1. 拉取鏡像: docker pull [鏡像名] 2. 創建容器: docker run [選項] [鏡像名] [命令] 3. 啟動容器: docker start [容器名]

nginx怎麼查版本 nginx怎麼查版本 Apr 14, 2025 am 11:57 AM

可以查詢 Nginx 版本的方法有:使用 nginx -v 命令;查看 nginx.conf 文件中的 version 指令;打開 Nginx 錯誤頁,查看頁面的標題。

怎麼啟動nginx服務器 怎麼啟動nginx服務器 Apr 14, 2025 pm 12:27 PM

啟動 Nginx 服務器需要按照不同操作系統採取不同的步驟:Linux/Unix 系統:安裝 Nginx 軟件包(例如使用 apt-get 或 yum)。使用 systemctl 啟動 Nginx 服務(例如 sudo systemctl start nginx)。 Windows 系統:下載並安裝 Windows 二進製文件。使用 nginx.exe 可執行文件啟動 Nginx(例如 nginx.exe -c conf\nginx.conf)。無論使用哪種操作系統,您都可以通過訪問服務器 IP

See all articles