虽然Tomcat也可以认为是HTTP服务器,内部集成了http服务器的相关功能,但通常它仍然会和Nginx配合在一起使用。
nginx常用做静态内容服务和反向代理服务器,以及页面前端高并发服务器。
严格的来说,Nginx 应该叫做「HTTP Server」;而 Tomcat 则是一个「Application Server」,或者更准确的来说,是一个「Servlet/JSP」应用的容器(Ruby/Python 等其他语言开发的应用也无法直接运行在 Tomcat 上),这种特性导致了它们在使用中有明确的分工职责。tomcat更多用来做做一个应用容器,让java web app跑在里面的东西。大部分适用于静态资源文件的访问(图片,文件)
一 本篇文章要解决的问题什么是静态资源,什么是动态资源
常规web服务器如何来访问静态和动态资源
如何使用nginx来实现静态资源和动态资源的分离
二 什么是静态资源,什么是动态资源 静态资源对于移动 APP 来说,这些静态资源主要是图片、视频和流媒体信息;对于 Web 网站来说,则包括了 JavaScript 文件、CSS 文件、静态 HTML 文件等等。
友情提示:虽然大家都知道,但还是要说一个很小白的问题。并不是不会动的就是静态资源。有些同学把视频、动态图片认为是动态资源,这是不对的。
动态资源一般如果一次请求会从操作数据库或者缓存中的数据,那可以认为此次请求是动态请求,只要涉及到数据库的操作,必然会使用到后台的语言,如python,java,php。所以也可以大概的这样认为,就是后缀名是后台语言开发的脚本就是动态文件。如要访问一个php文件 test.php,一个python文件test.py,这个就是动态资源。
三 常规web服务器如何来访问静态和动态资源 以nginx作为web服务器举例。web服务器是这样的一个程序,可以对用户(如浏览器、APP)的请求进行响应。比如我们通过浏览器访问百度,可以得到百度的首页。
请求服务器时可能会请求静态的资源(如一个静态的html文件、一张图片、一个视频),也可能请求一个动态脚本,如一个PHP文件。下面分别说下这两种类型的文件,nginx是如何处理,然后影响给客户端的。
首先找到服务器上nginx的配置文件的位置
可以通过 whereis nginx 命令来查找,一般在/etc/nginx/nginx.conf
打开配置文件vim nginx.conf,找到http区块,所以nginx相关的配置均在此处设置。
找到http区块里的server区块,server区块就是一个web项目的设置,比如你服务器上安装了两个项目,就可以设置两个server区块,每个区块对应一个项目。如下图
http{ server{ listen 80; 当我们使用www.a.com来访问服务器时,web服务器的根目录是/var/www/project1 server_name www.a.com root /var/www/project1; index index.html index.php } server{ listen 80; 当我们使用www.b.com来访问服务器时,web服务器的根目录是/var/www/project2,从而实现一台服务器上可以存着多个项目,以前很多服务器厂商推出的虚拟主机,就是使用这个原理来实现的。 server_name www.b.com root /var/www/project2; index index.html index.php } } 如何访问一台服务器上的静态资源和动态资源
先简单介绍一下server区块中关于Location几个比较常用的设置 1. 当用户请求 http://localhost/example 时,这里的 $uri 就是 /example。 try_files 会到硬盘里尝试找这个文件。如果存在名为 /$root/example(其中 $root 是项目代码安装目录)的文件,就直接把这个文件的内容发送给用户。 显然,目录中没有叫 example 的文件。然后就看 $uri/,增加了一个 /,也就是看有没有名为 /$root/example/ 的目录。 又找不到,就会 fall back 到 try_files 的最后一个选项 /index.php,发起一个内部 “子请求”,也就是相当于 nginx 发起一个 HTTP 请求到 http://localhost/index.php。 location / { try_files $uri $uri/ /index.php?$query_string; } 2. 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。 #这里是直接转发给后端应用服务器了,也可以是一个静态首页 location = / { proxy_pass http://tomcat:8080/index } 3. 第三个必选规则是处理静态文件请求,这是nginx作为http服务器的强项 # 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用 location ^~ /static/ { root /webroot/static/; } location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; } 4. 第四个规则就是通用规则,用来转发动态请求到后端应用服务器 #非静态文件请求就默认是动态请求,自己根据实际把握 location / { proxy_pass http://tomcat:8080/ }
有了以上只是作为铺垫,相信你很容易可以看懂下面的nginx服务器的设置
http{ server{ listen 80; server_name www.a.com # 指定网站根目录 root /var/www/project1; index index.html index.php 匹配uri请求中含.php并且带get参数,如a.php?a=1 location ~ \.php?.*$ { fastcgi_index index.php; 此处不是本文重点,你只需要了解,这个地方是把请求转发给php,php有两种与nginx的通信方式,一种是通过监听9000端口,一种是通过sock文件,此处是使用sock文件 fastcgi_pass unix:/run/php/php7.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # location / 对所有的请求有效,会匹配所有的请求 location / { 对所有根目录下的文件、目录,都将请求重定向到index.php文件,因为一般PHP框架都是单入口,这样可以保证所有的请求都会通过项目的入口文件 try_files $uri $uri/ /index.php?$args; } } } 总结。我们通过server区块的root选项来指定网站的根目录;通过location /来配置所有的请求,如果请求的是静态文件,直接从根目录找到对应的静态文件返回给客户端;通过location ~ .php?.*$来匹配uri中含.php的请求,然后转发给php处理程序,处理完后返回给nginx,然后返回给客户端。 四 使用nginx来实现静态资源和动态资源的分离其实就是请求静态资源直接通过nginx返回,请求动态动态资源,通过nginx的反向代理或者负载均衡,将请求重定向到其他服务器的处理程序,待处理完成后,返回给nginx,nginx在返回给客户端。
实现静态资源和动态资源的分离,nginx相关设置 通过负载均衡的方式: 找到nginx的配置文件,在http区块中添加如下内容: http{ 负载均衡可以随便起名字,如我这个地方起的是my_host upstream my_host{ 根据实际情况设置server的值,如要访问的真正服务在192.168.1.104:8080 端口,同时可以设置权重。 server 要代理的ip:80 weight=5; server 192.168.1.104:8080 weight=1; } server{ listen 80; server_name www.baidu.com index index.html index.php location / { root /var/www/html 根据upstream设置的名字,前加http proxy_pass http://my_host; } } }
通过反向代理的方式: 找到nginx的配置文件,在http区块中添加如下内容: http{ server{ listen 80; server_name [www.abc.com](http://www.abc.com) index index.html index.php location / { root /var/www/html 可以设置反向代理相关的一些参数 proxy_set_header Host www.54php.cn; 设置反向代理的服务器的地址 proxy_pass http://192.168.1.104:8080; } } } 总结
要想实现静态资源和动态资源分离的分离,其实就是访问的静态资源在一台服务器上,需要的时候,直接返回。访问的动态资源在另一台服务器(通过反向代理)或几台服务器(通过负载均衡)上,这样处理相关的动态资源就不用占用本台服务器的CPU资源,这样就可以处理更多的请求,提高系统的并发能力。
版权申明:本站文章均来自网络,如有侵权,请联系01056159998 邮箱:itboby@foxmail.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有