1. 程式人生 > >nginx防盜鏈,訪問控制,解析PHP配置,代理

nginx防盜鏈,訪問控制,解析PHP配置,代理

nginx防盜鏈 訪問控制 解析PHP配置代理

配置防盜鏈
技術分享圖片
編輯配置文件
技術分享圖片
valid_referers 定義一個白名單 如果不匹配403
技術分享圖片
return 403也可以定義deny all 拒絕
nginx 訪問控制
技術分享圖片
編輯配置文件 只要匹配到就不繼續匹配
location 定義目錄
allow 允許
deny all
技術分享圖片
測試是否鏈接正常
技術分享圖片
沒有被允許 128
技術分享圖片
匹配正則
編輯配置文件 匹配upload|image
技術分享圖片
測試訪問PHP
技術分享圖片
訪問沒有限制的1.txt 是可以的
技術分享圖片
根據user_agent訪問
技術分享圖片
編輯配置文件
技術分享圖片
測試訪問 以user_agent
技術分享圖片
如果想區分大小寫 匹配後面加個* 號
技術分享圖片
再次測試
技術分享圖片
Nginx 解析相關配置
技術分享圖片
在配置文件中加入 不加載 訪問的話不能解析
技術分享圖片
加載配置文件之後
技術分享圖片
sock 文件路徑不對報錯502
加載之後重新訪問502
技術分享圖片
查看錯誤日誌
技術分享圖片
錯誤信息如下
技術分享圖片
訪問不到sock 文件 文件不存在
技術分享圖片
查看php-fpm.conf 文件定義的文件路徑
技術分享圖片
修改PHP文件 監聽IP端口
技術分享圖片
檢測語法是否錯誤
技術分享圖片
查看端口
技術分享圖片
錯誤日誌一樣不存在
技術分享圖片
配置文件 test.conf 也要做相應的更改 fastcgi_pass 換成IP和端口
技術分享圖片
location ~ .php$
{
include fastcgi_params;

include語句會獲取指定文件中存在的所有文本/代碼/標記,並復制到使用 include 語句的文件中。

   fastcgi_pass unix:/tmp/php-fcgi.sock;

fastcgi_pass 127.0.0.1:9000;

指定FastCGI服務器監聽端口與地址,可以是本機或者其它:

   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME /data/wwwroot/zlw.com$fastcgi_script_name;

腳本文件請求的路徑

出現502時 要檢測PHP文件和test.conf 文件是否寫的一致
上面的root 要和SCRIPT_FILENAME 一致
技術分享圖片
加入監聽的sock 不定義mode 這個權限就變成了440
屬主和屬組變成root
技術分享圖片
重新加載
技術分享圖片
查看sock文件權限
技術分享圖片
配置文件test.com.conf unix 去讀sock 文件
技術分享圖片
測試訪問PHP 權限被拒絕
技術分享圖片
以nobody 用戶去讀sock
修改文件屬主可以再次訪問

nginx 代理
技術分享圖片
編寫新的配置文件
技術分享圖片
proxy_pass 真正的web 服務器地址
檢測語法 並重新加載文件
技術分享圖片
測試
技術分享圖片
Nginx代理是在一臺代理服務器中自定義一個域名,該域名指向一個多多個IP,然後將用戶的請求通過這臺代理服務器解析指定的IP所對應的web服務器;當該域名指向多個IP時,需要使用upstream保證用戶可以通過代理服務器正常訪問每個IP,即為負載均衡

常見的502錯誤
1.配置錯誤
因為nginx找不到php-fpm了,所以報錯,一般是fastcgi_pass後面的路徑配置錯誤了,後面可以是socket或者是ip:port

2.資源耗盡
lnmp架構在處理php時,nginx直接調取後端的php-fpm服務,如果nginx的請求量偏高,我們又沒有給php-fpm配置足夠的子進程,那麽php-fpm就會資源耗盡,一旦資源耗盡nginx找不到php-fpm就會出現502錯誤,

解決方案
去調整php-fpm.conf中的pm.max_children數值,使其增加,但是也不能無限增加,畢竟資源有限,一般4G內存機器如果跑php-fpm和nginx,不跑mysql可以設置為150,8G為300以此類推

3.除了上面的兩種錯誤還有其他的原因,很少有,我們可以借助nginx的錯誤日誌來進行排查vim /usr/local/nginx/logs/nginx_error.log 我們也可以給日誌定義級別vim/usr/local/nginx/conf/nginx.conf 找到error_log,默認是crit最嚴謹的就行,也可以改成debug顯示的信息最全面,但是很容易撐爆我們的磁盤。

首先我們需要讓瀏覽器進行訪問
修改nginx的配置文件
[root@wqslinux ~]# vim/usr/local/nginx/conf/vhosts/111.conf

server
{
listen 80;
server_name www.111.com; //域名地址
index index.html index.htm index.php;
root /data/www/;

location ~ .php$ {
include fastcgi_params;
fastcgi_pass unix:/tmp/www.sock; //修改sock
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;
}

}

檢查語法是否正常
[root@wqslinux ~]#/usr/local/nginx/sbin/nginx -t
重新加載配置文件
[root@wqslinux ~]# /usr/local/nginx/sbin/nginx-s reload
[root@wqslinux ~]# /etc/init.d/nginx reload

檢查nginx是那個用戶跑的
[root@wqslinux ~]# ps aux |grep nginx
編輯php-fpm文件
我們要在這個php-fpm文件裏面設置nginx的用戶主,跟組這樣才不會顯示502
[root@wqslinux ~]# vim/usr/local/php/etc/php-fpm.conf

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log =/usr/local/php/var/log/php-fpm.log
[www]
listen = /tmp/www.sock
user = php-fpm
group = php-fpm
listen.owner = nobody //定義屬主
listen.group = nobody //定義屬組
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

配置完之後重啟php-fpm
[root@wqslinux ~]# /etc/init.d/php-fpm restart
ps: 再補充一個,是近期很多同學遇到的問題
這種情況下,使用的是socket,版本高於5.4(含5.4) 默認監聽的socket文件權限是所有者只讀,屬組和其他用戶沒有任何權限。所以,nginx的啟動用戶(咱們配置的是nobody)就沒有辦法去讀這個socket文件,最終導致502,這個問題可以在nginx的錯誤日誌中發現。解決辦法很簡單,上面給出的配置文件中就有避免這個問題的配置。
listen.owner = nobody //定義屬主
listen.group = nobody //定義屬組
這兩個配置就是定義socket的屬主和屬組是誰。除了這個還有一種方法
listen.mode = 777
這樣nobody也可以有讀取權限了。

在nginx配置文件中,location主要有這幾種形式:

  1. 正則匹配 location ~ /abc { }

  2. 不區分大小寫的正則匹配 location ~* /abc { }

  3. 匹配路徑的前綴,如果找到停止搜索 location ^~ /abc { }

  4. 精確匹配 location = /abc { }

5.普通路徑前綴匹配 location /abc { }

先說優先級

4 > 3 > 2 > 1 > 5

再來解釋一下各個格式

location = / {

精確匹配 / ,主機名後面不能帶任何字符串

[ configuration A ]
}

location / {

因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求

但是正則和最長字符串會優先匹配

[ configuration B ]
}

location /documents/ {

匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜索

只有後面的正則表達式沒有匹配到時,這一條才會采用這一條

[ configuration C ]
}

location ~ /documents/Abc {

匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜索

只有後面的正則表達式沒有匹配到時,這一條才會采用這一條

[ configuration CC ]
}

location ^~ /images/ {

匹配任何以 /images/ 開頭的地址,匹配符合以後,停止往下搜索正則,采用這一條。

[ configuration D ]
}

location ~* .(gif|jpg|jpeg)$ {

匹配所有以 gif,jpg或jpeg 結尾的請求

然而,所有請求 /images/ 下的圖片會被 config D 處理,因為 ^~ 到達不了這一條正則

[ configuration E ]
}

location /images/ {

字符匹配到 /images/,繼續往下,會發現 ^~ 存在

[ configuration F ]
}

location /images/abc {

最長字符匹配到 /images/abc,繼續往下,會發現 ^~ 存在

F與G的放置順序是沒有關系的

[ configuration G ]
}

location ~ /images/abc/ {

只有去掉 config D 才有效:先最長匹配 config G 開頭的地址,繼續往下搜索,匹配到這一條正則,采用

[ configuration H ]
}?

再來分析一下A-H配置的執行順序。

  1. 下面2個配置同時存在時

location = / {
[ configuration A ]
}

location / {
[ configuration B ]
}

此時A生效,因為=/優先級高於/

  1. 下面3個配置同時存在時

location /documents/ {
[ configuration C ]
}

location ~ /documents/ {

[configuration CB]

}

location ~ /documents/abc {
[ configuration CC ]
}

當訪問的url為/documents/abc/1.html,此時CC生效,首先CB優先級高於C,而CC更優先於CB

  1. 下面4個配置同時存在時

location ^~ /images/ {
[ configuration D ]
}

location /images/ {
[ configuration F ]
}

location /images/abc {
[ configuration G ]
}

location ~ /images/abc/ {
[ configuration H ]
}?

當訪問的鏈接為/images/abc/123.jpg時,此時D生效。雖然4個規則都能匹配到,但^~優先級是最高的。

若^~不存在時,H優先,因為~/images/ > /images/

而/images/和/images/abc同時存在時,/images/abc優先級更高,因為後者更加精準

  1. 下面兩個配置同時存在時

location ~* .(gif|jpg|jpeg)$ {
[ configuration E ]
}

location ~ /images/abc/ {

[ configuration H ]
}?

當訪問的鏈接為/images/abc/123.jpg時,E生效。因為上面的規則更加精準。

nginx防盜鏈,訪問控制,解析PHP配置,代理