2[服务器篇]nginx和tomcat的区别是什么?

前言

用100篇文章讲清面试过程中80%的知识点,只要这100篇文章熟练掌握,了然于胸,就可以面试势如破竹,对面试官进行360°的反击,吊打大部分面试官,疯狂收割大厂Offer!

文章持续更新,每周两篇。会按照知识点进行分类。分为服务器篇、PHP篇、数据库篇、缓存篇、消息队列篇、算法设计模式篇、分布式服务篇。

本系列的写作思路是,用一个大部分程序员容易混淆或者不太理解的概念入手,用第一性原理讲解问题涉及的知识点,如何将知识点用到实际项目中,以及存在哪些坑、如何避坑,一切站在实战的角度。争取用一篇文章讲清楚,以后您再遇到此类问题,直接参考文中的解决思路即可,无需再浪费时间,查阅大量隔靴搔痒的文章。

上篇文章我们最后介绍了nginx和tomcat。当然两者均可以作为web服务器,收到客户端请求,然后给浏览器返回处理后的数据。但这不是这篇文章的重点,这篇文章主要讲讲对于大中小项目,是如何使用nginx来实现静动分离,提高服务器的并发性能,所以本质上讲,这是一篇关于静态资源和动态资源如何部署的文章。当你所在的项目遇到访问瓶颈的时候,希望这篇文章能对你有所启发。

这是上篇文章介绍的nginx和tomcat的区别的,大家可以再看一下:
虽然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是如何处理,然后影响给客户端的。

  1. 首先找到服务器上nginx的配置文件的位置
    可以通过 whereis nginx 命令来查找,一般在/etc/nginx/nginx.conf

  2. 打开配置文件vim nginx.conf,找到http区块,所以nginx相关的配置均在此处设置。

  3. 找到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
    }
}
  1. 如何访问一台服务器上的静态资源和动态资源
    关于Nginx 收到一个请求时,它是如何去匹配 URI 并找到合适的 Location 请看这篇文章
    https://www.cnblogs.com/cheyunhua/p/7927674.html
    先简单介绍一下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;
        }
    }

}
  1. 总结。我们通过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资源,这样就可以处理更多的请求,提高系统的并发能力。

你可能感兴趣的:(2[服务器篇]nginx和tomcat的区别是什么?)