1. 程式人生 > >nginx防盜鏈和代理配置

nginx防盜鏈和代理配置

png 查看 代理 index.php 主機配置 源碼 信息 css 根路徑

nginx防盜鏈

防盜鏈的意義在於防止網站中的文件鏈接在其他網站中被使用,盜鏈的文件或圖片在其他網站中加載,在這個過程中,實質上加載的請求是被盜鏈服務器上響應的,這就造成了一些不正常流量(並非自己網站的正常打開頁面加載的處理請求)造成了消耗不必要的帶寬
要實現防盜鏈,需要了解HTTP協議中的請求頭部的Referer頭域和采用URL的格式表示訪問當前網頁或者文件的源地址。通過該頭域的值,我們可以檢測到訪問目標資源的源地址。這樣,如果我們檢測到Referer(rui‘fe~)頭域中的值並不是自己站點內的URL,就采取組織措施,實現防盜鏈

nginx防盜鏈使用到了valid_referers這個名單定義項(相當是定義白名單域名,如需定義多個域名使用空格分隔,非這裏定義的域名會在轉跳中返回403狀態碼),if中定義:非名單裏裏的域名可以定義返回403狀態拒絕訪問或返回一個盜鏈顯示圖片,如果使用盜鏈顯示圖片就定義rewrite跳轉到那個圖片的URL

location中定義防止盜鏈的文件類型,以正則的語法進行匹配
expires、access_log定義了這些文件過期時間和日誌不記錄類型的配置,防盜鏈與靜態文件過期時間和訪問日誌不記錄可以在一個location中定義配置
rewrite設定指定轉跳,設定指定轉跳的URL地址,返回狀態碼302
return跟rewrite類似,只不過在最後處理請求時是直接拒絕掉這個盜鏈的請求,返回狀態碼403

註意配置中的空格分隔,配置完成後使用-t檢查,nginx防盜鏈配置項如下:

location ~* ^.*\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$
 ? ? {
 ? ? ? ?  expires 7d;
 ? ? ? ?  valid_referers none blocked server_name .*.aaa.com bbb.com;
 ? ? ? ? ?if ($invalid_referer) {
 ? ? ? ? ? ? ? ? ? ?  rewrite ^/ http://aaa.com/bmiddle/403.jpg;
 ? ? ? ? ? ? ? ? ? ? # return 403;
 ? ? ? ? ? ? ? ? ? ? ? ? }
 ? ? ? ?  access_log off;
 ? ? }
-------------檢查配置並reload重新加載配置
[root@localhost bmiddle]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost bmiddle]# /usr/local/nginx/sbin/nginx -s reload

在瀏覽器中訪問防盜鏈資源(在windows的hosts文件中添加一個虛擬機的解析),在公網博客寫入本站的圖片URL地址,在博客中點擊該地址會被轉跳至顯示指定的圖片,轉跳狀態碼為302,拒絕訪問的狀態碼則是403,第一條為虛擬機本站圖片的URL,第二條為公網博客的來源地址

技術分享圖片

nginx訪問控制

根據需求限制某些ip或者某些類型的文件不能訪問或禁止解析,多個訪問控制可以同時配置,防止解析某些可執行惡意的代碼文和上傳惡意的文件類型
配置指定字符的訪問控制,在location 後定義匹配限制的字符,如果匹配到有這個字符的URL請求,會執行匹配規則,這裏配置的是先允許指定的ip訪問後,再拒絕所有的訪問請求,只允許指定的ip訪問指定的內容(如名稱是admin的管理目錄)

註意配置中的空格分隔,配置完成後使用-t檢查

location /admin.*/
 ? ? {
 ? ?  allow 127.0.0.1;
 ? ?  allow 192.168.1.112;
 ? ?  deny all;
 ? ? }
? ? ?

測試訪問控制,查看日誌記錄信息,可以從日誌中看到,允許了配置中的回環地址和192.168.1.112的windown本機的訪問,拒絕了服務器本機通過自身的網卡ip訪問,實現了ip反饋控制的需求

[root@localhost admin]# echo "123">1.html
[root@localhost admin]# curl -x127.0.0.1:80 -I aaa.com/admin/1.html
HTTP/1.1 200 OK
Server: nginx/1.15.2
Date: Tue, 14 Aug 2018 14:57:55 GMT
Content-Type: text/html
Content-Length: 4
Last-Modified: Tue, 14 Aug 2018 14:57:35 GMT
Connection: keep-alive
ETag: "5b72eddf-4"
Accept-Ranges: bytes

[root@localhost admin]# curl -x192.168.1.234:80 -I aaa.com/admin/1.html
HTTP/1.1 403 Forbidden
Server: nginx/1.15.2
Date: Tue, 14 Aug 2018 14:58:05 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
[root@localhost admin]# cat /data/wwwroot/log/aaa.com.log
192.168.1.112 - [14/Aug/2018:22:57:41 +0800] aaa.com "/admin/1.html" 200 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
127.0.0.1 - [14/Aug/2018:22:57:55 +0800] aaa.com "/admin/1.html" 200 "-" "curl/7.29.0"
192.168.1.234 - [14/Aug/2018:22:58:05 +0800] aaa.com "/admin/1.html" 403 "-" "curl/7.29.0"

限制某些頁面元素的訪問控制,通過正則匹配實現,這裏匹配以admin和abc開頭、php結尾的文件URL訪問,並把這些請求deny拒絕掉
註意配置中的空格分隔,配置完成後使用-t檢查
配置如下

location ~.*(admin|abc)/.*\.php$
 ? ? {
 ? ? allow 127.0.0.1;
 ? ? deny all;
 ? ? }
[root@localhost admin]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost admin]# /usr/local/nginx/sbin/nginx -s reload

測試訪問控制,允許回環地址訪問,拒絕通過服務器本機網卡ip進行訪問,拒絕windown客戶端訪問,並查看訪問日誌記錄的信息

[root@localhost admin]# curl -x127.0.0.1:80 -I aaa.com/admin/admin.php
HTTP/1.1 200 OK
Server: nginx/1.15.2
Date: Tue, 14 Aug 2018 15:11:19 GMT
Content-Type: application/octet-stream
Content-Length: 8
Last-Modified: Tue, 14 Aug 2018 15:07:24 GMT
Connection: keep-alive
ETag: "5b72f02c-8"
Accept-Ranges: bytes

[root@localhost admin]# curl -x192.168.1.234:80 -I aaa.com/admin/admin.php
HTTP/1.1 403 Forbidden
Server: nginx/1.15.2
Date: Tue, 14 Aug 2018 15:11:31 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive

技術分享圖片
訪問日誌記錄了允許127.0.0.1訪問狀態碼200,拒絕192.168.1.234和192.168.1.112訪問並返回狀態碼403

[root@localhost admin]# cat /data/wwwroot/log/aaa.com.log
127.0.0.1 - [14/Aug/2018:23:11:19 +0800] aaa.com "/admin/admin.php" 200 "-" "curl/7.29.0"
192.168.1.234 - [14/Aug/2018:23:11:31 +0800] aaa.com "/admin/admin.php" 403 "-" "curl/7.29.0"
192.168.1.112 - [14/Aug/2018:23:11:47 +0800] aaa.com "/admin/admin.php" 403 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"

限制指定的user_agent的訪問類型,用http_user_agent定義user_agent名單,然後使用return指定返回請求處理的狀態碼

if ($http_user_agent ~ ‘Spider/3.0|YoudaoBot|Tomato‘)
 ? ? {
 ? ?  return 403;
 ? ? }
[root@localhost admin]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost admin]# /usr/local/nginx/sbin/nginx -s reload
測試限制user_agent訪問
[root@localhost admin]# curl -A "Tomatoaaaadgd" -x127.0.0.1:80 aaa.com/girl.png -I
HTTP/1.1 403 Forbidden
Server: nginx/1.15.2
Date: Tue, 14 Aug 2018 15:27:09 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive

正常訪問,使用127.0.0.1地址訪問

HTTP/1.1 200 OK
Server: nginx/1.15.2
Date: Tue, 14 Aug 2018 15:27:17 GMT
Content-Type: image/png
Content-Length: 4666274
Last-Modified: Tue, 31 Jul 2018 08:55:41 GMT
Connection: keep-alive
ETag: "5b60240d-4733a2"
Expires: Tue, 21 Aug 2018 15:27:17 GMT
Cache-Control: max-age=604800
Accept-Ranges: bytes

nginx解析php相關配置

nginx中需要配置php-fpm解析才能正常解析php的代碼頁面,在未解析php的源碼時會直接顯示該頁面的代碼,配置解析後會執行php代碼,顯示出php頁面
配置和php-fpm的通信方式有ip和sock文件兩種模式,ip模式可以 提供ip方式的訪問,sock只能在本機訪問,sock適合nginx和php都在一臺服務器上使用的場景
註意配置中fastcgi_param中定義的路徑為網站根目錄的路徑,與server下的root根路徑一直,否則會造成訪問404狀態
虛擬主機配置文件中的配置如下:? ??

location ~ \.php$
 ? ? {
 ? ? include fastcgi_params;
 ? ? fastcgi_pass unix:/tmp/php-fcgi.sock;
 ? ? fastcgi_index index.php;
 ? ? fastcgi_param SCRIPT_FILENAME /data/wwwroot/aaa$fastcgi_script_name;
 ? ? }
[root@localhost nginx]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost nginx]# /usr/local/nginx/sbin/nginx -s reload

出現502錯誤:極大可能是nginx配置和php-fpm通信的方式配置問題,如php中定義的通信方式是127.0.0.1:9000,而nginx中定義的是php-fpm.sock,這樣就造成了訪問時nginx不能和php-fpm通信,調用不了php解析,就會報錯502問題
sock文件權限,如果sock文件權限只有root用戶可讀,那樣也會造成訪問502問題,還有就是sock文件是否正常,是否有sock的通信文件
資源耗盡,如果通過調用php出現慢解析,會造成大量的等待響應的處理請求,這樣會造成php進程的擁堵,就好像高速路大量的車輛通過的場景,這樣的問題先從mysql語句是否有慢處理排查,其次配置php更多處理的進程,或者提供更多的php-fpm服務來處理請求

測試nginx調用php解析

nginx未調用php解析時訪問php測試頁面

[root@localhost nginx]# curl -x127.0.0.1:80 aaa.com
<?php
phpinfo();

修改php-fpm提供解析的方式,和修改nginx調用php的方式,再次訪問php測試頁,會返回php的解析頁代碼

[root@localhost nginx]# curl -x127.0.0.1:80 aaa.com
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<style type="text/css">
body {background-color: #fff; color: #222; font-family: sans-serif;}
pre {margin: 0; font-family: monospace;}

nginx代理

nginx代理應用的場景:
客戶端不能通過本機訪問一個範圍之外的一臺服務器,而在這個範圍的邊界有一臺服務器,它可以訪問到這臺範圍之外的服務,實現的是客戶端通過這個邊界上的服務器去訪問範圍外的那臺服務器上的內容

技術分享圖片

代理模塊的配置如下

server
{

 ? listen 80;
 ? server_name google.com;
 ? ? ? 
 ? ? ? location /
 ? ? ? {
 ? ? ? ?  proxy_pass http://185.53.178.7/;
 ? ? ? ?  proxy_set_header Host $host;
 ? ? ? ?  proxy_set_header X-Real-IP $remote_addr;
 ? ? ? ?  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 ? ? ? }

}

nginx防盜鏈和代理配置