Nginx是一款轻量级的网页服务器、反向代理器以及电子邮件代理服务器。Nginx采用的是异步非阻塞的通信机制(epoll模型),支持更大的并发连接.所谓的epoll模型:当事件没有准备好时,就放入epoll(队列)里面。如果有事件准备好了,那么就去处 理;如果事件返回的是EAGAIN,那么继续将其放入epoll里面。从而,只要有事件准备好了,我们就去处理它,只有当所有事件都没有准备好时,才在 epoll里面等着。这样,我们就可以并发处理大量的并发了,当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一 个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事 件,事实上就是这样的。
    与多线程方式相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换, 事件处理非常的轻量级,并发数再多也不会导致无谓的资源浪费(上下文切换)。对于IIS服务器,每个请求会独占一个工作线程,当并发数上到几千时,就同时 有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战:因为线程带来的内存占用非常大,线程的上下文切换带来的cpu开销很大,自然性能就上不 去,从而导致在高并发场景下性能下降严重。
    Nginx通过异步非阻塞的事件处理机制,Nginx实现由进程循环处理多个准备好的事件,从而实现高并发和轻量级。

Master/Worker结构:一个master进程,生成一个或多个worker进程(网上找的图):

Master-Worker设计模式核心思想是将原来串行的逻辑并行化,并将逻辑拆分成很多独立模块并行执行。其中主要包含两个主要组件Master和Worker,Master主要用来管理worker进程,将逻辑进行拆分,拆分为互相独立的部分,将每个独立部分下发到多个Worker并行执行,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。
    Worker主要进行实际逻辑计算,并将结果返回给Master。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。更多的worker数,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换。
    每个worker进程都是从master进程fork过来。在master进程里面,先建立好需要listen的socket之后,然后再fork出多个worker进程,这样每个worker进程都可以去accept这个socket(当然不是同一个socket,只是每个进程的这个socket会监控在同一个ip地址与端口,这个在网络协议里面是允许的)。一般来说,当一个连接进来后,所有在accept在这个socket上面的进程,都会收到通知,而只有一个进程可以accept这个连接,其它的则accept失败。
    下面我个人采用Nginx实现压缩以及缓存静态资源文件,来提高服务器的请求效率,配置文件如下,具体的都在注释中体现:

<pre name="code" class="html">#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;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;#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;##缓存cache参数配置##proxy_connect_timeout 5;proxy_read_timeout 60;proxy_send_timeout 5;proxy_buffer_size 16k;proxy_buffers 4 64k;proxy_busy_buffers_size 128k;proxy_temp_file_write_size 128k;#缓存到nginx的本地目录proxy_temp_path  /Users/heyongjian/Desktop/heyongjian/FSvcWeb/nginx/temp/;proxy_cache_path /Users/heyongjian/Desktop/heyongjian/FSvcWeb/nginx/temp/cache_temp levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;##end###压缩配置#gzip  on;           #打开gzip压缩功能gzip_min_length 1k; #压缩阈值gzip_buffers 4 16k; #buffer 不用修改gzip_comp_level 2;  #压缩级别:1-10,数字越大压缩的越好,时间也越长gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;  #        压缩文件类型gzip_vary off;      #跟Squid等缓存服务有关,on的话会在Header里增加 "Vary: Accept-Encoding"gzip_disable "MSIE [1-6]\.";  #IE1-6版本不支持gzip压缩#具体的服务器地址及端口号,该处可以配置集群实现负载均衡,cluster为服务器集群名upstream cluster{server 10.16.39.12:8080; #并且可以分配权重weight,这样来配置集群服务器的访问优先权#...}server {listen       80;#nginx服务器,即代理服务器名server_name   localhost;rewrite ^(.*)$ https://$host$1 permanent; #这里是http跳转https#charset koi8-r;#access_log  logs/host.access.log  main;#缓存相应的文件(静态文件)location ~ \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {proxy_pass http://cluster;         #如果没有缓存则通过proxy_pass转向请求proxy_redirect off;proxy_set_header Host $host;proxy_cache cache_one;proxy_cache_valid 200 302 1h;                              #对不同的HTTP状态码设置不同的缓存时间,h小时,d天数proxy_cache_valid 301 1d;proxy_cache_valid any 1m;expires 30d;}#动态请求代理给相应服务器location / {proxy_pass http://cluster; proxy_redirect    off;proxy_set_header Host  $host;proxy_set_header X-Forwarded-For  $remote_addr; }#purge插件缓存清理location ~ /purge(/.*) {allow              127.0.0.1;        #能够清除缓存的服务器IP地址#allow             10.16.39.12;deny               all;proxy_cache_purge  cache_one $1$is_args$args;}#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 the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;#    location / {#        root   html;#        index  index.html index.htm;#    }#}#代理http跳转https这块配置# HTTPS server#server {listen       443 ssl;server_name  localhost;ssl on;### SSL log files ###  access_log      logs/ssl-access.log;  error_log       logs/ssl-error.log;### SSL cert files ###  ssl_certificate      ../../cert/server.crt;  ssl_certificate_key  ../../cert/server.key;#ssl_session_cache    shared:SSL:1m;#ssl_session_timeout  5m;#ssl_ciphers  HIGH:!aNULL:!MD5;#ssl_prefer_server_ciphers  on;location / {proxy_pass http://cluster; ### force timeouts if one of backend is died ##  proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;  ### Set headers ####  proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  ### Most PHP, Python, Rails, Java App can use this header ###  proxy_set_header X-Forwarded-Proto https;  ### By default we don't want to redirect it ####  proxy_redirect     off;  }}}

这样配置以后:

1.http会直接跳转https;

2.访问web应用时,静态文件会被压缩,而且能压缩到原来的30%,效果很明显;

3.第一次访问web应用时,静态文件会被缓存到指定的Nginx本地目录,再次访问时,就不会需要再次请求服务器;

4.使用ngx_cache_purge(https://github.com/FRiCKLE/ngx_cache_purge)模块进行缓存清理,例如:www.wolfdream.cn/purge/xxx.jpg 就可以清除xxx图片缓存了,另外超时的缓存Nginx会自动删除。

通过Nginx进行调优,可以使访问效率提高很多,上述若有错误,欢迎拍砖指出!

以上参考博文:http://www.open-open.com/lib/view/open1417488526633.html

http://blog.csdn.net/zhaoyue007101/article/details/42144459

Nginx的静态资源缓存以及压缩相关推荐

  1. nginx静态资源缓存与压缩

    一.静态资源缓存 参考文章 (1)apache设置max-age或expires 这里需要修改.htaccess文件. <IfModule mod_headers.c><FilesM ...

  2. nginx 配置静态资源缓存。解决web静态资源访问过慢

    Nginx文件结构 1.全局块:配置影响nginx全局的指令.一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等. ...

  3. nginx静态资源缓存和gzip压缩

    其实这章主要就是优化访问时间和减少宽带问题 优化访问时间,一般css,js,woff还有图片都是静态文件,是一般都不用更改得,如果每次请求都要走tomcat,都是要耗时一些的,那么可以第一次访问的时候 ...

  4. Nginx静态资源优化、压缩、缓存

    这一篇记录一下Nginx压缩缓存相关的指令,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟.多谢! 目录 优化 sendfile tcp_nopush tc ...

  5. Nginx 静态资源缓存配置

    示例 # Media: images, icons, video, audio, HTC location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|m ...

  6. nginx配置静态资源,重新发布后,浏览器缓存导致异常原因和解决

    原因: nginx作为静态资源服务器,重新构建后发生浏览器页面直接取缓存中的js等文件名,但是由于服务器中文件已经被替换导致出现异常. 浏览器在下次请求这个资源的时候不会将请求发向后端,而是直接从缓存 ...

  7. 成功解决 Nginx更新静态资源无效 ,Nginx静态资源更新不及时,Nginx清除缓存

    文章目录 问题描述 问题解决 问题复现 正常情况 问题描述 使用 nginx做动静分离,在将服务器中的静态资源修改后,访问页面,发现页面没有及时更新. 问题解决 我这里是清除了浏览器缓存. 有关ngi ...

  8. 前端web:浏览器静态资源缓存策略

    浏览器静态资源缓存策略 浏览器其实提供了两种控制策略,分别是强制缓存和协商缓存 强制缓存 强制缓存:就是强制使用浏览器缓存下来的资源; 在指定的一段时间内用自己缓存的文件就行,不需要再次发出请求. 具 ...

  9. win10 nginx部署静态资源服务器和HTML

    win10 nginx部署前端项目(静态资源服务器和HTML) niginx的安装和启停操作参照博客:https://blog.csdn.net/qq_26666947/article/details ...

最新文章

  1. R语言ggplot2可视化设置数据点的大小、设置数据点的颜色、设置数据点边缘线条的厚度(point border thickness)实战
  2. 2018-01-11 Antlr4实现数学四则运算
  3. ES6 - let、const与作用域
  4. rtmp流\http流测试地址
  5. 【数据库系统】为什么使用SQL而非C/C++的函数库执行数据库查询操作
  6. java中jxl飘红_jxl导出excel文件,部署到tomcat中就会报错,为什么呢,求解!
  7. python调用cmd执行命令_python怎么运行cmd命令
  8. 软件开发学习资料大全
  9. LVS+Keepalived+Nginx+Tomcat高可用负载均衡集群配置
  10. java运行环境搭建_java的运行环境
  11. matlab p值 z值,显著性水平 p值 z值
  12. 计算机科学数学背景,Emory的Mathematics and Computer Science「埃默里大学数学与计算机科学系」...
  13. allure趋势图无数据
  14. Android Miracast 花屏问题分析
  15. 微信小程序实现运动步数排名与发布个人动态服务器部署
  16. maven项目转gradle
  17. 写给新手的深度学习综述,收藏了
  18. HJ212-2017 记录
  19. [转] 食物相关的英文单词
  20. go mysql delete_Go实现对MySQL的增删改查

热门文章

  1. 后台启动zookeeper
  2. 街景字符识别2-图像读取及图像增广
  3. 如何使用Gulp完成项目的自动化构建
  4. GreenPlum数据库集群故障检测与恢复
  5. 【黑马课程笔记】webAPI
  6. 关于上海数据中心新政PUE小于1.3的节能对策解读-孙长青
  7. 【论文笔记之 MDF】Multidelay Block Frequency Domain Adaptive Filter
  8. 【解析】A星寻路算法介绍
  9. 山月大佬做了个极客时间返现平台及技术栈介绍
  10. gm修改爆率需要重启服务器吗,自己开传奇如何设置GM名单,以及装备爆率