Nginx 动静分离


1. 🌐 动静分离

1.1 📌 何为动静分离

Nginx 的动静分离,简单来说,就是将动态请求和静态请求分开处理。这可以理解为使用 Nginx 处理静态页面,而 Tomcat 处理动态页面。动静分离大致有两种实现方式:

  1. 将静态文件独立到单独的域名,并放在独立的服务器上(主流推崇的方案)。
  2. 动态和静态文件混合发布,通过 Nginx 来分开。

使用 location 指定不同的后缀名可以实现不同的请求转发。通过 expires 参数可以设置浏览器缓存文件的过期时间,减少与服务器之间的请求和流量。

在这里插入图片描述

1.2 📌 动静分离目的

动静分离的主要目的是加快网站的解析速度。通过将动态页面和静态页面交给不同的服务器来解析,提高请求的访问效率,并降低原来单个服务器的压力。


2. 🔧 如何配置

2.1 📌 资源准备

在这里插入图片描述

2.2 📌 进行 Nginx 配置

首先,定位到 Nginx 的安装目录,并打开 /conf/nginx.conf 配置文件:

http {
	……

	server {
		listen       80;
		server_name  192.168.17.129;

		location /www/ {
			root	/data/;
			index	index.html index.htm;
		}
		
		location /image/ {
			root	/data/;
			autoindex	on; // 列出访问目录
		}
	}
}

以上配置意味着:

  • 当请求以 /www/ 开始时,资源会在 /data/ 目录下查找。
  • 当请求以 /image/ 开始时,资源会在 /data/ 目录下查找,同时列出该目录下的所有文件。

2.3 📌 测试结果

使用浏览器或其他工具测试配置的效果:

  1. 输入地址:http://192.168.17.129/image/01.jpg

    在这里插入图片描述

  2. 输入地址:http://192.168.17.129/image/ (由于配置了 autoindex on,会显示目录列表)

    在这里插入图片描述

  3. 输入地址:http://192.168.17.129/www/a.html

    在这里插入图片描述


3. 📍 location

在 Nginx 中,location 用于定义如何响应不同的 URI 请求。

3.1 📌 基本匹配规则

  • /:通用匹配,任何请求都会匹配到。
  • =:精确匹配。
  • ~:正则匹配,区分大小写。
  • ~*:正则匹配,不区分大小写。
  • ^~:非正则匹配,匹配以指定模式开头的 location。

3.2 📌 匹配顺序

  1. 精确匹配 =

  2. 前缀匹配 ^~

  3. 正则匹配 ~~*(按配置文件中的顺序)

  4. 通用匹配 /

    location ~*/(css|img|js) {
        root /usr/local/nginx/static;
        index index.html index.htm;
    }
    

3.3 📌 aliasroot 的区别

在 Nginx 中,aliasroot 都用于指定资源的物理路径,但它们在功能和使用上有所不同。下面我们详细探讨这两者的差异。

location /css {
    alias /usr/local/nginx/static/css;
    index index.html index.htm;
}

🌲 root 的定义与用法

  • 📌 定义root 用于设定一个基础目录。

  • 📍 行为:当使用 root 时,location 匹配的路径将会被添加到所指定的目录后。

    例如:如果设置为 root /data; 并请求 /images/photo.jpg,Nginx 会尝试提供 /data/images/photo.jpg


📂 alias 的定义与用法

  • 📌 定义alias 指定了一个精确的目录路径。

  • 📍 行为:与 root 不同,使用 alias 时,location 匹配的路径会被添加到 alias 指定的路径后。

    例如:设置为 location /images/ { alias /data/photos/; } 并请求 /images/photo.jpg,Nginx 会提供 /data/photos/photo.jpg


🚫 关于 alias 的注意事项

  1. 使用 alias 的配置块中不能使用 rewritebreak
  2. alias 指定的目录路径必须/ 结尾。
  3. 如果 location 匹配的路径不以 / 结尾,那么访问的 URL 中的该路径是否以 / 结尾都不会影响访问,Nginx 会自动添加 /
  4. 但如果 location 匹配的路径以 / 结尾,那么访问的 URL 中的该路径必须也要以 / 结尾。否则,访问会失败。

💡 总结

  • 对于 root,无论 location 匹配的路径后面是否有 /,都不会影响访问。
  • alias 提供了更精确的路径配置,但使用时要特别注意上述的规则。

4. 🔄 UrlRewrite 路径重写

rewrite 是 Nginx 中用于实现 URL 重写的关键指令。

4.1 📌 基本语法

rewrite <regex> <replacement> [flag];
  • <regex>:正则表达式用于匹配 URL。
  • <replacement>:替换 URL。
  • [flag]:标志。

4.2 📌 标志

  • last:完成该规则后,继续查找下一个匹配。
  • break:完成该规则后,停止处理。
  • redirect:返回 302 临时重定向。
  • permanent:返回 301 永久重定向。

4.3 📌 示例

假设您希望将所有 0-9.html 的请求路径重写为 /index.jsp?pageNum=1

rewrite ^/([0-9]+).html /index.jsp?pageNum=1 break;

此配置将匹配任何数字.html 的请求,并将其重写为指定的 URL。


5. 📊 动静分离指南

动静分离是一种常用的 Web 服务器优化策略,旨在加快网站的解析速度。简单来说,它是将动态请求和静态请求分开处理,例如使用 Nginx 处理静态页面,而使用 Tomcat 或其他应用服务器处理动态页面。这种策略可以减轻服务器的压力,提高响应速度,并更好地利用资源。


📋 环境准备:

  1. 🚀 安装 Nginx:

    sudo apt update
    sudo apt install nginx
    
  2. 🌐 安装应用服务器 (这里以 Tomcat 为例):

    sudo apt install tomcat9 tomcat9-admin
    

🛠️ Nginx 配置:

  1. 📂 创建静态文件的目录:

    sudo mkdir -p /var/www/static
    

    将你的静态文件(例如 .jpg, .jpeg, .png, .gif, .ico, .css, .js)复制到 /var/www/static 目录。

  2. 🔧 配置 Nginx:

    打开 Nginx 主配置文件:

    sudo nano /etc/nginx/nginx.conf
    

    替换或修改为以下内容:

    user www-data;
    worker_processes auto;
    pid /run/nginx.pid;
    include /etc/nginx/modules-enabled/*.conf;
    
    events {
        worker_connections 768;
    }
    
    http {
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
    
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
    
        gzip on;
        gzip_disable "msie6";
    
        server {
            listen 80;
            server_name www.example.com; # 替换为你的域名
    
            # 🖼️ 静态文件处理
            location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
                root /var/www/static;
                expires 30d;
            }
    
            # 🔄 动态内容代理到应用服务器
            location / {
                proxy_pass http://localhost:8080;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
    }
    

    保存并关闭文件。

  3. 🔍 测试 Nginx 配置:

    sudo nginx -t
    

    如果一切正常,你会看到 syntax is okaytest is successful 的消息。

  4. 🔄 重启 Nginx:

    sudo systemctl restart nginx
    

🧪 最后的测试:

  1. 在浏览器中访问 http://www.example.com。确保您可以看到来自 Tomcat 的动态内容。
  2. 尝试访问静态文件,例如 http://www.example.com/image.jpg,确保您可以正确加载静态内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yueerba126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值