nginx可以作为web服务器以及反向代理,还有mail功能,在nginx的配置文件中是分段的,main端表示对web和mail等都生效的,http表示作为web时生效的,server用于定义虚拟主机嵌套在http内
对于多个站点,为了配置看起来明晰,可以在http端使用include包含conf.d目录下的所有文件,然后在conf.d目录下分别以每个站点命名配置文件进行配置
location使用的修饰符
location[=|~|~*|^~] url {.....}
location URL{}
对当前路径以及子路径下的所有对象都生效
location =URL {}
精确匹配当前路径,不包括子路径。只对当前路径生效
location ~|~* URL {}
模式匹配URL,此处的URL可使用正则表达式
~表示匹配的时候区分字符大小写
~*表示匹配的时候不区分字符大小写
location ^~ URL {}
明确说明不使用正则表达式
当这些混合使用的时候,=匹配的优先级最高,如果没有,非正则表达式的优先级最高,再则,就是使用正则表达式的,最后就是没加修饰符的
location 后加的URL需要和{root /path/to/dirctory}合并得到最终的文件系统路径
2.nginx中定义访问控制
基于ip的访问控制
location / {
deny指令
allow指令 //可以加单个ip,网段,all等参数
)
基于用户的访问控制(使用auth basic)模块
location / {
auth_basic "need password"
auth_basix_user_file htpasswd
}
用户认证文件也是使用htpasswd生成 (建议生成为隐藏文件)
3.index模块(可以用在http,server,location中,有继承关系)
index file (control which files are to be indexed) 定义默认页面
4. auto index模块
autoindex on //如果没有主页面,列出所有文件
5. limit requests模块
6. limit conn模块
7.stub status模块
stub_status on;
开启状态报告模块,在访问返回的信息中
Active connextions:291
server accepts handled requests
reading : writing: waiting:
accepts:已经接受的连接的个数
handled:已经处理的连接的个数
requests:已经处理的请求的个数(requests/handled可以大致得出每个连接的请求数)
reading:nginx正在读取其首部的请求的个数
writing:nginx正在读取其主体的请求的个数或正处理请求内容的请求个数或正在向客户端发送响应的请求的个数
waiting:长连接模式中的保持的连接个数
8.ssl模块
相关指令:(定义在server段)
ssl on; //开启ssl功能
ssl_certificate //指定证书
ssl_certificate_key //指定私钥
ssl_session_timeout //超时时间
ssl_protocols //指定支持的协议的版本
ssl_ciphers //使用的算法
ssl_perfer_server_ciphers on; //是否允许服务端选择其倾向的加密算法
9.proxy模块
nginx通过proxy模块实现反向代理的功能,nginx在作为web反向代理服务器的时候,nginx负责接收用户请求,并能够根据URI,客户端参数,或者是其他的处理逻辑将用户请求调度至上游服务器,nginx在实现反向代理功能是最重要的指令是proxy_pass,它能够将location定义的某URI代理至指定的上游服务器
eg:location /uri {
proxy_pass http:192.168.1.1:808/newuri;
} //此时是直接将uri进行了转换
特殊情况:a.如果location定义的uri使用了模式匹配(~,~*,^~),其uri会直接被传递给上游服务器,而不会被转换成一个新的uri
eg:location ~|^~|~* uri {
proxy_pass http:192.168.0.1:808;
} //此时访问的就是192.168.0.1:808/~|^~|~* uri
b.如果location中使用了url重新,那么nginx处理请求时也是处理重写后的uri,而不是上游服务器定义的uri
eg: location /{
rewrite ...
proxy_pass http:192.168.0.1:808/index
} //那么/index就不再生效,而是重写后的uri
其他proxy相关指令:
nginx的http核心模块中提供可很多的服务器变量($remote-ip就是表示客户端地址),这些服务器变量在nginx的配置文件中可以直接进行引用
proxy_set_header X-Real-Ip $remote-ip
10.upstream模块(用于实现负载均衡)
upstream NAME{
}
需要引入一个新的上下文,定义在server{}之外
定义upstream的时候需要给其一个独特的名称,然后使用proxy模块代理至upstream上去,由upstram完成负载均衡的功能
例如:Upstream hadoop {
server 192.168.0.1;
server 192.168.0.1;
}
upstream模块还可以实现后端健康状况检查,对于upstream而言,最重要的指令就是server
server指令接受的参数:wegiht=VALUE //用于定义权重(加权论调)
max-fails=VALUE //最大错误次数
fail_timeout=VALUE //定义错误超时时长
backup //通常用于定义错误提示(提供错误页面)
ip_hash //根据源地址hash,能将同意客户端请求始终定向至同一server
least_conn //将请求向连接数最少的服务器转发
server {
listen 80;
servername localhost;
location / {
proxy_pass http://hadoop/; //注意此处仍要使用uri的格式
}
}
11.nginx的缓存
nginx在web服务器的时候,nginx可以将文件描述符(也就是文件系统上缓存对象对应的元数据)是缓存在内存空间的,同时也存储页面对应的键,并且这段内存空间是共享内存,而页面的缓存是在磁盘上
proxy_cache_path //不能定义在server上下文,必须定义在http中(因为定义的缓存是共享的,所以不能在某特定虚拟主机中进行定义)
procy_cache_path /var/nginx/cache [levels=levels] keys_zone=name:size [max_size]
levels:定义目录级别
levels=1:2 //一级子目录一个字符命名,二级子目录两个字符命名,最多只能有三级,并且各级子目录命名最多两个字符
keys_zone //给内存区域命名(可以用多个,每个缓存磁盘空间也就是之前定义的目录会对应一个共享内存区域,这就是给这个内存区域命名和设定大小)
max_size //path指定的缓存目录最大可以占据多少磁盘空间
这样,nginx就具有了缓存的功能,然后在server中定义需要缓存的虚拟主机使用定义好的缓存空间
在某个location中定义使用示例:
proxy_cache off;表示关闭
proxy_cache name; //就是keys_zone处定义的name
proxy_cache_valid 200 10m; //将返回状态码为200的对象缓存十分钟
nginx提供的缓存是公共的,对所有的用户都是生效的
除了proxy_cache之外,另外还有三种常见的缓存:
open_log_cache:打开日志缓存
open_file_cache :打开文件缓存
fastcgi_cache
12.nginx的压缩功能
默认情况下,nginx编译的时候会自动编译gzip模块,所以可以直接使用(启用压缩功能可以在一定程度上节约带宽的)
在http上下文中
gzip on; //开启gzip压缩功能
gzip_min_length; //使用gzip压缩的最小文件大小(达到这个大小之后才会使用gzip压缩)
gzip_buffer ; //gzip压缩文件过程可以使用的内存空间大小
12.rewrite模块
rewrite模块引入了if指令,做条件判断,只有在满足条件的时候才做相应的处理
if通常只能用在server,location中,尤其是用在location中
if (condition) {
}
测试:
双目测试: ~,!~
=,!=
~*,!~*
eg:if($request_method=POST){
}
if($request_uri~*/index){
}
建议用在location上下文中,在if中常用的有break指令,避免循环,推出判断
return(0-999)
判断是不是盗链行为,需要使用referer模块
使用valid_referers none www.example.com... //使用valid_referfer指令定义来自哪些网站的引用是合法的(none表示直接从浏览器输入访问的)
if($invalid_referer){
return 403
} //表示在定义了有效referfer之后,此处使用该参数匹配不符合有效引用的连接然后返回错误码
如何使用rewrite指令完成url重写
rewrite支持正则表达式
rewrite regex replacement [flag]
flag的四个值:last:本次重写完成之后,重启下一轮检查(但是可能会带来重写循环)
break:本次重写完成之后,不再检查,直接执行后续操作(可以避免重写循环)
本文出自 “zxcvbnm玄烨” 博客,请务必保留此出处http://10764546.blog.51cto.com/10754546/1726456
原文:http://10764546.blog.51cto.com/10754546/1726456