企业级Nginx使用部署二

学习目标和内容

  1. 能够搭建基于用户的访问控制
  2. 能够配置访问基于IP的访问限制
  3. 能够操作Nginx的平滑升级
  4. 能够编译实现并使用第三方模块
  5. 能够实现URL的rewrite重写规则
  6. 能够理解防盗链原理和实现

访问限制配置

基于IP的访问限制

基于ngx_http_access_module模块,默认可使用

语法:

deny ip 禁止ip访问

allow ip 允许访问

默认是允许所有访问的

①配置

②测试使用

加一个测试:

起另外一台虚拟机操作,虚拟机没有浏览器,学习使用curl进行请求发送

curl -I 访问的url地址 可以返回header头信息

基于用户的访问限制

基于ngx_http_auth_basic_module模块,默认可用

语法:

加密文本: 由htpasswd命令实现

htpasswd httpd里的一个工具 如果没有 可以通过yum install httpd-tool

创建密码文件:htpasswd -c 生成到的路径 用户名

-c 创建新文件,如果再次添加用户去掉-c参数,否则会被删除覆盖原来的

auth_basic “提示信息”

auth_basic_user_file /etc/nginx/htpasswd;

实现:

①配置实现

②测试查看

重装和升级

在实际业务场景中,需要使用软件新版本的功能、特性。

重新安装

①停止掉服务,删除编译的安装的软件包和源码包

②重新解压编译安装即可

注意:如果有需要,请备份配置文件和网站目录里的资源文件

平滑升级

升级软件版本之后,需要启动新的版本,启动不了,端口已经被占用

如果直接把旧版本的服务停止掉,会影响线上业务的使用

最佳解决办法:

①旧的不先停掉

②新的又可以起来

③旧的和新的同时提供服务,旧的请求完成之后,就停掉旧进程

-USR2 平滑启动一个进程(平滑升级)

-WINCH 优雅的关闭子进程

-QUIT 优雅关闭主进程

①编译安装新版本

shell > tar xvf nginx-1.14.0.tar.gz

shell > cd nginx-1.14.0

shell > ./configure --prefix=/usr/local/nginx --with-http_ssl_module

shell > make && make install

以上操作完成之后,会把原来的旧版本备份为nginx.old

②新旧版本同时运行

shell > kill -USR2 主进程号

③停止掉旧进程

查看旧的主进程号,并使用kill -WINCH 优雅的关闭的子进程,再关闭旧的主进程

shell > kill -WINCH 旧的主进程号

shell > kill -QUIT 旧的主进程号

第三方模块使用

nginx本身官方没有的功能,一些开源开发者定制开发了,把代码公布出来,可以通过加载第三方模块的方式,使用新的功能

1、开启nginx目录文件列表显示功能

需求:显示目录文件列表,实现下载功能

配置实现

2、Nginx编译使用第三方模块

使用第三方模块插件,美化显示效果

https://www.nginx.com/resources/wiki/modules/fancy_index/

https://github.com/aperezdc/ngx-fancyindex

第三方模块列表显示效果

实现操作步骤:

①重新编译安装加载第三方模块

记得先解压第三方软件模块

shell > tar zxvf ngx-fancyindex-v0.4.2.tar.gz

shell > cd /root/soft/nginx-1.14.0

shell > ./configure --prefix=/usr/local/nginx --with-http_ssl_module --add-module=/root/soft/ngx-fancyindex-0.4.2/

shell > make && make install

安装完成之后

②配置实现

③测试查看效果

测试配置文件,进行重载配置。如果模块安装完成,配置成功,就可以看到之前图片的效果了

3、OpenResty

openresty 在nginx的基础上,结合lua脚本实现高并发等web平台。

http://openresty.org/cn/

安装步骤:

shell > tar xvf openresty-1.13.6.2.tar.gz

shell > cd openresty-1.13.6.2

shell > ./configure --prefix=/usr/local/openresty

shell > make && make install

openresty实际还是nginx,做了一个软连接

查看版本号和默认编译参数

测试使用一下模块功能

使用lua模块输出一个页面文字信息

4、Tengine

tengine是alibaba公司,在nginx的基础上,开发定制,更加服务自己业务的服务器软件。

后来进行开源。

http://tengine.taobao.org/

shell > tar xvf tengine-2.2.2.tar.gz

shell > cd tengine-2.2.2

shell > ./configure --prefix=/usr/local/tengine

shell > make && make install

查看软件参数和加载的模块

URL重写

介绍

(1) ⼀些动态URL地址需要伪装成静态HTML,便于搜索引擎抓取(seo优化),需要Rewrite来处理

例如:是a.html 真是其实访问的是a.php 把动态的伪装成为静态

  1. ⼀些由于⽬录结构,域名变化的旧URL,须要跳转到新的URL上,可以通过rewrite来处理

360buy.com jd.com

xiaomi mi

location

Location 配置语法

①location [ = | ~ | ~* | \^~ ] uri { ... }

前缀+uri(字符串/正则表达式)

②location \@name { ... }

\@+name

前缀的含义:

= :精确匹配(必须全部相等)

~ :大小写敏感

~* :忽略大小写

\^~ :只需匹配uri部分

\@ :内部服务跳转

案列:

  1. =,精确匹配

location = / {

#规则

}

# 则匹配到 `http://www.example.com/` 这种请求

  1. ~,大小写敏感

location ~ /Example/ {

#规则

}

#请求示例

#http://www.example.com/Example/ [成功]

#http://www.example.com/example/ [失败]

  1. ~*,大小写忽略

location ~* /Example/ {

#规则

}

# 则会忽略 uri 部分的大小写

#http://www.example.com/Example/ [成功]

#http://www.example.com/example/ [成功]

4> \^~,只匹配以 uri 开头

location \^~ /img/ {

#规则

}

#以 /img/ 开头的请求,都会匹配上

#http://www.example.com/img/a.jpg [成功]

#http://www.example.com/img/b.mp4 [成功]

#http://www.example.com/bimg/b.mp4 [失败]

#http://www.example.com/Img/b.mp4 [失败]

5> \@,nginx内部跳转

location /img/ {

error_page 404 \@img_err;

}

location \@img_err {

# 规则

}

#以 /img/ 开头的请求,如果链接的状态为 404。则会匹配到 \@img_err 这条规则上

location匹配优先级

(location =) > (location 完整路径) > (location \^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)

return

return 语法

返回服务器的状态码

语法:

return 服务器状态值

该指令⽤于结束规则的执⾏并返回状态码给客户端.

403 Forbidden.服务器已经理解请求,但是拒绝执⾏它

404 Not Found.请求失败,请求所希望得到的资源未在服务器上发现.404这个状态码被⼴泛应⽤于当服务器不想揭示为何请求被拒绝,或者没有其他适合的响应可⽤的情况下.

500 Internal Server Error.服务器遇到⼀个未曾预料的状况,导致它⽆法完成对请求的处理.⼀般来说,这个问题都会在服务器的程序码出错时出现.

502 Bad Gateway.作为⽹关或代理⼯作的服务器尝试执⾏请求时,从上游服务器接收到⽆效的响应.

503 Service Unavailable.由于临时的服务器维护或过载,服务器当前⽆法处理请求.这个状况是临时的,并且将在⼀段时间以后恢复.503状态码的存在并不意味着服务器在过载的时候必须使⽤它.某些服务器只不过是希望拒绝客户端的连接.

504 Gateway Timeout作为⽹关或代理⼯作的服务器尝试执⾏请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP,FTP,LDAP)或辅助服务器(例如DNS)

收到响应。

请求状态码:

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status

rewrite

rewrire需要pcre才能开启此模块

rewrite语法

匹配到,替换为其他内容

语法 rewrite 匹配内容 替代内容 标记

官方文档地址:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

flag标记说明:

last  #本条规则匹配完成后,继续向下匹配新的location URI规则

break  #本条规则匹配完成即终止,不再匹配后面的任何规则

redirect  #返回302临时重定向,浏览器地址会显示跳转后的URL地址

permanent  #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

资源重定向实现

需求:

访问web1下的test.php 实际test.php 不存在 所以重写定向到test.html里

①创建测试页面文件

②重写配置

shell > vim /usr/local/nginx/conf/nginx.conf

③重载配置测试访问

总结:实际不存在的文件,通过重写URI规则,定向到一个存在的文件。

这个在实际工作中,常常用来seo优化的伪静态的使用。当然实际是要把真实的后端的页面,伪装为静态html页面。

域名重定向实现

需求:

公司的域名升级了,需要启用新的用户使用。

但是用户却不知道,还可能使用旧的域名访问网站。

故把旧域名的来源,重定向到新的域名。

7、防盗链原理和实现

需求:

web1服务器上资源文件

web2服务器经常链接显示web1服务器图片

用户经常访问web2服务器的图片,以为是web2自己的,结果web2每次耗费很多流量。

实际web2没有从中获得效益

解决方案:

①图片加水印

②通过判断referer来源,确定是否返回对应的资源文件

referer 本次请求的上次连接是什么 上次的来源

语法:

valid_referers none blocked servername

none blocked 没有referfer的情况,直接访问资源的情况

if ($invalid_referer) {}

①创建两个server虚拟机

②编写通过页面访问图片

上传此页面分别到web1和web2目录中

③配置web1的防盗链,防止web2来获取加载图片资源

④显示一个其他图片

跳转到的图片不能在web1下了,如果还在web1下,还会一直处于防盗链状态

配置图片跳转

实现效果

安全

反向代理

实现隐藏真实服务的操作,起到一定安全作用

2、隐藏Nginx版本号的安全性和方法

①在http段加入server_tokens off

②重载配置测试访问