nginx的配置文件詳解javascript
worker_processes 24;php
#指定工做衍生進程數,(通常等於CPU的總核數或者總核數的兩倍,例如兩個4核CPU,總核數爲8)css
#指定錯誤日誌的存放路徑和錯誤日誌級別:[debug|info|notice|warn|error|crit]html
worker_rlimit_nofile 51200#指定文件描述符數量java
event{ use epoll}#linux 下默認的I/O網絡模型,默認採用的是epoll模型。linux
worker_connections 65535;#容許的鏈接數nginx
client_max_body_size 8m#設置客戶端可以上傳的文件的大小web
#開啓gzip壓縮功能正則表達式
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;算法
#寫個判斷機制
if ($request_uri ~* ^.*\.svn.*$) {
return 404;
}
if ($request_filename !~ (/index.php/jsapi|/fonts|/javascript) ) {
rewrite ^/(.*)$ /index.php/user/$1 last;
break;
}
#域名重定向連接
server {
listen 80;
server_name ftchinese.com;
rewrite ^/(.*) http://www.ftchinese.com/$1 permanent;
}
#對於每一條日誌記錄,日誌文件都將先打開文件,再寫入日誌記錄,而後立刻關閉,爲了提升包含變量的日誌文件存放路徑的性能,需用open_log_file_cache指令設置常常被使用的日誌文件描述符緩存。
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time] | off 該指令默認是禁止的
open_log_file_cache off
lnmp環境的配置和優化:
提升PHP(FastCGI),什麼是FastCGI呢?
FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行爲是將CGI解釋器進程保持在內存中並所以獲取較高的性能。總所周知,CGI解釋器的反覆加載是CGI
性能低下的主要緣由,若是CGI解釋器保持在內存中並接受FastCGI進程管理調度,則能夠提供良好的性能、伸縮性、Fail-Over特性等。
FastCGI的工做原理是:
(1)、FastCGI進程管理自身初始化,啓動多個CGI解釋器進程(多個php-cgi進程)並等待來自Web Server的連接。在本文中,採用PHP-FPM進程管理器啓動多個php-cgi FastCGI進程。啓動php-cgi FastCGI進程時,能夠配置以TCP和UNIX套接字兩種方式啓動。
(2)、當客戶端請求到達Web服務器時,web服務器將請求採用TCP協議或者UNIX套接字方式轉發到FastCGI主進程,FastCGI主進程選擇並鏈接到一個CGI解釋器(子進程)。web服務器將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi。
(3)、FastCGI進程完成處理後將標準輸出和錯誤信息從同一鏈接返回web服務器。當FastCGI子進程關閉鏈接時,請求便告知處理完成。FastCGI子進程接着等待並處理來自FastCGI進程管理器的下一個鏈接。而在通常的普通CGI模式中,php-cgi在此時已經退出了。
因此能夠想象普通的CGI模式到底有多慢。每個web請求PHP都必須從新解析php.ini、從新載入所有擴展並從新初始化所有數據結構。使用FastCGI,全部這些都只在進程啓動時發生一次。一個額外好處是:持續數據庫鏈接能夠工做。
nginx負載均衡的主要模塊之HTTP Upstream模塊
Upstream模塊是nginx負載均衡的主要模塊,它提供了一個簡單的方法來實如今輪詢和客戶端IP之間的後端服務器負載均衡,並能夠對後端服務器進行健康檢查。
ip_hash指令
語法:ip_hash
默認值:None
使用環境:Upstream
當對後端的多臺動態應用服務器作負載均衡時,ip_hash指令可以將某個客戶端IP的請求經過哈希算法定位到同一臺服務器上。這樣,當來自某個IP的用戶在後端web服務器A上登陸後,再訪問該站點的其餘URL,能保證其訪問的仍是後端web服務器A。若是不採用IP_hash指令,假設來自某個ip的用戶在後端web服務器A上登陸後,再訪問該站點的其餘URL,有可能被定向到後端Web服務器B,C...上,因爲用戶登陸後session信息記錄在服務器A上的,B,C...上沒有,這時就會提示用戶未登陸。
使用ip_hash指令沒法保證後端服務器的負載均衡,可能有些後端服務器接收到的請求多,有些後端服務器接收到的請求少,並且設置後端服務器權重等方法將不起做用。因此,若是後端的動態應用服務器可以作到session共享,仍是建議採用後端服務器的session共享方式來代替nginx的ip_hash方式。
若是後端服務器有時要從nginx負載均衡(已使用ip_hash)中摘除一段時間,你必須將其標記爲「down」,而不是直接從配置文件中刪除或者註釋掉該後端服務器的信息。
upstream backend{
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;#當原來爲4臺服務器時,3標記爲down後,nginx仍然會按4臺服務器進行哈希。若是直接註釋掉,nginx會按照3臺服務器進行從新哈希,原來哈希到server1 上的ip地址可能被哈希到server2上邊,原來的session就會失效。
server backend4.example.com
}
server指令
server
語法:servername[parameters]
默認值:none
使用環境:upstream
該指令用於指定後端服務器的名稱和參數。服務器的名稱能夠是一個域名、一個ip地址、端口號或UNIX Socket。
在後端服務器名稱以後,能夠跟如下參數:
a、weight=NUMBER---設置服務器的權重,權重數值越高,被分配到的客戶端請求數越多。若是沒有權重,則爲默認值權重1
b、max_fails=NUMBER---在參數fail_timeout指定的時間內對後端服務器請求失敗的次數,若是檢測到後端服務器沒法鏈接或者發生服務器錯誤(404除外),則標記爲失敗。若是沒有設置,則默認值爲1,設爲數值0將關閉這項檢查。
c、fail_timeout=TIME---在經歷參數max_fails設置的失敗次數後,暫停的時間
d、down---標記服務器爲永久離線狀態,用於ip_hash指令
e、backup---僅僅在非backup服務器所有宕機或者繁忙的時候才啓用。
upstream backend{
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
upstream 指令
語法:upstream name{...}
默認值:none
使用環境:http
該指令用於設置一組能夠在proxy_pass和fastcgi_pass指令中使用的代理服務器,默認的負載均衡方式爲輪詢。示例以下:
upstream backend{
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
upstream相關變量
log_format timing '$remote_addr - $remote_user [$time_local] $request '
' upstream_response_time $upstream_response_time'
'msec $msec request_time $request_time';
log_format up_head '$remote_addr - $remote_user [$time_local] $request '
' upstream_http_content_type $upstream_http_content_type' ;
upstream模塊擁有如下的變量:
$upstream_addr
處理請求的upstream服務器地址
$upstream_status
upstream服務器的應答狀態
$upstream_response_time
upstream服務器響應時間(毫秒),多個響應以逗號和冒號分割
$upstream_http_$HEADER
任意的HTTP協議頭信息。如:$upstream_http_host
nginx負載均衡服務器的雙機高可用
第一種方式:
(1)、www.youedomain.com域名解析到虛擬IP 61.1.1.2上。
(2)、正常狀況下,主機61.1.1.4綁定虛擬IP61.1.1.2
/sbin/ifconfig eth0:1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up
/sbin/route add -host 61.1.1.2 dev eth0:1
/sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1
(3)、用戶訪問www.youedomain.com(虛擬ip61.1.1.2)實際訪問的是主機61.1.1.4.而備機61.1.1.5則處於空閒狀態
(4)、若是主機61.1.1.4發送故障,備機61.1.1.5將在幾秒鐘以內接管虛擬ip61.1.1.2,與本身綁定,併發送ARPing包給IDC的公網網關刷新MAC地址。
/sbin/ifconfig eth0:1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up
/sbin/route add -host 61.1.1.2 dev eth0:1
/sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1
(5)、這時,用戶訪問www.youedomain.com(虛擬ip地址爲61.1.1.2)實際上訪問的是備機61.1.1.5,從而實現故障轉移與高可用,避免了單點故障。
注意:此種方式還能夠利用基於VRRP路由協議的Keepalived軟件來實現。
第二種方式:
(1)、www.yourdomain.com域名經過DNS輪詢解析到虛擬IP61.1.1.3和61.1.1.3上
(2)、正常狀況下,server1 61.1.1.4綁定虛擬ip61.1.1.2,server261.1.1.5綁定虛擬IP地址61.1.1.3.
(3)、在server1上執行以下命令:
/sbin/ifconfig eth0:1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up
/sbin/route add -host 61.1.1.2 dev eth0:1
/sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1
(4)、在server2上執行如下命令:
/sbin/ifconfig eth0:1 61.1.1.3 broadcast 61.1.1.255 netmask 255.255.255.0 up
/sbin/route add -host 61.1.1.3 dev eth0:1
/sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1
(5)、用戶訪問www.yourdomain.com(虛擬ip地址爲61.1.1.2和61.1.1.3)其實是根據DNS輪詢訪問兩天負載均衡服務器,兩臺服務器均處於活的狀態。
(6)、若是server1發生故障,server2將在幾秒鐘以內接管server1的虛擬ip61.1.1.2,與本身綁定,併發送ARPing包給IDC的公網網關刷新MAC地址,server2同時綁定61.1.1.2和61.1.1.3兩個虛擬ip
(7)、在server2上執行以下命令:
/sbin/ifconfig eth0:1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up
/sbin/route add -host 61.1.1.2 dev eth0:1
/sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1
nginx的Rewrite規則與實例
rewrite主要的功能就是實現url的重寫,nginx的rewrite規則採用PCRE,Perl兼容正則表達式的語法進行規則匹配,若是您須要nginx的rewrite功能,在編譯nginx以前,必須編譯安裝pcre庫。
rewrite的應用:經過rewrite規則,能夠實現規範的URL、根據變量來作URL轉向及選擇配置。例如:
一些使用MVC框架的程序只有一個入口,能夠經過rewrite來實現。一些動態URL地址須要假裝成靜態HTML。便於搜索引擎抓取,也須要rewrite來處理。一些用於目錄結構、域名變化的舊URL,也必須跳轉到新的URL上,也能夠經過rewrite來處理。
rewrite指令的最後一項參數爲flag標記,支持的flag標記主要有如下幾種:
a、 last :至關於Apache裏德(L)標記,表示完成rewrite;
b、 break;本條規則匹配完成後,終止匹配,再也不匹配後面的規則
c、 redirect:返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址
d、 permanent:返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址
e、 last和break用來實現URL重寫,瀏覽器地址欄URL地址不變
nginx rewrite規則相關指令有if、rewrite、set 、return、break等,其中rewrite是最關鍵的指令。
break指令
語法:break
默認值:none
使用環境:server,location,if
該指令的做用是完成當前的規則集,再也不處理rewrite指令
示例以下:
if ($slow) {
limit_rate 10k;
break
}
if指令
語法:if(condition){...}
默認值:none
使用環境:server,location
該指令用於檢查一個條件是否符合,若是條件符合,則執行大括號內的語句。if指令不支持嵌套,不支持多個條件&&和||處理。
如下信息能夠被指定爲條件:
(1)變量名:錯誤的值包括:空字符串"",或者任何以0開始的字符串;
(2)變量比較可使用"="(表示等於)和"!="(表示不等於)運算符;
(3)正則表達式模式匹配可使用"~*"和"~"符號;
(4)「~」符號表示區分大小寫字母的匹配;
(5)"~*"符號表示不區分大小寫字母的匹配(例如firefox與FireFox是匹配的);
(6)「!~」和「!~*」符號的做用恰好和"~"、"!~*"相反,表示不匹配;
(7)"-f"和"!-f"用來判斷文件是否存在;
(8)"-d"和"!-d"用來判斷目錄是否存在;
(9)"-e"和"!-e"用來判斷文件或目錄是否存在;
(10)"-x"和"!-x"用來判斷文件是否可執行。
部分正則表達式能夠在圓括號"()"內,其值能夠經過後面的變量$1至$9訪問,示例:
if ($http_user_agent ~MSIE) {
rewrite ^(.*)$ /mise/$1 break;
}
return指令
語法:return code
默認值:none
使用環境:server,location,if
該指令用於結束規則的執行並返回狀態碼給客戶端。狀態碼能夠這些值:204,400,402~406,408,410,411,413,416及500~504。此外,非標準狀態碼444將以不發送任何Header頭的方式結束鏈接。
注意:某些代理服務器在DNS查詢超時時會返回400或者500的錯誤.
rewrite指令
語法:rewrite regex replacement flag
默認值:none
使用環境:server,location,if
該指令根據表達式來重定向URI,或者修改字符串。指令根據配置文件中的順序來執行。
注意:重寫表達式只對相對路徑有效。若是你想配對主機名,你應該使用if語句,代碼以下:
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent;#$1contains '/foo',not 'www.mydomain.com/foo'
}
若是替換串以http://開頭,將會採用301或302跳轉進行URL重定向
在以上的標記中,last和break用來實現URI重寫,瀏覽器地址欄的URL地址不變,但在服務器訪問的路徑發生了變化。redirect和permanent用來實現URL跳轉,瀏覽器地址欄會顯示跳轉後的URL地址。
last和break標記的實現功能相似,但兩者之間有細微的差異,使用alias指令時必須用last標記,使用proxy_pass指令時要使用break標記。last標記在本條rewrite規則執行完畢後,會對其所在的server[......]標籤從新發起請求,而break標記則在本條規則匹配完成後,終止匹配,再也不匹配後面的規則。以下:必須使用break標記,使用last會致使死循環:
location /cms/{
proxy_pass http://test.yourdomain.com;
rewrite "^/cms/(.*)\.html$" /cms/index.html break;
}
所以,通常在根location中(即location /{...})或直接在server標籤中編寫rewrite規則,推薦使用last標記,在非根location中(例如:location /cms/{...}),
則使用break標記。如:
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
location /download {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
若是被替換的URI中含有參數(即相似/app/test.php?if=5之類的URI),默認狀況下參數會被自動附加到替換串上,你能夠經過在替換串的末尾加上?標記來解決這一問題。
rewrite ^/users/(.*)$ /show?user=$1? last;
下面咱們來比較一下,不加?標記和加上?標記的URL跳轉區別:
rewrite ^/test(.*)$ http://www.yourdomain.com/home permanent;
訪問http://www.yourdomain.com/home/test?id=5 通過301跳轉後的URL地址爲:http://www.yourdomain.com/home?id=5
rewrite ^/test(.*)$ http://www.yourdomain.com/home? permanent;
訪問http://www.yourdomain.com/home/test?id=5通過301跳轉後的URL地址爲http://www.yourdomain.com/home
注意:對於({和})來講,他們既能用在重定向的正則表達式裏,也能用在配置文件裏分割代碼塊,爲了不衝突,正則表達式裏若是帶花括號,應該用雙引號(會在單引號)包圍。以下:
/photos/123456
重定向到:
/path/photos/12/1234/123456.png
能夠用如下方法(注意雙引號):
rewrite "/photos/([0-9]{2})([0-9]{2})([0-9]{2})"
/path/to/photos/$1/$1$2/$1$2$3.png;
set指令
語法:set variable value
默認值:none
使用環境:server,location,if
該指令用於定義一個變量,並給變量賦值。變量的值能夠是文本、變量及文本變量的聯合。
示例:
set $varname 'hello';
uninitialized_variable_warn 指令
語法:uninitialized_variable_warn on|off
默認值:uninitialized_variable_warn on
使用環境:http,server,location,if
該指令用於開啓或關閉記錄關於未初始化變量的警告信息,默認值爲開啓。
nginx的rewrite規則編寫示例:
文件和目錄不存在時,重定向到某個PHP文件上。適用於WordPress 等MVC結構的開源博客系統:
#-e filename 若是 filename存在,則爲真
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php last;
}
多目錄轉成參數 abc.domain.com/sort/2 =>abc.domain.com/index.php?act=sort&name=abc&id=2:
if ($host ~* (.*)\.domain\.com) {
set $sub_name $1;
rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
}
目錄對換 /123456/xxxx ->/xxxx?id=123456:
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
若是客戶端使用IE瀏覽器,則重定向到/nginx-ie目錄下:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}
禁止訪問多個目錄:
location ~^/(cron|templates)/{
deny all;
break;
}
禁止訪問以/data開頭的文件:
location ~^/data {
deny all;
}
設置某些類型文件的瀏覽器緩存時間:
location ~ .*\.(gif|jpg|jpeg|pnf|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
將多級目錄下的文件轉換成一個文件/job-1234-456-789.html指向job/123/456/789.html:
rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;
禁止訪問以.sh 、 .flv 、 .mp4爲文件名後綴的URL地址:
location ~ .*\.(sh|flv|mp4)?$ {return 403;}
由以上示例能夠看出,Apache的rewrite規則改成nginx的rewrite規則,其實很簡單:Apache的rewriterule指令轉換成nginx的rewrite指令,Apache的[L]標記換成nginx的last標記,中間的內容不變。
若是Apache的rewrite規則改成nginx的rewrite規則後,使用nginx -t命令檢查發現nginx.conf配置文件有語法錯誤(主要是大括號引發的),那麼能夠嘗試給條件加上引號。以下爲錯誤:
rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1 last;
加上引號就正確了:
rewrite "^/([0-9]{5}).html$" /x.jsp?id=$1 last;
apache 與nginx的rewrite規則在URL跳轉時有細微的區別:
Apache rewrite的規則,以下:
RewriteRule ^/html/tagindex/([a-zA-Z])/.*$/$1/ [R=301,L]
nginx 的規則:
rewrite ^/html/tagindex/([a-zA-Z]+)/.$ http://$host/$1 permanent;
Apache與nginx的rewrite規則在變量名稱方面也有區別。
介紹:Apache和nginx rewrite規則的一些功能相同或者相似的指令、標記對應關係
Apache的RewriteCond指令對應nginx的if指令
Apache的RewriteRule指令對應nginx的rewrite指令;
Apache的[R]標記對應nginx的redirect標記
Apache的[P]標記對應nginx的last標記
Apache的[R,L]標記對應nginx的redirect標記;
Apache的[P,L]標記對應nginx的last標記;
Apache的[PT,L]標記對應nginx的last標記;
nginx的web緩存服務nginx的web緩存服務器主要有proxy_cache相關指令集和fastCGI相關指令集構成,前者用於反向代理時,對後端內容源服務器進行緩存,後者主要用於對fastCGI的動態程序進行緩存。proxy_cache相關指令集一、proxy_cache指令語法:proxy_cache zone_name;默認值:None使用環境:http,server,location該指令用於設置哪一個緩存區將被使用,zone_name值爲proxy_cache_path指令建立的緩存區的名稱。二、proxy_cache_path語法:proxy_cache_path path[level=number] keys_zone=zone_name:zone_size[inactive=time] [max_size=size]默認值:None 使用環境:http該指令用於設置緩存文件的存放路徑:示例以下:proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one: 500m inactive=1d max_size=30g;注意:該指令只能在http標籤內配置,levels指定該緩存空間有兩層目錄,第一層目錄爲1個字母,第二層爲2個字母,保存的文件名會相似/data0/proxy_cache/c28/brwvfege3454565555555-er4t54t5g5665c;keys_zone參數用來爲這個緩存區起名,500m指內存緩存空間大小500MB;inactive的1d指若是緩存數據在1天內沒有被訪問,將被刪除;max_size的30g是指磁盤緩存空間爲30G。三、proxy_cache_methods指令語法:proxy_cache_methods[GET HEAD POST]默認值:proxy_cache_methods GET HEAD;使用環境:http,server,location該指令用於設置緩存那些http方法,默認緩存http get/head方法。不緩存http post 方法;四、proxy_cache_min_uses指令語法:proxy_cache_min_uses the_number;默認值:proxy_cache_min_uses 1;使用環境:http、server、location該指令用於設置緩存的最小使用次數,默認爲1五、proxy_cache_valid指令語法:proxy_cache_valid reply_code[reply_code...]time;默認自:None使用環境:http、server、location該指令用於對不一樣返回狀態碼的URL設置不一樣的緩存時間,例如:proxy_cache_valid 200 302 10m; #設置200,302狀態的URL緩存10分鐘proxy_cache_valid 404 1m;#設置404的緩存時間爲1分鐘proxy_cache_valid 5m;#若是不指定狀態碼,直接指定緩存時間,則只有200 301 302 狀態的URL緩存5分鐘。proxy_cache_valid 200 302 10m;proxy_cache_valid 301 1h;proxy_cache_valid any 1m;#對沒有單獨設置的狀態碼,所有設置緩存時間爲1分鐘。六、proxy_cache_key指令語法:proxy_cache_key line;默認值:None使用環境:http,server,location該指令用於設置web緩存的key值,nginx根據key值md5哈希存儲緩存。通常根據$host(域名)、$request_uri(請求路徑)等變量組合成proxy_cache_key。如:proxy_cache_key "$host:$server_port$uri$is_args$args";注意:經過ngx_cache_purge模塊編譯安裝到nginx中,用來清除指定URL的緩存。