用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。

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