Nginx错误页面优雅显示的配置


Nginx下如何定义优雅显示的页面呢?

   下面我们就以404错误为例,具体步骤如下:

   1.创建自己的404.html页面,放在站点目录下面;

   2.更改nginx.conf配置文件,在http模块中加入 fastcgi_intercept_errors on;

   3.更改nginx.conf配置文件,在server模块中加入:error_page 404  /404.html;  或者 error_page 404 =http://www.hulala.com/404.html;

   4.更改后检查语法/nginx/sbin/nginx -t ,并重启nginx;

   现在,404错误的页面优雅显示已经配置OK了。


   举一反三:502、403 等其他错误可以用同样的方法来配置。  

       error_page  500 502 503 504  /50x.html;

       error_page  403  /403.html;


   注意:

   在nginx中错误重定向生效的两个前提条件是:设置了fastcgi_intercept_errors on,并且正确的设置了error_page这个选项。


负载均衡(做分发服器)

1、基于浏览器的分发

基于浏览器的分发,按照在不同平台的浏览器请求进行分发,比如手机浏览器讲究资源小速度快节省流量,所以将自手机浏览器的请求分发到专供处理移动平台的web服务器上,而在PC上浏览网页注重体验,所以将来自IE浏览器的请求分发到专供处理PC平台的服务器上,这样可以使在不同平台的用户都能得到适合自己的体验!

添加多个upstream

vim /usr/local/nginx/conf/nginx.con

upstream    web {       


                ip_hash;        







                server 192.168.1.10       


                }        







        upstream    apache {       


                ip_hash;       


                server 192.168.1.11       


                }

在定义server的时进行location规则判断

server{       


        listen        80;       


        server_name   192.168.1.100;   (分发主机)       


        location/ {       


                if        ( $http_user_agent ~* Elinks ) {       


                proxy_pass http:        //web        ;         #来自Elinks浏览器的请求,交给web来处理                      


        }       


                if        ( $http_user_agent ~* Mozilla ) {       


                proxy_pass http:        //apache        ;       


        #来自Mozilla类型的浏览器的请求,交给apache处理,IE和火狐都属于Mozilla       


        }           


        }       


        }


2、基于开发语言的分发

这里开发语言环境的部署,祥看我这篇文章“http://cuimk.blog.51cto.com/6649029/1335770

常见开发语言的后缀aspaspx php jsp html,为了将不同语言开发的程序交给特定的语言环境来执行,同样可以实现Nginx的location规则来实现

同样定义server时进行location规则判断

location~* \.php$ {       


                proxy_pass http:        //192        .168.1.250;         #访问php结尾的,分发到250       


        }                             


        location ~* \.jsp$ {       


                proxy_pass http:        //192        .168.1.251;          #访问jsp结尾的,分发到251       


        }       


        location / {       


                root html       


                index index.html;             #访问其他的,请求本机       


        }


3、基于源地址的分发

像联通移动的网站,进去之后可以看到,你所进入的页面是你所在城市的页面,里面的信息很多是你当地退出的一些活动,这就是他们根绝你的IP地址来得知你当前所在位置,然后将请求分发到对应的服务器所实现的。

首先Nginx需要geoip模块,故编译添加

.        /configure        –with-http_geoip_module

首先定义多个upstream




upstream bj.server{       


                ip_hash;       


                server 192.168.1.251          #定义bj的IP访问的服务器       


        }       


        upstream sh.server {       


                ip_hash;       


                server192.168.1.251           #定义sh的IP访问的服务器       


        }       


        upstream default.server {       


                ip_hash;       


                server 192.168.1.100          #定义其他地区访问的服务器       


        }

定义一个IP库

geo$geo {       


                default default;       


                192.168.18.0        /24        bj;       


                192.168.17.0        /24        sh;           #定义bj和sh的IP段       


        }

在server里添加loscation规则


location/ {       


                proxy_pass http:        //        $geo.server$request_uri       


        }

这样会对不同的IP匹配IP库,看其属于哪个地区,然后在有针对性的将请求分发


4、基本IP轮询分发

配置十分简单,以两台RS做实验

将RS定义在一个upstream内


vim /usr/local/nginx/conf/nginx.conf

upstream web {       


                ip_hash;       


                server       192.168.18.250;         


                server       192.168.18.251;           #两台RS       


        }

在定义server的时候来指定其访问的模块,有多台机器的会默认轮询访问,当然可以自定义访问权重。

server {       


                listen        80;                   #监听80端口       


                server_name   localhost;            #域名       


                location/ {       


                proxy_pass http:        //web        ;              #协议,模块名       


        }       


        }


我在定义upstream的时候都添加了一句“ip_hash;”这里是算法,使用ip哈希的算法,让来自同一台的清楚只交给后端同一台RS来处理.

配置限速

限速也是通过location规则实现的


首先需要在http里指定最大带宽(比如说是10M)


limit_zoneone $binary_remote_addr     10M;

然后在server添加location规则


location/ {       


                root               html;       


                index              index.html index.htm;       


                limit_rate         10k;                #限速多少       


                limit_rate_after   100k;               #下载多少的时候开始限速       


                limit_connone 2;                       #同一IP同时只能下载两个       


        }

防盗链配置



防盗链原理也是通过location规则实现的

1、指定文件的防盗链



location~*.(gif|jpg|png|swf|flv)$  {               #针对哪些文件格式进行防盗链                                       


                root        /usr/local/nginx/html        ;       


                valid_referersnone blocked baidu.com;          #只允许baidu连接       


                if        ($invalid_referer) {       
  rewrite ^/ http://www.jb51.net/retrun.html; #盗链访问重定向到的地址
  #return 403;


        }       
}


第一行:gif|jpg|png|swf|flv 
表示对gif、jpg、png、swf、flv后缀的文件实行防盗链 
第二行: 表示对www.ingnix.com这2个来路进行判断 
if{}里面内容的意思是,如果来路不是指定来路就跳转到http://www.jb51.net/retrun.html页面,当然直接返回403也是可以的。 

2、针对目录防止盗链

location         /p_w_picpaths/        {       


                alias        /data/p_w_picpaths/        ;       


                valid_referers none blocked server_names *.xok.la xok.la ;       


                if        ($invalid_referer) {        return        403;}       


        }


3. 通过ngx_http_accesskey_module模块实现防盗链,比较少用

实现方法如下:
1. 下载NginxHttpAccessKeyModule模块文件:Nginx-accesskey-2.0.3.tar.gz
2. 解压此文件后,找到nginx-accesskey-2.0.3下的config文件。编辑此文件:替换其中的”$HTTP_ACCESSKEY_MODULE”为”ngx_http_accesskey_module”;
3. 用一下参数重新编译nginx:
./configure --add-module=path/to/nginx-accesskey

4. 修改nginx的conf文件,添加以下几行:

location /download {
  accesskey             on;
  accesskey_hashmethod  md5;
  accesskey_arg         "key";
  accesskey_signature   "mypass$remote_addr";
}


其中:

accesskey为模块开关;
accesskey_hashmethod为加密方式MD5或者SHA-1;
accesskey_arg为url中的关键字参数;
accesskey_signature为加密值,此处为mypass和访问IP构成的字符串。


访问测试脚本download.php:

<?
$ipkey= md5("mypass".$_SERVER['REMOTE_ADDR']);
$output_add_key="<a href=http://www.jb51.net/download/G3200507120520LM.rar?key=".$ipkey.">download_add_key</a><br />";
$output_org_url="<a href=http://www.jb51.net/download/G3200507120520LM.rar>download_org_path</a><br />";
echo $output_add_key;
echo $output_org_url;
?>

访问第一个download_add_key链接可以正常下载,第二个链接download_org_path会返回403 Forbidden错误。


他的运行方式是:如我的download 目录下有一个 file.zip 的文件。对应的URI 是http://www.bc8.com.cn/download/file.zip
使用ngx_http_accesskey_module 模块后http://www.bc8.com.cn/download/file.zip?key=09093abeac094. 只有给定的key值正确了,才能够下载download目录下的file.zip。而且 key 值是根据用户的IP有关的,这样就可以避免被盗链了。

http://mageedu.blog.51cto.com/4265610/1405190  软负载与nginx那些强大不可不说的功能


转载于:https://blog.51cto.com/hao360/1381262