Nginx常用功能详解
一、NGINX目录保护及访问限制
Nginx保护目录的配置如下,目录密码保护文件是/usr/local/nginx/htpasswd
location~/admin{ #admin为要保护的目录名称,location的意思就是保护从网页根目录算起的admin目录 auth_basic”PLEASELOGIN”;#就是进入资料夹时会显示的信息 auth_basic_user_file/usr/local/nginx/htpasswd;#验证用户及密码文件,我这边设定是放在/usr/local/nginx/htpasswd }
location~\.php${ fastcgi_pass127.0.0.1:9000; fastcgi_indexindex.php; fastcgi_paramSCRIPT_FILENAME/var/www/bbs$fastcgi_script_name; includefastcgi_params; }
注意,设置目录密码保护时,请注意配置区块的位置,如果放在location~\.php${}区块后面,如果打开的是静态页面或图片等非php文件,会提示要输入密码,但是,如果打开的是php文件,则设置无效,会直接执行php文件并显示。因此,一定要注意把要设置目录密码保护的区块放在location~\.php${}区块之前。
生成密码文件:
htpasswd-b-c/usr/locla/nginx/htpasswdusernamepassword;
二、NGINX防盗链
另外NGiNX防盗链,防止别人偷图(视频、flash、软件…)当然也是OK滴! 一样也是在server的区段加上
location~*\.(txt|ico|gif|png|bmp|jpg|jpeg|zip|rar|gz|7z|exe|mp3|flv|swf)${ valid_referersnoneblockedjb51.netwww.nhooo.com; if($invalid_referer){ rewrite^/https://www.nhooo.com/notlink.html; } }
这时候location的意思就是保护从网页根目录算起,所有的指定类型的文件都依照此规则
valid_referersnoneblocked的意思就是不阻挡从哪些地方来的囉~这边以空格来分隔允许的域名或ip位置
$invalid_referer的意思就是不允许连结
rewrite^/https://www.nhooo.com/notlink.html;的意思就是指定不允许的连结自动转向到一个页面,或是已经有设定404转址的也可以先注解掉这行再把#return404的注解拿掉,就会自动跑到你设定的404页面了。
特别提醒:如何来看防盗链是否是生效的,建议大家直接看服务日志,不要拿个网站来测试。因为有些不要脸的家伙(比如某度),他会用自己的图片服务器来提供服务。就是因为这个原因,上一次我在做这个的时候,浪费了很多时间。
三、NGINX下载限速
NGiNX还能限速再限制下载线程! 先在http区段找到limit_zone,再把注释拿掉~
#设定一个叫做crawler的区域,大小为20MB
limit_zonecrawler$binary_remote_addr20m;
然后在server的区段加上
#限制档案类型只能单线下载
location~.*\.(zip|rar|gz|tar|exe|mp3|flv|swf|jpg|jpeg)$ { limit_conncrawler1; limit_rate500k;#再加上限速 } #限制特定资料夹底下只能单线下载 #location/download/{ #limit_conncrawler1; #limit_rate500k;#再加上限速 #}
四、NGINX多域名设置
今天在配置PHP+Nginx时出现一个严重的问题,在Nginx虚拟主机上绑定了泛域名,在程序中需要用二级域名指向不同的内容,但无论如何访问都只跳转到主域名上!为了找到问题,一个一个试验,得出如下结论:不管绑定多少域名,用$_SERVER["SERVER_NAME"]只会返回虚拟主机中绑定的第一个域名!
比如绑定域名如下:
server_name www.nhooo.com*.jb51.netjb51.net
现在我不管用什么域名访问,$_SERVER["SERVER_NAME"]都只会返回www.nhooo.com!!这是个很严重的问题,对泛域名造成了致命的影响!
既然有问题,就肯定有解决方案。。在wiki主翻了N久,终于找到了需要的资料!原来:$_SERVER["SERVER_NAME"]返回的值是由Nginx的fastcgi_param中SERVER_NAME提供的,而默认的配置为:
fastcgi_param SERVER_NAME $server_name;
Nginx中$server_name变量就是上面设置的域名,只会返回第一个!
这下好办了,把上面的配置改成:
fastcgi_param SERVER_NAME $host;
就行了。
另外还需要在server_name配置后面加一行:
server_name_in_redirectoff;
意思是让nginx在处理自己内部重定向时不默认使用 server_name设置中的第一个域名!