Nginx 动静分离分析

熊孩纸 阅读:163 2021-03-31 18:10:37 评论:0

1、nginx 与 tomcat 处理静态资源区别:

tomcat静态资源请求量为每秒1000次,则nginx静态资源请求量为每秒6000次,tomcat每秒的吞吐量为0.6M,nginx的每秒吞吐量为3.6M,可以说,nginx处理静态资源的能力是tomcat处理能力的6倍

2、动静分离原理:

服务端接收来自客户端的请求中,有一部分是静态资源的请求,例如html,css,js和图片资源等等,有一部分是动态数据的请求。
因为tomcat处理静态资源的速度比较慢,所以我们可以考虑把所有静态资源独立开来,交给处理静态资源更快的服务器例如nginx处理,而把动态请求交给tomcat处理。
如下图所示,我们在机器上同时安装了nginx和tomcat,把所有的静态资源都放置在nginx的webroot目录下面,把动态请求的程序都放在tomcat的webroot目录下面,
当客户端访问服务端的时候,如果是静态资源的请求,就直接到nginx的webroot目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给tomcat进行处理,这样就实现了动静分离,提高了服务器处理请求的性能。

3、结构示意图:

4、 nginx 实例配置:

#Nginx.conf 
user  caogen; 
worker_processes  1; #因为我用的是虚拟机 只设置了1CPU 
 
error_log  logs/nginx_error.log  error; 
error_log  logs/nginx_info.log   info; 
 
pid        logs/nginx.pid; 
worker_rlimit_nofile 51200; #更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。 
 
events { 
    use epoll; #nginx工作模式,epoll是linux平台下的高效模式,配合nginx的异步非阻塞作用 
    worker_connections  51200; #定义nginx每个进程的最大连接书为51200,一般网上都配置65535. 
    accept_mutex on;    #设置网络连接的序列化,当一个新连接到达时,如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态;如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是惊群问题。更详细的解释http://huoding.com/2013/08/24/281 
    multi_accept on;    #设置worker_poocess是否允许同时接受多个网络连接,默认一个worker一次只接受一个新连接,multi_accept设置为on后能接受多个,有利于性能提升 
    } 
 
 
    http { 
        include       mime.types; #nginx通过服务端文件的后缀名来判断这个文件属于什么类型,再将该数据类型写入http头部的Content-Type字段中,发送给客户端。mime.types这个文件里面全是文件类型的定义。 
        default_type  application/octet-stream; #当用户请求的文件后缀在mime.types这个文件没有定义,便使用默认的type为二进制流 
        include /usr/local/nginx/conf/proxy.conf; 
 
    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; #开启高效文件传输模式 
    tcp_nopush     on;  #启用之后,数据包会累积到一定大小才会发送,减小了额外开销,防止网络阻塞,提高网络效率 
    tcp_nodelay  on;    #启用之后,尽快发送数据。 
    #可以看到tcp_nopush是要等数据包累积到一定大小才发送,tcp_nodelay是要尽快发送,二者相互矛盾。实际上,它们可以一起用,最终的效果是先填满包,再尽快发送。 
 
    keepalive_timeout  65; 
 
    #gzip  on; 
    include /usr/local/nginx/conf/gzip.conf; 
 
    #开启负载均衡的服务器组 
    upstream caogen_proxy{ 
        ip_hash; #每个请求按照ip的hash结果分配,同一个ip的访客固定访问一个后端服务器 
        server 192.168.88.130:8081; 
        server 192.168.1.130:8085; 
    } 
 
    #禁止通过Ip访问 
    server{ 
    server_name _: 
    return 404; 
    } 
 
    server { 
        listen       80; 
        server_name  localhost 127.0.0.1 192.168.88.130; 
        charset utf-8; 
        #access_log  logs/host.access.log  main; 
 
    #动静分离  静态文件交给nginx处理  动态交给tomcat     
    #location ~ .*\.(gif|jpg|jpeg|png|js|css)$ {   
    #   root /usr/local/nginx/staticFiles/; 
    #   expires 1h; #缓存一小时 
    #} 
 
    location ~ ^/(images|js|css)/ { 
        root /usr/local/nginx/staticFiles/; 
        expires 1h; 
    } 
 
        location / { 
            #root   html; 
            #index  index.html index.htm; 
            #proxy_pass http://localhost:8081; 
            proxy_pass http://caogen_proxy; 
        } 
 
        #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; 
        } 
    } 
} 

代理配置说明:

# proxy.conf 
proxy_redirect off; 
proxy_set_header Host $host; 
proxy_set_header X-Real-IP $remote_addr; #获取真实ip 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #获取代理服务器的ip和客户的真实ip 
client_max_body_size 10m;          #允许客户端请求的最大单文件字节数 
client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数 
proxy_connect_timeout 300;         #nginx跟后端服务器连接超时时间(代理连接超时) 
proxy_send_timeout 300;            #后端服务器数据回传时间(代理发送超时) 
proxy_read_timeout 300;            #连接成功后,后端服务器响应时间(代理接收超时) 
proxy_buffer_size 64k;             #设置代理服务器(nginx)保存用户头信息的缓冲区大小 
proxy_buffers   32 32k;            #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 
proxy_busy_buffers_size 128k;      #高负荷下缓冲大小(proxy_buffers*2) 
proxy_temp_file_write_size 128k;   #设定缓存文件夹大小,大于这个值,将从upstream服务器传 

压缩配置说明:

gzip on;  #开启gzip  默认关闭 
gzip_buffers 16 8k; #这是默认的设置 
gzip_comp_level 1;  #gzip的压缩程度,级别为1到9.级别越高,压缩程序越高,时间越多 
gzip_min_length 1k; #gzip压缩功能对大数据压缩效果明显,对小数据有时候会出现越压缩数据越大的情况,所以设置当字节数大于多少的时候才开启压缩,我设置为1kb,默认设置为20kb 
gzip_types  text/plain application/x-javascript text/css application/xml application/javascript;    #压缩的常规文件类型 
gzip_vary on; #告诉接受方数据经过gzip压缩 
gzip_disable "MSIE[1-6]\."; #因为IE6对gzip不支持,所以在IE6及更旧的版本不使用gzip压缩 

注意以上我注释掉的一段动静分离的配置:

#动静分离  静态文件交给nginx处理  动态交给tomcat     
#location ~ .*\.(gif|jpg|jpeg|png|js|css)$ {   
#   root /usr/local/nginx/staticFiles/; 
#   expires 1h; #缓存一小时 
#} 

因为网站的图片分两种,一种图片上作为css而产生的,一种图片上用户动态上传的,作为css的图片上放在项目的images文件夹里,用户上传的图片放在一个文件服务器里面,注释的配置是所有gif,jpg……等类型为后缀的url都会被nginx处理,如果在/usr/local/nginx/staticFiles/文件夹里没有图片,nginx则会返回404。/usr/local/nginx/staticFiles/这个文件夹只存放了js,css和css的图片。所以用户上传的图片都无法查看。


调整后的动静分离配置:

 location ~ ^/(images|js|css)/ { 
    root /usr/local/nginx/staticFiles/; 
    expires 1h; 
} 

仅仅存储静态图片资源或者是css 样式文件中引入的静态图片资源

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
排行榜
关注我们

一个IT知识分享的公众号