日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx工作原理、配置以及web服务器的资源请求过程

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nginx工作原理、配置以及web服务器的资源请求过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

nginx工作原理、配置以及web服務器的資源請求過程

  • 1. nginx簡介
  • 2. nginx的特性與優點
    • 2.1 nginx的特性
    • 2.2 nginx的優點
    • 2.3 nginx工作原理
    • 2.4 Nginx的模塊從功能上分為如下三類:
  • 3. nginx進程架構
  • 4. web服務器請求資源的過程
  • 5. nginx的配置
  • 6. nginx的安裝與配置
    • 6.1 nginx主目錄下各個目錄的作用
    • 6.2 nginx服務命令
    • 6.3 nginx的配置文件詳解
    • 6.4 nginx.conf配置詳解
    • 6.5 使用nginx服務控制命令重啟并指定配置文件路徑
  • 7. nginx用于調試,定位問題的配置參數

1. nginx簡介

Nginx是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由俄羅斯的伊戈爾·賽索耶夫開發的,第一個公開版本0.1.0于2004年10月10日。

源代碼以類BSD許可證的形式發布,因其穩定性、豐富的功能集、簡單的功能集、簡單的配置文件和低級系統的消耗而聞名。2011年6月1日,nginx1.0.4發布

Nginx是一款輕量級的web服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like協議下發行。其特點是內存少,并發能力強,事實上nginx的并發能力在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、騰訊、淘寶、京東等。

2. nginx的特性與優點

2.1 nginx的特性

nginx是一個很牛的高性能Web和反向代理服務器,它具有很多非常優越的特性:

  • 在高連接并發的情況下,nginx是Apache服務器不錯的替代品,能夠支持高達50000個并發連接數的響應
  • 使用epoll and kqueue作為開發模型
  • nginx作為負載均衡服務器:nginx既可在內部直接支持和PHP程序對外進行服務,也可支持作為HTTP代理服務器對外進行服務
  • nginx采用C進行編寫,不論系統資源開銷還是CPU使用效率都比Perlbal要好很多

2.2 nginx的優點

  • 高并發連接:官方測試能夠支撐5萬并發連接,在實際生產環境中跑到2-3萬并發連接數

  • 內存消耗少:在3萬并發連接下,開啟的10個nginx進程才消耗150M內存(15M*10=150M)

  • 配置文件非常簡單:風格跟程序一樣通俗易懂

  • 成本低廉:nginx為開源軟件,可以免費使用。而購買F5 BIG-IP、NetScaler等硬件負載均衡交換機則需要十多萬至幾十萬人民幣

  • 支持Rewrite重寫規則:能夠根據域名、URL的不同,將HTTP請求分到不同的后端服務器群組

  • 內置的健康檢查功能:如果Nginx Proxy后端的某臺Web服務器宕機了,不會影響前端訪問

  • 節省帶寬:支持GZIP壓縮,可以添加瀏覽器本地緩存的Header頭

  • 穩定性高:用于反向代理,宕機的概率微乎其微

  • 模塊化設計:模塊可以動態編譯

  • 外圍支持好:文檔全,二次開發和模塊較多

  • 支持熱部署:可以不停機重載配置文件

  • 支持事件驅動、AIO(AsyncIO,異步IO)、mmap(Memory Map,內存映射)等性能優化

2.3 nginx工作原理

Nginx是由內核和模塊組成。
Nginx本身做的工作實際很少,當它接受到一個HTTP請求時,它僅僅時通過查找配置文件將此次次請求映射到一個location block,而此location中所配置的各個指令則會啟動不同的模塊去完成工作,因此模塊可以看做Nginx真正的勞動工作者。通常一個location中的指令會涉及一個handler模塊和多個filter模塊(當然,多個location可以復用同一個模塊)。handler模塊負責處理請求,完成響應內容的生成,而filter模塊對響應內容進行處理。
Nginx的模塊從結構上分為核心模塊、基礎模塊和第三方模塊

  • 核心模塊:HTTP模塊、EVENT模塊和MAIL模塊

  • 基礎模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊。

  • 第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊。

2.4 Nginx的模塊從功能上分為如下三類:

  • Handlers(處理器模塊)。此類模塊直接處理請求,并進行輸出內容和修改headers信息操作。handlers處理器模塊一般只能有一個。

  • Fiters(過濾模塊)。此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最后nginx輸出。

  • Proxies(代理類模塊)。此類模塊是nginx的HTTP Upstream之類的模塊,這些模塊主要與后端一些服務比如FastCGI等進行交互,實現服務代理和負載均衡等功能。

3. nginx進程架構

nginx的進程架構
啟動nginx時,會啟動一個master進程,這個進程不處理任何客戶端的請求,主要用來產生worker線程,一個worker線程用來處理n個request。
而worker線程的線程數可以根據自己的需求來進行配置

[root@localhost conf]# pwd /usr/local/nginx/conf [root@localhost conf]# vim nginx.conf 3 worker_processes 1; //這個地方就是用來設置worker進程個數的 [root@localhost conf]# vim nginx.conf 3 worker_processes 3;[root@localhost conf]# systemctl restart nginx.service [root@localhost conf]# ps -ef | grep nginx root 119118 1 0 18:29 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 119120 119118 0 18:29 ? 00:00:00 nginx: worker process nginx 119121 119118 0 18:29 ? 00:00:00 nginx: worker process nginx 119122 119118 0 18:29 ? 00:00:00 nginx: worker process

圖解:首先用戶通過http/https協議訪問nginx的主機,這時nginx會啟動一個master進程,這個進程,不處理客戶端的請求,而是生成worker線程(這里是一個負載均衡集群),通過worker線程來處理客戶端的請求,若用戶請求網站服務,worker就會到web server這個服務集群提取對應的資源給客戶端,同理,這個Application server可以用來訪問應用服務器,Memcached緩存服務器,backup是后端的意思。

4. web服務器請求資源的過程

1.客戶端發起請求,然后與服務端建立tcp連接 2.服務器接收請求 3.進行反向代理,然后服務器處理請求 4.查看訪問資源的類型(可能是本地的資源,也可能是通過NFS掛載的資源) 5.構建響應報文 6.通過網絡接口返回響應報文給客戶端 7.服務端將本次的操作記錄到日志中

圖解:首先客戶端要與服務端建立連接(沒有連接就無法從服務端獲取想要的資源)我們訪問的時候都是通過域名去訪問服務端的,而域名是可以通過DNS將IP解析成域名去訪問的,所以實際上是訪問的服務器的IP。
接收客戶端請求報文中記錄了對某資源的一次請求的過程;服務器對請求報文進行解析,并獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理;處理完成個之后就去對象存儲里去取相應的資源,取到之后構建一個響應報文;然后將客戶請求的資源進行封裝,并通過網絡接口發送響應報文,客戶端收到對應的資源之后,web服務器會在日志文件中添加一個條目,來描述已執行的事務。


單進程I/O模型:啟動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應;
多進程I/O模型:并行啟動多個進程,每個進程響應一個連接請求;
復用I/O結構:啟動一個進程,同時響應N個連接請求
復用的多進程I/O模型:啟動x個進程,每個進程響應y個連接請求,同時接收x*y個請求。

5. nginx的配置

nginx的編譯分為兩種:

  • 靜態編譯:靜態編譯就是編譯器在編譯可執行文件的時候,將可執行文件需要調用的對應動態鏈接庫(so)中的部分提取出來,鏈接到可執行文件中去,使可執行文件在運行的時候不依賴于動態鏈接庫,所以其優缺點與動態編譯的可執行文件正好互補
  • 動態編譯:動態編譯的可執行文件需要附帶一個的動態鏈接庫,在執行時,需要調用其對應動態鏈接庫中的命令。

所以其優點一方面是縮小了執行文件本身的體積,另一方面是加快了編譯速度,節省了系統資源。

缺點是:哪怕是很簡單的程序,只用到了鏈接庫中的一兩條命令,也需要附帶一個相對龐大的鏈接庫;二是如果其他計算機上沒有安裝對應的運行庫,則用動態編譯的可執行文件就不能運行。

6. nginx的安裝與配置

下載nginx的源碼包
想要安裝不同的版本可以取官網下載:https://nginx.org/en/download.html

[root@localhost ~]# wget http://nginx.org/download/nginx-1.20.1.tar.gz

解決nginx的依賴

[root@localhost ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ zlib make

解壓nginx的tar包

[root@localhost ~]# tar -xzf nginx-1.20.1.tar.gz -C /usr/local

創建系統用戶

[root@localhost ~]# useradd -r -M -s /sbin/nologin nginx

創建日志存放目錄

[root@localhost ~]# mkdir -p /var/log/nginx [root@localhost ~]# chown -R nginx.nginx /var/log/nginx

編譯安裝nginx

[root@localhost nginx-1.20.1]# ./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-debug \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_image_filter_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --http-log-path=/var/log/nginx/access.log \ --error-log-path=/var/log/nginx/error.log[root@localhost nginx-1.20.1]# make && make install

配置nginx環境變量

[root@localhost ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh[root@localhost ~]# source /etc/profile.d/nginx.sh

配置nginx的service文件使用systemctl控制nginx

[root@localhost system]# pwd /usr/lib/systemd/system[root@localhost system]# cat > nginx.service << EOF [Unit] Description=Nginx server daemon After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecStop=/usr/local/nginx/sbin/nginx -s quit ExecReload=/bin/kill -HUP \$MAINPID[Install] WantedBy=multi-user.target EOF設置開機自啟 [root@localhost system]# systemctl daemon-reload [root@localhost system]# systemctl enable --now nginx

6.1 nginx主目錄下各個目錄的作用

/usr/local/nginx/ #為服務安裝目錄,若你安裝在/opt目錄下則是/opt/nginx,根據你安裝的不同目錄也不同 /usr/local/nginx/sbin #為服務主程序目錄 /usr/local/nginx/sbin/nginx #為服務程序文件 /usr/local/nginx/modules/ #為模塊目錄 /usr/local/nginx/conf/ #為服務的配置文件目錄 /usr/local/nginx/html/ # 為服務網頁根目錄 /usr/local/nginx/conf/nginx.conf #為服務配置文件 /usr/local/nginx/logs/ #為服務日志文件目錄 /usr/local/nginx/logs/nginx.pid #服務pid文件 /usr/local/nginx/logs/error.log #服務錯誤日志文件 /usr/local/nginx/logs/access.log #服務訪問日志文件

6.2 nginx服務命令

/usr/local/nginx/sbin/nginx 啟動nginx /usr/local/nginx/sbin/nginx -v #查看nginx版本 /usr/local/nginx/sbin/nginx -V #顯示除版本信息意外的其他配置參數信息 /usr/local/nginx/sbin/nginx -t #檢查nginx配置文件是否正確 /usr/local/nginx/sbin/nginx -s reload #重新加載nginx /usr/local/nginx/sbin/nginx -s quit #正常關閉nginx,建議使用這種方式關閉nginx,這個是優雅的關閉nginx /usr/local/nginx/sbin/nginx -s stop #快速關閉nginx /usr/local/nginx/sbin/nginx -c //用來指定配置文件的路徑

6.3 nginx的配置文件詳解

主配置文件默認位置:/usr/local/nginx/conf/nginx.conf //在不指定安裝路徑的情況下

  • 默認啟動nginx時,使用的配置文件是:安裝路徑/conf/nginx.conf文件
  • 可以在啟動nginx時通過-c選項來指定要讀取的配置文件

nginx常見的配置文件及其作用

配置文件作用
nginx.confnginx的基本配置文件
mime.typesMIME類型關聯的擴展文件
fastcgi.conf與fastcgi相關的配置
proxy.conf與proxy相關的配置
sites.conf配置nginx提供的網站,包括虛擬主機

6.4 nginx.conf配置詳解

nginx.conf的內容分為以下幾段:

  • main配置段:全局配置段。其中main配置段中可能包含event配置段
  • event {}:定義event模型工作特性
  • http {}:定義http協議相關的配置

配置指令的語法格式

derective value1 [value2 ...];

支持使用變量:

  • 內置變量:模塊會提供內建變量定義
  • 自定義變量:set var_name value

檢查nginx配置文件的語法cuowu

[root@localhost conf]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

查看nginx的版本信息

[root@localhost conf]# nginx -v nginx version: nginx/1.20.1[root@localhost conf]# nginx -V //-V不僅能看到nginx的版本信息,還能看到編譯nginx時編譯了那些功能等信息 nginx version: nginx/1.20.1 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log

6.5 使用nginx服務控制命令重啟并指定配置文件路徑

[root@localhost conf]# pwd /usr/local/nginx/conf[root@localhost conf]# cp nginx.conf mime.types /opt/ [root@localhost conf]# cd /opt/ [root@localhost opt]# ls mime.types nginx.conf nginx.sh packages[root@localhost opt]# head -3 nginx.conf #user nobody; worker_processes 1;[root@localhost opt]# nginx -s quit ; nginx -c /usr/local/nginx/conf/nginx.conf[root@localhost opt]# head -3 /usr/local/nginx/conf/nginx.conf#user nobody; worker_processes 3;[root@localhost opt]# ps -ef | grep nginx root 42776 1 0 11:00 ? 00:00:00 nginx: master process nginx -c /usr/local/nginx/conf/nginx.conf nginx 42777 42776 0 11:00 ? 00:00:00 nginx: worker process nginx 42778 42776 0 11:00 ? 00:00:00 nginx: worker process nginx 42779 42776 0 11:00 ? 00:00:00 nginx: worker process root 43003 1358 0 11:00 pts/0 00:00:00 grep --color=auto nginx[root@localhost opt]# nginx -s quit ; nginx -c /opt/nginx.conf [root@localhost opt]# ps -ef | grep nginx root 45058 1 0 11:02 ? 00:00:00 nginx: master process nginx -c /opt/nginx.conf nginx 45059 45058 0 11:02 ? 00:00:00 nginx: worker process root 45134 1358 0 11:02 pts/0 00:00:00 grep --color=auto nginx

7. nginx用于調試,定位問題的配置參數

是否以守護進程方式運行Nginx
守護進程(daemon)是脫離終端并且在后臺運行的進程。它脫離終端是為了避免進程執行過程中的信息在任何終端上顯示,這樣一來,進程也不會被任何終端所產生的信息所打斷。Nginx毫無疑問是一個需要以守護進程方式運行的服務,因此,默認都是以這種方式運行的。

不過Nginx還是提供了關閉守護進程的模式,之所以提供這種模式,是為了方便跟蹤調試Nginx,畢竟用gdb調試進程時最煩瑣的就是如何繼續跟進fork出的子進程了。

daemon {on|off}; //是否以守護進程方式運行nginx,調試時應設置為off master_process {on|off}; //是否以master/worker模型來運行nginx,調試時可以設置為off error_log 位置 級別; //配置錯誤日志用法: Syntax: daemon on | off; //語法 Default: daemon on; //默認值 Context: main //可以配置在那個字段中 [root@localhost conf]# head -4 nginx.conf#user nobody; worker_processes 3; daemon off[root@localhost conf]# systemctl restart nginx.service // 此時nginx將不會以守護進程的方式運行,會一直占據著前臺屏幕

master_process {on|off}; //是否以master/worker模型來運行nginx,調試時可以設置為off

//用法 Syntax: master_process on | off; Default: master_process on; Context: main// nginx默認是以master/worker模型來運行 [root@localhost opt]# head -4 nginx.conf #user nobody; worker_processes 1; master_process off;//重新讀取nginx配置文件 [root@localhost opt]# systemctl stop nginx.service ; nginx -c /opt/nginx.conf [root@localhost opt]# ps -ef | grep nginx root 13256 1 0 11:47 ? 00:00:00 nginx -c /opt/nginx.conf root 13466 1358 0 11:47 pts/0 00:00:00 grep --color=auto nginx

error_log 位置 級別; //配置錯誤日志

//用法,在不同的字段有不同的含義,比如在main字段寫就會對整個nginx產生影響,在http字段寫就會對某個網站產生影響Syntax: error_log file [level]; Default: error_log logs/error.log error; Context: main, http, mail, stream, server, location[root@localhost opt]# head -4 nginx.conf #user nobody; worker_processes 1; error_log logs/error.log;重啟nginx服務讓配置文件生效 [root@localhost opt]# systemctl stop nginx; nginx -c /opt/nginx.conf[root@localhost opt]# ls /usr/local/nginx/logs/ error.log nginx.pid[root@localhost opt]# ls /usr/local/nginx/logs/ error.log nginx.pid [root@localhost opt]# curl http://192.168.182.131/sx.txt <html> <head><title>404 Not Found</title></head> <body> <center><h1>404 Not Found</h1></center> <hr><center>nginx/1.20.1</center> </body> </html>[root@localhost opt]# cat /var/log/nginx/error.log 2021/10/25 17:18:19 [error] 10117#0: *1 open() "/usr/local/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.182.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.182.131", referrer: "http://192.168.182.131/" 2021/10/25 18:29:13 [notice] 119113#0: signal process started 2021/10/25 18:33:46 [notice] 124307#0: signal process started 2021/10/25 19:29:31 [notice] 56895#0: signal process started 2021/10/26 10:53:47 [notice] 35176#0: signal process started 2021/10/26 10:53:47 [notice] 35188#0: signal process started 2021/10/26 10:57:44 [notice] 39890#0: signal process started 2021/10/26 10:57:44 [notice] 39893#0: signal process started

error_log里的位置和級別能有以下可選項:
位置 | 級別
file | 記錄到某個文件中
stdree | 記錄到標準錯誤中(不推薦)
syslog:server=address[,parameter=value] | 記錄到某臺日志服務器中
memory:size | 記錄到內存中(不推薦)

日志級別含義
debug若要使用debug級別,需要在編譯nginx時使用–with-debug選項
info一般信息
notice不影響正常功能,需要注意的消息
warn可能影響系統功能,需要提醒用戶的重要事件
error錯誤信息(常用的)
cuit緊急,比較嚴重的
alert必須馬上處理的
emerg會導致系統不可用的

正常運行必備的配置參數

user USERNAME [GROUPNAME]; //指定運行worker進程的用戶和組 pid /path/to/pid_file; //指定nginx守護進程的pid文件 worker_rlimit_nofile number; //設置所有worker進程最大可以打開的文件數,默認為1024 worker_rlimit_core size; //指明所有worker進程所能夠使用的總體的最大核心文件大小,保持默認即可

總結

以上是生活随笔為你收集整理的nginx工作原理、配置以及web服务器的资源请求过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。