用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還有其他騷操作