文章目录
- nginx简介
- nginx相关概念(正向和反向代理)
- 正向代理
- 反向代理
- nginx相关概念(负载均衡和动静分离)
- 负载均衡
- 动静分离
- nginx配置文件
- 全局块
- events块
- http块
- http全局块
- server块
- server全局块
- location块
- nginx配置实例1:反向代理
- nginx配置实例2:负载均衡
- nginx提供了几种分配策略
- 轮询
- weight
- ip_hash
- fair(第三方)
- least_conn
- nginx配置实例3:动静分离
- nginx原理解析
nginx简介
Nginx是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强(在同类型的网页服务器中表现较好),专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,支持高达50000个并发连接数
nginx相关概念(正向和反向代理)
正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
反向代理
客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,完后将数据返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的ip地址
总体来说:正向代理代理的是客户端,反向代理代理的是服务端
nginx相关概念(负载均衡和动静分离)
负载均衡
随着请求数量增加,单个服务器负载不能满足当前请求数量,我们可以通过增加服务器的数量,将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,使得负载分发到不同的服务器,这就是我们所说的负载均衡。是一种解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力
nginx配置文件
全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、允许生成的worker_processes数,进程pid存放路径、日至存放路径和类型以及配置文件的引入等。比如:worker_processes,这是nginx服务器并发处理的关键配置,worker_processes值越大,可以支持的并发数量也越多,但是会受到硬件、软件等设备的制约
events块
events块涉及的指令主要影响nginx服务器与用户的网络的网络连接,常用的设置包括是否开启对多worker_processes下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个worker_processes可以同时支持的最大连接数,下图中表示每个worker_processes可以支持最大连接数为1024,这部分的配置对nginx的性能影响较大,在实际中应该灵活配置
http块
这是nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http块也可以包括http全局块和server块
http全局块
http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时、单链接请求数上限等
server块
这块和虚拟主机有密切关系,从用户角度看虚拟主机和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本,每个http块可以包含多个server块,每个server块相当于一个虚拟主机而每个server块也分为全局server块,以及可以同时包含多个location块
server全局块
最常见的配置是本虚拟主机的监听配置和本虚拟主机的名称或ip配置
location块
一个server块可以配置多个location块,这块的主要作用是基于nginx服务器接收到的请求字符串,对虚拟主机名称之外的字符串进行匹配,对待定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行
#全局块
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
#events块
events {
worker_connections 1024;
}
#http块
http {
#http全局块
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#server块
server {
#server全局块
listen 80;
server_name 112.124.21.178;
#location块
location / {
proxy_pass http://myserver;
}
}
include /etc/nginx/conf.d/*.conf;
}
nginx配置实例1:反向代理
我的配置文件路径在/etc/nginx/conf.d中有个default.conf,在里面直接配置server即可,配置如下:
第一种方式:设置listen端口号80,server_name为本机ip地址,并在location中配置proxy_pass需要代理的ip地址
第一种方式:设置listen端口号9090,server_name为本机ip地址,并在location后面加入~ 路径名匹配,在里面配置proxy_pass需要代理的ip地址
server {
listen 80;
server_name 112.124.21.178;
location / {
proxy_pass http://112.124.21.178:8080;
}
}
server {
listen 9090;
server_name 112.124.21.178;
location ~ /tomcat1/ {
proxy_pass http://112.124.21.178:8080;
}
location ~/tomcat2/ {
proxy_pass http://112.124.21.178:8081;
}
}
配置好后,重启nginx服务器:
- 访问112.124.21.178,页面会跳转到112.124.21.118:8080端口
- 访问112.124.21.178:9090/tomcat1/,页面会跳转到112.124.21.178:8080端口
- 访问112.124.21.178:9090/tomcat2/,页面会跳转到112.124.21.178:8081端口
ps:
~ 为区分大小写匹配(可用正则表达式)
= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。
!~为区分大小写不匹配
~* 为不区分大小写匹配(可用正则表达式)
!~*为不区分大小写不匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。
nginx配置实例2:负载均衡
我的配置文件路径在/etc/nginx/conf.d中有个default.conf,在里面直接配置server即可,配置如下:
在server上方加入一个upstream块,格式为upstream 名称,里面配置需要负载均衡的服务器,格式为:server ip地址,完后将location块中proxy_pass 设置为 http://upstream 的名称
upstream myserver {
server 112.124.21.177:8040;
server 112.124.21.177:8080;
server 112.124.21.177:8090;
}
server {
listen 80;
server_name 112.124.21.178;
location / {
proxy_pass http://myserver;
}
}
配置好后,重启nginx服务器:
- 访问112.124.21.177实际访问路径为112.124.21.178:8040
- 访问112.124.21.177实际访问路径为112.124.21.178:8080
- 访问112.124.21.177实际访问路径为112.124.21.178:8090
nginx提供了几种分配策略
轮询
nginx默认分配方式,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
注意:
在轮询中,如果服务器down掉了,会自动剔除该服务器。
缺省配置就是轮询策略。
此策略适合服务器配置相当,无状态且短平快的服务使用。
weight
指定轮询几率,weight和服务器访问几率成正比,weight代表权重默认为1,用于服务器后端性能不均的情况
注意:
权重越高分配到需要处理的请求越多。
此策略可以与least_conn和ip_hash结合使用。
此策略比较适合服务器的硬件配置差别比较大的情况。
ip_hash
指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。
注意:
在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
ip_hash不能与backup同时使用。
此策略适合有状态服务,比如session。
当有服务器需要剔除,必须手动down掉。
fair(第三方)
按照服务器端的响应时间来分配请求,响应时间短的优先分配。
least_conn
把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
注意:
此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。
nginx配置实例3:动静分离
Nginx动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用nginx处理静态页面,tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种:
- 把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案
- 动态跟静态文件混合在一起发布,通过nginx来分开
server {
listen 9999;
server_name 112.124.21.177.22;
location / {
proxy_pass http://127.0.0.1:8080;
}
location /images/ {
root /usr/local/server;
autoindex on;
expires 3d;
}
location /www/ {
alias /usr/local/server/html/;
autoindex on;
}
#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;
}
}
通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。expires定义:给一个资源设定一个过期时间,浏览器自身确认是否过期,无需去服务器端验证,所以不会产生额外的流量。这种方法非常适合不经常变动的资源(如果经常更新文件,不建议使用expires来缓存),我这里设置3d,表示在这三天之内访问这个url,发送一个请求,比对服务器该文件最后更新时间有没有变化,没有变化则不会从服务器抓取,返回状态码304,如果有变化,则直接从服务器重新下载,返回状态码200。
autoindex:是否开启目录索引
root:配置的路径+完整访问路径(完整的location配置路径+静态文件),后面可以不用加/
alias:配置路径+静态文件(去除location中配置的路径),后面必须加/
ps:有个小插曲,因为我nginx是在docker中安装的,配置静态目录的时候一直在外面配置的,导致一直404,刚开始还没反应过来,用下来感觉nginx使用docker容器不是很方便。