前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx防盗链+Nginx访问控制+Nginx解析php相关配置+Nginx 代理

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

作者头像
老七Linux
发布2018-05-09 16:21:25
1K0
发布2018-05-09 16:21:25
举报

一、Nginx防盗链:

1.1 打开配置文件:

代码语言:javascript
复制
/usr/local/nginx/conf/vhost/haha.com.conf

增加如下配置文件:

代码语言:javascript
复制
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 测试

代码语言:javascript
复制
[[email protected]03 vhost]# curl -x127.0.0.1:80 www.hehe.com/2.jpg -I
HTTP/1.1 200 OK

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

指定一个referer,再次测试:

代码语言:javascript
复制
[[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 增加如下配置文件

代码语言:javascript
复制
location /admin/

{
    allow 127.0.0.1;
    allow 192.168.230.137;
    deny all;
}

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

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

代码语言:javascript
复制
location ~ .*admin\.php$ {

{
    allow 127.0.0.1;
    allow 221.224.0.190;
    deny all;
}

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

2.3 测试:

代码语言:javascript
复制
[[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访问是完全没有问题的。

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

image
image

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

image
image

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

代码语言:javascript
复制
location ~ .*(upload|image)/.*\.php$
{
        deny all;
}

2.5 根据user-agent限制:

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

代码语言:javascript
复制
if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato')
{
      return 403;
}

测试:

代码语言:javascript
复制
[[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为小写的时候,就不生效了。所以我们需要设置忽略大小写:

代码语言:javascript
复制
if ($http_user_agent ~* 'Spider/3.0|YoudaoBot|Tomato')
{
      return 403;
}

只需要在~添加一个 * 即可!
代码语言:javascript
复制
[[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

再次测试:

代码语言:javascript
复制
[[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 配置:

代码语言:javascript
复制
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错误。例如:

代码语言:javascript
复制
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路径咱们故意写错,然后就会出现如下错误:

代码语言:javascript
复制
[[email protected]03 ~]# curl  -x127.0.0.1:80 haha/upload/12.php -I
HTTP/1.1 502 Bad Gateway

咱们来看一下错误日志:

代码语言:javascript
复制
[[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

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

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

代码语言:javascript
复制
[[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模式

代码语言:javascript
复制
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

代码语言:javascript
复制
[[email protected] ~]# /usr/local/php-fpm/sbin/php-fpm -t

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

查看端口:

代码语言:javascript
复制
[[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

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

代码语言:javascript
复制
[[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的配置文件:

代码语言:javascript
复制
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;
      }

测试+重载

再次测试:

代码语言:javascript
复制
[[email protected]03 ~]#curl  -x127.0.0.1:80 haha/upload/12.php -I
HTTP/1.1 200 OK

注意点:

image
image

3.3 权限导致的502

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

代码语言:javascript
复制
[[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

再次测试:

代码语言:javascript
复制
[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均不可以正常访问! 再次使用授权方式验证:

代码语言:javascript
复制
[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

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

代码语言:javascript
复制
[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 原理为:

mark
mark

4.2 配置文件:

代码语言:javascript
复制
cd /usr/local/nginx/conf/vhost
 
vim proxy.conf

加入如下内容:

代码语言:javascript
复制
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服务前,先测试一下:

代码语言:javascript
复制
[[email protected] vhost]# curl -x127.0.0.1:80  www.okay686.cn
this is a test web www.haha.com

重启nginx之后再次测试:

代码语言:javascript
复制
[[email protected] vhost]# curl -x127.0.0.1:80  www.okay686.cn

就已经可以访问了!

mark
mark
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016/08/14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Nginx防盗链:
  • 二、Nginx访问控制:
  • 三、Nginx解析php相关配置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档