用ChatGPT學Nginx是一種什麼體驗

語言: CN / TW / HK

theme: fancy highlight: atom-one-light


我正在參加「掘金·啟航計劃」

Hi~,我是一碗周,一個在舒適區垂死掙扎的前端,如果寫的文章有幸可以得到你的青睞,萬分有幸~~

🦋 寫在前面

最近ChatGPT的熱度一直不減,那就用ChatGPT來學一學Nginx,看看會有什麼樣的一個體驗。

你問什麼是ChatGPT?那就讓它自己來告訴你:

image_he1dsxgStd.png

🎉 什麼是Nginx?

這個在官網中是什麼說的:

NGINX是用於Web服務、反向代理、內容快取、負載均衡、媒體流傳輸等場景的開源軟體。它最初是一款專為實現最高效能和穩定性而設計的Web伺服器。除了HTTP伺服器功能以外,NGINX還可用作電子郵件(IMAP、POP3和SMTP)的代理伺服器以及HTTP、TCP和UDP伺服器的反向代理與負載均衡器。

ChatGPT是什麼說的

image_obDGzZ8vsG.png

講真,說了這麼多搞得迷迷糊糊,就記住了Nginx是可以做Web伺服器以及反向代理的一個高效能低資源消耗的開源軟體就夠了。

🌻 優點

image_J7eqOzibyR.png

恩,這個ChatGPT非常強,也不知道在哪裡找的資料,不過這也大大減少了自己的學習成本。

🐁 安裝

在ChatGPT中問了好幾次也沒有問道我想要的安裝方式,還是自己來吧\~

這裡我使用的是原始碼編譯安裝,我的環境:

  • Centos7.9
  • Nginx1.23.3

首先安裝用到的工具:

bash yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel wget

然後執行下面這些命令:

bash cd /usr/local mkdir nginx cd nginx/ # 到目標目錄 wget http://nginx.org/download/nginx-1.23.3.tar.gz # 下載指定版本 tar -xvf nginx-1.23.3.tar.gz cd nginx-1.23.3/ ./configure --with-http_stub_status_module --with-http_ssl_module # 新增常用模板 make # 編譯 make install # 安裝

然後檢視版本,檢視是否安裝成功

```bash $ /usr/local/nginx/sbin/nginx -v

nginx version: nginx/1.23.3

```

安裝成功之後建立軟連線,保證直接可以使用名稱訪問:

bash ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

到這為止就安裝成功了,其他安裝方式可以在Installing nginx中檢視。

🥪 Nginx目錄

安裝完成之後我們先來看一下安裝後的Nginx目錄結果是個什麼樣子:

```bash [root@ywanzhou nginx]$ pwd /usr/local/nginx [root@ywanzhou nginx]$ tree . ├── client_body_temp ├── conf # 存放Nginx中配置檔案的路徑 │ ├── fastcgi.conf # fastcgi相關引數的配置檔案 │ ├── fastcgi.conf.default # 以.default結尾的都是同名檔案的備份檔案 │ ├── fastcgi_params # fastcgi的引數檔案 │ ├── fastcgi_params.default │ ├── koi-utf # 編碼轉換對映檔案,用於在輸出內容到客戶端時,將一種編碼轉換到另一種編碼 │ ├── koi-win # 編碼轉換對映檔案,用於在輸出內容到客戶端時,將一種編碼轉換到另一種編碼 │ ├── mime.types # 設定http協議的Content-Type與副檔名對應關係 │ ├── mime.types.default │ ├── nginx.conf # 核心配置檔案 │ ├── nginx.conf.default │ ├── scgi_params # scgi相關引數檔案 │ ├── scgi_params.default │ ├── uwsgi_params # uwsgi相關引數檔案 │ ├── uwsgi_params.default │ └── win-utf # 編碼轉換對映檔案,用於在輸出內容到客戶端時,將一種編碼轉換到另一種編碼 ├── fastcgi_temp # fastcgi臨時資料目錄 ├── html # nginx中預設的站點目錄 │ ├── 50x.html │ └── index.html ├── logs # 日誌存放目錄 │ ├── access.log # 訪問日誌 │ ├── error.log # 錯誤日誌 │ └── nginx.pid # nginx啟動後,會將pid存入該檔案 ├── proxy_temp ├── sbin # nginx命令目錄 │ └── nginx ├── scgi_temp └── uwsgi_temp

9 directories, 21 files ```

上面就是對Nginx目錄的一個解釋。

現在可以嘗試一下啟動Nginx服務,看看是否有效果,你可以執行下面兩個命令之中的一個來啟動Nginx:

```bash nginx

或者

systemctl start nginx.service

```

如果想要確定Nginx是否啟動,可以通過下面這個命令檢視:

```bash [root@ywanzhou ~]$ ps aux | grep nginx # 檢視nginx是否啟動,如果啟動返回結果與下面類似 root 19577 0.0 0.0 46004 1132 ? Ss Feb14 0:00 nginx: master process nginx nobody 19578 0.0 0.1 48536 2228 ? S Feb14 0:00 nginx: worker process root 32259 0.0 0.0 112812 980 pts/0 S+ 09:26 0:00 grep --color=auto nginx

```

OK子,應該就這麼多,簡答介紹一下目錄,下面來介紹一下常用命令。

不對,忘記說了一點,如果想要訪問方才啟動的Nginx的頁面,如果是自己的虛擬機器直接把防火牆關了訪問ip地址就可以,如果是購買的伺服器需要開放80端口才可以訪問,訪問成功的頁面如下:

image_Cy3L103gaN.png

🥑 Nginx的常用命令

現在我們來簡單介紹一下Nginx中的常用指令,首先我們來問一下ChatGPT,得到的回覆如下:

image_QCwy_p9DHM.png

為了方便大家複製命令,我將上面的內容複製了一份。

以下是一些常用的Nginx指令:

  1. nginx:啟動Nginx伺服器。
  2. nginx -s stop:停止正在執行的Nginx伺服器。
  3. nginx -s quit:優雅地停止Nginx伺服器。
  4. nginx -s reload:重新載入Nginx配置檔案,無需停止伺服器。
  5. nginx -t:檢查Nginx配置檔案的語法是否正確。
  6. nginx -V:顯示Nginx版本和編譯選項資訊。
  7. nginx -h:顯示Nginx的命令列選項。
  8. sudo systemctl start nginx:在Linux上使用systemd啟動Nginx。
  9. sudo systemctl stop nginx:在Linux上使用systemd停止Nginx。
  10. sudo systemctl restart nginx:在Linux上使用systemd重新啟動Nginx。

我這裡簡單的總結了一張圖,如下所示:

Nginx常用命令_N0GRAoCmsd.png

🐬 Nginx配置檔案

Nginx的配置檔案這裡通常指的的./conf/nginx.conf檔案,下面就是Nginx中的預設的配置檔案:

```nginx

user nobody; # 指定使用者使用nginx

worker_processes 1; # nginx工作程序數,一般與cpu核數相同

error_log logs/error.log; # 日誌存放目錄

error_log logs/error.log notice;

error_log logs/error.log info;

pid logs/nginx.pid; # nginx的pid存放目錄

events { worker_connections 1024; # 每個程序允許的最大連線數 }

http { include mime.types; # 引入其他的配置檔案 default_type application/octet-stream;

#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  logs/access.log  main;

sendfile        on;
#tcp_nopush     on;

#keepalive_timeout  0;
keepalive_timeout  65;

#gzip  on;

server {
    # 一些配置檔案
}

}

```

上面是Nginx配置檔案中的一部分,想要學習Nginx配置檔案,首先我們先來了解一下Nginx配置檔案的語法:

🐋 配置檔案語法

  1. 註釋:在Nginx的配置檔案中,註釋以#開頭;
  2. 指令:說的是Nginx伺服器如何處理請求的規則,每個指令都要以一個分號;結尾,它可以包含一個或者多個引數,例如: ```nginx include mime.types; # 引入其他的配置檔案 worker_processes 1; # nginx工作程序數,一般與cpu核數相同

    指令和引數中間以空格分割,空格的數量沒有要求。 3. 指令塊:類似於JavaScript中的程式碼塊,由一對`{}`進行包裹,例如:nginx events { worker_connections 1024; # 每個程序允許的最大連線數 } http { include mime.types; # 引入其他的配置檔案 default_type application/octet-stream; }

    `` 4. 變數:Nginx中的變數的格式為$variable_name`,具體Nginx中包含什麼變數,以及變數的具體含義後面在進行解釋。

🦄 全域性配置

首先我們先來說一下Nginx中的全域性配置,也就是:userworker_processeserror_logpid這四個配置,這四個配置理解起來很容易,如下所示:

  • user:用於設定Nginx服務所使用的使用者;
  • worker_processes:用於設定Nginx伺服器的程序數量,通常與CPU的核數一致,設定少了伺服器的效能沒有充分利用,設定多了造成沒有必要的程序切換;
  • error_log:Nginx錯誤日誌的存放路徑;
  • pid:Nginx服務所啟動時的pid。

🍞 events指令塊

在Nginx中的配置檔案中,events指令塊用來定義用來定義事件模型和每個程序的最大連線數量,例如預設的例子中:

nginx events { worker_connections 1024; # 每個程序允許的最大連線數 }

worker_connections的指令就指定了每個程序允許連線的最大併發數量。

除此之外,events指令塊還具有以下的其他引數:

  • multi_accept:允許每個worker程序一次性接收多個新連線,預設為off。
  • accept_mutex:允許多個worker程序爭搶新連線,預設為on。
  • accept_mutex_delay:設定worker程序獲取accept_mutex的超時時間,預設為500毫秒。
  • use:指定Nginx使用的事件模型,支援selectpollepollkqueue等。預設值取決於作業系統型別和版本,建議讓系統自行選擇。

🥦 http指令塊

http指令塊是Nginx配置檔案中最重要的一個配置,它用於配置Nginx作為伺服器的一些行為。

它的語法如下所示:

```nginx http { include mime.types; default_type application/octet-stream;

#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  logs/access.log  main;

sendfile        on;
#tcp_nopush     on;

#keepalive_timeout  0;
keepalive_timeout  65;

#gzip  on;

server {
    # 一些 server 塊的配置
}

} ```

http指令塊可以分為兩個部分,一個是全域性性的指令配置,另一個是server指令塊(可以包含多個),這裡我們就先了解一下http指令塊中的全域性性的指令配置,關於server指令塊我們在下一部分看。

http配置塊中,還可以定義一些全域性性的配置指令,如下所示:

  • include: 包含其他的配置檔案;
  • types:定義副檔名和對應的Content-Type;
  • default_type:定義預設的Content-Type型別,預設為default_type text/plain
  • access_log:指定Nginx的訪問日誌檔案路徑;
  • sendfile:指定Nginx是否啟用sendfile指令進行高效的檔案傳輸,預設為on;
  • tcp_nopush:指定Nginx是否啟用tcp_nopush指令進行資料推送,預設為off;
  • keepalive_timeout:指定Nginx與客戶端保持連線的超時時間,預設為75秒;
  • gzip:控制是否對響應內容進行gzip壓縮;
  • server:定義一個HTTP伺服器。

🐏 server指令塊

server指令塊用於配置一個HTTP伺服器,每一個HTTP伺服器都表示一個虛擬主機,用於監聽HTTP請求,並將接收的請求分發到location指令塊進行處理

一個http指令塊可以包含多個server指令塊,一個server指令塊可以包含多個location指令塊,例項如下所示:

```nginx server { listen 80; server_name localhost;

#charset koi8-r;

#access_log  logs/host.access.log  main;

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

} ```

我們依次來看:

  • listen:用於指定虛擬主機監聽的IP地址和埠,它是支援多個的;
  • server_name:用於指定虛擬主機的域名/IP,支援萬用字元和正則表示式,可以配置多個,以空格分割;以下是一些例子: nginx server_name www.ywanzhou.com; # 精確匹配 server_name *.ywanzhou.com; # 萬用字元 可以匹配 test.ywanzhou.com blog.ywanzhou.com等 server_name ^www\.(\w)\.com$; # 正則,可以匹配www.*.com的域名 # 匹配順序是 精確 萬用字元 正則
  • charset:字符集;
  • access_log:用於配置訪問日誌的檔案路徑。 nginx access_log logs/host.access.log main # 將訪問日誌存放進logs/host.access.log日誌格式為 main ,也就是http指令塊中log_format指令指定的格式
  • location:指令塊用於配置URL與資源的對映關係,它支援正則,非常的強大,這裡就簡單介紹一下,後面在詳細的說。
    • root:用於指定虛擬主機的根目錄,即請求的URL對應的檔案在伺服器中的儲存路徑。
    • index:用於指定預設訪問的檔名,如果使用者訪問的URL路徑不包含檔名,則會預設訪問該指令設定的檔案。
  • error_page:該指令用於定義HTTP錯誤頁面的處理方式,簡單說就是當我們訪問的頁面不存在時,我們可以通過error_page指令來指定錯誤頁面,就拿下面這個例子來說: nginx error_page 500 502 503 504 /50x.html; 其中的500 502 503 504表示狀態碼,如果出現這些跳轉到對應的頁面,而/50x.html是指定的目標URL。

🌸 Nginx的執行流程

最後我們來了解一下Nginx接收到請求後的一個執行流程,從客戶端傳送請求到Nginx返回響應體大致為以下幾個步驟:

nginx請求處理流程 (1)_sv6xXFc6z8.png

  • 解析請求:當Nginx接收到一個請求時,會首先解析該請求的頭部資訊,包括請求方法、請求URI、HTTP版本、請求頭部等等;
  • 確定server塊:根據上一步解析的資訊,確定該請求應該交給哪個server塊進行處理;
  • 確定location塊:根據URL去尋找對應的location塊,如果沒有找到則使用預設的location塊進行處理。
  • 處理請求:根據選擇的location塊中的配置,對請求進行處理。可能的處理方式包括反向代理、重定向、檔案讀取、CGI指令碼執行等等。
  • 響應體處理:根據請求的內容去返回不同的內容:
    • 如果是動態請求Nginx則會將請求進行轉發;
    • 如果是靜態資源則會根據配置的靜態資源目錄進行查詢;
    • 如果快取中存在則會從快取中返回;
    • 如果請求存在問題,則會返回對應的錯誤頁面;
  • 返回響應:Nginx將處理結果返回給客戶端,包括響應頭部、響應狀態碼、響應內容等資訊。

💫 寫在最後

這篇文章介紹的幾乎都是Nginx中的概念問題,還是比較枯燥的,用了很大的篇幅來介紹Nginx中的配置檔案,可以用作參考

這篇文章是《前端&運維那點事兒》專欄中Nginx系列的第一篇文章,後面還會有幾篇文章繼續來玩Nginx。

如果對這個專欄感興趣可以點一個關注,會一直持續更新\~