Nginx常見(jiàn)用法總結(jié)(面試必備)

      網(wǎng)友投稿 967 2025-04-04

      Nginx在日常開(kāi)發(fā)過(guò)程中主要作為靜態(tài)資源服務(wù)器(http服務(wù)器)和反向代理服務(wù)器。

      Nginx常用變量

      $host: 請(qǐng)求的主機(jī)頭

      if ($host = 'bbs.gitlib.com') {

      rewrite ^/$ http://bbs.bliwan.com permanent;

      }

      $remote_addr: 客戶端IP地址

      $remote_port: 客戶端端口號(hào)

      $remote_user: 已經(jīng)經(jīng)過(guò)Auth Basic Module驗(yàn)證的用戶名

      $http_referer: 請(qǐng)求引用地址

      $http_user_agent: 客戶端代理信息(UA)

      $http_x_forwarded_for: 相當(dāng)于網(wǎng)絡(luò)訪問(wèn)路徑

      $body_bytes_sent: 頁(yè)面?zhèn)魉偷淖止?jié)數(shù)

      $time_local: 服務(wù)器時(shí)間

      $request: 客戶端請(qǐng)求

      $request_uri: 請(qǐng)求的URI,帶參數(shù), 不包含主機(jī)名

      $request_filename: 請(qǐng)求的文件路徑

      $request_method: 請(qǐng)求的方法,如GET、POST

      $args: 客戶端請(qǐng)求中的參數(shù)

      $query_string: 等同于$args, 客戶端請(qǐng)求的參數(shù)

      $nginx_version: 當(dāng)前nginx版本

      $status: 服務(wù)器響應(yīng)狀態(tài)碼

      $server_addr: 服務(wù)器地址

      $server_port: 請(qǐng)求到達(dá)的服務(wù)器端口號(hào)

      $server_protocol: 請(qǐng)求的協(xié)議版本

      $content_type: HTTP請(qǐng)求信息里的Content-Type字段

      $content_length: HTTP請(qǐng)求信息里的Content-Length字段

      $uri: 請(qǐng)求中的當(dāng)前URI(不帶請(qǐng)求參數(shù),參數(shù)位于$args)

      $document_root: 當(dāng)前請(qǐng)求在root指令中指定的值

      $document_uri: 與$uri相同

      定義日志格式示例:

      log_format access '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $http_x_forwarded_for';

      輸入格式:

      14.18.29.118 - - [24/Jun/2017:20:53:09 +0800] "GET /index.html HTTP/1.1" 200 23 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" -

      Nginx設(shè)置重定向

      return形式

      # 301永久重定向,302臨時(shí)重定向

      return 301 https://example.com$request_uri;

      # return 返回形式

      return code;

      return code URL;

      return URL;

      rewrite形式

      rewrite ^/$ http://bbs.gitlib.com permanent;

      rewrite flag說(shuō)明:

      last: 停止處理后續(xù)rewrite指令集,然后對(duì)當(dāng)前重寫(xiě)的新URI在rewrite指令集上重新查找

      break: 停止處理后續(xù)rewrite指令集,并不在重新查找,但是當(dāng)前l(fā)ocation內(nèi)剩余非rewrite語(yǔ)句和location外的非rewrite語(yǔ)句可以執(zhí)行

      redirect: 如果replacement不是以http:// 或https://開(kāi)始,返回302臨時(shí)重定向

      permant: 返回301永久重定向

      Nginx條件判斷

      if判斷

      if ($http_user_agent ~ (125LA|WinHttpRequest|360Spider)) {

      return 444;

      }

      if ($http_referer ~* "filter=author&orderby=dateline") {

      return 444;

      }

      if ($host = 'bbs.gitlib.com') {

      rewrite ^/$ http://bbs1.gitlib.com permanent;

      }

      比較符說(shuō)明:

      使用=、!= 比較的一個(gè)變量和字符串,true/false

      使用~、~*與正則表達(dá)式匹配的變量,如果這個(gè)正則表達(dá)式中包含右花括號(hào)}或者分號(hào);則必須給整個(gè)正則表達(dá)式加引號(hào)

      使用-f、!-f 檢查一個(gè)文件是否存在

      使用-d、!-d 檢查一個(gè)目錄是否存在

      使用-e、!-e 檢查一個(gè)文件、目錄、符號(hào)鏈接是否存在

      使用-x、!-x 檢查一個(gè)文件是否可執(zhí)行

      set設(shè)置變量

      if ( $host ~* (.*)\.yzz\.cn) {

      set $domain ;

      }

      root /www/website/www/gitlib/$domain/;

      # set語(yǔ)法

      set variable value;

      Nginx反向代理

      proxy_pass

      proxy_pass將請(qǐng)求傳遞給HTTP服務(wù)器

      proxy_buffering: on; # 設(shè)置是否開(kāi)啟Proxy Buffer,默認(rèn)為on

      proxy_pass http://upload.gitlib.com; # 設(shè)置被代理服務(wù)器的地址

      proxy_connect_timeout 600;# 設(shè)置Nginx服務(wù)器與后端被代理服務(wù)器嘗試建立連接的超時(shí)時(shí)間,默認(rèn)為60s

      proxy_read_timeout 600; # 設(shè)置Nginx服務(wù)器向后端被代理服務(wù)器發(fā)出read請(qǐng)求后,等待響應(yīng)的超時(shí)時(shí)間,默認(rèn)為60s

      proxy_send_timeout 600; # 設(shè)置Nginx服務(wù)器向后端被代理服務(wù)器發(fā)出write請(qǐng)求后,等待響應(yīng)的超時(shí)時(shí)間,默認(rèn)為60s

      proxy_buffer_size 8k; # 設(shè)置Nginx服務(wù)器從被代理服務(wù)器獲取的第一段數(shù)據(jù)buffer大小,一般和proxy_buffers設(shè)置的buffer大小一致,或者更小, 默認(rèn)為4k或者8k

      proxy_buffers 4 32k; # 設(shè)置Proxy Buffer的個(gè)數(shù)和每個(gè)Buffer的大小

      proxy_busy_buffers_size 64k; # 設(shè)置處在Busy狀態(tài)的Buffer總大小上限,默認(rèn)為8K或者16K

      proxy_temp_file_write_size 64k; #

      proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; # upstream設(shè)置被代理服務(wù)器集群時(shí),設(shè)置組內(nèi)服務(wù)器出現(xiàn)哪些異常時(shí),可以依次輪詢到下一個(gè)組內(nèi)服務(wù)器處理

      proxy_redirect off; # 修改響應(yīng)頭Location值,off表示直接返回proxy_pass后的值,默認(rèn)為default(客戶端請(qǐng)求的URI),

      fastcgi_pass

      fastcgi_pass將請(qǐng)求傳遞給FastCGI服務(wù)器

      fastcgi_connect_timeout 3000;

      fastcgi_send_timeout 3000;

      fastcgi_read_timeout 3000;

      fastcgi_buffer_size 200k;

      fastcgi_buffers 8 200k;

      fastcgi_busy_buffers_size 200k;

      fastcgi_max_temp_file_size:1024M; # 設(shè)置臨時(shí)文件大小,默認(rèn)為1024M

      fastcgi_temp_file_write_size 200k;# 配置同時(shí)寫(xiě)入臨時(shí)文件的數(shù)據(jù)量的大小,合理的配置可以避免磁盤(pán)IO負(fù)載過(guò)高,導(dǎo)致系統(tǒng)性能下降,默認(rèn)為8KB或16KB

      fastcgi_temp_path /dev/shm; # 配置磁盤(pán)上的一個(gè)文件路徑,用于臨時(shí)存放代理服務(wù)器的大體積響應(yīng)數(shù)據(jù),如果proxy buffer 被裝滿后,響應(yīng)數(shù)據(jù)仍然沒(méi)有被Nginx服務(wù)器完全接收,響應(yīng)數(shù)據(jù)就被會(huì)臨時(shí)存放在該文件中

      uwsgi_pass

      uwsgi_pass將請(qǐng)求傳遞給uwsgi服務(wù)器(如python服務(wù))

      scgi_pass

      scgi_pass將請(qǐng)求傳遞給SCGI服務(wù)器

      memcached_pass

      memcached_pass將請(qǐng)求傳遞給memcached服務(wù)器

      Nginx負(fù)載均衡

      Nginx通過(guò)proxy_pass和upstream指令實(shí)現(xiàn)負(fù)載均衡,Nginx原生支持的負(fù)載均衡算法有如下幾種:

      輪詢

      每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的應(yīng)用服務(wù)器,如果應(yīng)用服務(wù)器down掉,自動(dòng)剔除,剩下的繼續(xù)輪詢

      權(quán)重

      通過(guò)配置權(quán)重,指定輪詢幾率,權(quán)重和訪問(wèn)比率成正比,用于應(yīng)用服務(wù)器性能不均的情況

      ip_hash

      每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)應(yīng)用服務(wù)器,可以解決session共享的問(wèn)題。

      least_conn

      最小連接數(shù)

      示例:

      upstream php {

      server 127.0.0.1:9000 max_fails=3 fail_timeout=30s;

      server 192.168.1.16 backup;

      server 192.168.1.17 down;

      }

      upstream php {

      server 192.168.10.2 weight=1;

      server 192.168.10.3 weight=2;

      }

      upstream php {

      ip_hash;

      server 192.168.10.16;

      server 192.168.10.17;

      }

      Nginx緩存

      Proxy Cache

      Nginx通過(guò)proxy_cache來(lái)實(shí)現(xiàn)緩存。Buffer和Cache都是用于提供IO吞吐小路的,但是概念不同。Buffer(緩沖)主要用于傳輸效率不同步或者優(yōu)先級(jí)不相同的設(shè)備之間傳輸數(shù)據(jù),一般通過(guò)對(duì)一方數(shù)據(jù)進(jìn)行臨時(shí)存放,再統(tǒng)一發(fā)送的辦法傳遞給另一方,以降低進(jìn)程之間的等待時(shí)間,保證速度較快的進(jìn)程不發(fā)生間斷,臨時(shí)存放的數(shù)據(jù)一旦傳送給另一方,這些數(shù)據(jù)本身也就沒(méi)有用處了;Cache(緩存)主要用于將硬盤(pán)上已有的數(shù)據(jù)在內(nèi)存中建立緩存數(shù)據(jù),提高數(shù)據(jù)的訪問(wèn)效率,對(duì)于過(guò)期不用的緩存可以隨時(shí)銷毀。

      Proxy Cache機(jī)制依賴于Proxy Buffer機(jī)制,只有在Proxy Buffer機(jī)制開(kāi)啟的情況下Proxy Cache的配置才會(huì)發(fā)揮作用。

      相關(guān)配置參數(shù)說(shuō)明:

      proxy_cache: zone | off; # 默認(rèn)為off,即關(guān)閉proxy_cache功能,zone為用于存放緩存的內(nèi)存區(qū)域名稱

      proxy_cache_path: path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size];

      path設(shè)置緩存數(shù)據(jù)存放的路徑;

      levels設(shè)置目錄層級(jí),如levels=1:2,表示有兩級(jí)子目錄,第一個(gè)目錄名取md5值的倒數(shù)第一個(gè)值,第二個(gè)目錄名取md5值的第2和3個(gè)值。

      keys_zone設(shè)置內(nèi)存zone的名字和大小,如keys_zone=my_zone:10m

      inactive設(shè)置緩存多長(zhǎng)時(shí)間就失效,當(dāng)硬盤(pán)上的緩存數(shù)據(jù)在該時(shí)間段內(nèi)沒(méi)有被訪問(wèn)過(guò),就會(huì)失效了,該數(shù)據(jù)就會(huì)被刪除,默認(rèn)為10s。

      max_size設(shè)置硬盤(pán)中最多可以緩存多少數(shù)據(jù),當(dāng)?shù)竭_(dá)該數(shù)值時(shí),nginx會(huì)刪除最少訪問(wèn)的數(shù)據(jù)

      示例

      proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g;

      location / {

      proxy_cache my_zone;

      proxy_pass http://192.168.10.110:8080/;

      proxy_set_header Host $host;

      proxy_set_header X-Real-IP $remote_addr;

      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

      }

      Expires

      location ~ .*\.(jpg|jpeg|gif|png|ico|swf)?$

      {

      expires 1d; #設(shè)置過(guò)期時(shí)間

      }

      Nginx實(shí)現(xiàn)Gzip壓縮

      通過(guò)gzip相關(guān)指令可以配置Gzip壓縮,對(duì)響應(yīng)數(shù)據(jù)進(jìn)行在線實(shí)時(shí)壓縮。

      相關(guān)配置參數(shù)說(shuō)明:

      gzip: on; # 開(kāi)啟或關(guān)閉gzip功能,默認(rèn)為off

      gzip_buffers: 16 8K; # 配置Gzip壓縮文件時(shí)使用的緩存空間大小,默認(rèn)number*size=128K

      gzip_comp_level: 9; # 壓縮級(jí)別,壓縮程度越高,壓縮效率最低,最費(fèi)時(shí)間

      gzip_min_length:# 配置最小壓縮的數(shù)據(jù)大小,如果響應(yīng)頁(yè)面的大小大于該值,才開(kāi)啟Gzip功能(一些小文件會(huì)導(dǎo)致壓縮后的大小比源文件還大),默認(rèn)為20,建議設(shè)置為1k(1024)

      gzip_http_version:1.0; # 配置只有高于指定版本的HTTP協(xié)議才能開(kāi)啟Gzip,默認(rèn)為1.1, 目前絕大多數(shù)瀏覽器都支持Gzip自解壓,一般采用默認(rèn)值即可

      gzip_proxied:any; # 設(shè)置是否對(duì)被代理服務(wù)器返回的數(shù)據(jù)進(jìn)行壓縮,默認(rèn)為off

      gzip_vary: on; # 開(kāi)啟壓縮標(biāo)記,開(kāi)啟后在響應(yīng)頭部添加 Vary: Accept-Encoding,默認(rèn)為off

      gzip_types:text/plain application/x-javascript text/css application/xml text/javascript; # 對(duì)指定類型的文檔進(jìn)行Gzip壓縮

      gzip_static:on; # 對(duì)于存在服務(wù)器上.gz作為后綴的文件,且客戶端瀏覽器支持gzip壓縮,就直接返回壓縮后的數(shù)據(jù)

      示例:

      gzip on;

      gzip_static on;

      gzip_comp_level 9;

      gzip_min_length 1k;

      gzip_buffers 4 8k;

      gzip_http_version 1.0;

      gzip_vary on;

      gzip_proxied any;

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

      Nginx常見(jiàn)配置參數(shù)

      server_names_hash_max_size 1024;

      server_names_hash_bucket_size 512;

      client_header_buffer_size 32k; # 客戶端請(qǐng)求頭部的緩沖區(qū)

      large_client_header_buffers 4 32k;

      client_max_body_size 10m;#設(shè)置最大的允許客戶端請(qǐng)求主體的大小(上傳文件大小限制), 默認(rèn)為1m

      client_body_buffer_size 128k;

      keepalive_timeout 60; #客戶端連接超時(shí)時(shí)間,單位是秒, 默認(rèn)是75秒

      sendfile on; # 開(kāi)啟高效傳輸模式,默認(rèn)為off

      tcp_nopush on;

      tcp_nodelay on;

      ssi on; # 開(kāi)啟ssi支持,默認(rèn)為false

      ssi_silent_errors on; # 設(shè)置為on表示在處理ssi文件時(shí)不輸出錯(cuò)誤信息,默認(rèn)為false

      ssi_types text/html; # 默認(rèn)支持html ,如果需要支持shtml(服務(wù)器執(zhí)行腳本),需要設(shè)置為ssi_types text/shtml

      server_tokens off; # 關(guān)閉nginx版本號(hào)的顯示,默認(rèn)為on

      Nginx優(yōu)化相關(guān)參數(shù)

      worker_processes 2; # 配置生成的worker process數(shù)量,一般為cpu核數(shù)

      worker_rlimit_nofile 65536; # 一個(gè)nginx進(jìn)程打開(kāi)的最多文件描述符數(shù)目,一般設(shè)置為與系統(tǒng)設(shè)定的值相同(ulimit -n)

      worker_cpu_affinity 01 10;# 為每個(gè)進(jìn)程分配CPU的工作內(nèi)核

      use epoll; # 事務(wù)模型

      events {

      use epoll; # 事務(wù)模型

      worker_connections 20000; # 一個(gè)nginx進(jìn)程的連接數(shù),nginx服務(wù)器允許的同事連接的客戶端最大數(shù)量Client = worker_processes * worker_connections/2;

      }

      Nginx常見(jiàn)用法

      依據(jù)UA屏蔽爬蟲(chóng)

      if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou

      spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot") {

      return 403;

      }

      屏蔽IP訪問(wèn)

      allow 133.27.182.82;

      allow 113.106.18.0/24;

      allow 121.201.104.0/24;

      deny all;

      使用Auth權(quán)限訪問(wèn)

      auth_basic "bbs-auth";

      auth_basic_user_file /usr/local/nginx/conf/bbsauthpwd;

      限制帶寬

      # 用戶下載達(dá)到 500k 后,便控制其速度在 50k 以內(nèi)

      location /download/ {

      limit_rate_after 500k;

      limit_rate 50k;

      }

      限制連接

      # 定義了一個(gè)名為“down”,10M大小,以連接IP為key的連接數(shù)據(jù)存儲(chǔ)空間

      limit_conn_zone $binary_remote_addr zone=down:10m;

      # 讀取名為`down`連接數(shù)據(jù)存儲(chǔ)空間的數(shù)據(jù),限制每個(gè)key(上面是以ip作為IP) 最大同時(shí)連接數(shù)為4

      location ~ .*\.(rar|zip|apk)?$ {

      limit_conn down 4;

      limit_rate 150k;

      }

      Nginx常見(jiàn)用法總結(jié)(面試必備)

      limit_conn_log_level notice: 指定當(dāng)觸發(fā)limit的時(shí)候日志打印級(jí)別

      限制請(qǐng)求

      # 定義一個(gè)名為”one”, 10M大小,每秒1個(gè)請(qǐng)求的請(qǐng)求數(shù)據(jù)存儲(chǔ)空間

      limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

      # 引用名為“one”的存儲(chǔ)空間,burst為等待請(qǐng)求數(shù)量數(shù),當(dāng)?shù)却?qǐng)求數(shù)量超過(guò)50個(gè)時(shí),則拋出503錯(cuò)誤,nodelay 針對(duì)的是 burst 參數(shù),burst=50 nodelay 表示這50個(gè)請(qǐng)求立馬處理,不能延遲,相當(dāng)于特事特辦。不過(guò),即使這20個(gè)突發(fā)請(qǐng)求立馬處理結(jié)束,后續(xù)來(lái)了請(qǐng)求也不會(huì)立馬處理。burst=50 相當(dāng)于緩存隊(duì)列中占了50個(gè)坑,即使請(qǐng)求被處理了,這20個(gè)位置這只能按 100ms一個(gè)來(lái)釋放

      limit_req zone=one burst=50 nodelay;

      limit_req_log_level notice: 指定當(dāng)觸發(fā)limit的時(shí)候日志打印級(jí)別

      實(shí)時(shí)顯示Nginx運(yùn)行狀況

      在安裝nginx是編譯http_stub_status_module即可,使用參數(shù)為–with-http_stub_status_module

      location /ngx_status {

      stub_status on;

      access_log on;

      }

      設(shè)置錯(cuò)誤頁(yè)面

      error_page 404 /404.html

      Nginx 常見(jiàn)錯(cuò)誤碼

      301 永久重定向

      302 臨時(shí)重定向

      403 禁止訪問(wèn)

      404 文件不存在

      413 文件上傳超過(guò)限制

      500 服務(wù)器錯(cuò)誤

      502 后臺(tái)服務(wù)器無(wú)響應(yīng)

      504 Nginx超時(shí),請(qǐng)求過(guò)多,工作進(jìn)程不足

      本文來(lái)自:“IT大咖說(shuō)”

      閱讀原文:點(diǎn)擊

      Nginx

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:在wps表格中怎么添加斜線(如何在wps表格中添加斜線)
      下一篇:如何新建文檔窗口?(打開(kāi)新建文檔怎么是小窗口)
      相關(guān)文章
      99热亚洲色精品国产88| 亚洲最大中文字幕无码网站| 久久久久亚洲AV无码专区体验| 亚洲中文字幕丝袜制服一区| 国产精品无码亚洲精品2021 | 久久国产成人亚洲精品影院| 亚洲欧美综合精品成人导航| 国产91在线|亚洲| 亚洲精品视频久久| 亚洲卡一卡2卡三卡4卡无卡三| 亚洲成在人线av| 亚洲AV综合色区无码一区爱AV | 亚洲人成影院77777| 亚洲欧洲日产国码在线观看| 精品亚洲A∨无码一区二区三区 | 亚洲av综合av一区二区三区| 亚洲av永久中文无码精品 | 亚洲经典千人经典日产| 亚洲爆乳AAA无码专区| 国产精品亚洲av色欲三区| www亚洲精品少妇裸乳一区二区| 亚洲AV无码专区国产乱码不卡| 亚洲a∨无码精品色午夜| 亚洲aⅴ无码专区在线观看| 国产亚洲精彩视频| 亚洲福利在线播放| 亚洲精品人成无码中文毛片| 亚洲免费视频一区二区三区| 国产亚洲精品福利在线无卡一| 国产国拍精品亚洲AV片| 日本亚洲欧洲免费天堂午夜看片女人员 | 亚洲色一色噜一噜噜噜| 久久亚洲中文字幕精品一区| 久久久亚洲精品蜜桃臀| 亚洲精品高清国产一线久久| 亚洲av片劲爆在线观看| 亚洲白色白色永久观看| 亚洲国产乱码最新视频| 色噜噜噜噜亚洲第一| 亚洲一级片免费看| 无码久久精品国产亚洲Av影片 |