Linux學習總結(四十二)lnmp訪問控制篇
防盜鏈的原理我們在lamp中已經有介紹,這裏不再重復,直接看配置過程。
核心語句為
valid_referers none blocked server_names *.test.com ;
if ($invalid_referer) {
return 403;
}
當然我們要將其放在location裏面,結合之前的緩存有效期配置,就形成如下結構
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 7d; //針對上面匹配的文件,設置緩存時間為7天 valid_referers none blocked server_names *.test.com ; //指定有效的referer if ($invalid_referer) { return 403; // 如果是無效的referer,則禁止訪問,返回403 } access_log off; //針對以上location匹配的文件不記錄訪問日誌 }
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -x127.0.0.1:80 -I -e "http://www.baidu.com/1.txt" test.com/2.jpg
curl -x127.0.0.1:80 -I -e "http://test.com/1.txt" test.com/2.jpg
2 訪問控制
需求一,針對admin目錄做一個訪問限制,只允許本機127.0.0.1訪問,拒絕其他所有ip。配置如下
location /admin/
{ allow 127.0.0.1;
deny all;
}
我們先來看下他的邏輯,在apache中,有一個 order ,會定義deny和allow的一個先後執行順序,而且每條規則都會去匹配。比如針對當前這個需求配置時這樣的
<Directory /data/wwwroot/www.123.com/admin/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
若果將上面改為Order allow,deny 則會deny 所有,allow 語句失效。在nginx 裏面從上往下只要匹配到規則就結束。第一條規則匹配到就不會去匹配第二條規則。
curl -x127.0.0.1:80 test.com/admin/index.html curl -x192.168.226.130:80 test.com/admin/index.html
其中 192.168.226.130 是本機ens33 網卡ip
如果只限制個別ip 訪問則可以寫成
location /admin/
{
deny 192.168.226.130;
}
默認是允許所有的。不需要寫allow all 了
也可以匹配正則限制
location ~ .*(upload|image)/.*\.php$
{
deny all;
}
這樣就拒絕請求了upload或者image目錄下的php文件
備註:該段配置要加在解析php的配置前面,否則不能限制解析php
限制指定use_agent的域名訪問,匹配符~後面的*可以忽略大小寫匹配
if ($http_user_agent ~* ‘Spider/3.0|YoudaoBot|Tomato‘)
{
return 403;
}
curl -x127.0.0.1:80 test.com -A "spider/3.0"
意思是限制一些爬蟲,或者有道機器人,或者tomato相關的訪問。就是可以有針對性的限制某些訪問。
3 解析php 配置
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;
}
fastcgi_pass unix:/tmp/php-fcgi.sock; 該行指定監聽php-fpm的socket,可以是ip加端口的形式,寫法要和php-fpm配置文件保持一致。對應行為 listen = /tmp/php-fcgi.sock。配置文件為 /usr/local/php-fpm/etc/php-fpm.conf,我們安裝php時有指定配置文件路徑。
fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;該行中的
/data/wwwroot/test.com 要跟虛擬主機保持一致vim /data/wwwroot/test.com/2.php
寫入一下內容
<?php
echo "a really php script";
?>
執行-s reload 後curl 測試
curl -x127.0.0.1:80 test.com/2.php
4 nginx 代理
代理服務器:
通常說的代理就是正向代理,正向代理的過程隱藏了真實的客戶端,服務端不知道真實的客戶端是誰,×××服務器,就是正向代理。反向代理代理的是服務端,隱藏了真實的服務端。
正向代理中,proxy和client同屬一個LAN
反向代理中,proxy和server同屬一個LAN
編輯一個新的虛擬主機
vim /usr/local/nginx/conf/vhost/proxy.conf
server
{
listen 80;
server_name proxybaidu.com; //本地代理服務器器域名
location /
{
proxy_pass http://61.135.169.125/; //被代理的服務器ip
proxy_set_header Host www.baidu.com; //指定被代理的服務器域名
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
crul -x127.0.0.1:80 proxybaidu.com
我們發現通過本地內網訪問到了百度首頁。為了理解代理,特意將代理服務器域名重命名了下,通常代理服務器域名會寫的和提供網站資源的服務器域名一樣,這樣對於客戶端來說就不會去區分,省去很多麻煩。百度這個ip 我們通過ping www.baidu.com 來獲取。
總結:上面實驗就是一個反向代理。怎麽理解反響代理隱藏服務端,代理服務器和真實服務端處於同一子網呢?該實驗我將proxybaidu.com更改為baidu.com,然後在windos 主機上設置本地dns ,再去訪問百度,完全看不出來是從我的虛擬機web中取的數據,因此隱藏了服務端。那麽為什麽說我的虛擬機web 和百度處於同一子網呢,回答這個問題之前,我先說下很關鍵的一點,就是我們所說的服務器和客戶端,局域網和公網,或者同一子網都是相對意義上的概念,單獨討論沒有意義。-x127.0.0.1:80 就是指定本地私網,對於該回環地址來說,因為我們的虛擬機 nat 到了主機所處的公網裏,所以從整體上看來我們的虛擬機web 和百度是處於同一子網的。
Linux學習總結(四十二)lnmp訪問控制篇