1. 程式人生 > >Nginx防盜鏈、Nginx訪問控制、Nginx解析php相關配置、Nginx代理

Nginx防盜鏈、Nginx訪問控制、Nginx解析php相關配置、Nginx代理

nginx

Nginx防盜鏈首先進入到/usr/local/nginx/conf/vhost/目錄下,編輯配置文件 vim test.com.confvim test.com.conf然後如數如下內容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 none blocked server_names *.test.com ; if ($invalid_referer) { return 403;這時防盜鏈的核心部分,第一行的意義為定義白名單,第二行是如果不匹配,第三行是狀態碼。輸入完後保存,檢查語法,重新加載。 Nginx訪問控制 和httpd一樣,Nginx也需要限制某些IP不能訪問或者只允許某些IP訪問,配制方法和httpd很像。但更加簡潔了。不需要像httpd全部都歷一遍。
配置訪問控制還是要編輯虛擬主機的配置文件
/usr/local/nginx/conf/vhost/
然後再最後面加上訪問控制的配置
location /admin/
{
allow 192.168.1.107;
allow 127.0.0.1;
deny all;
}
我們做白名單是時候一定要先allow後deny。allow是允許的意思,deny是拒絕的意思。在每個語句結束的時候一定要用“;”結束。
然後我們做一個實驗,創建一個目錄mkdir /data/wwwroot/test.com/admin/
然後在裏面寫入內容
echo “test,test”>/data/wwwroot/test.com/admin/1.html
然後我們做測試
curl -x 127.0.0.1:80 -I test.com/admin/1.html
HTTP/1.1 200 OK
curl -x 192.168.1.107:80 -I test.com/admin/1.html
HTTP/1.1 200 OK
而輸入其他的IP訪問就不成功了,這就是限制ip訪問。這是針對目錄的。

我們還可以按照正則去限制它的訪問
location ~ .(upload|image)/..php$
{
deny all;
}
小括號中的分隔符“|”是或者的意思,這樣就可以將訪問的URL中帶有關鍵字的字符串,並且是php的請求禁止訪問。這樣做的目的是將上傳文件的目錄禁止解析php,目的是保證安全。
然後我們做一個實驗。
首先創建一個upload目錄,在裏面寫一個php的文件,然後訪問

curl -x192.168.1.107:80 -I test.com/upload/1.php
HTTP/1.1 403 Forbidden
結果是無法訪問,我們的目的也達成了。

如果我們不想讓別人知道我們的網站,就可以根據user_agent限制,就像我們的網站被隱藏了一樣。
if ($http_user_agent ~ ‘Spider/3.0|YoudaoBot|Tomato‘)
{
return 403;
}
其中~後面的“
”是忽略大小寫。

Nginx解析php相關配置
在lamp中,php是作為httpd的一個模塊出現,只要模塊被加載,就可以解析php腳本了。而在lnmp中,php是作為一個服務(php-fpm)的形式存在的,首先要啟動php-fpm服務,然後Nginx再和php通信,也就是說處理php腳本解析的工作是由php-fpm來完成。
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;
}
這個就是Nginx解析php的配置文件。
這裏我們需要註意的是 fastcgi_pass unix:/tmp/php-fcgi.sock;容易寫錯,如果寫錯,就會顯示502。
我們組一個實驗,故意將/tmp/php-fcgi.sock寫錯,然後訪問。
curl -x192.168.1.107:80 test.com/3.php
<html>
<head><title>502 Bad Gateway</title></head>
由於我們寫錯了配置文件,所以顯示了502,然後我們查看一下錯誤日誌nginx_error.log
2018/04/26 23:22:39 [crit] 2076#0: *49 connect() to unix:/tmp/php-fgi.sock failed (2: No such file or directory) while connecting to upstream, client: 192.168.1.107, server: test.com, request: "GET HTTP://test.com/3.php HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-fgi.sock:", host: "test.com"
它的意思是 到unix:/tmp/php-fgi.sock失敗(2:沒有這樣的文件或目錄)。
當我們遇到這樣的問題時我們就要仔細思考一下是不是我們配置的地址不對呢?首先我們先看一下錯誤日誌,首先看文件存不存在。如果不存在,我們就要去查看php-fpm的配置文件,看看我們定義的sock是什麽。我們必須保持php-fpm中的sock與虛擬主機的配置文件中的sock一致。否則就會報錯502.

如果php-fpm監聽的是一個端口,比如127.0.0.1:9000,那麽我們也需要在虛擬主機的配置文件中做一個更改。
首先找到fastcgi_pass,然後將它改成監聽端口的形式。比如fastcgi_pass 127.0.0.1:9000;然後檢查語法是否錯誤,然後重新載入。經過這一系列的操作後,我們就有可以解析php了。所以,虛擬主機中的fastcgi_pass一定要和php-fpm中監聽的IP一致,否則就會報502。
在以後如果我們出現解析php出現502的時候一定要檢查php-fpm中配置監聽ip和sock是否一致,如果不一致就會報502。
還有就是SCRIPT_FILENAME後面跟的路徑一定要寫對,他是與配置文件上面的root後面跟的路徑是一致的,他們一定要對應起來。如果配置不對,在訪問的時候會報404。
還有一種情況報502是因為我們的的php-fpm配置文件中有一行listen.mode=666這行配置被註銷或者沒有了,這樣配置是讓所有 的用戶都可以執行這個文件,如果沒有這行配置,則只能root用戶可以執行權限。

Nginx代理
當用戶不能直接訪問服務器,那麽我們就可以做一個代理服務器。
首先進入/usr/local/nginx/cnof/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 是定義你要訪問的web服務器的IP
server_name是定義域名
然後我們檢查語法重新加載。
如果我們在做代理的時候不知道要訪問的web服務器的ip時,我們可以用dig +域名的方法獲取ip。
安裝 dig 命令: yum install -y bind*

Nginx防盜鏈、Nginx訪問控制、Nginx解析php相關配置、Nginx代理