nginx里面的基本组成模块
nginx在处理请求的时候,更多的是会把这些请求组成一条请求链,链上的各个模块都会进行不同功能的处理。例如说对于请求的解压和压缩处理,对于ssl的处理模块等。总的来说,nginx的基本模块我总结为了以下几项:
event module 事件处理机制模块,提供了各种事件的具体处理框架。nginx具体采用何种事件来处理,依赖于操作系统和编译设置项,例如ngx_event_core_module和ngx_epoll_module。
phase handler 主要负责处理客户端请求并产生待响应内容,ngx_http_static_module就是其中之一,该module主要是将nginx请求转往读取一些磁盘上边的数据,然后做出输出响应,例如说:uri 是以 / 结尾,则会交由 index 模块来链接上完整的路径名然后通过内部调用的方式来调用本模块。
output filter 该模块可以对响应的输出内容做出指定的修改,例如对页面的某些特定url进行替换操作。
upstream 这一模块相信大家都很熟悉,该模块主要是做反向代理的工作。
load-balancer 此模块主要是负责负载均衡功能,在集群中选择任意一台服务器作为请求的处理。
nginx的常用配置案例讲解
首先来查看一份最为基础的nginx基本配置:
events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; #标识使用零拷贝 keepalive_timeout 65; #标识采用长连接 server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
ps:这份配置里面分成了很多份配置块,每个配置块和大括号之间都需要有空格进行标明,否则会识别失效
配置location的重定向
例如说我们在/usr/local/www/文件夹底下创建了一份html页面,然后需要通过nginx来进行访问,nginx在匹配server的location路径的时候,会先按照全路径,再从左往右,再从右往左匹配的顺序。
server { listen 80; server_name www.idea.com *.idea.com idea.*; location / { root /usr/local/www/; } }
注意,这里面的root配置是存在继承关系的,location里面的root会继承location外边的root信息。如果location里面有写root,就会按照location里面的root来判断。server外>server内>location内。
配置动静分离
所谓的动静分离实质上是指我们对于nginx配置里面的动态请求和静态文件都做了一定的分离。例如以下的配置信息:
server { listen 80; server_name www.idea.com *.idea.com idea.*; root /usr/local/www; #这里面添加映射static的记录 location /static { root /usr/local/static/; } location / { root /usr/local/www/; index idea.html; } }
ps:这里面的配置内容,我引入了host文件的修改
192.168.43.235 www.idea.com 192.168.43.235 test.idea.com 192.168.43.235 idea.test
图片的实际存储位置是:
/usr/local/static/img/logo.jpg
按照上述的配置来讲,访问的方式是:
但是这种情况下,我们通过nginx来访问图片的方式是不会成功的,原因是这个地址会被nginx处理成为:
前往root地址+static的最终地址进行查询:
/usr/local/static/static
为了避免这种情况,通常会用别名alias来进行匹配,具体配置如下:
server { listen 80; server_name www.idea.com *.idea.com idea.*; root /usr/local/www; location /static { alias /usr/local/static/; } location / { root /usr/local/www/; index idea.html; } }
这个时候,我们再去访问 http://www.idea.com/static/img/logo.jpg 就会访问成功了。
同样对于别名我们可以进行更加复杂一些的逻辑操作案例:
假设我们需要访问static底下的文件内容,这个时候不需要携带相应的名称,直接通过访问
http://www.idea.com/static/css/test.css 就可以访问到 /usr/local/www/static/css/ 底下的内容了
那么,假如说有很多种类型的静态文件需要进行映射该如何配置呢?这个时候可以引入正则表达式的配置:
server { listen 80; server_name www.idea.com *.idea.com idea.*; root /usr/local/www; location /static { alias /usr/local/static/; } #这里的~是指忽略大小写 location ~* \.(gif|png|jpg|css|js) { root /usr/local/static/; } location / { root /usr/local/www/; index idea.html; } }
加入了这段正则表达式的配置之后(~* .(gif|png|css|js)$) 通过访问该路径:
http://www.idea.com/css/test.css 我们就可以访问到/usr/local/static/css/底下的文件内容了。
代理访问机制
nginx还提供了一个非常灵活的代理访问机制,供我们通过代理的方式来进行访问location
通过nginx配置完全匹配代理进行页面跳转:
server { listen 80; server_name www.idea.com *.idea.com idea.*; root /usr/local/www; location /static { alias /usr/local/static/; } location ~* \.(gif|png|jpg|css|js) { alias /usr/local/static/; } location =/idea-serach { proxy_pass http://www.baidu.com } location / { root /usr/local/www/; index idea.html; } }
通过proxy_pass配置来提供代理的请求转发,当我们访问http://www.idea.com/idea-serach的时候,就会匹配到访问百度的页面了。
小结
nginx对于访问的常见配置支持以下几种:
- 通过全路径访问location
- 通过关键字static匹配来访问location
- 通过正则表达式来访问location
- 通过反向代理进行访问location
防盗链匹配
设置某些链接只允许在固定的网站站点进行访问,防止某些特殊的域名进行ip访问之后盗取本网站的资源文件,因此可以设置这个防盗链的功能。具体配置如下:
server { listen 80; server_name www.idea.com *.idea.com idea.*; root /usr/local/www/; location /static { alias /usr/local/static/; } # 防盗链配置 location ~* \.(gif|png|jpg|css|js) { valid_referers none blocked *.idea.com; if ($invalid_referer) { return 403; } root /usr/local/static/; } location =/idea-serach { proxy_pass http://www.baidu.com; } location / { root /usr/local/www/; } }
网站黑名单
黑名单的配置比较简单,只需要先创建好黑名单文件,然后在http块里面引入就好了
# 创建黑名单文件 echo 'deny 192.168.0.132;' >> balck.ip #http 配置块中引入 黑名单文件 include black.ip;
记得配置成功之后要让nginx reload一下,同时请求的时候查看是否是203,如果是的话说明是缓存请求。
nginx的日志配置
当我们需要对于客户端发送的数据进行一些详细信息的查看时候,需要对nginx进行日志的记录,相应的可选参数有以下几点:
log_format格式变量: $remote_addr #记录访问网站的客户端地址 $remote_user #远程客户端用户名 $time_local #记录访问时间与时区 $request #用户的http请求起始行信息 $status #http状态码,记录请求返回的状态码,例如:200、301、404等 $body_bytes_sent #服务器发送给客户端的响应body字节数 $http_referer #记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置。 $http_user_agent #记录客户端访问信息,例如:浏览器、手机客户端等 $http_x_forwarded_for #当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置
将日志配置放在http块里面即可。
通常我们会将日志的配置放置于http模块当中,例如下边的这组案例:
events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
ngixn里面的代理配置
正向代理
客户机和服务器之间加入一层proxy代理机器,当发生请求的时候,由代理服务器去请求server端。最常见的正向代理案例有:vpn,局域网里面的上网客户端工具等。
举个栗子来讲:
当我们需要通过路径匹配到 $host: $port /baidu.html
的时候,被代理请求百度页面,可以进行以下的配置:
location =/baidu.html { proxy_pass http://www.baidu.com; }
反向代理
当客户端请求服务端的时候,实际上在服务端的接入层有一个代理机器进行请求的转发,而这一层请求的转发相对于客户端而言是透明的。
反向代理请求内部的服务器,虽然配置相似,但是功能不同,配置案例如下:
location =/baidu.html { proxy_pass http:/127.0.0.1:8088; }
代理相关参数
proxy_pass # 代理服务 proxy_redirect off; # 是否允许重定向 proxy_set_header Host $host; # 传 header 参数至后端服务 proxy_set_header X-Forwarded-For $remote_addr; # 设置request header 即客户端IP 地址 proxy_connect_timeout 90; # 连接代理服务超时时间 proxy_send_timeout 90; # 请求发送最大时间 proxy_read_timeout 90; # 读取最大时间 proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k;
ngixn里面的负载均衡
nginx里面有个叫做upstream的模块,专门用于配置负载均衡的内容,upstream里面提供有以下的相关参数:
service 反向服务地址 加端口
weight 权重
max_fails 失败多少次 认为主机已挂掉则,踢出
fail_timeout 移除server之后重新请求的时间 当服务挂了之后,这段时间内重新连接
backup 备用服务 (当服务全部都挂了,那么就会请求这里的服务)
max_conns 允许最大连接数
slow_start 当节点恢复,不立即加入,而是等待 slow_start 后加入服务对列。
相应参数的具体配置如下:
upstream backend { server 192.168.43.191:8080 weight=5 fail_timeout=10s; server 192.168.43.191:8089 weight=5 fail_timeout=10s; }
ngixn里面默认支持的负载均衡策略是轮询加权重的方式,除此之外,nginx自身还支持额外的多种负载均衡策略:
ll+weight:轮询加权重 (默认)
容易出现失重的情况,例如说某一台机器的访问过慢,容易导致请求堆积。
ip_hash : 基于Hash 计算 ,常用于保持session 一至性
基于hash计算的时候,可以根据ip进行hash计算请求到指定的服务器。
(通常session一致性在分布式中最好的处理手段是将session存储在第三方的存储中心)
首先对ip进行hash计算之后,将该值和服务器个数进行取模运算。
url_hash: 静态资源缓存,节约存储,加快速度
可以根据图片的url请求到指定的服务器,比较好理解。
least_conn : 最小链接数
每次请求都只会请求到最少客户端连接数的那台服务器去。
least_time :最小的响应时间
计算节点平均响应时间,然后取响应最快的那个,分配权重更高
配置案例
通过使用ip进行哈希计算的方式来请求后端服务器
upstream backend { ip_hash; server 192.168.43.191:8080 weight=1; server 192.168.43.191:8089 weight=8 fail_timeout=10s; } location / { #root html; index index.html index.htm; proxy_pass http://backend; }
当然nginx除了这些常用功能以外,还提供有非常丰富的其他功能配置,具体配置可以参考nginx的官方文档配置信息http://nginx.org/en/docs/