Nginx防盗链+Nginx访问控制+Nginx解析php相关配置+Nginx 代理

一、Nginx防盗链:

1.1 打开配置文件:

/usr/local/nginx/conf/vhost/haha.com.conf

增加如下配置文件:

location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$
{
    expires 7d;
    valid_referers none blocked server_names  *.haha.com ;
    if ($invalid_referer) {
        return 403;
    }
    access_log off;
}

如上配置文件中匹配以gif,jpg,png结尾的页面,并且设置一个白名单为*.haha.com, 其它的均403 forbidden!

1.2 测试+重载(-t && -s reload)

1.3 测试

[[email protected]03 vhost]# curl -x127.0.0.1:80 www.hehe.com/2.jpg -I
HTTP/1.1 200 OK

使用本地主机访问图片是没有问题的。

指定一个referer,再次测试:

[[email protected]03 www.haha.com]# curl -e "http://www.123.com" -x127.0.0.1:80 www.hehe.com/2.jpg -I
HTTP/1.1 403 Forbidden

就出现了403forbidden

二、Nginx访问控制:

有时候在咱们运维一些网站的时候,发现一些访问是不正常的。或者为了提高安全性,我们需要将某些页面加密处理!

2.1 增加如下配置文件

location /admin/

{
    allow 127.0.0.1;
    allow 192.168.230.137;
    deny all;
}

匹配规则为,一旦匹配则后面的均不执行,也就是允许127.0.0.1和192.168.230.137访问;其它的均拒绝!

匹配站点后台登录页,进行访问控制!

location ~ .*admin\.php$ {

{
    allow 127.0.0.1;
    allow 221.224.0.190;
    deny all;
}

2.2 测试+重载配置(-t && -s reload)

2.3 测试:

[[email protected]03 www.haha.com]# curl -x127.0.0.1:80 www.haha.com/admin/ -I
HTTP/1.1 200 OK
[[email protected]03 www.haha.com]# curl -x192.168.230.137:80 www.haha.com/admin/ -I
HTTP/1.1 200 OK
使用如上配置的IP访问是完全没有问题的。

现在我使用外部的电脑再次测试: 访问站点是没有问题的!

当我们再次访问/admin/目录的时候:


2.4 针对某个可以上传的目录做指定文件(例如:php)不解析:

location ~ .*(upload|image)/.*\.php$
{
        deny all;
}

2.5 根据user-agent限制:

如果站点被CC攻击了,或者不想被蜘蛛爬自己的网站,我们完全可以根据user-agent去禁止掉:

if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato')
{
      return 403;
}

测试:

[[email protected]03 ~]# curl -A "Tomato" -x127.0.0.1:80 haha/upload/12.php -I
HTTP/1.1 403 Forbidden


[[email protected]03 ~]# curl -A "tomato" -x127.0.0.1:80 haha/upload/12.php -I
HTTP/1.1 200 OK

如上第二个我们发现,当我们修改user-agent为小写的时候,就不生效了。所以我们需要设置忽略大小写:

if ($http_user_agent ~* 'Spider/3.0|YoudaoBot|Tomato')
{
      return 403;
}

只需要在~添加一个 * 即可!
[[email protected]03 ~]# curl -A "tomato" -x127.0.0.1:80 haha/upload/12.php -I
HTTP/1.1 403 Forbidden
Server: nginx/1.12.1

再次测试:

[[email protected]03 ~]# curl -A "tomato" -x127.0.0.1:80 haha/upload/12.php -I
HTTP/1.1 200 OK
Server: nginx/1.12.1

三、Nginx解析php相关配置

3.1 配置:

location ~ \.php$
      {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/www.haha.com$fastcgi_script_name;
      }
      
fastcgi_pass 用来指定php-fpm监听的地址或者socket

有时候咱们会经常因为一个小的失误,错误的漏写一个字母或者单词造成常见的502错误。例如:

location ~ \.php$
      {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/www.haha.com$fastcgi_script_name;
      }

假如如上的unix路径咱们故意写错,然后就会出现如下错误:

[[email protected]03 ~]# curl  -x127.0.0.1:80 haha/upload/12.php -I
HTTP/1.1 502 Bad Gateway

咱们来看一下错误日志:

[[email protected] ~]# cat /usr/local/nginx/logs/nginx_error.log 
2017/08/14 19:59:03 [crit] 5209#0: *21 connect() to unix:/tmp/php-cgi.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: haha.com, request: "HEAD HTTP://haha/upload/12.php HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-cgi.sock:", host: "haha"

错误日志提示我们(没有那么文件或者目录)其实我把unix:/tmp/php-fcgi.sock 少些了一个f

所以一旦遇到错误,我们一定要养成看日志的习惯,它能帮助我们很快定位到错误之处!

如果路径不晓得,我们可以查看一下:

[[email protected] ~]# cat /usr/local/php-fpm/etc/php-fpm.conf
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock

3.2 另外一种502常见错误:

如果我们的监听方式改为IP:port模式

cat /usr/local/php-fpm/etc/php-fpm.conf
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
#listen = /tmp/php-fcgi.sock
listen = 127.0.0.1:9000

测试+重启PHP-FPM

[[email protected] ~]# /usr/local/php-fpm/sbin/php-fpm -t

[[email protected] ~]# /etc/init.d/php-fpm reload
Reload service php-fpm  done

查看端口:

[[email protected] ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      5721/php-fpm: maste

已经更改为咱们自定义的! 然后再次测试:

[[email protected]03 ~]# curl  -x127.0.0.1:80 haha/upload/12.php -I
HTTP/1.1 502 Bad Gateway

发现 还是502,是不是我们忘记了更改vhost中Ngin的端口配置? 我们再次更改vhost中haha.com.conf的配置文件:

location ~ \.php$
      {
        include fastcgi_params;
        fastcgi_index index.php;
#        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/www.haha.com$fastcgi_script_name;
      }

测试+重载

再次测试:

[[email protected]03 ~]#curl  -x127.0.0.1:80 haha/upload/12.php -I
HTTP/1.1 200 OK

注意点:

3.3 权限导致的502

先看一下配置,我注释了#listen.mode = 666

[[email protected] www.haha.com]# vim /usr/local/php-fpm/etc/php-fpm.conf

[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
#listen = 127.0.0.1:9000
#listen.mode = 666

再次测试:

[root@zhdy-03 www.haha.com]# !curl
curl  -x127.0.0.1:80 haha/upload/12.php -I
HTTP/1.1 502 Bad Gateway

由此看来当我取消设置权限,或者设置为444均不可以正常访问! 再次使用授权方式验证:

[root@zhdy-03 www.haha.com]# chown nobody /tmp/php-fcgi.sock 
[root@zhdy-03 www.haha.com]# curl  -x127.0.0.1:80 haha/upload/12.php -I
HTTP/1.1 200 OK

这样看来我们是可以访问的! 这样是为了所有的用户都可以读和写; 我们还是修改过来原先的配置!

[root@zhdy-03 www.haha.com]# vim /usr/local/php-fpm/etc/php-fpm.conf

[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
#listen = 127.0.0.1:9000
listen.mode = 666

这样就表明,权限的不到位仍然也是导致502的原因!

还有一种502的现象,如果内存中出现大量的php-fpm进程占据了内存,也会同样导致此问题!


四、Nginx 代理

假如一个用户需要访问WEB服务器,但是用户与WEB服务器之间是不通的,WEB服务器在内网,我们需要一个代理服务器来帮助用户访问web,他必须和用户相通,也必须和web服务器相通,在中间起到搭桥的这就是代理服务器。

4.1 原理为:

4.2 配置文件:

cd /usr/local/nginx/conf/vhost
 
vim proxy.conf

加入如下内容:

server
{
    listen 80;
    server_name www.okay686.cn;

    location /
    {
        proxy_pass      http://221.224.0.123/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

因为是代理服务器所以不需要访问咱们本地服务器的任何文件; server_name www.okay686.cn; 定义一个域名;

proxy_pass http://221.224.0.123/;真实WEB服务器的IP地址。 (刚刚的IP地址不是我真正的服务器地址,为了防止某些XX.)

$host; 也就是咱们的server_name

当我没有重启nginx服务前,先测试一下:

[[email protected] vhost]# curl -x127.0.0.1:80  www.okay686.cn
this is a test web www.haha.com

重启nginx之后再次测试:

[[email protected] vhost]# curl -x127.0.0.1:80  www.okay686.cn

就已经可以访问了!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

proxy_pass根据path路径转发时的"/"问题记录

在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/。当加上了/,相当于是绝对根路径,则nginx不...

524100
来自专栏曾大稳的博客

zygote篇

参考连接:http://gityuan.com/2016/02/13/android-zygote/

11230
来自专栏linux

基于HAProxy的高性能缓存服务器nuster

Nuster是一个基于HAProxy的高性能缓存服务器

37600
来自专栏王启航的专栏

【腾讯云的1001种玩法】在腾讯云服务器搭建FBCTF平台,FBCTF简体中文汉化版,FBCTF更新缓存

一步一步教你在腾讯云服务器搭建FBCTF平台,FBCTF简体中文汉化版,FBCTF更新缓存,教程详细,小白也能轻松学会。

1.6K10
来自专栏张戈的专栏

【 ES 私房菜】ElasticSearch 详细部署教程

Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。本文详细介绍了elasticserch的部署...

1.5K10
来自专栏木头编程 - moTzxx

跨域解决方案整理笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

21230
来自专栏Petrichor的专栏

python: pyenv 指令备忘录

10920
来自专栏互联网杂技

详解JavaScript跨域问题

什么是跨域? 概念:只要协议、域名、端口有任何一个不同,都被当作是不同的域。 URL 说明 是否允许通信 ...

415100
来自专栏枕边书

网页实时聊天之js和jQuery实现ajax长轮询

众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系。所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,...

89680
来自专栏个人分享

Hbase基本操作~

每张表至少要有一个列簇,因此我们创建了info,现在,看看我们的表,执行下面list命令:

15720

扫码关注云+社区

领取腾讯云代金券