Nginx 防盗链首先进入到 / usr/local/nginx/conf/vhost / 目录下, 编辑配置文件 vim test.com.confvim test.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 .test.com ; if ($invalid_referer) { return 403; } access_log off;} valid_referers none blocked server_names *.test.com ; if ($invalid_referer) { return 403; 这时防盗链的核心部分, 第一行的意义为定义白名单, 第二行是如果不匹配, 第三行是状态码. 输入完后保存, 检查语法, 重新加载. Nginx 访问控制 和 httpd 一样, Nginx 也需要限制某些 IP 不能访问或者只允许某些 IP 访问, 配制方法和 httpd 很像. 但更加简洁了. 不需要像 httpd 全部都历一遍.
配置访问控制还是要编辑虚拟主机的配置文件
/usr/local/nginx/conf/vhost/
然后再最后面加上访问控制的配置
- location /admin/
- {
- allow 192.168.1.107;
- allow 127.0.0.1;
- deny all;
- }
我们做白名单是时候一定要先 allow 后 deny.allow 是允许的意思, deny 是拒绝的意思. 在每个语句结束的时候一定要用 ";" 结束.
然后我们做一个实验, 创建一个目录 mkdir /data/wwwroot/test.com/admin/
然后在里面写入内容
echo "test,test">/data/wwwroot/test.com/admin/1.html
然后我们做测试
- curl -x 127.0.0.1:80 -I test.com/admin/1.html
- HTTP/1.1 200 OK
- curl -x 192.168.1.107:80 -I test.com/admin/1.html
- HTTP/1.1 200 OK
而输入其他的 IP 访问就不成功了, 这就是限制 ip 访问. 这是针对目录的.
我们还可以按照正则去限制它的访问
- location ~ .(upload|image)/..php$
- {
- deny all;
- }
小括号中的分隔符 "|" 是或者的意思, 这样就可以将访问的 URL 中带有关键字的字符串, 并且是 php 的请求禁止访问. 这样做的目的是将上传文件的目录禁止解析 php, 目的是保证安全.
然后我们做一个实验.
首先创建一个 upload 目录, 在里面写一个 php 的文件, 然后访问
curl -x192.168.1.107:80 -I test.com/upload/1.php
HTTP/1.1 403 Forbidden
结果是无法访问, 我们的目的也达成了.
如果我们不想让别人知道我们的网站, 就可以根据 user_agent 限制, 就像我们的网站被隐藏了一样.
- if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato')
- {
- return 403;
- }
其中~ 后面的 "" 是忽略大小写.
Nginx 解析 php 相关配置
在 lamp 中, php 是作为 httpd 的一个模块出现, 只要模块被加载, 就可以解析 php 脚本了. 而在 lnmp 中, php 是作为一个服务 (php-fpm) 的形式存在的, 首先要启动 php-fpm 服务, 然后 Nginx 再和 php 通信, 也就是说处理 php 脚本解析的工作是由 php-fpm 来完成.
- location ~ .php$
- {
- include fastcgi_params;
- fastcgi_pass unix:/tmp/php-fcgi.sock;
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
- }
这个就是 Nginx 解析 php 的配置文件.
这里我们需要注意的是 fastcgi_pass unix:/tmp/php-fcgi.sock; 容易写错, 如果写错, 就会显示 502.
我们组一个实验, 故意将 / tmp/php-fcgi.sock 写错, 然后访问.
curl -x192.168.1.107:80 test.com/3.php
- <html>
- <head><title>502 Bad Gateway</title></head>
由于我们写错了配置文件, 所以显示了 502, 然后我们查看一下错误日志 nginx_error.log
2018/04/26 23:22:39 [crit] 2076#0: *49 connect() to unix:/tmp/php-fgi.sock failed (2: No such file or directory) while connecting to upstream, client: 192.168.1.107, server: test.com, request: "GET HTTP://test.com/3.php http://test.com/3.php HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-fgi.sock:", host: "test.com"
它的意思是 到 unix:/tmp/php-fgi.sock 失败(2: 没有这样的文件或目录).
当我们遇到这样的问题时我们就要仔细思考一下是不是我们配置的地址不对呢? 首先我们先看一下错误日志, 首先看文件存不存在. 如果不存在, 我们就要去查看 php-fpm 的配置文件, 看看我们定义的 sock 是什么. 我们必须保持 php-fpm 中的 sock 与虚拟主机的配置文件中的 sock 一致. 否则就会报错 502.
如果 php-fpm 监听的是一个端口, 比如 127.0.0.1:9000, 那么我们也需要在虚拟主机的配置文件中做一个更改.
首先找到 fastcgi_pass, 然后将它改成监听端口的形式. 比如 fastcgi_pass 127.0.0.1:9000; 然后检查语法是否错误, 然后重新载入. 经过这一系列的操作后, 我们就有可以解析 php 了. 所以, 虚拟主机中的 fastcgi_pass 一定要和 php-fpm 中监听的 IP 一致, 否则就会报 502.
在以后如果我们出现解析 php 出现 502 的时候一定要检查 php-fpm 中配置监听 ip 和 sock 是否一致, 如果不一致就会报 502.
还有就是 SCRIPT_FILENAME 后面跟的路径一定要写对, 他是与配置文件上面的 root 后面跟的路径是一致的, 他们一定要对应起来. 如果配置不对, 在访问的时候会报 404.
还有一种情况报 502 是因为我们的的 php-fpm 配置文件中有一行 listen.mode=666 这行配置被注销或者没有了, 这样配置是让所有 的用户都可以执行这个文件, 如果没有这行配置, 则只能 root 用户可以执行权限.
Nginx 代理
当用户不能直接访问服务器, 那么我们就可以做一个代理服务器.
首先进入 / usr/local/nginx/cnof/vhost
然后编辑一个新配置文件
vim proxy.conf
增加内容如下
- server
- {
- listen 80;
- server_name ask.apelearn.com;
- location /
- {
- proxy_pass http://121.201.9.155/;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
- }
其中 proxy_pass 是定义你要访问的 web 服务器的 IP
server_name 是定义域名
然后我们检查语法重新加载.
如果我们在做代理的时候不知道要访问的 web 服务器的 ip 时, 我们可以用 dig + 域名的方法获取 ip.
安装 dig 命令: yum install -y bind*
来源: http://www.bubuko.com/infodetail-2576630.html