12.13 Nginx防盗链
12.14 Nginx访问控制
12.15 Nginx解析php相关配置
12.16 Nginx代理
12.13 Nginx防盗链
Nginx防盗链的核心语句是可以嵌套在静态文件不记录日志和过期时间的语句中一起使用的,这样Nginx的配置就更加清晰明了。
步骤
1.配置文件
1 | [root@localhost ~]# vim /usr/local/nginx/conf/vhost/test2.com.conf |
1 | location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ |
~*
表示不区分大小写的匹配 valid_referers none blocked server_names
定义白名单的referer none blocked
表示空referer server_names
可以忽略不写 invalid_referer
表示非白名单
Nginx的正则表达式匹配 https://blog.csdn.net/a519640026/article/details/9138487
2.检查语法并加载配置文件
1 | [root@localhost vhost]# /usr/local/nginx/sbin/nginx -t |
测试
1 | [root@localhost ~]# curl -e "http://www.baidu.com" -x 192.168.80.102:80 test2.com/1.png -I |
-e
指定referer
这里referer不是test2.com的都会禁止访问png
12.14 Nginx访问控制
为了让公司内部的IP访问指定的目录,其他IP都拒绝掉
步骤
1.配置文件
1 | location ~ /admin/ |
Nginx的访问控制和Apache的不同 他的顺序是从上至下匹配,只要匹配到要求就会停止匹配。127.0.0.1匹配到到allow后就会停止匹配
2.检查语法并加载配置文件
1 | [root@localhost vhost]# /usr/local/nginx/sbin/nginx -t |
测试
1 | [root@localhost ~]# mkdir /var/www/test2/admin/ |
1 | [root@localhost ~]# curl -x 127.0.0.1:80 test2.com/admin/1.php -I |
我们新建一块网卡并动态配置IP给他在访问admin目录1
2
3
4
5
6
7
8ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.218.128 netmask 255.255.255.0 broadcast 192.168.218.255
inet6 fe80::1e59:e2e4:8f43:12e8 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:06:17:15 txqueuelen 1000 (Ethernet)
RX packets 3 bytes 746 (746.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10 bytes 1308 (1.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
1 | [root@localhost ~]# curl -x 192.168.218.128:80 test2.com/admin/1.php -I |
可以发现网卡ens37的IP被拒绝访问admin目录
对文件或者链接进行访问控制
步骤
1.配置文件
1 | location ~ .*(upload|image)/.*\.php$ |
(upload|image)/
表示uplocad或者image目录 这里就是禁止访问该目录下的php文件,以达到禁止解析PHP的目的
2.检查语法并加载配置文件
1 | [root@localhost vhost]# /usr/local/nginx/sbin/nginx -t |
测试
1 | [root@localhost ~]# mkdir /var/www/test2/upload/ /var/www/test2/image |
1 | [root@localhost ~]# curl -x 192.168.218.128:80 test2.com/admin/1.php -I |
新网卡IP192.168.218.128访问image目录下的php文件被拒绝了
对user_agent进行访问控制
步骤
1.配置文件
1 | location ~ / |
return 403
和deny all
效果一样 if和()之间有空格 否则报错 这里是禁止Chrome浏览器访问
2.检查语法并加载配置文件
1 | [root@localhost vhost]# /usr/local/nginx/sbin/nginx -t |
测试
使用ie浏览器访问test2
使用Chrome访问test2
12.15 Nginx解析php相关配置
步骤
1.配置文件
1 | location ~ \.php$ |
fastcgi_pass
必须和php-fpm.conf
的监听方式一致,否则报错502 fastcgi_pass 127.0.0.1:9000;
使用ip端口方式监听 fastcgi_param SCRIPT_FILENAME
中的路径要和root
的路径一致
2.检查语法并加载配置文件
1 | [root@localhost vhost]# /usr/local/nginx/sbin/nginx -t |
测试
1 | [root@localhost ~]# vim /var/www/test2/test.php |
成功解析PHP
注意事项:出现502页面
1 | [root@localhost ~]# curl -x 127.0.0.1:80 test2.com/test.php -I |
1.fastcgi_pass中sock写错
1 | fastcgi_pass unix:/tmp/php-fcgi1.sock; |
这里/tmp/php-fcgi1.sock
是没有的1
2[root@localhost ~]# tail /usr/local/nginx/logs/nginx_error.log
2018/06/09 14:36:04 [crit] 1705#0: *40 connect() to unix:/tmp/php-fcgi1.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: test2.com, request: "HEAD HTTP://test2.com/test.php HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-fcgi1.sock:", host: "test2.com"
日志显示找到该sock
2.fastcgi_pass中的监听方式和php-fpm.conf中的监听方式不一致
1 | [global] |
这里php-fpm.conf
监听方式是IP+端口
/usr/local/php-fpm/sbin/php-fpm -t
检查语句service php-fpm restart
重启php-fpm服务
1 | 2018/06/09 14:52:48 [crit] 1768#0: *44 connect() to unix:/tmp/php-fcgi.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: test2.com, request: "HEAD HTTP://test2.com/test.php HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-fcgi.sock:", host: "test2.com" |
日志显示没找到该sock
3./tmp/php-fcgi.sock的权限不够
由于Nginx的用户是nobody 而php-fcgi.sock的用户是root 因此要想Nginx和php-fcgi.sock通讯,就必须要让php-fcgi.sock的其他用户拥有6的权限
1 | [global] |
这里把sock的权限给注释了1
2018/06/09 15:08:18 [crit] 1963#0: *54 connect() to unix:/tmp/php-fcgi.sock failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: test2.com, request: "HEAD HTTP://test2.com/test.php HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-fcgi.sock:", host: "test2.com"
日志显示sock的权限不够 禁止访问
12.16 Nginx代理
Nginx可以做代理服务器。代理服务器可以让外网的用户访问到处在内网中的服务器,也可以通过代理服务器来加快访问速度。
步骤
1.配置文件
1 | [root@localhost ~]# vim /usr/local/nginx/conf/vhost/proxy.conf |
新建个proxy.conf的配置文件1
2
3
4
5
6
7
8
9
10
11
12
13server
{
listen 80;
server_name ask.apelearn.com;
location /
{
proxy_pass http://223.94.95.10/;
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
指要访问的web服务器的域名 proxy_pass
指要访问的web服务器的IP地址 proxy_set_header Host
代理头的主机名,指server_name
2.检查语法并加载配置文件
1 | [root@localhost vhost]# /usr/local/nginx/sbin/nginx -t |
测试
使用本地IP来访问ask.apelearn.com 说明代理成功1
2
3
4
5
6
7
8
9
10
11
12
13[root@localhost ~]# curl -x 127.0.0.1:80 ask.apelearn.com -I
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Sat, 09 Jun 2018 07:43:12 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.3.3
P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Set-Cookie: ape__Session=5dj4jumegivdbfk609hbfedka7; path=/; domain=.apelearn.com
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
myheader: web1