LNMP架構(四)

一 Nginx防盜鏈

一、修改虛擬主機配置文件php

    # vim /usr/local/nginx/conf/vhost/test.com.confmysql

    在配置文件中加入如下內容,這裏的內容是和靜態元素過時時間、不記錄日誌結合起來的:nginx

location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$   //^表示以……開頭,web

{正則表達式

    expires 7d;sql

    valid_referers none blocked server_names  *.test.com ;  //referer白名單apache

    if ($invalid_referer) {    //若是不是白名單中的referer,就返回403vim

        return 403;服務器

    }網絡

    access_log off;

}

二、測試語法錯誤並從新加載配置文件

    # /usr/local/nginx/sbin/nginx -t
    # /usr/local/nginx/sbin/nginx -s reload

三、測試驗證

    當referer是白名單之外的連接時,就會被禁止訪問

    # curl -e "http://www.baidu.com" -x127.0.0.1:80 test.com/1.gif -I

    當referer是白名單上的連接時,就會訪問成功

    # curl -e "http://test.com" -x127.0.0.1:80 test.com/1.gif -I

二 Nginx訪問控制

一、配置IP白名單

    編輯虛擬主機配置文件/usr/local/nginx/conf/vhost/test.com.conf,加入如下內容:

    locaton /admin/         //針對目錄作訪問控制
    {
        allow 192.168.31.157;  //注意配置白名單須要先容許,再deny
        allow 127.0.0.1;
        deny all;

    }
    不一樣於apache中的order ,先拒絕全部訪問,再開啓白名單,而且是順序執行完全部代碼;在nginx中,是沒有order的,執行語句時候,只要匹配到訪問的IP,則不會執行後面的語句,所以須要將allow寫在前面,deny寫在後面

二、檢查語法錯誤並從新加載配置文件

    # /usr/local/nginx/sbin/nginx  -t

    # /usr/local/nginx/sbin/nginx -s reload

三、測試驗證

    # curl -x192.168.31.157:80 -I test.com/admin/1.php

    # curl -x127.0.0.1:80 -I test.com/admin/1.php

    若是來源IP不在白名單內,則會出現403禁止訪問

四、訪問控制-正則匹配

    匹配正則表達式來進行訪問控制容許訪問或者拒絕訪問

    好比能夠在虛擬主機配置文件中加入如下內容,表示禁止上傳文件或圖片解析php

    location ~ .*(upload|image)/.*\.php$     //匹配upload或image目錄下以php結尾的文件
    {
        deny all;   //拒絕訪問
    }

    檢查語法並加載配置文件後,咱們來訪問upload下的php文件test.com/upload/1.php提示禁止訪問

    接下來訪問upload下的txt文件test.com/upload/1.txt則訪問OK

五、根據user_agent限制訪問

    在虛擬主機配置文件中加入如下代碼:

if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato')    //表示匹配到user_agent包含Spider/3.0|YoudaoBot|Tomato中任意一個就拒絕訪問

{      

    return 403;   //deny all和return 403效果同樣

}

    如今來訪問test.com/upload/1.txt  是可以成功訪問的

    接下來模擬用戶代理Tomatodsewre,由於匹配到Tomato,全部服務器拒絕訪問

# curl -A "Tomatodsewre" -x127.0.0.1:80 -I test.com/upload/1.txt

可是下圖中當咱們模擬用戶代理tomatodsewre,首字母由大小變成小寫後,訪問成功了,這說明咱們當前的配置是對大小敏感的

# curl -A "tomatodsewre" -x127.0.0.1:80 -I test.com/upload/1.txt

    此時咱們只須要在匹配符號~後面加上*號便可表示忽略大小寫,以下

    加上*後,咱們再來訪問test.com/upload/1.txt就會提示禁止訪問了

三 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;    

}

    在從新加載配置文件前,咱們先來測試訪問一個頁面3.php,文件內容以下

    下面咱們來訪問這個頁面,訪問結果出現的是3.php文件的內容,並未解析這個php文件

    # curl -x127.0.0.1:80 test.com/3.php

二、檢測語法並從新加載配置文件

    # /usr/local/nginx/sbin/nginx  -t

    # /usr/local/nginx/sbin/nginx -s reload

三、測試驗證

    如今咱們再來訪問3.php這個頁面,文件裏面的php語句被解析

    # curl -x127.0.0.1:80 test.com/3.php

四、502狀態碼

    當配置文件中fastcgi_pass unix:/tmp/php-fcgi.sock;   這一行配置的路徑/tmp/php-fcgi.sock寫錯了,就會出現502錯誤,咱們來將路徑改爲下面的錯誤路徑

    而後來測試訪問# curl -x127.0.0.1:80 test.com/3.php  就出現下面的502

當咱們遇到502錯誤的時候,能夠從幾個方面來分析:

    1)咱們來查看錯誤日誌# tail /usr/local/nginx/logs/nginx_error.log

    提示說沒有/tmp/php-cgi.sock這個目錄或文件,咱們# ls /tmp/php-cgi.sock 發現確實沒有這個文件

    這時候咱們就須要去php-fpm的配置文件中去查看php-fpm監聽的這個socket的路徑跟上面nginx配置文件中的路徑做一個對比,發現nginx配置文件中的路徑寫錯了

    這點總結起來就是:php-fpm配置文件中監聽的socket路徑是什麼,nginx配置文件中的fastcgi_pass路徑就應該寫什麼

    2)實驗:首先php-fpm配置文件配置監聽IP和端口,以下

    而後重啓php-fpm

    # /etc/init.d/php-fpm reload

    此時咱們能夠看到127.0.0.1:9000已經被監聽

    咱們再來訪問# curl -x127.0.0.1:80 test.com/3.php

    再來查看錯誤日誌# tail /usr/local/nginx/logs/nginx_error.log

    出現這個錯誤的緣由是nginx的配置文件尚未修改成IP+端口的形式,須要修改成下圖

    從新加載配置文件後,咱們再來查看訪問結果,結果是成功訪問到了

    總結:這點總結起來就是若是php-fpm配置文件使用的是IP+端口的形式,那麼nginx配置文件中也應該使用一樣的形式

    3)出現502錯誤還應該檢查的一個地方是nginx配置文件下圖中的路徑

    

    應該對應下面這個圖的路徑

    4)在php5.4及之後的版本,有一個特色,就是若是咱們在php-fpm配置文件中監聽的是socket,而又不定義listen.mode的話,那麼/tmp/php-fcgi.sock文件的權限就會變成440

    咱們將配置文件修改成以下形式:

    從新加載配置文件後,再來查看/tmp/php-fcgi.sock的文件權限,能夠看到其權限是440,所屬組和所屬主都是root用戶

    而後將nginx的配置文件配置爲socket,

    再來訪問# curl -x127.0.0.1:80 test.com/3.php 結果仍是502報錯

    咱們經過查看錯誤日誌,能夠看到502錯誤緣由是由於權限被拒絕,

    上面咱們提到/tmp/php-fcgi.sock的文件權限是440,所屬組和所屬主都是root用戶,可是下面這個圖顯示nginx的進程的所屬主和所屬組都是nobody

    咱們來測試下臨時將/tmp/php-fcgi.sock的所屬主和所屬組改成nobody

    # chown nobody /tmp/php-fcgi.sock

    而後再來訪問# curl -x127.0.0.1:80 test.com/3.php,結果訪問成功,這是由於此時nobody用戶有讀寫的權限了

    5)還有一種502錯誤的狀況是php-fpm服務的資源耗盡了,好比有一個mysql查詢卡死了,php-fpm的資源耗盡了,這個時候就須要去優化了

    以上修改過php-fpm的配置文件後須要restart  php-fpm服務

四 Nginx代理

    使用場景:a.用戶不能直接訪問到web服務器的網絡

                     b.用戶雖然能直接訪問web服務器,可是網絡太慢

    代理服務器特色:既能與用戶通訊,又能與web服務器通訊

    這裏咱們嘗試將本身的虛擬服務器配置爲代理服務器,而後使用虛擬服務器內部的迴環IP127.0.0.1來訪問外部的網站www.cxkchina.com/robots.txt,內部的迴環IP127.0.0.1本來是不能訪問外網的

一、切換目錄

        # cd /usr/local/nginx/conf/vhost/

二、新增虛擬主機配置文件

        在新增的虛擬主機配置文件proxy.conf中寫入如下內容:

server

{    

    listen 80;    

    server_name www.cxkchina.com;     //給代理服務器取的域名

//這裏沒有寫root,緣由是由於這個服務器是代理服務器,它不須要訪問本地服務器上的任何文件

    location /    

    {        

        proxy_pass      http://121.201.9.155/;         //此處告訴nginx真正的WEB服務器的IP

        proxy_set_header Host   $host;         //告訴nginx它要訪問的域名Host是上面設置的域名$host,$host也就是server_name

        proxy_set_header X-Real-IP      $remote_addr;      // 定義X-Real-IP這個變量的值是$remote_addr

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    // 定義X-Forwarded-For這個變量的值是$proxy_add_x_forwarded_for

    }

}

二、檢測語法錯誤並從新加載配置文件

    # /usr/local/nginx/sbin/nginx  -t

    # /usr/local/nginx/sbin/nginx -s reload

三、測試驗證

    正常狀況下來訪問www.cxkchina.com/robots.txt這個頁面

使用虛擬服務器內部的迴環IP127.0.0.1來訪問外部的網站www.cxkchina.com/robots.txt

 

相關推薦連接:

502問題彙總 http://ask.apelearn.com/question/9109

location優先級 http://blog.lishiming.net/?p=100

相關文章
相關標籤/搜索