Nginx中的部分插件示例

因为小编上一节讲的Nginx部署,是通过源码进行编译的,很多关于Nginx的插件是需要自己选择定义的。这里简单列列举几个常用的插件,供大家参考使用。

1 通过Nginx获取到真正的IP模块:real_ip

通过real_ip模块可以获取该报文发送时的客户主机IP,而非中间的路由节点IP。

ngx_realip模块究竟有什么实际用途呢?为什么我们需要去改写请求的来源地址呢?答案是:当Nginx处理的请求经过了某个HTTP代理服务器的转发时,这个模块就变得特别有用。

    当原始用户的请求经过代理(squid,proxy)转发之后,nginx接收到的请求的来源地址也就变成了该代理服务器的IP,于是乎nginx 就无法获取用户请求的真实IP地址了。

   所以,一般我们会在Nginx之前的代理服务器中把请求的原始来源地址编码进某个特殊的HTTP请求头中,然后再在Nginx中把这个请求头中编码的地址恢复出来。这样Nginx中的后续处理阶段(包括Nginx背后的各种后端应用)就会认为这些请求直接来自那些原始的地址,代理服务器就仿佛不存在一样。ngx_realip模块正是用来处理这个需求的。

##使用源码编译,重新加载nginx的配置
[root@server nginx-1.18.0]#./configure --help | grep real   ##查找real_ip模块
  --with-http_realip_module          enable ngx_http_realip_module
  --with-stream_realip_module        enable ngx_stream_realip_module
[root@server nginx-1.18.0]# ./configure --prefix=/usr/local/nginx/ --with-http_realip_module --with-http_ssl_module
                                        ##重新编译环境
[root@server nginx-1.18.0]# make        ##重新编译文件
[root@server objs]# cp nginx /usr/local/nginx/sbin/nginx       
                                        ##将重新编译获得的obj文件,替换原程序(原程序提前备份)
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y
        
图 1  替换完成,查看当前执行程序的配置信息

对配置文件进行配置,调用real_ip模块

##配置real_ip模块
 .....
 42     server{
 43         listen  80;                         ##访问时的端口
 44         server_name server.linux.com;        ##服务器名称
 45         set_real_ip_from 192.168.1.110;   
                            ##服务器的真正ip(来源的上一层真实IP<代理IP>,也可写网段或多个地址)
 46         real_ip_header X-Forwarded-For;     ##从那个头获取真实IP
 47         real_ip_recursive on;
                            ##递归的去除所配置中的可信IP。排除set_real_ip_from里面出现的IP。        
                              如果出现了未出现这些IP段的IP,那么这个IP将被认为是用户的IP
 48 
 49         location / {
 50                 return 200 "client real ip: $remote_addr\n";
                            ##访问成功,获取远程IP
 51         }
 52 
 53     }
....

检查访问结果:

图 1 real_ip模块测试结果

2. 图片压缩模块:image_filter_module

和上述模块操作步骤一样,对其进行重新编译,用编译连接完成的二进制文件替换现文件即可。

##只描述编译文件过程的不同,其他步骤均相等
./configure --prefix=/usr/local/nginx/ --with-http_realip_module --with-http_ssl_module --with-http_image_filter_module=dynamic
                ##--with-http_image_filter_module=dynamic 动态文件处理模块

#######根据编译环境问题解决相应的依赖性问题
[root@server opt]# yum install -y gd-devel-2.0.35-26.el7.x86_64.rpm 

#######因为有依赖性,小编这里采用的动态模块,所以会产生相应的模块。此时建立相应的模块存储位置,并将        
       动态模块导入
[root@server objs]# mkdir /usr/local/nginx/modules
[root@server objs]# cp ngx_http_image_filter_module /usr/local/nginx/modules


【说明】动态模块指单独形成一个模块,在使用时调用即可,若不调用,不会被直接使用。

 随后对建立的模块,进行导入、调用。配置nginx的配置文件:

##配置文件内容
 1 load_module modules/ngx_http_image_filter_module.so;  ##导入文件处理模块
...

 19 http {
 20     include       mime.types;
 21     default_type  application/octet-stream;
....
 55     server {
 56         listen       80;
 57         server_name  localhost;
 58 
 59         #charset koi8-r;
 60 
 61         #access_log  logs/host.access.log  main;
 62 
 63         location / {
 64             root   html;
 65             index  index.html index.htm;
 66         }
 67 
 68        location /download/ {                    ##指定访问的文件
 69             limit_conn addr 1;
 70             limit_req zone=one burst=5;
 71             image_filter resize 150 -;          
                                          ##指定压缩图片的格式:【150 -】表示按比例压缩
 72             image_filter_buffer 10M;        ##当图片过大时,需要设置压缩缓存
 73             image_filter_jpeg_quality 85;   ##设置压缩时的清晰度
 74         }

结果测试:

图 2 原图片大小
图 3 压缩后的照片

【说明】 更多图片压缩参数可查看博客:https://www.jianshu.com/p/56ca5c89d972

3. 对数据的加密访问:http_ssl_module

 首先对模块进行源码编译,若需要解决依赖性,根据要求解决依赖性即可。这里我们要对访问的数据进行加密,即https,故在完成模块编译后,需要生成使用的证书。

 生成证书:

##生成客户主机访问的证书
[root@server download]# cd /etc/pki/tls/certs/    ##切换到证书目录下
[root@server certs]# make cert.pem                ##生成证书
                                        ##按照要求,依次输入证书信息

 

图 4 生成证书信息

 

图 5 证书内容

【说明】上述生成的证书包含私钥和证书两部分。 

 将生成的证书,拷贝到配置目录下(cp cert.pem /usr/local/nginx/conf/),方便在配置文件是的调用。随后设置配置文件内容。

##在http服务中开启https服务的设置
....
126     server {
127         listen       443 ssl;                 ##指定安全连接的端口
128         server_name server.linux.com;         ##指定主机
129 
130         ssl_certificate      cert.pem;        ##指定证书和密钥
131         ssl_certificate_key  cert.pem;
132 
133         ssl_session_cache    shared:SSL:1m;   ##指定缓存和缓存时间
134         ssl_session_timeout  5m;
135 
136         ssl_ciphers  HIGH:!aNULL:!MD5;        ##加密方式
137         ssl_prefer_server_ciphers  on;       
                                     ##依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
138 
139         location / {
140             root   /web;                      ##访问的根目录
141             index  index.html index.htm;      ##目录下的默认发布页面
142         }
143     }
....

因为小编设置了默认发布目录为/web,所以还需要建立发布目录:

[root@server conf]# mkdir /web
[root@server conf]# touch /web/index.html
[root@server conf]# echo hello the linux world > /web/index.html

最后即可重启服务,进行测试:

##重启前可进行语法检测,根据报错排除文件错误
[root@server nginx]# sbin/nginx -t
图 6 测试

 

图 7 测试结果

【说明】 测试过程中会出现证书认证不安全,需要手动进行确认,是因为我们的证书只针对个人,没有通过CA机构的认证。

 在实现数据加密访问后,此时考虑用户的输入情况,不一定每次都是:https://....,同时考虑使用的方便性。例如当输入:baidu.com可直接跳转到:https://www.baidu.com。

为实现上述功能,我们添加地址重定向,实现上述功能。此时使用的模块依然是http_ssl_module。对Nginx的配置文件进行配置即可。

##直接添加server服务,指定重定向内容
...
144         server {
145             listen 80;
146             server_name server.linux.com;
147             rewrite ^/(.*)$ https://server.linux.com/$1;
                                    ## ^/(.*)$ 表示以任何开头、结尾的;$1标识网址输入的后面不变
148         }
...
图 8 直接重定向

查看访问细节:

图 9 临时重定向

 上述细节访问可知,是临时重定向,302。这里的临时指不缓存,若要永久重定向,则进行如下配置:

##直接添加server服务,指定重定向内容
...
144         server {
145             listen 80;
146             server_name server.linux.com;
147             rewrite ^/(.*)$ https://server.linux.com/$1 permanent;
                                    ## ^/(.*)$ 表示以任何开头、结尾的;$1标识网址输入的后面不变
148         }
...

 

图 10 永久重定向

 经过上述的规则重写,我们可以完成一个防盗链的操作(防止没有资源的用户,通过连接就可直接访问资源)。

首先配置盗链的服务器:

##使用Nginx配置服务器

######1 在盗链服务器上,安装nginx服务
##采用源码安装三部曲,这里不再赘述

######2 配置盗链服务器的默认访问配置
##内容如下:

    server {
        listen       80;
        server_name  daolian.linux.com;

        charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {                    ##定义默认发布页面
            root  /web;                
            index  index.html index.htm;
        }

######3 根据上述配置,编写默认发布页面
[root@servera conf]# mkdir /web
[root@servera conf]# vim /web/index.html
##内容:
  1 <html>
  2 <body>
  3 <br>A Steal Link</br>
  4 <img src="http://server.linux.com/download/play.jpeg">   ##正常资源访问地址
  5 </body>
  6 </html>

######4 重启服务,进行测试
图 11 根据盗链网址即可访问

 为了解决上述问题,可在资源服务器中进行如下配置:

##配置资源文件
......
 63        location / {
 64             root html;
 65             index  index.html index.htm;
 66         }
 67         location ~* \.(gif|jpg|png|jpeg)$ {        ##设置以(**)结尾的文件
 68             root html;
 69             valid_referers none blocked server.linux.com;      
                                                ##从server.linux.com访问正常访问
 70             if ($invalid_referer){
 71                 rewrite ^/ http://bbs.linux.com/download/daolian.jpg;
 72             }
                                            ##if判断,若不是指定地址访问,则重定向到指定位置
 73         }
 74     }
 75 
 76     server {                            ##重定向资源的位置
 77             listen 80;
 78             server_name bbs.linux.com;
 79 
 80             location / {
 81                 root html;
 82                 index index.html;
 83             }
 84         }
 85 

 

图 12 非定义地址,被重定向

 4. Nginx的图形分析工具:goaccess

软件下载:https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/g/goaccess-1.3-1.el7.x86_64.rpm

软件安装:因为小编这里下载的rpm包,所以可直接进行安装:yum install -y goaccess

配置Nginx:

##重现编写localtion 访问指定的页面
....
 63         location /report.html {
 64             alias /usr/local/nginx/html/report.html;
 65         }
...

测试:

##启动goaccess进行测试
[root@server opt]# goaccess /usr/local/nginx/logs/access.log -o /usr/local/nginx/html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d%b%Y' --log-format=COMBINED

    ##开启程序,将指定的文件输入(-o)到repot.html中 指定时间格式;日期格式;日志格式

                
图 13 访问结果

 

  参考文章:http://www.mamicode.com/info-detail-1728752.html

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值