在前幾篇博文中我提到過的 nginx除了是一款的web服務器外 nginx還是一個小型的反向代理服務器 我們可以使用nginx將一些靜態文件 例如css js images 存儲在客戶端本地 下次請求的時候直接從本地讀取 加快頁面響應速度 又比如 我們可以用做分發匹配 將請求php文件的分發給A機器 將請求py文件的請求分給B機器
還有其他很多 在此就不一一詳述 但上述功能都需要location模塊的配合 下面我就來詳細介紹下location模塊
nginx的location模塊 用來做模式匹配 官方文檔 REFER:http://nginx.org/en/docs/http/ngx_http_core_module.html#location
語法規則: location [=|~|~*|^~] /uri/ { … }
= 開頭表示精確匹配
^~ 開頭表示uri以某個常規字符串開頭,理解爲匹配url路徑即可。nginx不對url做編碼,因此請求爲/static/20%/aa,可以被規則^~ /static/ /aa匹配到(注意是空格)。
~ 開頭表示區分大小寫的正則匹配
~*開頭表示不區分大小寫的正則匹配
!~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹配 的正則
/ 通用匹配,任何請求都會匹配到。
多個location配置的情況下匹配順序爲(參考資料而來,還未實際驗證,試試就知道了,不必拘泥,僅供參考):
首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最後是交給 /通用匹配。當有匹配成功時候,停止匹配,按當前匹配規則處理請求。
1.禁止訪問 比如我不允許訪問項目下的 .htaccess文件 可以這樣設置
location ~ /\.ht {
deny all;
}
deny all表示拒絕所有請求
2.將請求php文件的指令 推送給php-fpm
location ~ \.php$ {
root /xxx;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location中是可以使用nginx內置變量的 詳見http://blog.csdn.net/zhangsheng_1992/article/details/51727031
3.將請求轉發給node服務器
upstream sample {
server 127.0.0.1:9000;
}
server{
listen 80;
server_name www.xxx.com;
location / {
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://sample;
}
}
請求www.xxx.com的所有請求 將被轉發到9000端口
4.反向代理靜態文件 gif jpg jpeg png bmp swf js css
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)${
#使用Web緩存區cache_one
proxy_cache cache_one ;
#對不同HTTP狀態碼緩存設置不同的緩存時間
proxy_cache_valid 200 304 12h ;
proxy_cache_valid 301 302 1m ;
proxy_cache_valid any 1m ;
#設置Web緩存的Key值,Nginx根據Key值md5哈希存儲緩存,這裏根據"域名,URI,
#參數"組合成Key
proxy_cache_key $host$uri$is_args$args;
}
之前我又一篇文章介紹了下squid反向代理的 對比對比有什麼不同 http://blog.csdn.net/zhangsheng_1992/article/details/44979165
5.url重寫 請求/123456/xxxx 變爲 /xxxx?id=123456
location /{
rewrite ^(.*)/equip(d+).html$ $1/index.php?m=content&c=index&a=lists&catid=$2 last;
}
之後我會有一片文章專門介紹nginx的rewrite 敬請關注6.設定查看Nginx狀態的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
7防盜鏈
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.xxx.com xxx.com ;
if ($invalid_referer) {
rewrite ^/ http://www.xxx.com/retrun.html;
#return 403;
}
}
不是www.xxx.com發出的圖片請求一律拒絕
除此之外 日誌格式 消息頭轉發 也可以在location模塊內配置 有興趣的去看我之前的博文 此處就不介紹了