0x7OpenResty系列OpenResty最佳案例 | 第1篇:Nginx介紹

      網友投稿 899 2022-05-29

      Nginx?簡介

      Nginx是一個高性能的Web?服務器,同時是一個高效的反向代理服務器,它還是一個IMAP/POP3/SMTP

      代理服務器。

      由于Nginx采用的是事件驅動的架構,能夠處理并發百萬級別的tcp連接,高度的模塊化設計和自由的BSD許可,使得Nginx有著非常豐富的第三方模塊。比如Openresty、API網關Kong。

      BSD開源協議是一個給予使用者很大自由的協議。基本上使用者可以”為所欲為”,可以自由的使用,修改源代碼,也可以將修改后的代碼作為開源或者專有軟件再發布。

      Nginx的優點

      ·??????高并發響應性能非常好,官方Nginx處理靜態文件并發5w/s

      ·??????反向代理性能非常強。(可用于負載均衡)

      ·??????內存和cpu占用率低。(為Apache的1/5-1/10)

      ·??????對后端服務有健康檢查功能。

      ·??????支持PHP cgi方式和fastcgi方式。

      ·??????配置代碼簡潔且容易上手。

      Nginx的安裝

      Centos系統安裝,請參考這里http://www.linuxidc.com/Linux/2016-09/134907.htm。先復制粘貼下它的文章。

      1.gcc?安裝

      安裝nginx?需要先將官網下載的源碼進行編譯,編譯依賴gcc?環境,如果沒有gcc?環境,則需要安裝:

      yum install gcc-c++

      2.PCRE pcre-devel?安裝

      PCRE(Perl Compatible Regular Expressions)?是一個Perl庫,包括perl?兼容的正則表達式庫。nginx?的http?模塊使用pcre?來解析正則表達式,所以需要在linux?上安裝pcre?庫,pcre-devel?是使用pcre?開發的一個二次開發庫。nginx也需要此庫。命令:

      yum install -y pcre pcre-devel

      3.zlib?安裝

      zlib?庫提供了很多種壓縮和解壓縮的方式,nginx?使用zlib?對http?包的內容進行gzip?,所以需要在Centos?上安裝zlib?庫。

      yum install -y zlib zlib-devel

      4.OpenSSL?安裝

      OpenSSL?是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL?協議,并提供豐富的應用程序供測試或其它目的使用。

      nginx?不僅支持http?協議,還支持https(即在ssl協議上傳輸http),所以需要在Centos?安裝OpenSSL?庫。

      yum install -y openssl openssl-devel

      5.官網下載

      1.直接下載.tar.gz安裝包,地址:https://nginx.org/en/download.html

      2.使用wget命令下載(推薦)。

      wget -c https://nginx.org/download/nginx-1.10.1.tar.gz

      6.解壓

      依然是直接命令:

      tar -zxvf nginx-1.10.1.tar.gz

      cd nginx-1.10.1

      7.配置

      其實在nginx-1.10.1?版本中你就不需要去配置相關東西,默認就可以了。當然,如果你要自己配置目錄也是可以的。

      使用默認配置

      ./configure

      8.編譯安裝

      make

      make install

      查找安裝路徑:

      whereis nginx

      Nginx的模塊組成

      Nginx的模塊從結構上分為核心模塊、基礎模塊和第三方模塊:

      ·??????核心模塊:HTTP模塊、EVENT模塊和MAIL模塊

      ·??????基礎模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊,

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

      Nginx的高并發得益于其采用了epoll模型,與傳統的服務器程序架構不同,epoll是linux內核2.6以后才出現的。Nginx采用epoll模型,異步非阻塞,而Apache采用的是select模型。

      ·??????Select特點:select?選擇句柄的時候,是遍歷所有句柄,也就是說句柄有事件響應時,select需要遍歷所有句柄才能獲取到哪些句柄有事件通知,因此效率是非常低。

      ·??????epoll的特點:epoll對于句柄事件的選擇不是遍歷的,是事件響應的,就是句柄上事件來就馬上選擇出來,不需要遍歷整個句柄鏈表,因此效率非常高。

      Nginx常用命令

      nginx?環境變量配置:

      export PATH=$PATH:/usr/servers/nginx/sbin

      ·??????查看nginx進程

      ps -ef|grep nginx

      ·??????啟動nginx

      nginx

      啟動結果顯示nginx的主線程和工作線程,工作線程的數量跟nginx.conf中的配置參數worker_processes有關。

      ·??????平滑啟動nginx

      kill -HUP?cat /var/run/nginx.pid

      或者

      nginx -s reload

      ·??????強制停止nginx

      pkill -9 nginx

      ·??????檢查對nginx.conf文件的修改是否正確

      nginx -t

      ·??????停止nginx的命令

      nginx -s stop或者pkill nginx

      ·??????查看nginx的版本信息

      nginx -v

      ·??????查看完整的nginx的配置信息

      nginx -V

      Nginx的配置

      通常情況下,Nginx的配置在Ngix的安裝目錄下的/conf/config.default?文件里,基本配置如下:

      worker_process?#?表示工作進程的數量,一般設置為cpu的核數

      worker_connections?#?表示每個工作進程的最大連接數

      server{}?#?塊定義了虛擬主機

      listen?#?監聽端口

      server_name?#?監聽域名

      location?{}?#?是用來為匹配的?URI?進行配置,URI?即語法中的“/uri/”

      location?/{}?#?匹配任何查詢,因為所有請求都以?/?開頭

      root?#?指定對應uri的資源查找路徑,這里html為相對路徑,完整路徑為

      #?/opt/nginx-1.7.7/html/

      index?#?指定首頁index文件的名稱,可以配置多個,以空格分開。如有多

      #?個,按配置順序查找。

      location?常用配置如下:

      模式

      含義

      location = /uri

      =?表示精確匹配,只有完全匹配上才能生效

      location ^~ /uri

      ^~?開頭對URL路徑進行前綴匹配,并且在正則之前。

      location ~ pattern

      開頭表示區分大小寫的正則匹配

      location ~* pattern

      開頭表示不區分大小寫的正則匹配

      location /uri

      不帶任何修飾符,也表示前綴匹配,但是在正則匹配之后

      location /

      通用匹配,任何未匹配到其它location的請求都會匹配到,相當于switch中的default

      Nginx的常用配置非常多,以下內容摘自于布爾教育課件,僅供參考:

      #定義Nginx運行的用戶和用戶組

      user??www?www;

      #啟動進程,通常設置成和cpu的數量相等

      worker_processes??8;

      worker_cpu_affinity?00000001?00000010?00000100?00001000?00010000?00100000?01000000?10000000;

      #為每個進程分配cpu,上例中將8個進程分配到8個cpu,當然可以寫多個,或者將一個進程分配到多個cpu。

      worker_rlimit_nofile?102400;

      #這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打

      #開文件數(ulimit?-n)與nginx進程數相除,但是nginx分配請求并不是那么均勻

      #,所以最好與ulimit?-n的值保持一致。

      #全局錯誤日志及PID文件

      error_log??/usr/local/nginx/logs/error.log;

      #錯誤日志定義等級,[?debug?|?info?|?notice?|?warn?|?error?|?crit?]

      pid????????/usr/local/nginx/nginx.pid;

      #一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(系統的值ulimit?-n)與nginx進程數相除,但是nginx分配請求并不均勻.

      #所以建議與ulimit?-n的值保持一致。

      worker_rlimit_nofile?65535;

      #工作模式及連接數上限

      events?{

      use???epoll;?????????????????#epoll是多路復用IO(I/O?Multiplexing)中的一種方式,但是僅用于linux2.6以上內核,可以大大提高nginx的性能

      worker_connections??102400;????#單個后臺worker?process進程的最大并發鏈接數?(最大連接數=連接數*進程數)

      multi_accept?on;?#盡可能多的接受請求

      }

      #設定http服務器,利用它的反向代理功能提供負載均衡支持

      http?{

      #設定mime類型,類型由mime.type文件定義

      include???????mime.types;

      default_type??application/octet-stream;

      #設定日志格式

      access_log????/usr/local/nginx/log/nginx/access.log;

      sendfile??????on;

      #sendfile?指令指定?nginx?是否調用?sendfile?函數(zero?copy?方式)來輸出文件,對于普通應用必須設為?on

      #如果用來進行下載等應用磁盤IO重負載應用,可設置為?off,以平衡磁盤與網絡I/O處理速度,降低系統的uptime.

      #autoindex??on;??#開啟目錄列表訪問,合適下載服務器,默認關閉。

      tcp_nopush?on;?#防止網絡阻塞

      keepalive_timeout?60;

      #keepalive超時時間,客戶端到服務器端的連接持續有效時間,當出現對服務器的后,繼請求時,keepalive-timeout功能可避免建立或重新建立連接。

      tcp_nodelay???on;?#提高數據的實時響應性

      #開啟gzip壓縮

      gzip?on;

      gzip_min_length??1k;

      gzip_buffers?????4?16k;

      gzip_http_version?1.1;

      gzip_comp_level?2;?#壓縮級別大小,最大為9,值越小,壓縮后比例越小,CPU處理更快。

      #值越大,消耗CPU比較高。

      gzip_types???????text/plain?application/x-javascript?text/css?application/xml;

      gzip_vary?on;

      client_max_body_size?10m;??????#允許客戶端請求的最大單文件字節數

      client_body_buffer_size?128k;??#緩沖區代理緩沖用戶端請求的最大字節數,

      proxy_connect_timeout?90;??????#nginx跟后端服務器連接超時時間(代理連接超時)

      proxy_send_timeout?90;?????????#后端服務器數據回傳時間(代理發送超時)

      proxy_read_timeout?90;?????????#連接成功后,后端服務器響應時間(代理接收超時)

      proxy_buffer_size?4k;??????????#設置代理服務器(nginx)保存用戶頭信息的緩沖區大小

      proxy_buffers?4?32k;???????????#proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設置

      proxy_busy_buffers_size?64k;???#高負荷下緩沖大小(proxy_buffers*2)

      #設定請求緩沖

      large_client_header_buffers??4?4k;

      client_header_buffer_size?4k;

      #客戶端請求頭部的緩沖區大小,這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過1k

      #不過由于一般系統分頁都要大于1k,所以這里設置為分頁大小。分頁大小可以用命令getconf?PAGESIZE取得。

      open_file_cache?max=102400?inactive=20s;

      #這個將為打開文件指定緩存,默認是沒有啟用的,max指定緩存數量,建議和打開文件數一致,inactive是指經過多長時間文件沒被請求后刪除緩存。

      open_file_cache_valid?30s;

      #這個是指多長時間檢查一次緩存的有效信息。

      open_file_cache_min_uses?1;

      #open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive

      #包含其它配置文件,如自定義的虛擬主機

      include?vhosts.conf;

      }

      配置詳解2如下:

      #這里為后端服務器wugk應用集群配置,根據后端實際情況修改即可,tdt_wugk為負載均衡名稱,可以任意指定

      #但必須跟vhosts.conf虛擬主機的pass段一致,否則不能轉發后端的請求。weight配置權重,在fail_timeout內檢查max_fails次數,失敗則剔除均衡。

      upstream?tdt_wugk?{

      server???127.0.0.1:8080?weight=1?max_fails=2?fail_timeout=30s;

      server???127.0.0.1:8081?weight=1?max_fails=2?fail_timeout=30s;

      }

      #虛擬主機配置

      server?{

      #偵聽80端口

      listen???????80;

      #定義使用www.wuguangke.cn訪問

      server_name??www.wuguangke.cn;

      #設定本虛擬主機的訪問日志

      access_log??logs/access.log??main;

      root???/data/webapps/wugk;??#定義服務器的默認網站根目錄位置

      index?index.php?index.html?index.htm;???#定義首頁索引文件的名稱

      #默認請求

      location?~?/{

      root???/data/www/wugk;??????#定義服務器的默認網站根目錄位置

      index?index.php?index.html?index.htm;???#定義首頁索引文件的名稱

      #以下是一些反向代理的配置.

      proxy_next_upstream?http_502?http_504?error?timeout?invalid_header;

      #如果后端的服務器返回502、504、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另一臺服務器,實現故障轉移。

      proxy_redirect?off;

      #后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP

      proxy_set_header?Host?$host;

      proxy_set_header?X-Real-IP?$remote_addr;

      proxy_set_header?X-Forwarded-For?$proxy_add_x_forwarded_for;

      proxy_pass??http://tdt_wugk;?????#請求轉向后端定義的均衡模塊

      }

      #?定義錯誤提示頁面

      error_page???500?502?503?504?/50x.html;

      location?=?/50x.html?{

      root???html;

      }

      #配置Nginx動靜分離,定義的靜態頁面直接從Nginx發布目錄讀取。

      location?~?.*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$

      {

      root?/data/www/wugk;

      #expires定義用戶瀏覽器緩存的時間為3天,如果靜態頁面不常更新,可以設置更長,這樣可以節省帶寬和緩解服務器的壓力。

      expires??????3d;

      }

      #PHP腳本請求全部轉發到?FastCGI處理.?使用FastCGI默認配置.

      location?~?\.php$?{

      root?/root;

      fastcgi_pass?127.0.0.1:9000;

      fastcgi_index?index.php;

      fastcgi_param?SCRIPT_FILENAME?/data/www/wugk$fastcgi_script_name;

      include?fastcgi_params;

      }

      #設定查看Nginx狀態的地址

      location?/NginxStatus?{

      stub_status??on;

      }

      }

      }

      Nginx?內置綁定變量

      名稱

      說明

      $arg_name

      請求中的name參數

      $args

      請求中的參數

      $binary_remote_addr

      遠程地址的二進制表示

      $body_bytes_sent

      已發送的消息體字節數

      $content_length HTTP

      0x7OpenResty系列:Openresty最佳案例 | 第1篇:Nginx介紹

      請求信息里的”Content-Length”

      $content_type

      請求信息里的”Content-Type”

      $document_root

      針對當前請求的根路徑設置值

      $document_uri

      與$uri相同;?比如/test2/test.php

      $host

      請求信息中的”Host”,如果請求中沒有Host行,則等于設置的服務器名

      $hostname

      機器名使用gethostname系統調用的值

      $http_cookie

      cookie?信息

      $http_referer

      引用地址

      $http_user_agent

      客戶端代理信息

      $http_via

      最后一個訪問服務器的Ip地址。

      $http_x_forwarded_for

      相當于網絡訪問路徑

      $is_args

      如果請求行帶有參數,返回“?”,否則返回空字符串

      $limit_rate

      對連接速率的限制

      $nginx_version

      當前運行的nginx版本號

      $pid worker

      進程的PID

      $query_string

      與$args相同

      $realpath_root

      按root指令或alias指令算出的當前請求的絕對路徑。其中的符號鏈接都會解析成真是文件路徑,使用Nginx?內置綁定變量

      207$remote_addr

      客戶端IP地址

      $remote_port

      客戶端端口號

      $remote_user

      客戶端用戶名,認證用

      $request

      用戶請求

      $request_body

      這個變量(0.7.58+)包含請求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比較有意義

      $request_body_file

      客戶端請求主體信息的臨時文件名

      $request_completion

      如果請求成功,設為”OK”;如果請求未完成或者不是一系列請求中最后一部分則設為空

      $request_filename

      當前請求的文件路徑名,比如/opt/nginx/www/test.php

      $request_method

      請求的方法,比如”GET”、”POST”等

      $request_uri

      請求的URI,帶參數

      $scheme

      所用的協議,比如http或者是https

      $server_addr

      服務器地址,如果沒有用listen指明服務器地址,使用這個變量將發起一次系統調用以取得地址(造成資源浪費)

      $server_name

      請求到達的服務器名

      $server_port

      請求到達的服務器端口號

      $server_protocol

      請求的協議版本,”HTTP/1.0”或”HTTP/1.1”

      $uri

      請求的URI,可能和最初的值有不同,比如經過重定向之類的

      參考資料

      http://www.linuxidc.com/Linux/2016-09/134907.htm

      https://moonbingbing.gitbooks.io/openresty-best-practices/content/ngx/nginx.html

      布爾教育課件

      方志朋簡介:SpringCloud中國社區聯合創始人,博客訪問量突破一千萬,愛好開源,熱愛分享,活躍于各大社區,保持著非常強的學習驅動力,終身學習踐行者,終身學習受益者。目前就職于國內某家知名互聯網保險公司,擔任DEVOPS工程師,對微服務領域和持續集成領域研究較深,精通微服務框架SpringCloud

      Nginx HTTP

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Redis面試題(2020最新版)
      下一篇:CPU性能發展所遇到的瓶頸
      相關文章
      亚洲AV永久无码精品一百度影院| 亚洲国产精品自在在线观看| 亚洲精品无码不卡在线播HE| 亚洲国产小视频精品久久久三级| 亚洲暴爽av人人爽日日碰| 国产成人精品日本亚洲专一区| 亚洲爆乳精品无码一区二区三区| 亚洲欧洲精品成人久久曰影片| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲国产女人aaa毛片在线| 国产亚洲综合网曝门系列| 亚洲国产精品激情在线观看| 亚洲国产香蕉人人爽成AV片久久| 亚洲国产精品成人| 国产L精品国产亚洲区久久 | 在线观看日本亚洲一区| 亚洲国产成人精品青青草原| 亚洲国产成人综合| 在线aⅴ亚洲中文字幕| 亚洲妇女无套内射精| 国产亚洲蜜芽精品久久| 亚洲第一页综合图片自拍| 亚洲午夜国产片在线观看| 亚洲A丁香五香天堂网| 亚洲人成色7777在线观看不卡 | 亚洲欧洲国产综合AV无码久久| 亚洲色精品三区二区一区| 久久精品熟女亚洲av麻豆| 亚洲情a成黄在线观看| 国产亚洲精品影视在线产品| 国产亚洲av片在线观看16女人| 亚洲国产精品无码久久一线 | 亚洲国产精品久久久久秋霞小| 婷婷亚洲综合五月天小说在线| 亚洲 国产 图片| 久久久久噜噜噜亚洲熟女综合 | 亚洲色偷偷色噜噜狠狠99网| 婷婷综合缴情亚洲狠狠尤物| 久久综合亚洲色HEZYO国产| 久久综合图区亚洲综合图区| 亚洲日产2021三区在线|