- 前言
- 为什么要写这本书
- 读者对象
- 如何阅读本书
- 勘误和支持
- 致谢
- 第一部分 安全运维篇
- 第 1 章 Linux 服务器安全运维
- 第 2 章 Linux 网络安全运维
- 第 3 章 数据安全工具 DRBD、extundelete
- 第二部分 运维故障排查篇
- 第 4 章 Linux 系统运维故障排查思路
- 第 5 章 Linux 故障排查案例实战
- 第三部分 自动化运维篇
- 第 6 章 轻量级运维利器 pssh、pdsh 和 mussh
- 第 7 章 分布式监控系统 Ganglia
- 第 8 章 基于 nagios 的分布式监控报警平台 Centreon
- 第 9 章 通过 Ganglia 与 Centreon 构建智能化监控报警平台
- 第四部分 集群架构篇
- 第 10 章 高性能 Web 服务器 Nginx
- 第 11 章 高性能集群软件 Keepalived
- 第 12 章 千万级高并发负载均衡软件 HAProxy
- 第 13 章 构建高性能的 MySQL 集群系统
- 第 14 章 高性能负载均衡集群软件 HAProxy
10.4 Nginx 常用功能介绍
Nginx 在功能实现方面和性能方面都表现得非常卓越,完全可以与 Apache 相媲美,几乎可以实现 Apache 的所有功能。下面就介绍 Nginx 常用的一些功能实例,具体包含反向代理应用实例、URL 重写应用实例等。
10.4.1 Nginx 反向代理应用实例
反向代理(Reverse Proxy)方式是指通过代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并且将从内部网络服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一台服务器。当一台代理服务器能够代理外部网络上的访问请求来访问内部网络时,这种代理服务的方式称为反向代理服务。反向代理服务经常用于 Web 服务器,此时代理服务器在外部网络看来就是一台 Web 服务器,而实际上反向代理服务器并没有保存任何网页的真实数据,所有的静态网页或动态程序都保存在内部网络的 Web 服务器上。因此,对反向代理服务器的攻击并不会使 Web 网站数据遭到破坏,这在一定程度上增强了 Web 服务器的安全性。
反向代理服务器通常也称为 Web 服务加速器,此时反向代理服务器就具有了代理缓存的功能,也就是说,反向代理服务器在接收客户端的请求后,首先从源服务器(内部网络上的 Web 服务器)上获取内容,然后把内容返回给用户,同时,也会把内容保存到代理服务器上一份,这样日后再收到同样的信息请求时,它会把本地缓存里的内容直接发给用户,以此减少后端 Web 服务器的压力,提高响应速度。这其实就是缓存服务器所实现的功能。
1.多域名跳转应用实例
多域名跳转的需求在 Web 应用配置中经常会用到,Apache 虽然也可实现类似功能,但是实现比较复杂,而通过 Nginx 则可轻松实现。
这里列举一个简单的应用实例。假定一个网站有两个域名,分别是 www.tb.com 和 m.tb.com,要实现当用户访问域名 www.tb.com 时将请求通过 Nginx 代理到 192.168.66.90 的 8080 端口的 web 目录下,而当管理员访问 http://www.tb.com/admin 时将请求代理到 192.168.66.90 的 8080 端口的/admin 目录下,而当用户访问 m.tb.com 域名时将请求代理到 192.168.66.90 的 8080 端口的/wap 目录下,只需在 Nginx 配置文件中做如下设置即可。
为了重点说明反向代理的配置,这里仅列出了 Nginx 配置文件中的 server 配置段,而省略了其他部分的配置,特此说明。关于反向代理的配置参数如下:
server www.tb.com location / { proxy_pass http://192.168.66.90:8080/web/ } location /admin { proxy_pass http://192.168.66.90:8080/admin } server m.tb.com location / { proxy_pass http://192.168.66.90:8080/wap/ }
这里要特别注意的是,在通过 proxy_pass 配置的两个代理目录 web 和 wap 后面必须加上一个斜杠,即“/web/”和“/wap/”,否则 Nginx 会出错,仔细看看上面代理配置中两种写法的区别就清楚了。
2.通过 Nginx 重定向实现新旧域名过渡
在 Web 应用中,需要网页重定向的情况有很多种,例如网页目录结构变动、网页的扩展名改变、网站域名改变、网页重命名等。当因为某种需求,要将网站老的域名用新的域名进行替换,但同时为了不丢失来自搜索引擎的流量,旧的域名也需要在一段时间内能够访问,并且要实现在用旧的域名访问网站时自动将访问请求转到新的域名上,这个时候就需要配置新旧域名过渡。在 Nginx 下配置域名过渡的方法非常简单,有两种方法可实现,下面分别介绍。
这里假定 www.taob.com 为旧的域名,而 www.tb.com 为新的域名,要实现通过 www.taob.com 域名访问的 url 都自动转向到 www.tb.com 对应的 url 路径下,在这里是,当用户访问“www.taob.com/a/xinwen/2014/0413/2.html”时,url 地址将自动转向到“www.tb.com/a/xinwen/2014/0413/2.html”路径下,第一种设置方法如下:
server { server_name www.taob.com; rewrite ^/(.*)$ http://www.tb.com/$1 permanent; }
这里仅列出了 Nginx 配置文件中的 server 配置段,而省略了其他部分的内容,这个配置中使用了 Nginx 的重定向功能,通过 rewrite 模块的 permanent 参数实现永久重定向的 HTTP 状态 301。
另外也可以通过判断 Nginx 核心变量 host 实现重定向功能,设置方法如下:
server { server_name www.tb.com www.taob.com; if ($host != 'www.tb.com' ) { rewrite ^/(.*)$ http://www.tb.com/$1 permanent; }
这个方法其实也借助了 Nginx 的核心变量 host 进行判断,然后通过 rewrite 模块的重定向功能实现转向。
3.alias 在 Nginx 下的应用
Nginx 也可以通过 alias 实现类似于 Apache 的别名功能,例如下面的一个设置:
location /i { alias /var/www/html/images/; }
在这个 location 配置段中,如果 url 请求“/i/logo.gif”,那么 Nginx 将会在服务器上查找“/var/www/html/images/logo.gif”文件,也就是说请求的 url 中 location 后面的部分会被追加到 alias 指定的目录后面,而 location 后面的“/i”路径将被自动丢弃,类似的例子还有:
location ~ ^/download/(.*)$ { root /home/webdata/www/$1; }
在这个例子中,如果 url 请求“/download/ebook.tar.gz”,那么 Nginx 将会在服务器上请求“/home/webdata/www/ebook.tar.gz”文件。
在 Nginx 中,alias 命令与 root 命令所实现的功能有几分相似,但是也有差别,例如:
location /i { root /var/www/html/images/; }
在这个 location 配置段中,如果 url 请求“/i/logo.gif”,那么 Nginx 将会在服务器上查找“/var/www/html/images/i/logo.gif”文件。同理,再看下面这个例子:
location ~ ^/download/(.*)$ { root /home/webdata/www/$1; }
在这个例子中,如果 url 请求“/download/ebook.tar.gz”,那么 Nginx 将会在服务器上查找“/home/webdata/www/ebook.tar.gz/download/ebook.tar.gz”文件。
从这两个例子可以看出 alias 命令和 root 命令的区别:alias 指定的目录是当前目录,而 root 指定的是根目录,一般情况下,建议在“location/”中通过 root 命令来配置根目录,而在其他目录匹配的位置使用 alias 命令。
4.location 命令应用实例
location 命令在 Nginx 配置中最常见,也最灵活。通过 location 命令能完成 Web 系统中的各种特殊功能和配置。下面介绍 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 192.168.66.80; allow 192.168.66.0/24; allow 192.16.88.0/16; deny all; }
在这些规则中,Nginx 将按照顺序依次进行规则检测,直到匹配到一条规则,然后退出。
要禁止访问某个目录,可添加如下设置:
location ~ ^/(WEB-INF)/ { deny all; }
要禁止访问*.txt、*.doc 文件,可添加如下设置:
location ~* \.(txt|doc)${ root /data/www/wwwroot; deny all; }
通过这些介绍可以发现,Nginx 非常灵活,功能强大,完全可以替换 Apache,是一台高性能的 Web 服务器。
10.4.2 Nginx 的 URL 重写应用实例
Nginx 的 URL 重写模块是用得比较多的模块之一,因此这里单独讲述。常用的 URL 重写模块命令有 if、rewrite、set、break 等,下面分别讲述。
1.if 命令
if 命令用于判断一个条件,如果条件成立,则执行后面大括号内的语句,相关配置从上级继承。if 命令的使用方法如下:
语法:if(condition){…}
默认值:none
使用字段:server、location
默认情况下,if 命令默认值为空,可在 Nginx 配置文件的 server、location 部分使用,另外,if 命令可以在判断语句中指定正则表达式或匹配条件等,相关匹配条件如下:
正则表达式匹配:
- ~表示区分大小写匹配。
- ~*表示不区分大小写匹配。
- !~和!~*分别表示区分大小写不匹配以及不区分大小写不匹配。
文件及目录匹配:
- -f 和!-f 用来判断是否存在文件。
- -d 和!-d 用来判断是否存在目录。
- -e 和!-e 用来判断是否存在文件或目录。
- -x 和!-x 用来判断文件是否可执行。
Nginx 配置文件中有很多内置变量,这些变量经常和 if 命令一起使用。常见的内置变量有如下几种:
- $args,此变量与请求行中的参数相等。
- $document_root,此变量等同于当前请求的 root 命令指定的值。
- $uri,此变量等同于当前 request 中的 URI。
- $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,此变量表示请求到达的服务器的端口号。
在了解完相关的 if 命令规则和 Nginx 内置变量后,下面给出一个 server 配置段实例:
server { listen 80; server_name www.tb.com; 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://127.0.0.1:8888; } }
这段代码主要完成对 www.tb.com 这个域名的资源访问配置,www.tb.com 这个域名的根目录为“/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”进行查找。
2.rewrite 命令
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 地址不变。下面是一个示例配置:
location ~ ^/best/ { rewrite ^/best/(.*)$ /test/$1 break; proxy_pass http://www.taob.com; }
这个例子使用了 break 标记,可实现将请求为 http://www.tb.com/best/webinfo.html 的页面重定向到 http://www.taob.com/test/webinfo.html 页面而不引起浏览器地址栏中 URL 的变化。这个功能在新旧网站交替的时候非常有用。
3.set 命令
通过 set 命令可以设置一个变量并为其赋值,其值可以是文本、变量或它们的组合。也可以使用 set 定义一个新的变量,但是不能使用 set 设置$http_xxx 头部变量的值。
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 /dede /wordpress?$query?; }
在这个例子中,要实现将请求为 http://www.tb.com/wp/?p=160 的页面重写到地址 http://www.tb.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 www.tb.cn www.taob.com; if ($host != 'www.tb.cn') { rewrite ^/(.*)$ http://www.tb.cn/error.txt break; rewrite ^/(.*)$ http://www.tb.cn/$1 permanent; } }
这个例子定义了两个域名 www.tb.cn 和 www.taob.com,当通过域名 www.taob.com 访问网站时,会将请求重定向到 http://www.tb.cn/error.txt 页面,由于设置了 break 命令,因此下面的 rewrite 规则不再执行,直接退出。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论