nginx基础详解

 

屏幕快照 2017-07-10 下午9.40.57.png-201.6kB

匹配这两种特殊字符“~”或“~*”的区别为:“~”用于区分大小写(大小写敏感)的匹配;“~*”用于不区分大小写的匹配。还能够用逻辑操做符“!”对上面的匹配取反,即“!~”和“!~*”。此外,“^~”的做用是先进行字符串的前缀匹配(必须之后边的字符串开头),若是能匹配到,就再也不进行其余location的正则匹配了。php

6.5.2 location匹配示例

[root@localhost nginx]# cat /usr/local/nginx/conf/extra/www.conf server { listen 80; server_name www.yunjisuan.com; root /var/www/html/wwwcom; location / { return 401; } location = / { return 402; } location = /images/ { return 501; } location /documents/ { return 403; } location ^~ /images/ { return 404; } location ~* \.(gif|jpg|jpeg)$ { return 500; } }

正则匹配结果以下:html

[root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com 402 #匹配了=的状况 [root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com/ 402 #匹配了=的状况 [root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com/xxxx 401 #匹配不到默认匹配 /的状况 [root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com/documents/ 403 #匹配字符串 [root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com/images/ 501 #优先匹配=的状况 [root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com/images/1.jpg 404 #匹配 [root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com/documents/images/1.jpg 500 #匹配~*的状况

从多个location的配置匹配能够看出匹配的优先顺序nginx

顺序 匹配标识的location 匹配说明
1 " location = / { " 精确匹配
2 " location ^~ /images/ { " 先进行字符串的前缀匹配,若是匹配到就不作正则匹配检查
3 " loction ~* \.(gif | jpg | jpeg)$ { " 正则匹配,*为不区分大小写
4 " location /documents/ { " 匹配常规字符串,模糊匹配,若是有正则检查,正则优先
5 " location / { " 全部location都不能匹配后的默认匹配原则

6.6 Nginx rewrite

6.6.1 什么是Nginx rewrite?

和Apache等Web服务软件同样,Nginx rewrite的主要功能也是实现URL地址重写。Nginx的rewrite规则须要PCRE软件的支持,即经过Perl兼容正则表达式语法进行规则匹配。默认参数编译时,Nginx就会安装支持rewrite的模块,可是,也必需要有PCRE软件的支持。面试

6.6.2 Nginx rewrite 语法

(1)rewrite指令语法正则表达式

指令语法:rewrite regex replacement 【flag】;
默认值:none
应用位置:server,location,if
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement部分,结尾是flag标记。下面是一个简单的URL rewrite跳转例子:apache

rewrite ^/(.*) http://www.baidu.com/$1 permanent;

在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,regex部分是^(.*),这是一个正则表达式,表示匹配全部,匹配成功后跳转到http://www.baidu.com/$1 。这里的$1是取前面regex部分括号里的内容,结尾的permanent;是永久301重定向标记,即跳转到后面的http://www.baidu.com/$1 地址上。浏览器

(2)regex经常使用正则表达式说明ruby

屏幕快照 2017-07-12 上午9.12.09.png-1130.9kB

(3)rewrite指令的最后一项参数flag标记的说明bash

屏幕快照 2017-07-12 上午9.14.31.png-300.7kB

  • 在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器端访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。
  • last和break标记的实现功能相似,但两者之间有细微的差异,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite规则执行完毕后,会对其所在的server{...}标签从新发起请求,而break标记则会在本条规则匹配完成后,终止匹配,再也不匹配后面的规则。

6.6.3 Nginx rewrite 的企业应用场景

Nginx的rewrite功能在企业里应用很是普遍:服务器

  • 能够调整用户浏览的URL,使其看起来更规范,合乎开发及产品人员的需求。
  • 为了让搜索引擎收录网站内容,并让用户体验更好,企业会将动态URL地址假装成静态地址提供服务
  • 网站换新域名后,让旧域名的访问跳转到新的域名上,例如:让京东的360buy换成了jd.com
  • 根据特殊变量,目录,客户端的信息进行URL跳转等。

6.6.4 Nginx rewrite 301 跳转

以往咱们是经过别名方式实现yunjisuan.com和www.yunjisuan.com访问同一个地址的,事实上,除了这个方式外,还可使用nginx rewrite 301 跳转的方式来实现。实现的配置以下:

[root@localhost nginx]# cat conf/extra/www.conf #www virtualhost by Mr.chen server { listen 80; server_name www.yunjisuan.com; root /var/www/html/wwwcom; location / { index index.html index.htm; } # location = / { # return 402; # } location = /images/ { return 501; } location /documents/ { return 403; } location ^~ /images/ { return 404; } location ~* \.(gif|jpg|jpeg)$ { return 500; } } server{ listen 80; server_name yunjisuan.com; rewrite ^/(.*) http://www.yunjisuan.com/$1 permanent; #当用户访问yunjisuan.com及下面的任意内容时,都会经过这条rewrite跳转到www.yunjisuan.com对应的地址 } 

客户端访问测试结果

QQ20170712-105655@2x.png-43.5kB

QQ20170712-105719@2x.png-83kB

6.6.5 实现不一样域名的URL跳转

示例:实现访问http://mail.yunjisuan.com时跳转到http://www.yunjisuan.com/mail/yunjisuan.html

外部跳转时,使用这种方法可让浏览器地址变为跳转后的地址,另外,要事先设置http://www.yunjisuan.com/mail/yunjisuan.html有结果输出,否则会出现401等权限错误。

(1)配置Nginx rewrite规则

[root@localhost nginx]# cat conf/extra/mail.conf server { listen 80; server_name mail.yunjisuan.com; location / { root /var/www/html/mailcom; index index.html index.htm; } if ( $http_host ~* "^(.*)\.yunjisuan\.com$") { set $domain $1; rewrite ^(.*) http://www.yunjisuan.com/$domain/yunjisuan.html break; } } 

客户端访问测试

QQ20170712-114726@2x.png-67.3kB

QQ20170712-114744@2x.png-52.6kB

6.6.6 rewrite跳转标记flag使用总结

1,在根location(即location / {...})中或server{...} 标签中编写rewrite规则,建议使用last标记
2,在普通的location(例 location/yunjisuan/{...}或if{}中编写rewrite规则,则建议使用break标记)

6.7 Nginx访问认证

有时,在实际工做中企业要求咱们为网站设置访问帐号和密码权限,这样操做后,只有拥有帐号密码的用户才能够访问网站内容。
这种使用帐号密码才能够访问网站的功能主要应用在企业内部人员访问的地址上,例如:企业网站后台,MySQL客户端phpmyadmin,企业内部的CRM,WIKI网站平台。

6.7.1 建立密码文件

咱们能够借用apache的htpasswd软件,来建立加密的帐号和密码

[root@localhost ~]# which htpasswd [root@localhost ~]# htpasswd -bc /usr/local/nginx/conf/htpasswd yunjisuan 123123 Adding password for user yunjisuan [root@localhost ~]# cat /usr/local/nginx/conf/htpasswd yunjisuan:FC1/eEc/iK0Mo #帐号密码是加密的(htpasswd是文件的名字)

6.7.2 在虚拟主机配置文件里加入两条配置信息

[root@localhost html]# cat /usr/local/nginx/conf/extra/blog.conf server { listen 80; server_name blog.yunjisuan.com; location / { root /var/www/html/blogcom; index index.html index.htm; auth_basic "yunjisuan training"; #加入这条配置 auth_basic_user_file /usr/local/nginx/conf/htpasswd; #加入这条配置 } } #配置解释: auth_basic :验证的基本信息选项(后边跟着的双引号里就是验证窗口的名字) auth_basic_user_file :验证的用户文件(后边根帐号密码文件的绝对路径)

6.7.3 网页登录验证

QQ20170712-203741@2x.png-46.7kB

屏幕快照 2017-07-12 下午8.36.57.png-57.4kB

QQ20170712-203807@2x.png-45.3kB

6.8 Nginx相关问题解答

6.8.1 Tengine和Nginx是什么关系?

Tengine是淘宝开源Nginx的分支,官方站点为http://tengine.taobao.org/

6.8.2 访问Nginx时出现状态码“403 forbidden”的缘由

(1)Nginx配置文件里没有配置默认首页参数,或者首页文件在站点目录下没有以下内容:

index index.php index.html index.htm;

(2)站点目录或内部的程序文件没有Nginx用户访问权限

(3)Nginx配置文件中设置了allow,deny等权限控制,致使客户端没有访问权限。

7 本章知识点回顾

  1. Nginx的特性优势
  2. 主流Web动态静态性能对比
  3. Apache select 和Nginx epoll 模型的区别(面试常考)
  4. 虚拟主机概念及类型分类详解
  5. 基于域名和端口虚拟主机的介绍及搭建
  6. Nginx错误,访问日志,以及访问日志切割
  7. Nginx访问状态信息介绍及配置实践。
  8. Nginx location介绍及配置实践
  9. Nginx rewrite介绍及配置实践
  10. Nginx Web访问认证介绍及配置实践
相关文章
相关标签/搜索