Nginx功能介绍:

    1.Nginx反向代理应用实例:


            反向代理(Reverse Proxy)方式是指通过代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并且将从内部网络服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一台服务器。当一台代理服务器能够代理外部网络上的访问请求来访问内部网络时,这种代理服务的方式称为反向代理服务。

            反向代理服务经常用于web服务器,此时代理服务器在外部网络看来就是一台web服务器,而实际上反向代理服务器并没有保存任何网页的真实数据,所有的静态网页或动态程序都保存在内部网络的web服务器上。因此,对反向代理服务器的攻击并不会使web网站数据遭到破坏,这在一定程度上增强了web服务器的安全性。

            反向代理服务器通常也称为web服务加速器,此时反向代理服务器就具有了代理缓存的功能,也就是说,反向代理服务器在接收客户端的请求后,首先从源服务器(内部网络上的web服务器)上获取内容,然后把内容返回给用户,同时,也会把内容保存到代理服务器上一份,这样日后再收到同样的信息请求时,它会把本地缓存里的内容直接发给用户,以此减少后端web服务器的压力,提高响应速度。这其实就是缓存服务器所实现的功能。

            a.多域名跳转应用实例:

                 实例:

                     假定一个网站有两个域名,分别是www.blog.com和m.blog.com,要实现当用户访问域名www.blog.com时将请求通过Nginx代理到10.0.0.35的8080端口的blog目录下,而当用户访问m.blog.com域名时将请求代理到10.0.0.35的8080端口的/bbs目录下。

                配置:                     

                    server {

                            listen       80;

                            server_name  www.blog.com;

                            location /{

                                    proxy_pass http://10.0.0.35:8080/blog/;

                            }

                    }                    

                    server {

                            listen       80;

                            server_name  m.blog.com;

                            location /{

                                    proxy_pass http://10.0.0.35:8080/bbs/;

                            }

                    }

                注意:         

                    在通过proxy_pass配置的两个代理目录blog和bbs后面必须加上一个斜杠,即“/blog/”和“/bbs/”,否则Nginx会出错。

            b.通过Nginx重定向实现新旧域名过渡:

                在Web应用中,需要网页重定向的情况有很多种,例如网页目录结构变动、网页的扩展名改变、网站域名改变、网页重命名等。当因为某种需求,要将网站老的域名用新的域名进行替换,但同时为了不丢失来自搜索引擎的流量,旧的域名也需要在一段时间内能够访问,并且要实现在用旧的域名访问网站时自动将访问请求转到新的域名上,这个时候就需要配置新旧域名过渡。

                案例:

                    这里假定m.blog.com为旧的域名,而yan.blog.com为新的域名,要实现通过m.blog.com域名访问的url都自动转向到yan.blog.com对应的url路径下。

                第一种配置:                       

                        server {

                                listen       80;

                                server_name  m.blog.com;

                                rewrite ^/(.*)$ http://yan.blog.com/$1 permanent;

                        }

                        通过rewrite模块的permanent参数实现永久重定向的HTTP状态301.

                第二种配置:                        

                        server {

                                listen       80;

                                server_name  m.blog.com yan.blog.com;

                                 location /{

                                        proxy_pass http://10.0.0.35:8080/bbs/;

                                }

                                if ($host != 'yan.blog.com') {

                                        rewrite ^/(.*)$ http://yan.blog.com/$1 permanent;

                                }

                        }

                        这个方法其实也借助了Nginx的核心变量host进行判断,然后通过rewrite模块的重定向功能实现转向。

            c.alias在Nginx下的应用:

                    Nginx也可以通过alias实现类似于Apache的别名功能,例如下面的一个设置:                            

                            location /i {

                                         alias /var/www/html/images/;

                                    }

                    alias命令和root命令的区别:

                            alias指定的目录是当前目录。

                            root指定的是跟目录。

                            一般情况下,建议在“location /”中通过root命令来配置跟目录,而在其他目录匹配的位置使用alias命令。

            d.location命令应用实例:

                    location命令常见的匹配规则以及规则的优先级:

                            例子:

                                location  = /  {

                                    [    config A    ]

                                }

                                location  /  {

                                    [    config B    ]

                                }


                                location ^~  /images/  {

                                    [    config C    ]

                                }


                                location ~* \.(gif|jpg|jpeg|swf)$  {

                                    [    config D    ]

                                }

                                在这四个例子中,第一个例子表示只匹配对“/”目录的查询,优先级最高,其他三个例子中的匹配优先级依次降低。第二个例子匹配以“/”开始的所有查询,即所有查询都匹配。第三个例子匹配以“/images/”开始的查询。不再检查正则表达式。第四个例子匹配以gif、jpg、jpeg、swf结尾的文件,但匹配优先级低于第三个例子。

                    Nginx功能很强大,它几乎可以实现Apache所有的功能,下面简单介绍Nginx中目录权限控制,IP访问控制、文件访问权限控制如何实现。

                            要实现与Apache一样的目录列表,可以添加如下配置:

                                    location  / {

                                        autoindex on;

                                    }

                             要实现IP访问控制,需要使用ngx_http_access_module模块,此模块可以限制某些IP地址客户端访问。

                                    例:

                                        location   /     {

                                                deny  10.0.0.91;

                                                allow    10.0.1.0/24;

                                                allow     16.0.1.0/16;

                                                deny all;

                                        }

                            要禁止访问某个目录,可以添加如下设置:

                                    location     ~  ^/(WEB-INF)/ {

                                            deny all;

                                    }

                            要禁止访问*.txt、*.doc文件。设置如下:

                                    location ~* \.(txt|doc)$ {

                                            root /data/www/wwwroot;

                                            deny all;

                                    }

   2.Nginx的URL重写应用实例:

        1.if命令:

                if命令用于判断一个条件,如果条件成立,则执行后面大括号内的语句,相关配置从上级继承。

                用法:

                        语法:if(condition){....}

                        默认值:none

                        使用字段:server、location

                默认情况下,if命令默认值为空,可在Nginx配置文件的server、location部分使用,另外,if命令可以在判断语句中指定正则表达式或匹配条件等。

                正则表达式匹配:

                        ☆~表示区分大小写匹配。

                        ★~*表示不区分大小写匹配。

                        ☆!~和!~*分别表示区分大小写不匹配及不区分大小写不匹配。

                文件及目录匹配:

                        ★-f和!-f用来判断是否存在文件。

                        ☆-d和!-d用来判断是否存在目录。

                        ★-e和!-e用来判断是否存在文件或目录。

                        ☆-x和!-x用来判断文件是否可执行。

                Nginx内置变量:

                        □$args ,此变量与请求行中的参数相等。

                        ■$document_root,此变量等同于当前请求的root命令指定的值。

                        □$uri,此变量等同于当前request中的URL.

                        ■$document_uri,此变量与$uri含义一样。

                        □$host,此变量与请求头部中“Host”行指定的值一致。

                        ■$limit_rate, 此变量用来设置限制连接的速率。

                        □$request_method,此变量等同于request的method,通常是“GET”或“POST”。

                        ■$remote_addr,此变量表示客户端IP地址。

                        □$remote_port,此变量表示客户端端口。

                        ■$remote_user,此变量等同于用户名,由ngx_http_auth_basic_module认证。

                        □$request_filename,此变量表示当前请求的文件的路径名,由root或alias与URI request组合而成。

                        ■$request_uri,此变量表示含有参数的完整的初始URI。

                        □$query_string,此变量与$args含义一致。

                        ■$server_name,此变量表示请求到达的服务器名。

                        □$server_port,此变量表示请求到达的服务器的端口号。

                实例配置:                  

                        server {

                            listen    8002;

                            server_name    10.0.0.35;

                            #access_log  logs/host.access.log  main;

                            location / {

                                root /var/www/html;

                                index index.html index.htm;

                            }

                            location ~*\.(gif|jpg|jpeg|png|bmp|swf|htm|html|css|js)$ {

                                root /usr/local/nginx/www/img;

                                if (!-f $request_filename)

                                {

                                   root /var/www/html/img;

                                }

                                if (!-f $request_filename)

                                {

                                    root /apps/images;

                                }

                            }

                            location ~*\.(jsp)$ {

                                root  /webdata/webapp/www/ROOT;

                                if (!-f $request_filename)

                                {

                                    root  /usr/local/nginx/www/jsp;

                                }

                                proxy_pass http://10.0.0.35:8888;

                            }

                        }

                这段代码主要完成10.0.0.35主机访问配置,根目录为“/var/www/html”,而静态资源分别位于“/usr/local/nginx/www/img”、“/var/www/html/img”、“/apps/images”三个目录下,请求静态资源的方式是依次在这三个目录下查找,如果在第一个目下找不到就找第二个目录,以此类推,如果都找不到,将提示404错误。

            动态资源分别位于“webdata/webapp/www/ROOT”和“/usr/local/nginx/www/jsp”两个目录下,如果客户端请求的资源是以jsp结尾的文件,那么将依次在这两个动态程序目录下查找资源。而对于没有在这两个目录中定义的资源,将全部从根目录“/var/www/html”进行查找。

        2rewrite命令:

                Nginx通过ngx_http_rewrite_module模块支持URL重写和if条件判断,但要使用rewrite功能,需要pcre支持,应在编译Nginx时指定pcre源码目录。

                rewrite的使用语法:

                        语法:rewrite regex flag

                            默认值:none

                            使用字段:server、location、if

                在默认情况下,rewrite命令默认值为空,可在Nginx配置文件的server、location、if部分使用,rewrite命令的最后一项参数为flag标记,其支持的flag标记主要有以下几种:

                        ☆    last,    相当于Apache里的[L]标记,表示完成rewrite之后搜索相应的URI或location。

                        ★    break,    表示终止匹配,不再匹配后面的规则。

                        ☆    redirect,    将返回302临时重定向,在浏览器地址栏会显示跳转后的URL地址。

                        ★    permanent,    将返回301永久重定向,在浏览器地址栏显示跳转后的URL地址。

                    其中,last和break用来实现URL重写,浏览器地址栏中的URL地址不变。

                            配置:                                    

                                    erver {

                                            listen       8080;

                                            server_name  www.blog.com;

                                    

                                            #charset koi8-r;

                                    

                                            #access_log  logs/host.access.log  main;

                                    

                                            location / {

                                                root   /var/www/html/;

                                                index  index.html index.htm;

                                            }

                                            location ~ ^/blog {

                                                rewrite ^/blog/(.*)$ /bbs/$1 break;

                                                proxy_pass http://10.0.0.35;

                                             }

                                    

                                            #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;

                                            }

                                    }

                                

                                    server {

                                            listen       80;

                                            server_name  10.0.0.35;

                                    

                                            #charset koi8-r;

                                    

                                            #access_log  logs/host.access.log  main;

                                    

                                            location / {

                                                root   html;

                                                index  index.html index.htm;

                                            }

                                            location /bbs {

                                                 root   html;

                                                 index  index.html index.htm;

                                             }

                                    

                                            #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;

                                            }

                                    }

                        这个例子使用了break标记,可实现将请求为http://www.blog.com:8080/blog/index.html 的页面重定向到 http://10.0.0.35/bbs/index.html 页面而不引起浏览器地址栏中URL的变化。这个功能在新旧网站交替的时候有用。

       3.set命令:

                通过set 命令可以设置一个变量并为其赋值,其值可以是文本 、变量或他们的组合。也可以使用set定义一个新的变量,但是不能使用set设置$http_xxx头部变量的值。

                set的使用语法如下:

                            set的使用语法如下:

                                    语法: set variable value

                                    默认值: none

                                    使用字段:server、location 、if

                在默认情况下,set命令默认值为空,可在Nginx配置文件的server、location、if部分使用,下面示例配置:

                        location /  {

                                proxy_pass http://127.0.0.1:8080/;

                                set   $query   $query_string;

                                rewrite   /dade   /wordpress$query?;

                        }

                         在这个例子中,要实现将请求为http://www.blog.com/wp/?p=160的页面重写到地址http://www.blog.com/wordpress/?p=160,也就是重写带参数的URL。这里涉及$query_string变量,这个变量相当于请求中的参数,也就是“?”后面的内容,也可以用$args代替$query_string变量。

         4.break命令:

                   break表示完成当前设置的规则后,不再匹配后面的重写规则。break的使用语法如下:

                            语法: break

                            默认值: none

                            使用字段: server、location、if

                    在默认情况下,break命令的值为空,可在Nginx配置文件的server、location、if部分使用。

                            实例:                                    

                                server {

                                        listen       80;

                                        server_name  yan.blog.com m.blog.com;

                                

                                        location / {

                                            root   /var/www/html/;

                                            index  index.html index.htm;

                                        }

                                        if ($host != 'yan.blog.com') {

                                            rewrite ^/(.*)$ http://yan.blog.com/error.txt

                                            break;

                                        rewrite ^/(.*)$ http://yan.blog.com/$1 permanent;

                                        }

                                }

                            这个例子定义了两个域名yan.blog.com和m.blog.com,当通过域名m.blog.com访问网站时,会将请求重定向到http://yan.blog.com/error.txt页面,由于设置了break命令,因此下面的rewrite规则不再执行,直接退出。