一、对目录和文件设置用户认证
首先需要安装apache,可以使用yum install httpd 安装
生成密码文件,创建用户
htpasswd -c /usr/local/nginx/conf/htpasswd test ## 添加test用户,第一次添加时需要加-c参数,第二次添加时不需要-c参数
对目录进行用户认证:
在nginx的配置文件中添加:
location /test/ { ## 对网站根目录下的test目录做验证 auth_basic "Auth"; ## Auth 可以随便设置,是首次验证会出现的提示 auth_basic_user_file /usr/local/nginx/conf/htpasswd; ## 存放验证用户密码的文件 }
对文件进行用户认证:
在nginx的配置文件中添加:
location ~ .*\admin.(php|html)$ { ## 对网站根目录下名为admin的.php和.html对用户认证,location ~ .*\admin.php$ { 这样就只对admin.php做验证了,多个文件类型用园括号括起来,中间以|号隔开. 这一段内容必须放在:location ~ \.php$ { 这一段的前面 auth_basic "Auth"; auth_basic_user_file /usr/local/nginx/conf/htpasswd; include fastcgi_params; ## 这一块是php的解析,没有就不能解析php。 fastcgi_pass unix:/tmp/php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name; }
二、列出目录
如果访问一个存在的目录会出现403错误,这是因为nginx默认关闭了列出目录的功能,可以开启它,但为了安全起见首先应该做个验证,开启之后就能够看见该目录下的所有文件了.
location /bbb/{ location /bbb/{ auth_basic "Auth"; auth_basic_user_file /usr/local/nginx/conf/htpasswd; autoindex on; ## 打开目录浏览功能 autoindex_exact_size off; ## 默认为on,显示出文件的确切大小,单位是bytes。 改为off后,显示出文件的大概大小,单位是kB或者MB或者GB autoindex_localtime on; ## autoindex_localtime on,默认为off,显示的文件时间为GMT时间,改为on后,显示的文件时间为文件的服务器时间 } }
三、域名重定向
在nginx的配置文件中添加:
server_name www.123.com 123.com; ## 域名通常都有这两种形式 if ($host != 'www.123.com' ) { ## 如果域名不等于www.123.com,假如输入的是123.com rewrite ^/(.*)$ http://www.123.com/$1 permanent; ## 那么自动调到带有3w的域名上去,可以换个别的网站,效果更明显. permanent 301永久重定向,redurect 302临时重定向,还有break和last last 相当于apache里的[L]标记,表示完成rewrite,不再匹配后面的规则 }
四、日志切割:
在nginx的配置文件中添加:
access_log /usr/local/nginx/logs/www.123.com.log combined_realip; ## 路径随便写,前提是要有对应的目录存在,文件则是自动创建的,combined_realip 是在nginx.conf里面定义的.
编写一个简单的脚本:
vim /usr/local/sbin/logrotate.sh ## 加入以下代码,文件自定义,这里的shell只是一个简单的演示.
#! /bin/bash datedir=`date +%Y%m%d` ## 定义一个名为datedir的变量记录时间 mv /usr/local/nginx/logs/www.123.com.log /usr/local/nginx/logs/$datedir:www.123.com.log ## 用mv命令重命名原有的.log日志文件,并且加上日志标签. kill -HUP `cat /usr/local/nginx/logs/nginx.pid` ## 先找到存放nginx进程PID的文件,然后用cat读出来,最后用kill命令发送HUP信号给nginx父进程,让它平滑重启,重新加载配置文件.
## 然后就可以利用 crontab 命令来定时切割日志文件了.
五、静态文件不记录日志,配置缓存
在nginx的配置文件中添加:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ ## 这里是缓存的静态文件类型,日志记录功能也不会记录它们的状态. { expires 30d; access_log off; } ## expires过期时间为30天, 图片文件不怎么更新,过期可以设大一点, 如果频繁更新,则可以设置得小一点,Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求,access_log off是关闭日志记录的命令,缓存文件的http状态码是304
日志格式:
log_format main '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; log_format main1 '$proxy_add_x_forwarded_for - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; ## 此日志格式为,ip不仅记录代理的ip还记录远程客户端真实IP。 错误日志error_log日志级别: error_log 级别分为 debug, info, notice, warn, error, crit 默认为crit, 该级别在日志名后边定义格式如下: error_log /your/path/error.log crit; crit 记录的日志最少,而debug记录的日志最多。如果你的nginx遇到一些问题,比如502比较频繁出现,但是看默认的error_log并没有看到有意义的信息,那么就可以调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富。 日志格式中的变量含义: $remote_addr 与 $http_x_forwarded_for 用以记录客户端IP地址,一个记录代理IP,一个记录真实IP。 $remote_user 记录客户端用户名臣 $time_local 记录访问时间与时区 $request 记录请求状态,成功是200 $body_byte_sent 记录发送给客户端文件主体内容大小 $http_referer 记录从哪个页面链接访问过来的 $http_user_agent 记录客户端浏览器的相关信息
六、防盗链
在nginx的配置文件中添加:
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ { ## 对这些格式的文件做防盗链,以|号隔开 valid_referers none blocked server_names *.123.com ## 网站白名单 if ($invalid_referer) { ## 如果不是网站白名单的网站 # return 403; ## 返回403,可以随便返回阿 rewrite ^/ http://www.example.com/nophoto.gif; ## 也可以让它直接跳转到另一个网址 } }
七、访问控制
限制只让某个ip访问
allow 219.232.244.234; deny all;
禁止某个IP或者IP段访问站点的设置方法
首先建立下面的配置文件放在nginx的conf目录下面,命名为deny.ip
cat deny.ip deny 192.168.1.11; deny 192.168.1.123; deny 10.0.1.0/24;
在nginx的配置文件nginx.conf中加入:include deny.ip;
重启一下nginx的服务,就可以生效了。
deny.ip 的格式中也可以用deny all;
如果你想实现这样的应用,除了几个IP外,其他全部拒绝,
那需要你在deny.ip 中这样写:
allow 1.1.1.1; allow 1.1.1.2; deny all;
八、user_agent 控制客户端访问
在nginx的配置文件中添加:
location / { if ($http_user_agent ~* 'bot|spider'){ ## 以单引号括起来,以|号隔开 ~* 不区分大小写 return 403; ## 返回403状态码 } }
九、nginx的rewrite应用
出处:http://shunz.net/2008/07/nginx_rewrite.html
Nginx以其良好的并发性能,目前正在逐渐取代Apache成为大家的Web server首选,但是Nginx目前的中文资料很少,需要大家努力贡献。
下面我介绍一下Nginx的Rewrite模块设置及Wordpress和Discuz的示例。Nginx的Rewrite规则比Apache的简单灵活多了,从下面介绍可见一斑。
首先,Nginx可以用if进行条件匹配,语法规则类似C,举例如下:
if ($http_user_agent ~ MSIE) {rewrite ^(.*)$ /msie/$1 break;}
1、正则表达式匹配,其中:
~ 为区分大小写匹配
~* 为不区分大小写匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配
2、文件及目录匹配,其中:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
如:
if (!-f $request_filename) {proxy_pass http://127.0.0.1;}
其次,Nginx的Rewrite规则与Apache几乎完全一致,所不同的是最后的flag标记,举例如下:
rewrite ^/feed/$ http://feed.shunz.net last;
flag标记有:
last ## 相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则
break ## 与last类似
redirect ## 返回302临时重定向
permanent ## 返回301永久重定向
例子:
Wordpress的重定向规则:
if (!-e $request_filename) {rewrite ^/(index|atom|rsd)\.xml$ http://feed.shunz.net last;rewrite ^([_0-9a-zA-Z-]+)?(/wp-.*) $2 last;rewrite ^([_0-9a-zA-Z-]+)?(/.*\.php)$ $2 last;rewrite ^ /index.php last;}