<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Nginx的基本使用

      1、Nginx的基本介紹

      Nginx 就是一個服務(wù)器軟件,它是俄羅斯人編寫的十分輕量級的 HTTP服務(wù)器,它的發(fā)音為“engine X”,是一個高性能的HTTP和反向代理服務(wù)器,同時也是一個IMAP/POP3/SMTP 代理服務(wù)器。

      其特點是占有內(nèi)存少,并發(fā)能力強(qiáng),易于開發(fā),部署方便。Nginx 支持多語言通用服務(wù)器。Nginx 專為性能優(yōu)化而開發(fā),能夠經(jīng)受高負(fù)載的考驗,有報告表名能支持高達(dá) 50000 個并發(fā)連接數(shù)。

      Nginx 啟動特別容易,并且?guī)缀蹩梢宰龅?*24不間斷運(yùn)行,即使運(yùn)行數(shù)個月也不需要重新啟動。你還能夠不間斷服務(wù)的情況下進(jìn)行軟件版本的升級。

      缺點:Nginx 只適合靜態(tài)和反向代理。

      優(yōu)點:負(fù)載均衡、反向代理、處理靜態(tài)文件優(yōu)勢。Nginx 處理靜態(tài)請求的速度高于Apache。

      Nginx有動態(tài)分離機(jī)制,靜態(tài)請求直接就可以通過Nginx處理,動態(tài)請求才轉(zhuǎn)發(fā)請求到后臺交由Tomcat進(jìn)行處理。

       

      2、Nginx的相關(guān)概念

      2.1、正向代理和反向代理

      正向代理即是客戶端代理,代理客戶端,服務(wù)端不知道實際發(fā)起請求的客戶端。反向代理即是服務(wù)端代理, 代理服務(wù)端, 客戶端不知道實際提供服務(wù)的服務(wù)端。

      正向代理類似一個跳板機(jī),代理訪問外部資源。比如我們國內(nèi)訪問谷歌,直接訪問訪問不到,我們可以通過一個正向代理服務(wù)器,請求發(fā)到代理服,代理服務(wù)器能夠訪問谷歌,這樣由代理去谷歌取到返回數(shù)據(jù),再返回給我們,這樣我們就能訪問谷歌了。

      正向代理即是客戶端代理,代理客戶端,服務(wù)端不知道實際發(fā)起請求的客戶端。

      正向代理的用途:

        (1)訪問原來無法訪問的資源,如google

             (2) 可以做緩存,加速訪問資源

        (3)對客戶端訪問授權(quán),上網(wǎng)進(jìn)行認(rèn)證

        (4)代理可以記錄用戶訪問記錄(上網(wǎng)行為管理),對外隱藏用戶信息

       

      反向代理(Reverse Proxy)實際運(yùn)行方式是指以代理服務(wù)器來接受internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請求連接的客戶端,此時代理服務(wù)器對外就表現(xiàn)為一個服務(wù)器。

      反向代理即是服務(wù)端代理, 代理服務(wù)端, 客戶端不知道實際提供服務(wù)的服務(wù)端。

      反向代理時,客戶端對代理是無感知的,因為客戶端無需任何配置。客戶端只需將請求發(fā)送給反向代理服務(wù)器,由反向代理服務(wù)器發(fā)送請求給目標(biāo)服務(wù)器并獲取數(shù)據(jù),再返回給客戶端。此時反向代理服務(wù)器和目標(biāo)服務(wù)器對外就像是一個服務(wù)器,暴露的是代理服務(wù)器的地址,隱藏了真實服務(wù)器的 ip 地址。

      反向代理的作用:

      (1)保證內(nèi)網(wǎng)的安全,阻止web攻擊,大型網(wǎng)站,通常將反向代理作為公網(wǎng)訪問地址,Web服務(wù)器是內(nèi)網(wǎng)

      (2)負(fù)載均衡,通過反向代理服務(wù)器來優(yōu)化網(wǎng)站的負(fù)載

      參考:http://www.rzrgm.cn/taostaryu/p/10547132.html

       

      2.2、負(fù)載均衡

      負(fù)載均衡,英文名稱為Load Balance,其含義就是指將負(fù)載(工作任務(wù))進(jìn)行平衡、分?jǐn)偟蕉鄠€操作單元上進(jìn)行運(yùn)行,例如FTP服務(wù)器、Web服務(wù)器、企業(yè)核心應(yīng)用服務(wù)器和其它主要任務(wù)服務(wù)器等,從而協(xié)同完成工作任務(wù)。形象來說就是,單個服務(wù)器解決不了,我們就增加服務(wù)器的數(shù)量,然后將請求分發(fā)到各個服務(wù)器上,將原先請求集中到單個服務(wù)器上的情況改為將請求分發(fā)到多個服務(wù)器上,將負(fù)載分發(fā)到不同服務(wù)器上。

       

      2.3、動靜分離

      Nginx有動態(tài)分離機(jī)制,靜態(tài)請求直接就可以通過 Nginx 處理,動態(tài)請求才轉(zhuǎn)發(fā)請求到后臺交由 Tomcat 進(jìn)行處理。動靜分離簡單來說就是把動態(tài)請求和靜態(tài)請求分開,可以理解為使用 Nginx 處理靜態(tài)頁面,tomcat 處理動態(tài)頁面。動靜分離可以簡單理解為:動態(tài)文件與靜態(tài)文件的分離。

      動靜分離將網(wǎng)站靜態(tài)資源(HTML,JavaScript,CSS,img等文件)與后臺應(yīng)用分開部署,提高用戶訪問靜態(tài)代碼的速度,降低對后臺應(yīng)用訪問。比如,我們可以將靜態(tài)資源放到nginx中,動態(tài)資源轉(zhuǎn)發(fā)到tomcat服務(wù)器中。

      如果不是動靜分離,即將靜態(tài)資源(html、css、js)和動態(tài)資源(jsp、servlet)都放在同一臺服務(wù)器上,對服務(wù)器的壓力會很大。而如果采用動靜分離,則可以將動態(tài)資源與靜態(tài)資源分離,不部署在同一臺服務(wù)器上,減輕服務(wù)器的壓力。

       

       

       3、Nginx的安裝

      nginx是C語言開發(fā),建議在linux上運(yùn)行。

      先安裝Linux系統(tǒng),看參考:http://www.rzrgm.cn/wenxuehai/p/14966942.html

      安裝好后,利用遠(yuǎn)程攻擊 putty 連接 Linux 系統(tǒng)。

      3.1、安裝依賴

      先安裝依賴 gcc、pcre-devel、zlib-devel、openssl-devel,通過 putty 連接 Linux 后,直接在命令行輸入以下命令進(jìn)行安裝:

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

      可能會提示需要 root 權(quán)限,此時是因為你沒有使用 root 用戶連接 Linux,只需退出重新連接,通過 root 用戶來連接即可,該用戶的密碼一般是 123456。

      如果提示 yum.pid 已被鎖定,則通過強(qiáng)制命令 rm -f /var/run/yum.pid 來關(guān)閉 yum 進(jìn)程,然后再重新安裝即可。

       

       

       

      3.2、下載上傳Nginx

      先下載 Nginx,下載連接:https://nginx.org/download/,比如我們下 1.12.2 版本:

       

      然后通過 PuTTY 提供的 PSCP 工具來實現(xiàn)將本地 window 系統(tǒng)的文件上傳到 Linux 系統(tǒng)上,將 Nginx 壓縮包上傳到 Linux 上。

      先找到 pscp.exe 程序的所在位置,一般跟 putty.exe 程序在同一目錄,在該目錄下打開命令行,輸入以下命令:

      pscp 本地文件完整路徑 用戶名@Linux系統(tǒng)ip:目錄
      
      -- 示例如下:
      pscp f:\nginx-1.12.2.tar.gz root@192.168.32.128:/usr/src

      或者可以通過 SSH Secure File Transfer Client 軟件來上傳文件到 Linux 上,更加方便

       

      3.3、解壓和安裝

      上傳成功后進(jìn)行解壓,注意,使用 putty 的連接而不是 pscp 的連接來進(jìn)行解壓。

      先切換到 Nginx 的目錄下,即 /usr/src,然后執(zhí)行解壓命令:

      cd /usr/src
      
      tar -xvf nginx-1.12.2.tar.gz

      解壓之后,進(jìn)入到解壓后的 Nginx 目錄,執(zhí)行安裝命令。依次執(zhí)行以下命令:

      cd nginx-1.12.2/
      
      ./configure
      
      make && make install

       

      3.4、檢驗安裝是否成功

      安裝成功之后,可以在 /usr/local 目錄下看到 nginx 目錄

       

      切換到該目錄下,啟動 Nginx:

      cd /usr/local/nginx/sbin
      ./nginx  -- 啟動nginx

      啟動過后,在本地瀏覽器(即你的 window 系統(tǒng)的瀏覽器)中通過 ip 訪問即可訪問到 Nginx:

      因為防火墻的問題,在 window 系統(tǒng)中訪問 Linux 系統(tǒng)的 Nginx 默認(rèn)是無法訪問的。此時我們可以將防火墻關(guān)閉或者是開啟訪問的 80 端口號即可。

      下面我們來開啟 80 端口號,可以在服務(wù)器中執(zhí)行如下命令來驗證 80 端口號是否已開啟:

      firewall-cmd --query-port=80/tcp

      提示 no 信息,即表示 80 端口未開啟,下面我們開啟80端口:

      firewall-cmd --add-port=80/tcp --permanent
      
      // 重啟防火墻
      systemctl restart firewalld

       --permanent   #永久生效,沒有此參數(shù)重啟后失效

      示例:

       

       

      4、Nginx的常用命令

      要想使用 Nginx 的一些命令,連接到 Nginx 后,需要切換到 Nginx 的腳本目錄下:

      cd /usr/local/nginx/sbin

       

      4.1、查看Nginx的版本

      查看 nginx 的版本可以用 ./nginx -v 命令:

       

      4.2、查看Nginx的狀態(tài)

      查看 Nginx 進(jìn)程的狀態(tài)的命令:

      ps -ef | grep nginx

      Nginx 已啟動時的狀態(tài):

      Nginx 關(guān)閉時的狀態(tài):

       

      4.2、啟動Nginx

      啟動命令:

      ./nginx

       

      4.3、關(guān)閉Nginx

      關(guān)閉命令:

      ./nginx -s stop

       

      4.4、重新加載Nginx

      在我們修改 Nginx 的配置文件后,可以重啟來讓它重新加載配置文件,但也可以不重啟,直接讓它重新加載即可,此時用重新加載命令即可:

      ./nginx -s reload

       

      5、Nginx的配置文件

      Nginx 的配置文件在 usr/local/nginx/conf 目錄下,在該目錄可以看到 nginx.conf 文件,該文件就是 Nginx 的配置文件:

       

      默認(rèn)的 nginx.conf 文件如下:

      #user  nobody;
      worker_processes  1;
      
      #error_log  logs/error.log;
      #error_log  logs/error.log  notice;
      #error_log  logs/error.log  info;
      
      #pid        logs/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 {
              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  404              /404.html;
      
              # redirect server error pages to the static page /50x.html
              #
              error_page   500 502 503 504  /50x.html;
              location = /50x.html {
                  root   html;
              }
      
              # proxy the PHP scripts to Apache listening on 127.0.0.1:80
              #
              #location ~ \.php$ {
              #    proxy_pass   http://127.0.0.1;
              #}
      
              # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
              #
              #location ~ \.php$ {
              #    root           html;
              #    fastcgi_pass   127.0.0.1:9000;
              #    fastcgi_index  index.php;
              #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
              #    include        fastcgi_params;
              #}
      
              # deny access to .htaccess files, if Apache's document root
              # concurs with nginx's one
              #
              #location ~ /\.ht {
              #    deny  all;
              #}
          }
      
      
          # another virtual host using mix of IP-, name-, and port-based configuration
          #
          #server {
          #    listen       8000;
          #    listen       somename:8080;
          #    server_name  somename  alias  another.alias;
      
          #    location / {
          #        root   html;
          #        index  index.html index.htm;
          #    }
          #}
      
      
          # HTTPS server
          #
          #server {
          #    listen       443 ssl;
          #    server_name  localhost;
      
          #    ssl_certificate      cert.pem;
          #    ssl_certificate_key  cert.key;
      
          #    ssl_session_cache    shared:SSL:1m;
          #    ssl_session_timeout  5m;
      
          #    ssl_ciphers  HIGH:!aNULL:!MD5;
          #    ssl_prefer_server_ciphers  on;
      
          #    location / {
          #        root   html;
          #        index  index.html index.htm;
          #    }
          #}
      
      }

      nginx.conf 可以看做是由三個部分組成,main、events 和 http。

      main(全局設(shè)置)、server(主機(jī)設(shè)置)、upstream(負(fù)載均衡服務(wù)器設(shè)置)和 location(URL匹配特定位置的設(shè)置)。

      • main塊設(shè)置的指令將影響其他所有設(shè)置;
      • server塊的指令主要用于指定主機(jī)和端口;
      • upstream指令主要用于負(fù)載均衡,設(shè)置一系列的后端服務(wù)器;
      • location塊用于匹配網(wǎng)頁位置。

      這四者之間的關(guān)系式:server繼承main,location繼承server,upstream既不會繼承其他設(shè)置也不會被繼承。
      在這四個部分當(dāng)中,每個部分都包含若干指令,這些指令主要包含Nginx的主模塊指令、事件模塊指令、HTTP核心模塊指令,同時每個部分還可以使用其他HTTP模塊指令,例如Http SSL模塊、HttpGzip Static模塊和Http Addition模塊等。

       

      5.1、如何確定Nginx配置文件的位置

      由于年代久遠(yuǎn)或者安裝方式差異,可能會忘記nginx配置文件路徑,要想找到nginx配置文件,首先要找到nginx命令,然后通過nginx命令找到配置文件路徑。

      參考:https://blog.csdn.net/wangjun5159/article/details/114384336

       

      5.2、全局塊(main)

      全局塊主要是從配置文件到 events 塊之間的內(nèi)容,即最外圍的內(nèi)容。主要是用來設(shè)置一些影響 Nginx 服務(wù)器整體運(yùn)行的配置指令。主要包括配置運(yùn)行 Nginx 服務(wù)器的用戶(組)、允許生成的 worker process 數(shù),進(jìn)程 PID 存放路徑、日志存放路徑和類型以及配置文件的引入等。main塊設(shè)置的指令將影響其他所有設(shè)置。

      比如上面的:

      worker_processes  1;

      這是 Nginx 服務(wù)器并發(fā)處理服務(wù)的關(guān)鍵配置, worker_process 值越大,可以支持的并發(fā)處理量也越多,但是會受到硬件、軟件等設(shè)備的制約。

      worker_processes是個主模塊指令,指定了Nginx要開啟的進(jìn)程數(shù)。每個Nginx進(jìn)程平均耗費10M~12M內(nèi)存。建議指定和CPU的數(shù)量一致即可。

       

      5.3、events塊

      events 塊主要影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接,常用的設(shè)置包括是否開啟對多 work process 下的網(wǎng)絡(luò)連接進(jìn)行序列化,是否允許同時接收多個網(wǎng)絡(luò)連接,選取哪種事件驅(qū)動模型來處理連接請求,每個 work process 可以同時支持的最大連接數(shù)等。

      比如上面的:

      events {
          worker_connections  1024;
      }

      表示每個 work process 支持的最大連接數(shù)是 1024。worker_connections 用來定義 Nginx 每個進(jìn)程的最大連接數(shù),默認(rèn)是1024。

      最大客戶端連接數(shù)由 worker_processes 和 worker_connections 決定,即 Max_client = worker_processes * worker_connections。

       

      5.4、HTTP塊

      這里是 Nginx 中配置最頻繁的部分,代理、緩存和日志定義等絕大多數(shù)功能和第三方模塊的配置都在這里進(jìn)行配置。

       

      6、Nginx的工作原理

      Nginx 默認(rèn)采用多進(jìn)程工作方式,Nginx啟動后,會運(yùn)行一個master進(jìn)程和多個worker進(jìn)程。其中master充當(dāng)整個進(jìn)程組與用戶的交互接口,同時對進(jìn)程進(jìn)行監(jiān)護(hù),管理worker進(jìn)程來實現(xiàn)重啟服務(wù)、平滑升級、更換日志文件、配置文件實時生效等功能。worker用來處理基本的網(wǎng)絡(luò)事件,worker之間是平等的,他們共同競爭來處理來自客戶端的請求。

      Nginx在啟動后,會有一個master進(jìn)程和多個worker進(jìn)程。

      nginx的進(jìn)程模型:

       

      6.1、master進(jìn)程(管理進(jìn)程)

      master進(jìn)程主要用來管理worker進(jìn)程,具體包括如下4個主要功能:
      (1)接收來自外界的信號。
      (2)向各worker進(jìn)程發(fā)送信號。
      (3)監(jiān)控woker進(jìn)程的運(yùn)行狀態(tài)。
      (4)當(dāng)woker進(jìn)程退出后(異常情況下),會自動重新啟動新的woker進(jìn)程。

      用戶交互接口:master進(jìn)程充當(dāng)整個進(jìn)程組與用戶的交互接口,同時對進(jìn)程進(jìn)行監(jiān)護(hù)。它不需要處理網(wǎng)絡(luò)事件,不負(fù)責(zé)業(yè)務(wù)的執(zhí)行,只會通過管理worker進(jìn)程來實現(xiàn)重啟服務(wù)、平滑升級、更換日志文件、配置文件實時生效等功能。

      重啟work進(jìn)程:我們要控制nginx,只需要通過kill向master進(jìn)程發(fā)送信號就行了。比如kill -HUP pid,則是告訴nginx,從容地重啟nginx,我們一般用這個信號來重啟nginx,或重新加載配置,因為是從容地重啟,因此服務(wù)是不中斷的。

      直接給master進(jìn)程發(fā)送信號,這是比較傳統(tǒng)的操作方式,nginx在0.8版本之后,引入了一系列命令行參數(shù),來方便我們管理。比如,./nginx -s reload,就是來重啟nginx,./nginx -s stop,就是來停止nginx的運(yùn)行。如何做到的呢?我們還是拿reload來說,我們看到,執(zhí)行命令時,我們是啟動一個新的nginx進(jìn)程,而新的nginx進(jìn)程在解析到reload參數(shù)后,就知道我們的目的是控制nginx來重新加載配置文件了,它會向master進(jìn)程發(fā)送信號,然后接下來的動作,就和我們直接向master進(jìn)程發(fā)送信號一樣了。

       

      6.2、worker進(jìn)程(處理請求)

      而基本的網(wǎng)絡(luò)事件,則是放在worker進(jìn)程中來處理了。多個worker進(jìn)程之間是對等的,他們同等競爭來自客戶端的請求,各進(jìn)程互相之間是獨立的。一個請求,只可能在一個worker進(jìn)程中處理,一個worker進(jìn)程不可能處理其它進(jìn)程的請求。

      worker進(jìn)程的個數(shù)是可以設(shè)置的,一般我們會設(shè)置與機(jī)器cpu核數(shù)一致。每個 worker 的線程可以把一個 CPU 的性能發(fā)揮到極致,所以 worker數(shù)和服務(wù)器的 CPU 數(shù)相等是最合適的。設(shè)少了會浪費 CPU,設(shè)多了會造成 CPU 頻繁切換上下文帶來的損耗。

      worker進(jìn)程之間是平等的,每個進(jìn)程,處理請求的機(jī)會也是一樣的。當(dāng)我們提供80端口的http服務(wù)時,一個連接請求過來,每個進(jìn)程都有可能處理這個連接,怎么做到的呢?

      Nginx采用異步非阻塞的方式來處理網(wǎng)絡(luò)事件,類似于Libevent,具體過程如下:

      1)接收請求:首先,每個worker進(jìn)程都是從master進(jìn)程fork過來,在master進(jìn)程建立好需要listen的socket(listenfd)之后,然后再fork出多個worker進(jìn)程。所有worker進(jìn)程的listenfd會在新連接到來時變得可讀,每個work進(jìn)程都可以去accept這個socket(listenfd)。當(dāng)一個client連接到來時,所有accept的work進(jìn)程都會受到通知,但只有一個進(jìn)程可以accept成功,其它的則會accept失敗。為保證只有一個進(jìn)程處理該連接,Nginx提供了一把共享鎖accept_mutex來保證同一時刻只有一個work進(jìn)程在accept連接。所有worker進(jìn)程在注冊listenfd讀事件前搶accept_mutex,搶到互斥鎖的那個進(jìn)程注冊listenfd讀事件,在讀事件里調(diào)用accept接受該連接。

      2)處理請求:當(dāng)一個worker進(jìn)程在accept這個連接之后,就開始讀取請求,解析請求,處理請求,產(chǎn)生數(shù)據(jù)后,再返回給客戶端,最后才斷開連接,這樣一個完整的請求就是這樣的了。

      我們可以看到,一個請求,完全由worker進(jìn)程來處理,而且只在一個worker進(jìn)程中處理。worker進(jìn)程之間是平等的,每個進(jìn)程,處理請求的機(jī)會也是一樣的。

       

      6.3、Nginx多進(jìn)程模型的好處

      首先,對于每個worker進(jìn)程來說,獨立的進(jìn)程,不需要加鎖,所以省掉了鎖帶來的開銷,同時在編程以及問題查找時,也會方便很多。

      其次,采用獨立的進(jìn)程,可以讓互相之間不會影響,一個進(jìn)程退出后,其它進(jìn)程還在工作,服務(wù)不會中斷,master進(jìn)程則很快啟動新的worker進(jìn)程。當(dāng)然,worker進(jìn)程的異常退出,肯定是程序有bug了,異常退出,會導(dǎo)致當(dāng)前worker上的所有請求失敗,不過不會影響到所有請求,所以降低了風(fēng)險。

       

      6.4、Nginx支持的并發(fā)數(shù)

      單個進(jìn)程的連接數(shù)有上限,Nginx 上配置單個 Worker 進(jìn)程的最大連接數(shù):worker_connections ,上限為 nofile。Nginx 上配置 Worker 進(jìn)程的數(shù)量:worker_processes。

      • Nginx 的最大連接數(shù):Nginx 的最大連接數(shù) = Worker 進(jìn)程數(shù) *  單個 Worker 進(jìn)程的最大連接數(shù)。
      • Nginx 的最大并發(fā)數(shù):Nginx 作為反向代理服務(wù)器時,每個請求建立1條連接,所以此時最大的并發(fā)數(shù) = 最大連接數(shù)。Nginx 作為反向代理時,會建立 Client 的連接和后端 Web Server 的連接,需要占用 2 個連接,此時最大并發(fā)數(shù) = 最大連接數(shù) / 2。

       

      nginx采用了異步非阻塞的方式來處理請求,nginx 是可以同時處理成千上萬個請求的,一個worker進(jìn)程可以同時處理的請求數(shù)只受限于內(nèi)存大小,而且在架構(gòu)設(shè)計上,不同的worker進(jìn)程之間處理并發(fā)請求時幾乎沒有同步鎖的限制,worker進(jìn)程通常不會進(jìn)入睡眠狀態(tài),因此,當(dāng)Nginx上的進(jìn)程數(shù)與CPU核心數(shù)相等時(最好每一個worker進(jìn)程都綁定特定的CPU核心),進(jìn)程間切換的代價是最小的。

       

      對于Nginx來講,一個進(jìn)程只有一個主線程,那么它是怎么實現(xiàn)高并發(fā)的呢?Nginx 采用了IO多路復(fù)用的原理,通過異步非阻塞的事件處理機(jī)制,實現(xiàn)了輕量級和高并發(fā)。

      簡單來說:每進(jìn)來一個request,會有一個worker進(jìn)程去處理。但不是全程的處理,處理到什么程度呢?處理到可能發(fā)生阻塞的地方,比如向上游(后端)服務(wù)器轉(zhuǎn)發(fā)request,并等待請求返回。那么,這個處理的worker不會這么傻等著,他會在發(fā)送完請求后,注冊一個事件:“如果upstream返回了,告訴我一聲,我再接著干”。于是他就休息去了。此時,如果再有request 進(jìn)來,他就可以很快再按這種方式處理。而一旦上游服務(wù)器返回了,就會觸發(fā)這個事件,worker才會來接手,這個request才會接著往下走。由于web server的工作性質(zhì)決定了每個request的大部份生命都是在網(wǎng)絡(luò)傳輸中,實際上花費在server機(jī)器上的時間片不多,這就是幾個進(jìn)程就能解決高并發(fā)的秘密所在。

      為什么 Nginx 不使用多線程?

      Apache: 創(chuàng)建多個進(jìn)程或線程,而每個進(jìn)程或線程都會為其分配 cpu 和內(nèi)存(線程要比進(jìn)程小的多,所以worker支持比perfork高的并發(fā)),并發(fā)過大會耗光服務(wù)器資源。

      Nginx: 采用單線程來異步非阻塞處理請求(管理員可以配置Nginx主進(jìn)程的工作進(jìn)程的數(shù)量)(epoll),不會為每個請求分配cpu和內(nèi)存資源,節(jié)省了大量資源,同時也減少了大量的CPU的上下文切換。所以才使得Nginx支持更高的并發(fā)。

       

      posted @ 2021-07-03 16:44  wenxuehai  閱讀(1909)  評論(0)    收藏  舉報
      //右下角添加目錄
      主站蜘蛛池模板: 少妇粗大进出白浆嘿嘿视频| 精品偷拍一区二区三区在| 国产色无码专区在线观看| 国产亚洲人成网站在线观看| 蜜桃网址| 亚洲a免费| 无码日韩做暖暖大全免费不卡| 思热99re视热频这里只精品| 国产精品任我爽爆在线播放6080| 午夜一区欧美二区高清三区| 日韩精品 在线 国产 丝袜| 国产精品国三级国产av| 亚洲高清日韩专区精品| 国产女人18毛片水真多1| 亚洲人成精品久久久久| 深夜av在线免费观看| 欧美亚洲综合成人A∨在线| 高清自拍亚洲精品二区| 亚洲老女人区一区二视频| 国产乱妇无码大片在线观看| 91孕妇精品一区二区三区| 国产亚洲av手机在线观看| 97碰碰碰免费公开在线视频| 一区二区视频| 国产成人亚洲精品狼色在线 | 精品国产亚洲第一区二区三区| 国产精品成人网址在线观看| 久久五月丁香合缴情网| 国产睡熟迷奷系列网站| 国产亚洲精品VA片在线播放| 阜平县| 自偷自拍亚洲综合精品| 人人澡超碰碰97碰碰碰| 日韩 一区二区在线观看| 中日韩精品视频一区二区三区 | av一区二区中文字幕| 日韩一区二区三区亚洲一| 18禁在线永久免费观看| 亚洲一区二区三区久久受| 天海翼激烈高潮到腰振不止| 野花韩国高清电影|