Linux里面为啥nginx要做动静分离?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux里面为啥nginx要做动静分离?相关的知识,希望对你有一定的参考价值。

在 Linux 系统中,使用nginx 做动静分离是用来提高性能和网站的可用性

动静分离的原理是将网站的静态内容(例如图像,CSS 文件和 javascript 文件)与动态内容(例如由后端 Web 应用程序生成的内容)分开存储和传输。

这样做可以提高网站的整体性能,因为它可以让您的 Web 服务器专注于处理动态内容,而另一台服务器专注于传输静态内容。这有助于减少 Web 服务器的负载,并有助于提高网站的响应速度和可用性。

除此之外,还有别的方案吗?

当然有,除了做动静分离,还有其他一些方法可以提高网站的性能和可用性。例如,可以使用内容分发网络(CDN)来传输静态内容,以减少对 Web 服务器的负载。

您还可以使用缓存来减少对后端数据库的访问,从而提高性能。

此外,您还可以使用服务器集群来扩展您的网站的处理能力,以应对高流量。

总之,要提高网站的性能和可用性,您可以根据您的具体情况来选择适合您的方案。

内容分发网络(CDN)是一种分布式网络,它将网站的内容存储在许多不同的服务器上,并从最近的服务器向用户发送内容。这与传统的网站架构不同,其中所有内容都存储在单个服务器上,并由该服务器直接向用户发送。CDN 可以提高网站的性能和可用性,因为它可以减少对单个服务器的负载,并使内容更快地传递给用户。CDN 通常用于传输静态内容,例如图像,视频和音频文件。

使用 CDN 的方式取决于您的网站架构。如果您的网站使用传统的服务器端技术(例如 php 或 ASP.NET),则可以在您的 Web 服务器上安装 CDN 插件。该插件会将您的静态内容存储在 CDN 上,并在向用户发送内容时从 CDN 获取内容。如果您的网站是基于静态网站生成器或静态托管平台构建的,则可以通过将您的内容存储在 CDN 上来启用 CDN。此外,您还可以通过配置您的域名解析记录来将流量路由到 CDN。总之,使用 CDN 的方式因您的网站架构而异,您需要根据您的具体情况来选择适合您的方法。

参考技术A 在Web服务器中,动态内容是指经常更新的内容,例如数据库中的信息或用户交互的内容。静态内容是指不经常更新的内容,例如图像、视频和音频文件。
使用nginx进行动静分离意味着将动态内容和静态内容分开处理。这可以通过将动态内容的请求转发到后端的动态服务器来实现,而将静态内容的请求直接由Nginx服务器本身处理。
这样做的好处是,可以提高Web服务器的效率和性能。动态服务器可以专注于处理动态内容的请求,而Nginx服务器可以快速处理静态内容的请求。这可以帮助提高Web服务器的并发能力,并使网站更快地加载。
此外,使用Nginx进行动静分离还可以提高网站的安全性。因为动态服务器处理的是数据库和用户交互的信息,所以可以更好地保护这些信息不被恶意访问。

什么是动静分离?

1.什么是动静分离?

将动态请求和静态请求区分访问,

2.为什么要做动静分离?

静态由Nginx处理, 动态由PHP处理或Tomcat处理....

因为Tomcat程序本身是用来处理jsp代码的,但tomcat也能处理静态资源.

tomcat本身处理静态效率不高,还会带来资源开销.

3.如何实现动静分离?

Nginx根据客户端请求的url来判断请求的是否是静态资源,如果请求的url包含jpg、png,则由Nginx处理。

如果请求的url是.php或者.jsp等等,这个时候这个请求是动态的,将转发给tomcat处理。

总结来说,Nginx是通过url来区分请求的类型,并转发给不同的服务端。

4.单机实现动静分离实战

    [root@web01 ~]# yum install java tomcat -y
?   [root@web01 ~]# mkdir /usr/share/tomcat/webapps/ROOT        -->主要站点根目录
?   [root@web01 ~]# vi /usr/share/tomcat/webapps/ROOT/index.jsp
?   <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
?   <html>

      <head>
        <title>Nginx+Tomcat</title>
      </head>

?     <body>
?         <%
?           Random rand = new Random();
?           out.println("<h2>动态资源</h2>");
?           out.println(rand.nextInt(99)+100);
?       %>

        <h2>静态图片</h2>

?       <img src="nginx.png" />
?     </body>
?   </html>
[root@web01 ~]# wget -O /usr/share/tomcat/webapps/ROOT/nginx.png http://nginx.org/nginx.png
[root@web01 ~]# systemctl start tomcat

tomcat监听在8080端口上:


#配置Nginx 
[root@web01 conf.d]# cat ds.oldxu.com.conf 
server 
    listen 80;
    server_name ds.oldxu.com;

location / 
    proxy_pass http://127.0.0.1:8080;

location ~* \.(png|gif|jpg|mp4)$ 
    root /images;
    expires 1d;


5.集群实现动静分离实战

[root@web01 conf.d]# cat ds.oldxu.com.conf 
server 
    listen 80;
    server_name ds.oldxu.com;

location / 
    proxy_pass http://127.0.0.1:8080;





[root@web02 conf.d]# cat ds.old.com.conf 
server 
    listen 80;
    server_name ds.old.com;
    location / 
    root /images;

[root@lb01 conf.d]# cat  proxy_ds.oldxu.com.conf

upstream java 
    server 172.16.1.7:8080;
 
upstream static 
    server 172.16.1.8:80;

server 
    listen 80;
    server_name ds.oldxu.com;
    location / 
        proxy_pass http://java;
        include proxy_params;
    

location ~* \.(png|gif|jpeg)$ 
    proxy_pass http://static;
    expires 2d;
    include proxy_params;


技术图片

本章课程内容大纲

1.什么是Rewrite?

Rewirte 主要实现url地址重写,以及地址跳转。
就是将用户的请求web 服务器的url地址重新修改为其他url地址的过程

2.Rewrite使用场景?

地址跳转
协议跳转
url 静态化

3.Rewrite实现原理?

4.Rewrite URL重写配置场景?

set 设置变量
if 负责语句中的判断
return 返回值或url
break 终止后续的rewrite 规则
rewrite 重定向url

5.Rewrite URL重写配置场景?

10案例

6.Rewrite URL重写falg标记?

7.Rewrite URL重写生产实践?

将用户的请求url.oldxu.com.cn跳转至url.oldxu.com/zh
将用户的请求urk.oldxu.com.cn跳转至url.oldxu.com/jp


[root@web01 conf.d]# cat url.oldxu.com.conf 
server 
    listen 80;
    server_name url.oldxu.com.cn url.oldxu.com.jp;
    

#判断
if ( $http_host ~* cn ) 
    set $language zh;

if ( $http_host ~* jp ) 
    set $language jp;


rewrite ^/$ http://url.oldxu.com/$language/;



server 
    listen 80;
    server_name url.oldxu.com;

location / 
    root /data;


if指令场景示例
根据用户的浏览器使用的语言自动判断并跳转至不同的语言界面
中国          url.oldxu.com    ---> url.oldxu.com   --->中文
english         url.oldxu.com    ---> url.oldxu.com   --->english

server 
    listen 80;
    server_name url.oldxu.com;

location / 
    if ( $http_accept_language ~* "en" ) 
        set $language en;
    
    if ( $http_accept_language ~* "zh|zh-CN" ) 
        set $language zh;
    

?   root /data/$language;



if指令场景示例

nginx过滤请求中包含a1=3526的http请求到10.16.3.5的8080端口处理

server 
    listen 80;
    server_name url.oldxu.com;

location / 
    default_type text/html;
    if ($request_uri ~* "a1=3526") 
        return 200 "https://www.jd.com";
    
    if ($request_uri ~* "git")
        return 403;
    
    if ($request_uri ~* "^/test") 
        return 302 "https://www.jd.com";
    
    if ( $http_accept_language ~* "en" ) 
        set $language en;
    
    if ( $http_accept_language ~* "zh|zh-CN" ) 
        set $language zh;
    
    root /data/$language;


return-----------------------------------

return 返回数据

1.返回code字符串
2.返回code 的状态码
3.返回url
break----------------------------------- 停止本次的操作,跳出循环

server 
    listen 80;
    server_name url.oldxu.com;
    root /code;

location / 
    rewrite /1.html /2.html 
break;
    rewrite /2.html /3.html;


location /2.html 
    rewrite /2.html /a.html;


location /3.html 
    rewrite /3.html /b.html;


 
[root@web01]# echo "1.html" >/code/1.html
[root@web01]# echo "2.html" >/code/2.html
[root@web01]# echo "3.html" >/code/3.html
[root@web01]# echo "a.html" >/code/a.html
[root@web01]# echo "b.html" >/code/b.html
 set
 if
 return
    状态码
    状态码 字符串
    状态码 URL    301 302
break
    停止后续操作:
rewrite

关键字 正则 替代内容 flag标记

Syntax: rewrite regex replacement    [flag];

跳转  :
重定向:

#flag
last            #本条规则匹配完成后,继续向下匹配新的location URI规则   (开发| 伪静态)
break           #本条规则匹配完成即终止,不再匹配后面的任何规则        (挂维护页)
redirect        #返回302临时重定向, 地址栏会显示跳转后的地址
permanent       #返回301永久重定向, 地址栏会显示跳转后的地址



中国          url.oldxu.com    ---> url.oldxu.com/zh   --->中文
english         url.oldxu.com    ---> url.oldxu.com/cn   --->english

server 
    listen 80;
    server_name url.oldxu.com;
    root /data;

set $language /default;
if ( $http_accept_language ~* zh ) 
    set $language /zh;

if ( $http_accept_language ~* en ) 
    set $language /en;

if ( $http_accept_language ~* ja ) 
    set $language /jp;


rewrite ^/$ $language;

location / 
    index index.html;


######永久维护
server 
    listen 80;
    server_name url.oldxu.com;
    root /data;
rewrite ^(.*)$ /wh.png break;
set $language /default;
if ( $http_accept_language ~* zh ) 
    set $language /zh;

if ( $http_accept_language ~* en ) 
    set $language /en;

if ( $http_accept_language ~* ja ) 
    set $language /jp;


rewrite ^/$ $language;

location / 
    index index.html;

######临时维护(jd)
    #error_page 403 404 500 502 /wh.png;
    #error_page 403 404 500 502 http://$http_host;

error_page 403 404 500 502 @temperror;
location @temperror 
        rewrite ^(.*)$ http://$http_host;


需求: 用户通过手机设备访问url.oldxu.com,跳转至url.oldxu.com/m

server 
    listen 80;
    server_name url.oldxu.com;
    root /data;

if ($http_user_agent ~* "android|iphone|ipad") 
        rewrite ^/$ /m;




需求: 用户通过手机设备访问url.oldxu.com,跳转至m.oldxu.com

server 
    listen 80;
    server_name url.oldxu.com;
    root /data;

if ($http_user_agent ~* "android|iphone|ipad") 
    rewrite ^/$  http://m.oldxu.com;



server 
    listen 80;
    server_name m.oldxu.com;
    root /data/m;
    

location / 
    index index.html;


#需求: 用户访问oldxu.com/test,跳转至https://xuliangwei.com
    
location------------------------------------------------------------------
        location /test 
                #rewrite ^(.*)$ https://www.xuliangwei.com/;
                return 302 https://www.xuliangwei.com/;
        
if ------------------------------------------------------------------------
    server 
        listen 80;
        server_name url.oldxu.com;
        root /data;

?   if ($request_uri ~* "^/test") 
?       #rewrite ^(.*)$ https://www.xuliangwei.com/;
?       return 302 https://www.xuliangwei.com/;
?   
?   location / 
?       index index.html;
?   

3.rewrite场景示例: 开发

需求: 用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html
[root@web01 conf.d]# cat url.oldxu.com.conf 
server 
    listen 80;
    server_name url.oldxu.com;
    root /data;
    location /  
        index index.html;
                #用户访问的url       #文件真实位置
        rewrite ^/(.*)-(.*)-(.*)-(.*).html /$1/$2/$3/$4/$1_$4.html;
    

flag
1.动静分离?
2.单台动静分离?
3.集群动静分离?
4.Rewrite
set
if
return URL跳转 运维
rewrite 改写URL 开发
flag:
redirect
permanent
last
break

以上是关于Linux里面为啥nginx要做动静分离?的主要内容,如果未能解决你的问题,请参考以下文章

什么是动静分离?

详述Linux系统中搭建Nginx动静分离

动静分离-nginxRewrite-set与if使用场景.

nginx动静分离

linux+apache+nginx实现,反向代理动静分离

Nginx动静分离