用ChatGPT學Nginx是一種什麼體驗
theme: fancy highlight: atom-one-light
我正在參加「掘金·啟航計劃」
Hi~,我是一碗周,一個在舒適區垂死掙扎的前端,如果寫的文章有幸可以得到你的青睞,萬分有幸~~
🦋 寫在前面
最近ChatGPT的熱度一直不減,那就用ChatGPT來學一學Nginx,看看會有什麼樣的一個體驗。
你問什麼是ChatGPT?那就讓它自己來告訴你:
🎉 什麼是Nginx?
這個在官網中是什麼說的:
NGINX是用於Web服務、反向代理、內容快取、負載均衡、媒體流傳輸等場景的開源軟體。它最初是一款專為實現最高效能和穩定性而設計的Web伺服器。除了HTTP伺服器功能以外,NGINX還可用作電子郵件(IMAP、POP3和SMTP)的代理伺服器以及HTTP、TCP和UDP伺服器的反向代理與負載均衡器。
ChatGPT是什麼說的
講真,說了這麼多搞得迷迷糊糊,就記住了Nginx是可以做Web伺服器以及反向代理的一個高效能低資源消耗的開源軟體就夠了。
🌻 優點
恩,這個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端口才可以訪問,訪問成功的頁面如下:
🥑 Nginx的常用命令
現在我們來簡單介紹一下Nginx中的常用指令,首先我們來問一下ChatGPT,得到的回覆如下:
為了方便大家複製命令,我將上面的內容複製了一份。
以下是一些常用的Nginx指令:
nginx
:啟動Nginx伺服器。nginx -s stop
:停止正在執行的Nginx伺服器。nginx -s quit
:優雅地停止Nginx伺服器。nginx -s reload
:重新載入Nginx配置檔案,無需停止伺服器。nginx -t
:檢查Nginx配置檔案的語法是否正確。nginx -V
:顯示Nginx版本和編譯選項資訊。nginx -h
:顯示Nginx的命令列選項。sudo systemctl start nginx
:在Linux上使用systemd啟動Nginx。sudo systemctl stop nginx
:在Linux上使用systemd停止Nginx。sudo systemctl restart nginx
:在Linux上使用systemd重新啟動Nginx。
我這裡簡單的總結了一張圖,如下所示:
🐬 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配置檔案的語法:
🐋 配置檔案語法
- 註釋:在Nginx的配置檔案中,註釋以
#
開頭; -
指令:說的是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中的全域性配置,也就是:user
、worker_processes
、error_log
、pid
這四個配置,這四個配置理解起來很容易,如下所示:
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使用的事件模型,支援select
、poll
、epoll
和kqueue
等。預設值取決於作業系統型別和版本,建議讓系統自行選擇。
🥦 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接收到一個請求時,會首先解析該請求的頭部資訊,包括請求方法、請求URI、HTTP版本、請求頭部等等;
- 確定
server
塊:根據上一步解析的資訊,確定該請求應該交給哪個server
塊進行處理; - 確定
location
塊:根據URL去尋找對應的location
塊,如果沒有找到則使用預設的location
塊進行處理。 - 處理請求:根據選擇的
location
塊中的配置,對請求進行處理。可能的處理方式包括反向代理、重定向、檔案讀取、CGI指令碼執行等等。 - 響應體處理:根據請求的內容去返回不同的內容:
- 如果是動態請求Nginx則會將請求進行轉發;
- 如果是靜態資源則會根據配置的靜態資源目錄進行查詢;
- 如果快取中存在則會從快取中返回;
- 如果請求存在問題,則會返回對應的錯誤頁面;
- 返回響應:Nginx將處理結果返回給客戶端,包括響應頭部、響應狀態碼、響應內容等資訊。
💫 寫在最後
這篇文章介紹的幾乎都是Nginx中的概念問題,還是比較枯燥的,用了很大的篇幅來介紹Nginx中的配置檔案,可以用作參考
這篇文章是《前端&運維那點事兒》專欄中Nginx系列的第一篇文章,後面還會有幾篇文章繼續來玩Nginx。
如果對這個專欄感興趣可以點一個關注,會一直持續更新\~
- 用ChatGPT學Nginx是一種什麼體驗
- 【好物分享】分享給前端開發的28個資源(網站、軟體、外掛),簡直是提高效率必備
- Vite3.0都來了,你還捲動嗎?(Vite3.0新特性一覽)
- 【好物分享】在命令列讀Markdown,這個感覺太舒服了
- 從0開始使用pnpm構建一個Monorepo方式管理的demo
- 我畫了5張腦圖可以讓你快速入門TypeScript
- 我看著MDN文件,手寫了幾個陣列例項方法
- 淺談JavaScript中的特殊函式
- 如何通過SSH配合VSCode收穫超舒適的遠端開發體驗
- CSS的calc函式不會還有人沒有用吧
- 【戲玩演算法】12-圖
- 誰說前端不能搞紅黑樹,用這55張圖拿JS一起手撕紅黑樹
- 簡單總結了10個JavaScript程式碼優化小tips
- NaiveUI中看起來沒啥用的元件(文字漸變)實現原來這麼簡單
- 面試官讓我用Flex寫色子佈局,我直接給寫了6個
- Vue3 TS Vite NaiveUI搭建一個專案骨架
- 用一萬多字從頭到尾介紹【函數語言程式設計】
- 這8張腦圖幾乎概括了所有的佈局方案,確定不看看嗎?
- 【戲玩演算法】07-字典
- 還在console.log一把梭嗎?console還有其他騷操作