本文旨在讲述nginx的常见概念及用法。
1. 概念
Nginx(engine-x)是一个高性能的Web服务器和HTTP反向代理服务器,当然它还可以用作负载均衡、HTTP缓存和邮件服务器等。
Nginx作为Web服务器,跟Apache相比,它占用的资源更小,能够支持更多的并发连接(官方文档宣称可达到50000个),效率更高。
2. 正向代理和反向代理的区别
首先,正向代理和反向代理本质的区别是其代理的对象不同,正向代理代理的是客户端,代替客户端去访问服务器;而反向代理则是代理的服务端,代替服务器去接受客户端的请求,下面以买房为例简单说明一下:
正向代理
假设A现在要买一个二手房,并且知道C手里有满足自己需求的房源,但是却不认识C;而B同时认识A和C,这样A就可以通过B来购买C的房子。整个过程中A对于C来讲是无感的但是A却清楚明白自己是从C那儿获取的房源。
反向代理
同样A要买一个二手房但是不知道具体的房源,而B呢手里有很多房源恰好有满足自己需求的,这样A通过B就可以买到自己心仪的房子了。整个过程中A是不知道自己所买的房子真正的户主是谁,B在中间就充当一个类似现在很多房屋中介的角色。
下面讲讲几种场景下nginx的配置,通常http模块一般用作nginx全局配置,通过include来导入各个server的配置,http模块在此处就不展开了,主要围绕server模块来进行。
3. 反向代理
nginx是通过关键字proxy_pass
来实现的,下面是一个实例:
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass 192.168.0.12:8090;
}
}
4. 负载均衡
nginx的负载均衡是关键字upstream
配合proxy_pass
来实现的,下面是简单的例子:
http {
upstream django_project {
server www.xxx.com:8001;
server www.yyy.com:8001;
server www.zzz.com:8001;
}
server {
listen 80;
server_name: www.example.com;
location / {
proxy_pass django_project;
}
}
}
另外负载均衡可以有很多策略,默认采用轮询的方式,还支持权重、ip哈希、url哈希等,此处不一一说明了。
5. Nginx其它配置说明
nginx缓存
nginx缓存就是将请求过的内容在本地建一个副本,下次请求时直接响应而不必去访问后端,那如何启用nginx的缓存功能呢?
启用nginx缓存,需要先在http全局区域设置proxy_cache_path
,然后在server区域通过proxy_cache
使用它,当然还有一些其他的设置参数,下面通过具体的实例来说明:
http {
...
# 设置缓存的目录、名称及占用内存大小
# 设置每次加载时最大加载时间及文件的数量
# 设置缓存占用最大内存总量
proxy_cache_path /var/www/nginx_cache keys_zone=mytest:10m loader_threshold=300 load_files=200 max_size=200m;
server {
listen 80;
server_name www.example.com;
# 使用缓存mytest
proxy_cache mytest;
location / {
proxy_pass www.example01.com:8090;
# 设置缓存的有效期
proxy_cache_valid any 5m;
# 设置最少几次请求进行缓存
proxy_cache_min_uses 5;
# 设置当如下参数不为空时跳过缓存
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
}
}
}
另外还可以通过proxy_cache_methods
来指定哪些方法被缓存。
nginx跳转/重定向
此功能是通过nginx的rewrite
模块来实现的,使用正则表达式改变URI,并且根据变量来转向以及选择配置。
常见格式:
rewrite uri_regex replacement [flag]
rewrite的几种flag:
- break:停止处理当前rewrite模块的指令集,其他模块的指令集不受影响,且不会发起新一轮location的匹配;
- last:停止处理当前rewrite模块的指令集,开始搜索与更改后的URI相匹配的location;
- redirect:临时重定向;
- permanent:永久重定向;
下面举一个简单的例子:
server {
listen 80;
server_name: localhost;
location /mytest {
rewrite ^/mytest /mytest00;
rewrite ^/mytest00 /more/index.html break;
# rewrite ^/mytest00 /more/index.html last;
rewrite ^/more/index\.html /mytest02; # 不会被执行
proxy_pass https://www.baidu.com;
}
# location /more/index.html {
# proxy_pass https://www.baidu.com;
# }
}
在浏览器上输入:localhost:80/mytest
,结果输出百度产品大全页面;
如果把break
行注释掉,而last行去掉注释,则会页面输出error;
而进一步把其下location
区域注释去掉,则页面输出百度产品大全页面。
rewrite模块还支持if指令,另外rewrite 指令是使用指定的正则表达式regex来匹配请求的urI,如果匹配成功,则使用replacement更改URI。rewrite指令按照它们在配置文件中出现的顺序执行。可以使用flag标志来终止指令的进一步处理。如果替换字符串replacement以http://,https://或$ scheme开头,则停止处理后续内容,并直接重定向返回给客户端。
跨域
服务器默认是不允许跨域的,为了解决跨域的问题,我们可以在nginx做如下配置:
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'
if ($request_method = 'OPTIONS') {
return 204;
}
}
网友评论