1. 程式人生 > >lnmp(四)——nginx防盜鏈、訪問控制、解析php、代理服務

lnmp(四)——nginx防盜鏈、訪問控制、解析php、代理服務

12.13 Nginx防盜鏈
12.14 Nginx訪問控制
12.15 Nginx解析php相關配置
12.16 Nginx代理

12.13 Nginx防盜鏈

配置如下,可以和靜態檔案不記錄日誌的配置結合起來:

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白名單為一級域名test.com,下面是條件判斷,如果訪問域名不為白名單,則返回403狀態。

12.14 Nginx訪問控制

需求:訪問/admin/目錄的請求,只允許某幾個IP訪問,配置如下:

location /admin/
{
   allow 192.168.133.1;
   allow 127.0.0.1;
   deny all;
}
mkdir /data/wwwroot/test.com/admin/
echo “test,test”>/data/wwwroot/test.com/admin/1.html
-t && -s reload
curl -x127.0.0.1:80 test.com/admin/1.html -I
curl -x192.168.133.130:80 test.com/admin/1.html -

和apache不一樣,nginx對allow、deny語句匹配就執行,即找到第一個匹配的條件就不再判斷後面對語句。

可以匹配正則

location ~ .*(abc|image)/.*\.php$
{
       deny all;
}

上面例子deny了abc或amage目錄下對php檔案。打到了apache禁止某目錄解析php的效果。

根據user_agent限制

if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato')
{
     return 403;
}

deny all和return 403效果一樣。

12.15 Nginx解析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 用來指定php-fpm監聽的地址或者socket。如果不一致或者寫錯,就會返回502狀態碼。配置一致指的是和php-fpm的配置檔案中規定對監聽途徑一致。還有一種可能導致502,就是資源耗盡,比如mysql讀取很慢nginx卡死。這需要優化架構、提升硬體等措施。

此外,在php5.4以後對版本,如果監聽socket,需要在php-fpm配置檔案中寫上“listen.mode=666”。否則/tmp/php-fcgi.sock預設許可權為440,屬主、屬組都是root,所以訪問時會被許可權拒絕。

12.16 Nginx代理

web伺服器只有私網,使用者不在私網內,這時可以通過nginx代理訪問web伺服器。也就是說nginx代理連線公網和私網,公網的使用者可以通過nginx訪問私網內的伺服器。代理伺服器幫助使用者訪問目標,然後返回請求對資料。主要應用在不能訪問或者訪問速度不佳的情況。

cd /usr/local/nginx/conf/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是要訪問的地址。proxy_set_header表示訪問的域名與上面定義對server_name一致。