一、修改虛擬主機配置文件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
一、配置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就會提示禁止訪問了
一、 編輯虛擬主機配置文件
在虛擬主機配置文件中加入如下內容:
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服務
使用場景: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