首页 > 代码库 > nginx的几种常用配置
nginx的几种常用配置
1. 设置默认虚拟主机
对没有匹配的Host值时,返回错误403到客户端
server {
listen 80 default_server;
server_name _;
return 403;
}
2. 用户认证
用户认证需要用到apache的htpasswd命令生成密码,如果没有安装apache,可以使用yum install httpd安装。
生成密码文件,创建用户
htpasswd -c /usr/local/nginx/conf/htpasswd test
添加test用户,第一次添加时需要加-c参数,第二次添加时不需要-c参数
在nginx的配置文件中添加
location / {
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
}
3. 域名重定向(Rewrite)
例子一:
server_name www.a.com www.test.com;
if ($host != ‘www.test.com‘ ) {
rewrite ^/(.*)$ http://www.test.com/$1 permanent;
}
例子二:
访问 www.abc.com 请求到 www.abc.com/abc/
if ($document_uri !~ ‘abc‘)
{
rewrite ^/(.*)$ http://www.abc.com/abc/$1 permanent;
}
注:$document_uri表示访问的url
Nginx的Rewrite规则与Apache几乎完全一致,
所不同的是最后的flag标记
flag标记有:
last 相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则
break 与last类似,本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect 返回302临时重定向 ,浏览器会显示跳转后的URL地址
permanent 返回301永久重定向,浏览器会显示跳转后的URL地址
last/break用来实现URL重写,浏览器地址栏的URL不变,但在服务器端访问的路径发生了变化。
redirect/permanent实现URL跳转,浏览器地址栏URL会显示跳转后的URL。
使用 alias 指令时必须用 last 标记 ,使用 proxy_pass 指令时要用 break 表示。last 标记在本条 rewrite 规则执行完毕后,会对其所在 server{....}标签重新发起请求,而 break 标记则在本条
规则匹配完成后,终止匹配。
4. 日志切割
编写脚本:
vi /usr/local/sbin/logrotate.sh //加入
#! /bin/bash
d=`date -d "-1 day" +%Y%m%d`
/bin/mv /usr/local/nginx/logs/test.log /usr/local/nginx/logs/test_$d.log
/etc/init.d/nginx reload >/dev/null 2>&1
/bin/gzip /usr/local/nginx/logs/logs/test_$d.log #如果要对日志进行压缩就加上这句
日志格式
log_format main ‘$remote_addr - $remote_user [$time_local] $request ‘
‘"$status" $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;
此日志格式为,ip不仅记录代理的ip还记录远程客户端真实IP。
log_format main1 ‘$proxy_add_x_forwarded_for - $remote_user [$time_local] ‘
‘"$request" $status $body_bytes_sent ‘
‘"$http_referer" "$http_user_agent"‘;
内部变量说明
$remote_addr与$http_x_forwarded_for用以记录客户端IP地址,一个记录代理IP,一个记录真实IP;
$remote_user 用以记录客户端用户名称;
$time_local 用来记录访问时间与时区;
$request 用来记录请求的url与http协议;
$status 用来记录请求状态,成功是200;
$body_byte_sent 记录发送给客户端文件主体内容大小;
$http_referer 用来记录从哪个页面链接访问过来的;
$http_user_agent 记录客户端浏览器的相关信息;
错误日志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级别时,错误日志记录的内容会更加丰富。
5. 静态文件不记录日志,并且配置缓存
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
access_log off;
}
location ~ .*\.(js|css)$
{
expires 12h;
access_log off;
}
6. 防盗链
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ {
valid_referers none blocked server_names www.a.com *.b.com;
if ($invalid_referer) {
return 403;
#rewrite ^/ http://www.example.com/nophoto.gif;
}
}
7. 访问控制
黑名单
deny 192.168.1.1;
deny 192.168.1.2;
deny 192.168.2.0/24;
allow all;
白名单
allow 192.168.1.0/24;
allow 127.0.0.1;
allow 192.168.2.1;
deny all;
8. nginx 代理
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://1.1.1.1/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
负载匀载:
upstream test {
ip_hash;
server 192.168.1.1;
server 192.168.1.2;
}
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://test/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
注:加上ip_hash作用是使每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
9. if指令
该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。If指令不支持嵌套,不支持多个条件&&和||处理。
1) 正则表达式匹配,其中:
== 等值比较;
~ 为区分大小写匹配
~* 为不区分大小写匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配
举例:if ($http_user_agent ~ MSIE) {rewrite ^(.*)$ /msie/$1 break;}
2) 文件及目录匹配,其中:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
举例:if (!-f $request_filename) {proxy_pass http://127.0.0.1;}
10. location命令
location表达式类型
~ 表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
= 进行普通字符精确匹配。也就是完全匹配。
@ "@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
location优先级
在nginx的location和配置中location的顺序没有太大关系。正location表达式的类型有关。相同类型的表达式,字符
串长的会优先匹配。
以下是按优先级排列说明:
第一优先级:等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
第二优先级:^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
第三优先级:正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
第四优先级:常规字符串匹配类型。按前缀匹配。
11. nginx全局变量
arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值。
args #这个变量等于请求行中(GET请求)的参数,如:foo=123&bar=blahblah;
binary_remote_addr #二进制的客户地址。
body_bytes_sent #响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。
content_length #请求头中的Content-length字段。
content_type #请求头中的Content-Type字段。
cookie_COOKIE #cookie COOKIE变量的值
document_root #当前请求在root指令中指定的值。
document_uri #与uri相同。
host #请求主机头字段,否则为服务器名称。
hostname #Set to themachine’s hostname as returned by gethostname
http_HEADER
is_args #如果有args参数,这个变量等于”?”,否则等于”",空值。
http_user_agent #客户端agent信息
http_cookie #客户端cookie信息
limit_rate #这个变量可以限制连接速率。
query_string #与args相同。
request_body_file #客户端请求主体信息的临时文件名。
request_method #客户端请求的动作,通常为GET或POST。
remote_addr #客户端的IP地址。
remote_port #客户端的端口。
remote_user #已经经过Auth Basic Module验证的用户名。
request_completion #如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。
request_method #GET或POST
request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。
scheme #HTTP方法(如http,https)。
server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
server_name #服务器名称。
server_port #请求到达服务器的端口号。
12. Apache和Nginx规则的对应关系
Apache的RewriteCond对应Nginx的if
Apache的RewriteRule对应Nginx的rewrite
Apache的[R]对应Nginx的redirect
Apache的[P]对应Nginx的last
Apache的[R,L]对应Nginx的redirect
Apache的[P,L]对应Nginx的last
Apache的[PT,L]对应Nginx的last
nginx的几种常用配置