一、第三方模块的使用
第三方模块网址: https://www.nginx.com/resources/wiki/modules
1、编译安装第三方模块
①上传第三方模块压缩包
上传 ngx-fancyindex-v0.4.3.tar.gz和echo-nginx-module-0.61.tar.gz
到/root/soft下。编译安装以上两个Nginx的第三方模块。
②编译安装并升级
tar zxvf ngx-fancyindex-v8.4.3.tar.gz
tar xvf echo-nginx-module-0.61.tar.gz //解压安装包
cd /root/soft/nginx-1.16.0
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module
--with-http_stub_status_module --with-http_realip_module --add-module=/root/soft/ngx-
fancyindex-0.4.3 --add-module=/root/soft/echo-nginx-module-0.61
make && make install && make upgrade //安装并更新
make && make install && make upgrade //编译安装和升级
2、fancyindex美化目录列表
①查看确认编译模块参数
#查看版本号及其编译参数
/usr/local/nginx/sbin/nginx -V
确认是否包含ngx-fancyindex模块
②配置实现
#可以配置到http、server、location等下。推荐配置到server下
#开启fancyindex列表显示功能,之前官方的是autoindex on;
fancyindex on;
#显示文件大小M/G
fancyindex_exact_size off;
3、echo调试$document_root
echo-nginx-module这个模块是用来调试打印$document_root里面的变量
验证一下是否和root设定的值一样
location / {
#输出为文本类型
default_type text/plain ;
#default_type text/html ;
#打印输出查看变量信息
echo $document_root;
}
二、nginx发行版本
1、淘宝的tengine
tengine是alibaba公司,在nginx的基础上,开发定制,更适合自己业务的服务器软件。
后来进行了开源。
#解压编译安装
tar xvf tengine-2.3.0.tar.gz
cd tengine-2.3.0
./configure --prefix=/usr/local/tengine
make && make install
#查看默认加载的模块和参数信息
/usr/local/tengine/sbin/nginx -v
#tengine默认提供-m参数查看已经编译加载的模块
案例:通过tengine内置模块自动添加页脚信息 ,标识服务器信息, 使用ngx_http_footer_filter_module
./configure --prefix=/usr/local/tengine --add-module=/root/soft/tengine-2.3.0
/modules/ngx_http_footer_filter_module
修改配置文件并重载服务service nginx reload
vim /usr/local/tengine/conf/nginx.conf
module可定义在http、server、location中,建议在server中
location / {
#定义需要插入footer的响应类型(Response Content-Type) .
footer_types "text/plain" "text/css" "application/x-javascript";
#在上面定义的HTTP响应的正文结尾插入指定的format内容。
#如果format中含有变量,会被替换为变量当前的值。
footer "$host_comment";
}
2、OpenResty
openresty 在Nginx的基础上,结合lua脚本实现高并发的web平台。作者章亦春
WAF nginx+lua+redis 实现应用型防火墙 动态把IP加入黑名单
官方网址: http://openresty.org/cn/
编译安装步骤
解压编译并安装
tar xvf openresty-1.15.8.1.tar .gz
cd openresty-1.15.8.1
./configure --prefix=/usr / local/openresty
make && make install
查看默认编译参数及模块
/usr/local/openresty /sbin/openresty -V
/usr/local/openresty/bin/openresty这个实际的软链接是
/usr/local/openresty/nginx/sbin/nginx 两个命令都可以启动
启动openresty之后刷新网页可以看到Welcome to Openresty
使用lua模块语法修改配置文件
vim /usr/local/apenresty/nginx/conf/nginx.conf
示例配置:
location / {
root html;
index index.html index.htm ;
#默认返回类型
default_type text/html;
#调用lua模块的语法,输出内容
content_by_lua 'ngx.say ("hello openresty")';
}
openresty的软链接是/usr/local/openresty/nginx/sbin/nginx
所以重载可以用
/usr/local/openresty/bin/openresty -s reload
三、URL匹配之location
1、location匹配规则
URI唯一资源标识通常由三部分组成:
①资源的命名机制;②存放资源的主机名;③资源自身的名称。
只要是可以唯一标识资源的都被称为URI
URL统一资源定位 符
#精确匹配
location =/ {
#规则
}
则匹配到 http:/www.example.com/ 以/结尾的这种请求
~ 区分大小写
location ~ /Example/ {
#规则
}
请求示例
http://www.example.com/Example/[成功]
http://www.example.com/example/[失败]
~*大小写忽略
location ~* /Example/ {
#规则
}
请求示例
http://www.example.com/Example/[成功]
http://www.example.com/example/[成功]
#^~只匹配以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[失败]
/其他匹配都不成功就匹配此项
location / {
#规则
}
如果路径的资源文件是存在的,会优先获取资源文件
2、location匹配跳转
@+name nginx内部跳转
location /img/ {
#如果状态码是404就指定404的页面
error_page 404 = @img_err;
}
location @img_err {
#规则
return 503;
}
以/img/开头的请求,如果链接的状态为404。则会匹配到@img_err这条规则上
3、return
该指令用于结束规则的执行并返回状态码给客户端.
403 Forbidden.服务器已经理解请求,但是拒绝执行它
404 Not Found.请求失败,请求所希望得到的资源未在服务器上发现,没有其他适合的响应情况.
400的都是无法获取的资源,500的是服务器的问题
500 Internal Server Eror.服务器遇到一个未曾预料的状况,导致它无法完成对请求的处理.一般来说,这个问题都会在服务器的程序码出错时出现.
502 Bad Gateway.作为网关或代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应.
大概率是服务器挂了
503 Service Unavailable.由于临时的服务器维护或过载,服务器当前无法处理请求.这个状况是临时的,并且将在一段时间以后恢复.503状态码的存在并不意味着服务器在过载的时候必须使用它.某些服务器只不过是希望拒绝客户端的连接.
504Gateway Timeout作为网关或代理工作的服务器尝试执行请求时,未能及时从上游服务器(URl标识出的服务器,例如HTTP,FTP,LDAP)或辅助服务器(例如DNS)收到响应
请求状态码:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
location /img/ {
#如果状态码是404就指定404的页面
error_page 404 = @img_err;
}
location @img_err {
#规则
return 404;
}
输入带有img的url访问请求如果匹配到error_page 404就匹配下一个location跳转返回状态码404
4、rewrite
rewrite匹配到请求URI,重写到新的URI
rewrite语法 匹配到,替换为其他内容
语法 rewrite 匹配内容 替代内容 标记
官方文档地址: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则,客户端URL地址不会发生跳转
break #本条规则匹配完成即终止,不再匹配后面的任何规则,客户端URL地址不会发生跳转
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
匹配顺序:多条rewrite,从上到下匹配,匹配到之后就不在匹配其他rewrite规则。
四、URL相关案例实现
1、资源重定向实现pathinfo
业务需求描述:
实际业务不存在index.html,需要重写访问index.php
URL为index.html,而实际访问的是index.php,对外被认为是html静态页面
以上方案就是 seo(搜索引擎优化)优化伪静态的使用,把真实的后端的页面,伪装为静态html页面。
①修改配置
vim /usr/local/nginx/conf/nginx.conf
#添加配置到server
rewrite /index.html /index.php last;
③重载配置测试访问
service nginx reload 重载配置文件
如果把break写到location / 外面,就能解析.php。
否则匹配了/index.php也不会匹配下面的location ~ \.php$,所以无法解析index.php(弹出下载)
Tip: Nginx支持pathinfo路径重写方式
需求
http://www.shop.com/home/goods/index/cate_id/187.html默认不支持访问,重写成为
http://www.shop.com/index.php?s=home/goods/index/cate_id/187.html
语法规则示例
location / {
伪静态seo
rewrite /index.html /index.php last;
#判断请求的路径 如果不存在
if ( !-e $request_filename) {
#捕获到所有路径信息重写为index.php的s参数
#home/goods/index/cate_id/187.html这个就是被重定向的路径
#last需要匹配之后的location规则,并且客户端url不会跳转
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
2、域名重定向实现
把shop.Inmp.com的请求全部重定向到新域名www.shop.com
(windows客户端测试可以绑定新的域名/etc/hosts)
rewrite / http://www.shop.com permanent; //永久重定向
#shop.lnmp.com的请求全部重定向到www.shop.com中
server {
listen 80;
server_name shop.lnmp.com;
rewrite / http://www.shop.com permanent;
}
server {
listen 80;
#绑定新域名即可
server_name www.shop.com;
root html/tp5shop/public;
index index.php index.html;
#deny 192.168.17.1;
#auth_basic "shop login" ;
#auth_basic_user_file /usr/local/nginx/conf/passwd.db;
access_log logs/shop.lnmp.com_access.log mylogs;
location / {
rewrite /index.html /index.php last;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
3、防盗链原理和实现
业务需求描述:
域名A的资源文件,经常被域名B直接调用访问。
而用户经常访问域名B,看到的资源(图片等)以为是域名B的,实际则是域名A的。但是域名A没有从中获得任何收益,却要给域名B调用的访问耗费服务器资源和带宽。所以,禁止域名B直接访问和调用域名A的资源的方式,就被称为"防止盗链”
①ip虚拟主机目录建立静态文件访问www.shop.com虚拟主机的图片资源
②在www.shop.com虚拟主机配置防盗链
#定义在server里shop的server,这个会把自己的其他url也禁掉
valid_referers www.shop.com;
if ($invalid_referer) {
return 404;
}
#优化
#定义在server里shop的server
#图片请求防盗链
location ~* \.(jpg|png|jpeg|gif|bmp) {
valid_referers www.shop.com ;
if ($invalid_referer) {
return 404;
}
}
五、安全
1、反向代理
实现隐藏真实服务的操作,起到一定安全作用。
实际工作中nginx的反向代理可以导致别人不知道真实服务器究竟是哪台
2、隐藏nginx版本号
Nginx对外提供服务,为了避免被针对某个版本的漏洞进行攻击。经常做法是隐藏掉软件的版本信息。提供一定的安全性。
#将以下配置加入到http段配置中
server_tokens off;
3、Https和CA
ssl加密传输,密钥对连接
如果Nginx配置文件格式需要调整可以通过管理工具下载到桌面调整好了再上传reload
server {
listen 443 ssl;
#绑定好域名
server_name web1.heimadevops.top;
#指定证书相关位置
ssl_certificate /usr/local/nginx/conf/1_web1.heimadevops.top_bundle.crt;
ssl_certificate_key /usr/local/nginx/conf/2_web1.heimadevops.top.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
#http跳转到https
server {
listen 80;
server_name web1.heimadevops.top;
#永久重定向permanent
rewrite / https://web1.heimadevops.top permanent;
}
客户端注意解析域名/etc/hosts