Web服务之Nginx浅析
一、Nginx
? ?簡介:
? ?nginx [engine x]是Igor Sysoev編寫的一個(gè)高性能的HTTP和反向代理服務(wù)器,另外它也可以作為郵件代理服務(wù)器。
? ?在大多數(shù)情況下都是用來做靜態(tài)web服務(wù)器和反向代理服務(wù)器,在作為反向代理服務(wù)器的時(shí)候,Nginx可以對后端的real server做負(fù)載均衡,基于應(yīng)用層的負(fù)載均衡,但是他僅支持一些常見的協(xié)議,如:http、mysql、ftp、smtp。
? ?特性:
? Nginx是一款面向性能設(shè)計(jì)的HTTP服務(wù)器,相較于Apache、lighttpd具有占有內(nèi)存少,穩(wěn)定性高等優(yōu)勢。與舊版本(<=2.2)的Apache不同,nginx不采用每客戶機(jī)一線程的設(shè)計(jì)模型,而是充分使用異步邏輯,削減了上下文調(diào)度開銷,所以并發(fā)服務(wù)能力更強(qiáng)。整體采用模塊化設(shè)計(jì),有豐富的模塊庫和第三方模塊庫,配置靈活。 在Linux操作系統(tǒng)下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系統(tǒng)下效率相當(dāng)高。同時(shí)Nginx在OpenBSD或FreeBSD操作系統(tǒng)上采用類似于epoll的高效事件模型kqueue。
? ?相較apache來說,Nginx在靜態(tài)web,反向代理,性能,高并發(fā)等功能上比apache要強(qiáng)大,但是apache在穩(wěn)定性,動(dòng)態(tài)網(wǎng)站的方面比Nginx優(yōu)秀.隨著互聯(lián)網(wǎng)的規(guī)模越來越大,apache已經(jīng)解決不了C10k(并發(fā)訪問量超過10k)的問題了,所以出現(xiàn)了新的應(yīng)用程序,就如Nginx,目前Nginx的穩(wěn)定版是1.4.x系列.
? ?Nginx在官方測試的結(jié)果中,能夠支持五萬個(gè)平行連接,而在實(shí)際的運(yùn)作中,是可以支持二萬至四萬個(gè)平行鏈接。
? ?整體采用模塊化設(shè)計(jì)是nginx的一個(gè)重大特點(diǎn),甚至http服務(wù)器核心功能也是一個(gè)模塊。要注意的是:nginx的模塊是靜態(tài)的,添加和刪除模塊都要對nginx進(jìn)行重新編譯,這一點(diǎn)與Apache的動(dòng)態(tài)模塊完全不同。
? ?自PHP-5.3.3起,PHP-FPM加入到了PHP核心,編譯時(shí)加上--enable-fpm即可提供支持。 PHP-FPM以守護(hù)進(jìn)程在后臺運(yùn)行,Nginx響應(yīng)請求后,自行處理靜態(tài)請求,PHP請求則經(jīng)過fastcgi_pass交由PHP-FPM處理,處理完畢后返回。 Nginx和PHP-FPM的組合,是一種穩(wěn)定、高效的PHP運(yùn)行方式,效率要比傳統(tǒng)的Apache和mod_php高出不少。
? ?
二、Nginx的HTTP特性
? 基本的HTTP服務(wù)器特性:
靜態(tài)資源的web服務(wù)器,能緩存打開的文件描述符
可以做反向代理服務(wù)器,緩存加速反向代理,簡單的負(fù)載均衡以及容錯(cuò)
支持FastCGI,uwsgi,SCGI,和memcached服務(wù)的緩存加速支持
靜態(tài)模塊化架構(gòu),非DSO機(jī)制,支持多種過濾器,如gzip,SSI和圖像大小調(diào)整等
支持SSL
? ?擴(kuò)展的HTTP服務(wù)器特性:
支持基于名稱和IP做虛擬主機(jī)
支持keepalive
支持平滑的升級,平滑的配置文件更新
支持定制訪問日志,支持日志緩存以提高性能,快速的日志輪轉(zhuǎn)
3xx-5xx錯(cuò)誤代碼重定向
支持url rewrite
根據(jù)客戶端地址執(zhí)行不同的功能支持路徑別名
支持基于IP和用戶認(rèn)證
支持速率限制,并發(fā)限制
三、Nginx的基本架構(gòu)
? ?Nginx會(huì)啟動(dòng)一個(gè)master進(jìn)程和多個(gè)worker線程/進(jìn)程,每個(gè)worker進(jìn)程可以響應(yīng)多個(gè)請求,啟動(dòng)的worker數(shù)量可以自行設(shè)置。worker進(jìn)程以非特權(quán)用戶(ngnix)運(yùn)行。
? ?一般而言,設(shè)置的worker數(shù)量應(yīng)該比cpu的核心數(shù)少一到兩個(gè),如24個(gè)核心的cpu,應(yīng)該設(shè)置22-23個(gè)worker進(jìn)程數(shù)。
? ?Nginx是基于事件驅(qū)動(dòng):kqueue,epoll(Linux),/dev/poll;支持消息通知機(jī)制:select,pool,rt signals;支持sendfile:服務(wù)器響應(yīng)請求時(shí),由內(nèi)核直接響應(yīng),而不用經(jīng)過用戶空間。支持文件AIO,異步IO,支持mmap,內(nèi)存映射。
四、Ngnix配置文件解析
1.配置文件層次
main { //全局配置 } http{server{ //虛擬主機(jī)location ** { //URI訪問屬性}} }2.main段
? ?基礎(chǔ)設(shè)置 ? ?
# user username [groupname]; //指定運(yùn)行worker進(jìn)程的用戶和組 # worker_processes 1; //啟動(dòng)的worker的數(shù)量,性能優(yōu)化關(guān)鍵點(diǎn) #error_log logs/error.log; //錯(cuò)誤日志文件及其級別;默認(rèn)為error級別;調(diào)試時(shí)可以使用debug級別,但要求在編譯時(shí)必須使用--with-debug啟用debug功能; #error_log logs/error.log notice; //同上,但是級別為notice #error_log logs/error.log info; //同上,但是級別為 info #pid logs/nginx.pid; //指定Nginx的pid文件 #events { # worker_connections 1024; //worker進(jìn)程的個(gè)數(shù);通常其數(shù)值應(yīng)該為CPU的物理核心數(shù)減1或減2;Nginx的最大并發(fā)數(shù)為worker_processes*worker_connections # }? ? 擴(kuò)展設(shè)置:與性能優(yōu)化相關(guān)
# worker_rlimit_nofile 9999; //指定一個(gè)worker進(jìn)程所能夠打開的最大文件句柄數(shù),可以使用ulimit -n查看單個(gè)文件可以打開的最大句柄數(shù),(socket連接也算在里面)。系統(tǒng)默認(rèn)值1024,此值需大于等于worker_connections,但是如果是代理服務(wù)器,此值應(yīng)大于等于worker_connections的兩倍 # worker_rlimit_sigpending 12; //設(shè)定每個(gè)用戶能夠發(fā)往worker進(jìn)程的信號的數(shù)量 # worker_cpu_affinity cpumask; //與上面的worker_processes有關(guān),讓worker運(yùn)行在指定的cpu上,如有4顆cpu,4個(gè)process,那就分別是0001,0010,0100,1000,表示第0,1,2,3顆cpu,性能優(yōu)化關(guān)鍵點(diǎn) # ssl_engine ssldevice; //在存在ssl硬件加速器的服務(wù)器上,指定所使用的ssl硬件加速設(shè)備; # timer_resolution t; //每次內(nèi)核事件調(diào)用返回時(shí),都會(huì)使用gettimeofday()來更新nginx緩存時(shí)鐘;timer_resolution用于定義每隔多久才會(huì)由gettimeofday()更新一次緩存時(shí)鐘;x86-64系統(tǒng)上,gettimeofday()代價(jià)已經(jīng)很小,可以忽略此配置; # worker_priority number; //worker的優(yōu)先級,值越小,優(yōu)先級越高,對于性能的增強(qiáng)也是很關(guān)鍵的(-20,20),默認(rèn)是0,對系統(tǒng)的性能增強(qiáng)很關(guān)鍵 ? ? 擴(kuò)展設(shè)置:與事件相關(guān)
? ? 擴(kuò)展設(shè)置:用于調(diào)試、定位問題
// 只在調(diào)試時(shí)使用 # daemon on|off; //是否讓ningx運(yùn)行后臺;默認(rèn)為on,調(diào)試時(shí)可以設(shè)置為off,使得所有信息去接輸出控制臺; # master_process on|off; //是否以master/worker模式運(yùn)行nginx;默認(rèn)為on;調(diào)試時(shí)可設(shè)置off以方便追蹤;3.http段
# 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 { //定義虛擬主機(jī) # listen 80; //監(jiān)聽的端口listen address[:port];listen port # server_name localhost; //定義基于主機(jī)名或IP的虛擬主機(jī),可跟多個(gè)主機(jī)名 # server_name_hash_bucket_size //快速主機(jī)名查找使用hash主機(jī)名 # #charset koi8-r; # #access_log logs/host.access.log main; # location / { # root html; //設(shè)置web資源的路徑,可以放在http,server和location中 # index index.html index.htm; #定義默認(rèn)主頁,自左向右匹配 # } # # #error_page 404 [=200] /404.html; #錯(cuò)誤頁面重定向,[=200表示請求狀態(tài)碼也編程200] # # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; # location = /50x.html { # root html; # } # }? ? ?server段:
# listen address[:port]; 或 # listen port; #default_server//定義此server為http中默認(rèn)的server;如果所有的server中沒有任何一個(gè)listen使用此參數(shù),那么第一個(gè)server即為默認(rèn)server; # rcvbuf=SIZE//接收緩沖大小; # sndbuf=SIZE//發(fā)送緩沖大小; # ssl: https server; # server_name [...];//server_name可以跟多個(gè)主機(jī)名,名稱中可以使用通配符和正則表達(dá)式(通常以~開頭);當(dāng)nginx收到一個(gè)請求時(shí),會(huì)取出其首部的server的值,而后跟眾server_name進(jìn)行比較;比較方式://(1) 先做精確匹配;www.magedu.com//(2) 左側(cè)通配符匹配;*.magedu.com//(3) 右側(cè)通配符匹配;www.abc.com, www.*//(4) 正則表達(dá)式匹配: ~^.*\.magedu\.com$ # server_name_hash_bucket_size 32|64|128;//為了實(shí)現(xiàn)快速主機(jī)查找,nginx使用hash表來保存主機(jī)名;系統(tǒng)默認(rèn)沒有此項(xiàng),也不是太重要 ?
? ? location段
# location [ = | ~ | ~* | ^~ ] uri { ... } //只能在server和location中,一個(gè)server中可以有多個(gè)location// =:精確匹配;優(yōu)先級最高// ~:正則表達(dá)式模式匹配,匹配時(shí)區(qū)分字符大小寫//~*:正則表達(dá)式模式匹配,匹配時(shí)忽略字符大小寫//^~: URI前半部分匹配,不檢查正則表達(dá)式 # location @name { ... }//功能:允許根據(jù)用戶請求的URI來匹配指定的各location以進(jìn)行訪問配置;匹配到時(shí),將被location塊中的配置所處理; # location /i/ { # alias /data/w3/p_w_picpaths/;//路徑別名,訪問/i/top.gif時(shí)將由/data/w3/p_w_picpaths/top.gif文件來響應(yīng) # } # location ~* ^/documents/(.*)$ { # root /www/htdocs; # try_files $uri /docu/$1 /temp.html;//try_files path1 [path2 ...] uri;自左至右嘗試讀取由path所指定路徑,在第一次找到即停止并返回;如果所有path均不存在,則返回最后一個(gè)uri; # }? ? 其他參數(shù)設(shè)置:網(wǎng)絡(luò)連接相關(guān)
# keepalive_timeout time; //保持連接的超時(shí)時(shí)長;默認(rèn)為75秒;可以定義在http, server, location中 # keepalive_requests n; //在一次長連接上允許承載的最大請求數(shù);上下文:http,server,location # keepalive_disable [msie6 | safari | none ]; //對指定的瀏覽器禁止使用長連接;有些瀏覽器不支持長連接 # tcp_nodelay on|off; //對keepalive連接是否使用TCP_NODELAY選項(xiàng);默認(rèn)on;把多個(gè)確認(rèn)報(bào)文合成一個(gè)響應(yīng),確認(rèn)延遲 # client_header_timeout time; //讀取http請求首部的超時(shí)時(shí)長; # client_body_timeout time; //讀取http請求包體的超時(shí)時(shí)長; # send_timeout time; //發(fā)送響應(yīng)的超時(shí)時(shí)長;? ? 其他參數(shù)設(shè)置:對客戶端請求限制
# limit_except method ... { ... } //指定對范圍之外的其它方法的訪問控制;指定method為GET方法的同時(shí),nginx會(huì)自動(dòng)添加HEAD方法。上下文:location如: limit_except GET {allow 192.168.1.0/32;deny all;}請留意上面的例子將對除GET和HEAD方法以外的所有HTTP方法的請求進(jìn)行訪問限制。 # client_max_body_size SIZE; //http請求包體的最大值;常用于限定客戶所能夠請求的最大包體;根據(jù)請求首部中的Content-Length來檢測,以避免無用的傳輸;上下文:http, server, location # limit_rate speed; //限制客戶端每秒鐘傳輸?shù)淖止?jié)數(shù);默認(rèn)為0,表示沒有限制;上下文:http, server, location, # limit_rate_after time; //nginx向客戶發(fā)送響應(yīng)報(bào)文時(shí),如果時(shí)長超出了此處指定的時(shí)長,則后續(xù)的發(fā)送過程開始限速;如:下載站上下文:http, server, location,? ? 其他參數(shù)設(shè)置:對客戶端請求的特殊處理
# ignore_invalid_headers on|off//是否忽略不合法的http首部;默認(rèn)為on; off意味著請求首部中出現(xiàn)不合規(guī)的首部將拒絕響應(yīng);只能用于server和http; # log_not_found on|off;//是否將文件找不到的信息也記錄進(jìn)錯(cuò)誤日志中;默認(rèn)為on;上下文:http, server, location # resolver address;//指定nginx使用的dns服務(wù)器地址;上下文: http, server, location # resover_timeout time;//指定DNS解析超時(shí)時(shí)長,默認(rèn)為30s,建議5秒; 上下文:http, server, location # server_tokens on|off;//是否在錯(cuò)誤頁面中顯示nginx的版本號;默認(rèn)on,上下文:http, server, location? ? 其他參數(shù)設(shè)置:文件操作的優(yōu)化
# sendfile on|off//是否啟用sendfile功能;由內(nèi)核直接響應(yīng)用戶請求,默認(rèn)off上下文:http, server, location, if in location # aio on|off//是否啟用aio功能;完全異步 # open_file_cache max=N [inactive=time]|off//是否打開文件緩存功能;上下文: http, server, locationmax: 緩存條目的最大值;當(dāng)滿了以后將根據(jù)LRU(最近最少使用)算法進(jìn)行置換;inactive: 某緩存條目在指定時(shí)長時(shí)沒有被訪問過時(shí),將自動(dòng)被刪除;默認(rèn)為60s;緩存的信息包括: 文件句柄、文件大小和上次修改時(shí)間;已經(jīng)打開的目錄結(jié)構(gòu);沒有找到或沒有訪問權(quán)限的信息; # open_file_cache_errors on|off//是否緩存文件找不到或沒有權(quán)限訪問等相關(guān)信息;默認(rèn)off;上下文:http, server, location # open_file_cache_valid time;//多長時(shí)間檢查一次緩存中的條目是否超出非活動(dòng)時(shí)長,默認(rèn)為60s; 上下文:http, server, location # open_file_cache_min_use #;//在inactive指定的時(shí)長內(nèi)被訪問超此處指定的次數(shù)地,才不會(huì)被刪除;默認(rèn)1分鐘;上下文:http, server, location? ?http核心模塊的內(nèi)置變量
# $uri: #當(dāng)前請求的uri,不帶參數(shù);參數(shù) ?=12等之類的 # $request_uri: #請求的uri,帶完整參數(shù); # $host: #http請求報(bào)文中host首部;如果請求中沒有host首部,則以處理此請求的虛擬主機(jī)的主機(jī)名代替; # $hostname: #nginx服務(wù)運(yùn)行在的主機(jī)的主機(jī)名; # $remote_addr: #客戶端IP # $remote_port: #客戶端Port # $remote_user: #使用用戶認(rèn)證時(shí)客戶端用戶輸入的用戶名; # $request_filename: #用戶請求中的URI經(jīng)過本地root或alias轉(zhuǎn)換后映射的本地的文件路徑;用的很多 # $request_method: #請求方法 # $server_addr: #服務(wù)器地址 # $server_name: #服務(wù)器名稱 # $server_port: #服務(wù)器端口 # $server_protocol: #服務(wù)器向客戶端發(fā)送響應(yīng)時(shí)的協(xié)議,如http/1.1, http/1.0 # $scheme: #在請求中使用scheme, 如https://www.magedu.com/中的https; # $http_HEADER: #匹配請求報(bào)文中指定的HEADER,$http_host匹配請求報(bào)文中的host首部 # $sent_http_HEADER: #匹配響應(yīng)報(bào)文中指定的HEADER,例如$http_content_type匹配響應(yīng)報(bào)文中的content-type首部; # $document_root: #當(dāng)前請求映射到的root配置;五、Nginx編譯安裝
1)部署開發(fā)環(huán)境 # yum -y install "Development tools" "Server Platform Development" 2)解決依賴 pcre-devel openssl-devel # yum -y install pcre-devel openssl-devel 3) 設(shè)置用戶 # groupadd -r nginx # useradd -r -g nginx nginx 4)編譯安裝nginx-1.4.7 # tar xf nginx-1.4.7.tar.gz # cd nginx-1.4.7 # ./configure --prefix=/usr --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf --error-log-path=\ /var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock \--user=nginx --group=nginx --with-http_ssl_module \ --with-http_flv_module --with-http_stub_status_module \ --with-http_gzip_static_module --http-client-body-temp-path=\ /var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=\ /var/tmp/nginx/scgi --with-pcre # make && make install 5)檢測配置文件語法 # /usr/sbin/nginx -t 6) 提供啟動(dòng)腳本 # vim /etc/rc.d/init.d/nginx內(nèi)容如下 # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid# Source function library. . /etc/rc.d/init.d/functions# Source networking configuration. . /etc/sysconfig/network# Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0nginx="/usr/sbin/nginx" prog=$(basename $nginx)NGINX_CONF_FILE="/etc/nginx/nginx.conf"[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginxlockfile=/var/lock/subsys/nginxmake_dirs() {# make required directoriesuser=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`options=`$nginx -V 2>&1 | grep 'configure arguments:'`for opt in $options; doif [ `echo $opt | grep '.*-temp-path'` ]; thenvalue=`echo $opt | cut -d "=" -f 2`if [ ! -d "$value" ]; then# echo "creating" $valuemkdir -p $value && chown -R $user $valuefifidone }start() {[ -x $nginx ] || exit 5[ -f $NGINX_CONF_FILE ] || exit 6make_dirsecho -n $"Starting $prog: "daemon $nginx -c $NGINX_CONF_FILEretval=$?echo[ $retval -eq 0 ] && touch $lockfilereturn $retval }stop() {echo -n $"Stopping $prog: "killproc $prog -QUITretval=$?echo[ $retval -eq 0 ] && rm -f $lockfilereturn $retval }restart() {configtest || return $?stopsleep 1start }reload() {configtest || return $?echo -n $"Reloading $prog: "killproc $nginx -HUPRETVAL=$?echo }force_reload() {restart }configtest() {$nginx -t -c $NGINX_CONF_FILE }rh_status() {status $prog }rh_status_q() {rh_status >/dev/null 2>&1 }case "$1" instart)rh_status_q && exit 0$1;;stop)rh_status_q || exit 0$1;;restart|configtest)$1;;reload)rh_status_q || exit 7$1;;force-reload)force_reload;;status)rh_status;;condrestart|try-restart)rh_status_q || exit 0;;*)echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"exit 2 esac 7)添加到系統(tǒng)服務(wù)并開機(jī)啟動(dòng) # chkconfig --add nginx # chkconfig nginx on # chkconfig --list nigx 8) 設(shè)置nginx配置文件的語法高亮 # mkdir ./vim/syntax -pv # cd .vim/syntax # wget http://www.vim.org/scripts/download_script.php?src_id=19394 # cd .vim # vim filetype.vim 內(nèi)容如下au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/* if &ft == '' | setfiletype nginx | endif 9)啟動(dòng)服務(wù) # service nginx start # pa aux | grep nginx
六、配置使用Nginx
1.配置虛擬主機(jī)
server {listen 80;server_name www.a.com;root /web/a }2.設(shè)置訪問控制access模塊,只有兩個(gè)選項(xiàng):allow和deny
server {listen 80;server_name www.a.com;root /web/a;allow 192.168.0.0/16;deny all;}3.用戶認(rèn)證
location /admin/ {auth_basic "admin";auth_basic_user_file /etc/nginx/.htpasswd;root /web/a/;} # 使用htpasswd -c -m /path/to/somefile username 創(chuàng)建密碼文件4.下載點(diǎn)設(shè)置
5.SSL示例
6.stub_status狀態(tài)頁
location /server-status {stub_status on;}7.gzip壓縮
http {gzip on; #開啟壓縮功能,可以放在http,servergzip_http_version 1.0; #壓縮后使用那種http協(xié)議構(gòu)建響應(yīng)報(bào)文gzip_comp_level 2; #壓縮級別gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/json; #僅對這些格式的內(nèi)容進(jìn)行壓縮gzip_disable msie6; #對IE6不使用壓縮機(jī)制}8.URL rewrite, 地址重寫
# rewrite regex replacement [flag]; //上下文 server,location,ifflag參數(shù):last:停止執(zhí)行當(dāng)前這一輪的ngx_http_rewrite_module指令集,然后查找匹配改變后URI的新location;break:停止執(zhí)行當(dāng)前這一輪的ngx_http_rewrite_module指令集;redirect:在replacement字符串未以“http://”或“https://”開頭時(shí),使用返回狀態(tài)碼為302的臨時(shí)重定向;permanent:返回狀態(tài)碼為301的永久重定向。 # rewrite_log on|off //開啟或者關(guān)閉將ngx_http_rewrite_module模塊指令的處理日志以notice級別記錄到錯(cuò)誤日志中。默認(rèn)為off; # return code //用于結(jié)束rewrite規(guī)則,并且為客戶返回狀態(tài)碼;可以使用的狀態(tài)碼有204, 400, 402-406, 500-504等; location /down/ { #可以沒有down1文件夾root /web/b;rewrite ^/down1/(.*\.(jpg|gif|png))$ /p_w_picpath/$1 last;#訪問網(wǎng)址是www.a.com/down1,實(shí)際目錄是www.a.com/p_w_picpath}9.防盜鏈
#ngx_http_referer_module//此模塊允許攔截“Referer”請求頭中含有非法值的請求,阻止它們訪問站點(diǎn)。 需要注意的是偽造一個(gè)有效的“Referer”請求頭是相當(dāng)容易的, 因此這個(gè)模塊的預(yù)期目的不在于徹底地阻止這些非法請求,而是為了阻止由正常瀏覽器發(fā)出的大規(guī)模此類請求。 還有一點(diǎn)需要注意,即使正常瀏覽器發(fā)送的合法請求,也可能沒有“Referer”請求頭。 定義: # location /photos/ { # valid_referers none blocked server_names # *.example.com example.* www.example.org/galleries/ # ~\.google\.; # if ($invalid_referer) {//如果是以上指定范圍外的,則返回 403錯(cuò)誤 # return 403; # } # } 該指令的參數(shù):none # 缺少“Referer”請求頭;blocked # “Referer” 請求頭存在,但是它的值被防火墻或者代理服務(wù)器刪除; 這些值都不以“http://” 或者 “https://”字符串作為開頭;server_names # “Referer” 請求頭包含某個(gè)虛擬主機(jī)名;轉(zhuǎn)載于:https://blog.51cto.com/hoolee/1413195
總結(jié)
以上是生活随笔為你收集整理的Web服务之Nginx浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVC, MVP, MVVM比较以及区别
- 下一篇: Nginx —— 检查配置文件ngi