1.ngnix介紹
ngnix www服務(wù)軟件 俄羅斯人開發(fā) 開源 性能很高 本身是一款靜態(tài)WWW軟件 靜態(tài)小文件 支持高并發(fā),同時(shí)占用的資源很少媳瞪。
2.最大特點(diǎn)
(1)靜態(tài)小文件(1M)巢音,支持高并發(fā)飒责,同時(shí)占用的資源很少。3W并發(fā),10個(gè)進(jìn)程恬吕,內(nèi)存150M.
(2)nginx服務(wù)端支持的平臺(tái):unix蜂林、linux遥诉、windows都可以.
(3)配置簡(jiǎn)單/靈活、輕量
(4)高并發(fā)(靜態(tài)小文件)噪叙,靜態(tài)幾萬(wàn)的并發(fā)
(5)占用資源少矮锈。2W并發(fā) 開10個(gè)線程服務(wù),內(nèi)存消耗幾百M(fèi)
(6)功能種類比較多构眯,每一個(gè)功能都不是特別強(qiáng)
(7)支持epoll模型愕难。使得nginx可以支持高并發(fā)早龟!apache select模型
(8)nginx可以配合動(dòng)態(tài)服務(wù)
(9)利用nginx可以對(duì)IP限速惫霸,可以限制連接數(shù)。
它所具備的其他WWW服務(wù)特性如下:
支持基于名字葱弟、端口以及IP的多虛擬機(jī)主機(jī)站點(diǎn);
支持rewrite模塊,支持URI重寫及正則表達(dá)式匹配;
支持基于客戶端IP地址和HTTP基本認(rèn)證的訪問(wèn)控制;
支持http響應(yīng)速率限制;
支持同一IP地址的并發(fā)連接或請(qǐng)求數(shù)限制壹店。
3.Nginx的應(yīng)用場(chǎng)合:
(1)提供靜態(tài)服務(wù)(圖片,視頻服務(wù))芝加,另一個(gè)lighttpd硅卢。并發(fā):幾萬(wàn)并發(fā)。
html,js,css,.flv,jpg,gif等藏杖。類似lighttpd将塑。
(2)提供動(dòng)態(tài)服務(wù),nginx+fastcgi的方式運(yùn)行php蝌麸,jsp点寥。動(dòng)態(tài)并發(fā)500-1500.
apache+php,lighttpd+fcgi php
(3)提供反向代理(proxy)服務(wù),或者稱為負(fù)載均衡来吩。日PV2000W以下敢辩,都可以直接用nginx做代理。
haproxy F5 A10
(4)緩存服務(wù).類似Squid弟疆,varnish
4.nginx主要應(yīng)用場(chǎng)景:
1.web服務(wù)器(首選)
靜態(tài)文件,nginx首選
動(dòng)態(tài)文件,配合fastcgi支持php
2.反向代理(負(fù)載均衡),1000-2000W PV,并發(fā)6000
3.緩存(不是很多)
注:nginx之所以超過(guò)apache的原因是nginx采用epoll模型戚长,而apache采用的是select模型。
5.nginx虛擬主機(jī):
一個(gè)server標(biāo)簽就是一個(gè)虛擬主機(jī)怠苔。
1.基于域名的虛擬主機(jī).通過(guò)域名來(lái)區(qū)分虛擬主機(jī)==>應(yīng)用:外部網(wǎng)站
2.基于端口的虛擬主機(jī).通過(guò)端口來(lái)區(qū)分虛擬主機(jī)==>應(yīng)用:公司內(nèi)部網(wǎng)站同廉,網(wǎng)站的后臺(tái)
3.基于IP的虛擬主機(jī)。幾乎不用。不支持ifxconfig別名恤溶,配置文件可以乓诽。
6.nginx的安裝:
(1)HTTP rewrite module requires the PCRE library
PCRE == perl 兼容表達(dá)式
操作命令:
yum install pcre pcre-devel -y
rpm -qa pcre pcre-devel
(2)SSL module requires the OPEN SSL library
操作命令:
yum install openssl-devel -y
rpm -qa openssl-devel
(3)install nginx
tar -zxf ngnix-1.6.2
cd ngnix-1.6.2
. /configure --prefix=/application/ngnix-1.6.2 --user=ngnix --group=ngnix --with-http_ssl_module --with-http_stub_status_module
make && make install
cd ../
ln -s /application/nginx-1.6.2/ /application/nginx
(4)啟動(dòng)nginx
/application/nginx/sbin/nginx
(5)驗(yàn)證是否安裝成功
netstat -lntup|grep 80
或
lsof -i :80
7.nginx配置詳解
#user? nobody;
worker_processes? 1;====> worker進(jìn)程的數(shù)量
#error_log? logs/error.log;
#error_log? logs/error.log? notice;
#error_log? logs/error.log? info;
#pid? ? ? ? logs/nginx.pid;
events {====>事件區(qū)塊開始
worker_connections? 1024;====>每個(gè)worker進(jìn)程支持的最大連接數(shù)
}
http {====>http區(qū)塊開始
include? ? ? mime.types;====>nginx支持的媒體類型庫(kù)文件包含
default_type? application/octet-stream;====>默認(rèn)的媒體類型
#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;====>開啟高級(jí)傳輸模式
#tcp_nopush? ? on;
#keepalive_timeout? 0;
keepalive_timeout? 65; ====>連接超時(shí)時(shí)間
#gzip? on;
server {====>第一個(gè)server區(qū)塊開始 表示一個(gè)虛擬主機(jī)
listen? ? ? 80;
server_name? localhost;
#charset koi8-r;
#access_log? logs/host.access.log? main;
location / {
root? html; ====>站點(diǎn)根目錄
index? index.html index.htm;====>默認(rèn)首頁(yè)文件
}?
#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;
#? ? }
#}
}
8.核心模塊(Core Modules):
主模塊(Main Module):
配置和服務(wù)器全局有關(guān)的一些參數(shù),比如錯(cuò)誤日志咒程、進(jìn)程鸠天、權(quán)限等
user
worker_processes
error_log
syntax: error_log file [debug|info|notice|warn|error|crit]
default: ${prefix}/logs/error.log
指定保存服務(wù)器(和 fastcgi)錯(cuò)誤的日志文件。
在不同的部分帐姻,錯(cuò)誤等級(jí)的缺省值會(huì)不一樣稠集,為:
1、在主要部分 – error
2饥瓷、在 HTTP 部分 – crit
3剥纷、在server部分 – crit
在Nginx中獨(dú)有的而lighttpd卻拒絕實(shí)現(xiàn)的特性是,每個(gè)虛擬主機(jī)可以有各自
分離的錯(cuò)誤日志呢铆。在 server {} 中添加本指令即可晦鞋。
log_not_found
lock_file
pid
include
syntax: include file / *
default: none
你可以包含任何配置文件,基于你想要達(dá)到的目的棺克。
該指令還支持文件名通配符:
include vhosts/*.conf
注意悠垛, 0.6.7 以前,相對(duì)路徑是相對(duì)于 configure 編
譯時(shí)的 –prefix= 指令指定的目錄娜谊,缺省為 /usr/local/nginx确买。
如果編譯時(shí)沒(méi)有指定,則使用絕對(duì)路徑纱皆。
0.6.7 以后湾趾,相對(duì)路徑是相對(duì)于 nginx 配置文件 nginx.conf 所在的目錄,
而不是 nginx 的 prefix 目錄了派草。
事件模塊(Events Module):
配置 IO 事件接口的相關(guān)參數(shù)搀缠,通常就是 worker_connections 這個(gè)參數(shù)。
use
syntax: use [kqueue|rtsig|epoll|/dev/poll|select|poll|eventport]
default:
通常 nginx 在編譯時(shí)近迁,會(huì)根據(jù)平臺(tái)自動(dòng)選擇最優(yōu)的 Events 接口艺普。
除非特殊情況下,編譯時(shí)指定了多個(gè)事件接口钳踊,則可以使用該指令來(lái)指定
特定的接口衷敌。
worker_connections
syntax: worker_connections number
default:
根據(jù)主模塊中的 worker_processes 指令和該指令可計(jì)算最大的客戶端連接數(shù):
max_clients = worker_processes * worker_connections
不過(guò),在做反向代理時(shí)拓瞪, max_clients 變成了:
max_clients = worker_processes * worker_connections/4
因?yàn)榻陕蓿瑸g覽器通常默認(rèn)打開兩個(gè)與服務(wù)器的連接, 而 nginx 使用同一個(gè)文件描述符池中的描述符來(lái)連接后端祭埂。
HTTP 模塊
HTTP 核心模塊(Http Core Module):
控制 Nginx HTTP 處理過(guò)程的核心特性面氓。
alias
default_type
syntax: default_type MIME-type
default: default_type text/plain
context: http, server,location
指定在標(biāo)準(zhǔn) MIME 映射中沒(méi)有指定的文件的默認(rèn) MIME 類型兵钮。
error_page
syntax: error_page code [code…][=|=answer-code] uri
default: no
context: http, server, location, if in location
指定當(dāng)錯(cuò)誤出現(xiàn)時(shí)需要顯示的 URI 。
而且舌界,還可以改變應(yīng)答的代碼為另外一種代碼掘譬,比如:
error_page 404 =200 /.empty.gif;
index
keepalive_timeout
syntax: keepalive_timeout [time]
default: keepalive_timeout 75
context: http, server, location
指定 keep_alive 連接的客戶端的超時(shí)時(shí)間。
keepalive_requests
limit_except
limit_rate
listen
syntax: listen address:port [default [backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|bind|ssl]
default: listen 80
context: server
指定最近的 server {…} 塊的監(jiān)聽地址和端口呻拌。僅指定一個(gè)地址葱轩、一個(gè)端口、或一個(gè)地址的服務(wù)器名藐握,都是可以的靴拱。
如果僅給定 IP 地址,則端口默認(rèn)為 80
如果指令帶有 default 參數(shù)猾普,則最近的 server {…} 配置塊袜炕,將成為 IP 地址:端口 對(duì)的默認(rèn)服務(wù)器。
如果沒(méi)有指令帶有 default 參數(shù)初家,則缺省取 address:port 對(duì)出現(xiàn)的第一個(gè) server 配置快偎窘。
location
syntax: location [=|~|~*|^~] /uri/ { … }
default: no
context: server
在特定 URI 上設(shè)置不同的配置。既能使用普通的字符串也和正則表達(dá)式來(lái)配置溜在。
使用正則表達(dá)式陌知,必須帶一個(gè)前綴:
1、 ~* 表示大小寫不敏感的炕泳。
2纵诞、 ~ 表示大小寫敏感的上祈。
確定哪一個(gè) location 指令匹配某查詢培遵,首先檢查普通字符串。普通字符串匹配該查詢的開始
部分登刺,而且是大小寫敏感的 – 取匹配得最接近的一個(gè)籽腕。之后,將以在配置文件中出現(xiàn)的次序
來(lái)檢查各個(gè)正則表達(dá)式纸俭。找到第一個(gè)匹配查詢的正則表達(dá)式時(shí)停止皇耗。如果沒(méi)有找到匹配的正則
表達(dá)式,則使用普通字符串搜索到的結(jié)果揍很。
有兩種方式修改這樣的行為郎楼。一是使用 “=” 前綴,僅精確匹配查詢窒悔。如果查詢匹配呜袁,則搜索
停止,并立即處理請(qǐng)求简珠。比如阶界,如果對(duì) “/” 的請(qǐng)求比較頻繁,則使用 “l(fā)ocation = / ” 將
加快處理這種請(qǐng)求的過(guò)程。
第二種是使用前綴 ^~ 膘融。該前綴與普通字符串一起使用芙粱,來(lái)告訴 nginx ,如果提供的路徑匹配
則不要去檢查正則表達(dá)式氧映。舉個(gè)例子春畔,”location ^~ /images/” 表示以 /images/ 開始的查詢
則可停止搜索 – 所有的正則表達(dá)式指令都不會(huì)被檢查。
總結(jié)一下岛都,指令以下面的順序來(lái)檢查:
1拐迁、使用 = 前綴的指令,它精確匹配查詢疗绣。如果找到线召,則停止查找。
2多矮、所有剩余的常規(guī)字符串的指令缓淹。如果該匹配使用了 ^~ 前綴,則搜索停止塔逃。
3讯壶、正則表達(dá)式,以在配置文件中定義的次序湾盗。
4伏蚊、如果第 3 點(diǎn)獲得了一個(gè)匹配,則使用該結(jié)果格粪。否則躏吊,使用從 第 2 點(diǎn)中匹配到的結(jié)果。
nginx 比對(duì)解碼后的 URIs帐萎, 知道這點(diǎn)很重要比伏。如果你希望匹配 “/images/%20/test”,則你需要
使用 “/images/ /test” 來(lái)確定 location 疆导。
root
sendfile
syntax: sendfile [on|off]
default: sendfile off
context: http, server, location
啟用或不啟用 sendfile()
server
syntax: server {…}
default: no
context: http
虛擬主機(jī)的配置指令赁项。
不區(qū)分 IP 和基于名稱( Host 請(qǐng)求頭) 的虛擬主機(jī)。
listen 指令用來(lái)描述所有監(jiān)聽的地址和端口澈段。
server_name 指令來(lái)描述所有虛擬主機(jī)的名稱悠菜。
server_name
syntax: server_name name […]
default: server_name hostname
context: server
該指令執(zhí)行兩種操作:
。 將 HTTP 請(qǐng)求中的 Host 請(qǐng)求頭與配置文件中 server {…} 配置塊比對(duì)败富,選擇第一個(gè)匹配的悔醋。
這就是虛擬服務(wù)器的定義。用下面的順序處理服務(wù)器名:
1囤耳、完整的篙顺,靜態(tài)的名稱偶芍;
2、以通配符開頭的名稱 – *.example.com
3德玫、以通配符結(jié)尾的名稱 – www.example.*
4匪蟀、使用正則表達(dá)式的名稱
如果沒(méi)有匹配的,則使用以下順序使用配置文件中的某個(gè) [#server server { … }] 塊:
1宰僧、server 塊擁有標(biāo)記為 default 的匹配 listen 指令材彪。
2、擁有匹配的 listen 指令的第一個(gè) server 塊琴儿。
段化。如果 server_name_in_redirect 指令設(shè)置了,則設(shè)置用于 HTTP 轉(zhuǎn)向中的服務(wù)器名造成。
server_tokens
types
HTTP 基本認(rèn)證模塊(Http Auth Basic Module):
使用該模塊显熏,可以基于 HTTP 基本認(rèn)證,使用用戶名和密碼來(lái)保護(hù)站點(diǎn)或其中的某部分晒屎。
auth_basic
syntax: auth_basic [text|off]
default: auth_basic off
context: http, server, location, limit_except
該指令包含 HTTP 基本認(rèn)證使用的測(cè)試名和密碼喘蟆。分配的參數(shù)用于認(rèn)證 realm 。
“off” 值將覆蓋掉從底層指令繼承來(lái)的動(dòng)作鼓鲁。
auth_basic_user_file
syntax: auth_basic_user_file the_file
default: no
context: http, server, location, limit_except
該指令設(shè)置用于認(rèn)證 realm 的 htpasswd 文件名蕴轨。需要注意的是,從 0.6.7 開始骇吭,
相對(duì)路徑的文件路徑將相對(duì)于配置文件 nginx.conf 所在的目錄橙弱,而不是 prefix 目錄。
密碼必須使用 crypt 函數(shù)編碼燥狰,你可以使用apache中的 htpasswd 程序構(gòu)建棘脐。
HTTP 自動(dòng)索引
該模塊提供自動(dòng)給出目錄文件列表頁(yè)面的功能。僅當(dāng) ngx_http_index_module 沒(méi)有找到索引
文件時(shí)碾局,請(qǐng)求才會(huì)到達(dá)該 ngx_http_autoindex_module 模塊荆残。
autoindex
syntax: autoindex [ on|off ]
default: autoindex off
context: http, server, location
啟用或禁止自動(dòng)目錄文件列表功能奴艾。
autoindex_exact_size
syntax: autoindex_exact_size [ on|off ]
default: autoindex_exact_size on
context: http, server, location
定義在目錄列表中如何顯示文件的大小 — 精確的字節(jié)數(shù)或有取舍的更可讀的
autoindex_localtime autoindex_localtime
syntax: autoindex_localtime [ on|off ]
default: autoindex_localtime off
context: http, server, location
是否顯示文件時(shí)間為本地時(shí)間净当,缺省不顯示(為 GMT 時(shí)間)。
索引文件(Index):
設(shè)置 URL 中未指定文件時(shí)的默認(rèn)文件蕴潦∠裉洌可指定多個(gè)文件。
前面的文件沒(méi)找到時(shí)潭苞,將依次查找后面的忽冻。
index
syntax: index file-path [file-path [ … ] ];
default: no
context: server, location
日志(Log):
設(shè)置 Nginx 如何為大量事件寫入日志。
access_log
syntax: access_log path [format [buffer=size | off]]
default: access_log log/access.log combined
context: http, server, location
經(jīng)典案例:
1.server塊配置可如下配置
include www.conf;
include vhosts/*.conf;
2.ngnix 提供了查看狀態(tài)的web界面 具體配置如下:
##status
server{
listen 80;
server_name www.xiaoxiaoshan.com;
location / {
stub_status on;
access_log off;
}
}
第一個(gè)server表示nginx啟動(dòng)到現(xiàn)在共處理了--個(gè)連接此疹。
第二個(gè)accepts表示nginx啟動(dòng)到現(xiàn)在共成功創(chuàng)建--次握手
請(qǐng)求丟失數(shù) = (握手?jǐn)?shù)-連接數(shù))
第三個(gè)handled requests,表示總共處理了--次請(qǐng)求
reading:nginx讀取到客戶端的Header信息數(shù)
Writing:nginx返回個(gè)客戶端的header信息數(shù)
Waiting:nginx已經(jīng)處理完正在等候下一次請(qǐng)求指令的駐留連接僧诚。開啟keep-alive的情況下遮婶,這個(gè)值等一active-(reading+writing)
3.nginx的錯(cuò)誤信息:
nginx的錯(cuò)誤信息是調(diào)試nginx服務(wù)的重要手段,屬于核心功能模塊湖笨,該參數(shù)名字為error_log旗扑,可以放在main區(qū)塊中全局配置,也可以放在不同主機(jī)中單獨(dú)記錄虛擬主機(jī)的錯(cuò)誤信息慈省。
error_log的語(yǔ)法格式及參數(shù)語(yǔ)法說(shuō)明如下:
errot_log? file level;
error_log的默認(rèn)值為:
#defaule: error_log logs/error.log error;
可以放置的標(biāo)簽段為:
#context:main ,http,server,location
4.nginx的訪問(wèn)日志介紹
nginx軟件會(huì)把每個(gè)用戶訪問(wèn)網(wǎng)站的日志信息記錄到指定的日志文件里臀防,共網(wǎng)站提供分析用戶瀏覽行為等。
nginx的訪問(wèn)日志主要有下面兩個(gè)參數(shù)控制:
log_format 用來(lái)定義記錄日志的格式
access_log 用來(lái)指定日志文件的路徑及使用的何種日志格式記錄日志边败。
nginx日志格式中默認(rèn)的參數(shù)配置如下:
#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;
$server_name:虛擬主機(jī)名稱袱衷。
$remote_addr:遠(yuǎn)程客戶端的IP地址。
-:空白笑窜,用一個(gè)“-”占位符替代致燥,歷史原因?qū)е逻€存在。
?$remote_user:遠(yuǎn)程客戶端用戶名稱排截,用于記錄瀏覽者進(jìn)行身份驗(yàn)證時(shí)提供的名字篡悟,如登錄百度的用戶名scq2099yt,如果沒(méi)有登錄就是空白匾寝。
[$time_local]:訪問(wèn)的時(shí)間與時(shí)區(qū)?搬葬,比如18/Jul/2012:17:00:01 +0800,時(shí)間信息最后的"+0800"表示服務(wù)器所處時(shí)區(qū)位于UTC之后的8小時(shí)艳悔。
$request:請(qǐng)求的URI和HTTP協(xié)議急凰,這是整個(gè)PV日志記錄中最有用的信息,記錄服務(wù)器收到一個(gè)什么樣的請(qǐng)求
$status?:記錄請(qǐng)求返回的http狀態(tài)碼猜年,比如成功是200抡锈。
$uptream_status:upstream狀態(tài),比如成功是200.
$body_bytes_sent:?發(fā)送給客戶端的文件主體內(nèi)容的大小乔外,比如899床三,可以將日志每條記錄中的這個(gè)值累加起來(lái)以粗略估計(jì)服務(wù)器吞吐量。
$http_referer:記錄從哪個(gè)頁(yè)面鏈接訪問(wèn)過(guò)來(lái)的杨幼。
$http_user_agent:客戶端瀏覽器信息
$http_x_forwarded_for:客戶端的真實(shí)ip撇簿,通常web服務(wù)器放在反向代理的后面,這樣就不能獲取到客戶的IP地址了差购,通過(guò)$remote_add拿到的IP地址是反向代理服務(wù)器的iP地址四瘫。反向代理服務(wù)器在轉(zhuǎn)發(fā)請(qǐng)求的http頭信息中,可以增加x_forwarded_for信息欲逃,用以記錄原有客戶端的IP地址和原來(lái)客戶端的請(qǐng)求的服務(wù)器地址找蜜。
$ssl_protocol:SSL協(xié)議版本,比如TLSv1稳析。
$ssl_cipher:交換數(shù)據(jù)中的算法洗做,比如RC4-SHA弓叛。
$upstream_addr:upstream的地址,即真正提供服務(wù)的主機(jī)地址诚纸。
$request_time:整個(gè)請(qǐng)求的總時(shí)間邪码。
$upstream_response_time:請(qǐng)求過(guò)程中,upstream的響應(yīng)時(shí)間咬清。
5.nginx訪問(wèn)日志輪詢切割
#!/bin/sh
dateformat=`date +%Y%m%d`
basedir="/application/nginx"
nginxlogdir="$basedir/logs"
logname="access_www"
[-d $nginxlogdir ]&&cd $nginxlogdir || exit 1
[ -f ${logname}.log ]||exit 1
/bin/mv ${logname}.log ${dateformat}_${logname}.log
$basedir/sbin/nginx -s reload
將上述腳本做定時(shí)任務(wù)執(zhí)行闭专。
6.nginx rewrite規(guī)則
nginx rewrite 正則表達(dá)式匹配
大小寫匹配
~ 為區(qū)分大小寫匹配
~* 為不區(qū)分大小寫匹配
!~和!~*分別為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配
文件及目錄匹配
-f和!-f用來(lái)判斷是否存在文件
-d和!-d用來(lái)判斷是否存在目錄
-e和!-e用來(lái)判斷是否存在文件或目錄
-x和!-x用來(lái)判斷文件是否可執(zhí)行
flag標(biāo)記
last 相當(dāng)于Apache里的[L]標(biāo)記,表示完成rewrite
break 終止匹配, 不再匹配后面的規(guī)則旧烧。
redirect 返回302臨時(shí)重定向 地址欄會(huì)顯示跳轉(zhuǎn)后的地址影钉。
permanent 返回301永久重定向 地址欄會(huì)顯示跳轉(zhuǎn)后的地址。
logcation的幾個(gè)使用實(shí)例:
1)location? / { }:匹配任何查詢掘剪,因?yàn)樗姓?qǐng)求都以 / 開頭平委。但是正則表達(dá)式規(guī)則將被優(yōu)先和查詢匹配。
2)location =/ {}:僅僅匹配/
3)location ~* \.(gif|jpg|jpeg)$
{
rewrite \.(gif|jpg)$ /logo.png;
}:location不區(qū)分大小寫夺谁,匹配任何以gif廉赔,jpg,jpeg結(jié)尾的文件。
幾個(gè)實(shí)例:
多目錄轉(zhuǎn)成參數(shù)
要求:abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2
規(guī)則配置:
if ($host ~* (.*)\.domain\.com) {
set $sub_name $1;
rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
}
目錄對(duì)換
要求:/123456/xxxx -> /xxxx?id=123456
規(guī)則配置:
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
再來(lái)一個(gè)針對(duì)瀏覽器優(yōu)化的自動(dòng)rewrite,這里rewrite后的目錄可以是存在的丰榴;
例如設(shè)定nginx在用戶使用ie的使用重定向到/nginx-ie目錄
規(guī)則如下:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}
目錄自動(dòng)加“/” ,這個(gè)功能一般瀏覽器自動(dòng)完成
if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
以下這些可能就跟廣義的rewrite重寫無(wú)關(guān)了
禁止htaccess
location ~/\.ht {
deny all;
}
禁止多個(gè)目錄
location ~ ^/(cron|templates)/ {
deny all; break;
}
禁止以/data開頭的文件馏艾,可以禁止/data/下多級(jí)目錄下.log.txt等請(qǐng)求
location ~ ^/data {
deny all;
}
禁止單個(gè)文件
location ~ /data/sql/data.sql {
deny all;
}
給favicon.ico和robots.txt設(shè)置過(guò)期時(shí)間; 這里為favicon.ico為99天,robots.txt為7天并不記錄404錯(cuò)誤日志
location ~(favicon.ico) {
log_not_found off;
expires 99d;
break;
}
location ~(robots.txt) {
log_not_found off;
expires 7d;
break;
}
設(shè)定某個(gè)文件的瀏覽器緩存過(guò)期時(shí)間;這里為600秒,并不記錄訪問(wèn)日志
location ^~ /html/scripts/loadhead_1.js {
access_log off;
expires 600;
break;
}
Nginx還可以自定義某一類型的文件的保質(zhì)期時(shí)間奴愉,具體寫法看下文的代碼:
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires??? 1h;
break;
}
}
//上段代碼就將js|css|jpg|jpeg|gif|png|swf這類文件的保質(zhì)期設(shè)置為一小時(shí)琅摩。
防盜鏈的設(shè)置:
防盜鏈:如果你的網(wǎng)站是個(gè)下載網(wǎng)站,下載步驟應(yīng)該是先經(jīng)過(guò)你的主頁(yè)找到下載地址锭硼,才能下載房资,為了防止某些網(wǎng)友直接訪問(wèn)下載地址完全不通過(guò)主頁(yè)下載,我們就可以使用防盜鏈的方式檀头,具體代碼如下:
location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}
文件反盜鏈并設(shè)置過(guò)期時(shí)間--<盜鏈多次請(qǐng)求也會(huì)打開你的站點(diǎn)的圖片啊轰异,所以設(shè)置下緩存時(shí)間,不會(huì)每次盜鏈都請(qǐng)求并下載這張圖片>
location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
valid_referers none blocked *.jjonline.cn *.jjonline.com.cn *.lanwei.org *.jjonline.org localhost ?42.121.107.189;
if ($invalid_referer) {
rewrite ^/?http://img.jjonline.cn/forbid.gif;
return 417;
break;
}
access_log off;
break;
}
說(shuō)明:
這里的return 417 為自定義的http狀態(tài)碼鳖擒,默認(rèn)為403溉浙,方便通過(guò)nginx的log文件找出正確的盜鏈的請(qǐng)求地址
“rewrite ^/ http://img.jjonline.cn/forbid.gif;”顯示一張防盜鏈圖片
“access_log off;”不記錄訪問(wèn)日志,減輕壓力
“expires 3d”所有文件3天的瀏覽器緩存
只充許固定ip訪問(wèn)網(wǎng)站蒋荚,并加上密碼;這個(gè)對(duì)有權(quán)限認(rèn)證的應(yīng)用比較在行
location \ {
allow 22.27.164.25; #允許的ipd
deny all;
auth_basic “KEY”; #認(rèn)證的一些設(shè)置
auth_basic_user_file htpasswd;
}
說(shuō)明:location的應(yīng)用也有各種變化馆蠕,這里的寫法就針對(duì)了根目錄了期升。
文件和目錄不存在的時(shí)重定向
if (!-e $request_filename) {
#proxy_pass http://127.0.0.1; #這里是跳轉(zhuǎn)到代理ip惊奇,這個(gè)代理ip上有一個(gè)監(jiān)聽的web服務(wù)器
rewrite ^/ http://www.jjonline.cn/none.html; ?#跳轉(zhuǎn)到這個(gè)網(wǎng)頁(yè)去
#return 404; #直接返回404碼,然后會(huì)尋找root指定的404.html文件
}
域名跳轉(zhuǎn)
server {
listen 80;
server_name jump.jjonline.cn ;#需要跳轉(zhuǎn)的多級(jí)域名
index index.html index.htm index.php; #入口索引文件的名字
root /var/www/public_html/; #這個(gè)站點(diǎn)的根目錄
rewrite ^/ http://www.jjonline.cn/;
#rewrite到這個(gè)地址播赁,功能表現(xiàn):在瀏覽器上輸入jump.jjonline.cn并回車颂郎,不會(huì)有任何提示直接變成www.jjonline.cn
access_log off;
}
多域名轉(zhuǎn)向
server {
listen 80;
server_name www.jjonline.cn www.jjonline.org;
index index.html index.htm index.php;
root /var/www/public_html/;
if ($host ~ “jjonline\.org”) {
rewrite ^(.*) http://www.jjonline.cn$1 permanent;
}
}
三級(jí)域名跳轉(zhuǎn)
if ($http_host ~* “^(.*)\.i\.jjonline\.cn$”) {
rewrite ^(.*) http://demo.jjonline.cn$1;
break;
}
域名鏡向
server {
listen 80;
server_name mirror.jjonline.cn;
index index.html index.htm index.php;
root /var/www/public_html;
rewrite ^/(.*) http://www.jjonline.cn/$1 last;
access_log off;
}
某個(gè)子目錄作鏡向,這里的示例是demo子目錄
location ^~ /demo {
rewrite ^.+ http://demo.jjonline.cn/ last;
break;
}
以下在附帶本博客的rewrite寫法,emlog系統(tǒng)的rewrite
location ~ {
if (!-e $request_filename) {
rewrite ^/(.+)$ /index.php last;
}
}
7.fastcgi模塊
配置文件如下:
server {
listen? ? ? 80;
server_name? blog.xiaoxiaoshan.com··;
root? html/blog;
index? index.php index.html index.htm;
location / {
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}
location ~ .*\.(php|php5)?$
{
fastcgi_pass? 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
access_log? /app/logs/blog_access.log? main;
}
8.負(fù)載均衡
upstream backend {
server bacnkend1.example.com weight = 5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
ip_hash;
}
server {
location / {
proxy_pass http://backend;
}
}
9.Http_proxy模塊
location / {
? ? proxy_pass http://localhost:8000;
? ? proxy_set_header Host $host;
? ? proxy_set_header X-Real-IP $remote_addr;
}