1. 🌐 动静分离
1.1 📌 何为动静分离
Nginx 的动静分离,简单来说,就是将动态请求和静态请求分开处理。这可以理解为使用 Nginx 处理静态页面,而 Tomcat 处理动态页面。动静分离大致有两种实现方式:
- 将静态文件独立到单独的域名,并放在独立的服务器上(主流推崇的方案)。
- 动态和静态文件混合发布,通过 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 📌 测试结果
使用浏览器或其他工具测试配置的效果:
-
输入地址:
http://192.168.17.129/image/01.jpg
-
输入地址:
http://192.168.17.129/image/
(由于配置了autoindex on
,会显示目录列表) -
输入地址:
http://192.168.17.129/www/a.html
3. 📍 location
在 Nginx 中,location
用于定义如何响应不同的 URI 请求。
3.1 📌 基本匹配规则
/
:通用匹配,任何请求都会匹配到。=
:精确匹配。~
:正则匹配,区分大小写。~*
:正则匹配,不区分大小写。^~
:非正则匹配,匹配以指定模式开头的 location。
3.2 📌 匹配顺序
-
精确匹配
=
-
前缀匹配
^~
-
正则匹配
~
或~*
(按配置文件中的顺序) -
通用匹配
/
location ~*/(css|img|js) { root /usr/local/nginx/static; index index.html index.htm; }
3.3 📌 alias
与 root
的区别
在 Nginx 中,alias
和 root
都用于指定资源的物理路径,但它们在功能和使用上有所不同。下面我们详细探讨这两者的差异。
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
的注意事项
- 使用
alias
的配置块中不能使用rewrite
的break
。 alias
指定的目录路径必须以/
结尾。- 如果
location
匹配的路径不以/
结尾,那么访问的 URL 中的该路径是否以/
结尾都不会影响访问,Nginx 会自动添加/
。 - 但如果
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 或其他应用服务器处理动态页面。这种策略可以减轻服务器的压力,提高响应速度,并更好地利用资源。
📋 环境准备:
-
🚀 安装 Nginx:
sudo apt update sudo apt install nginx
-
🌐 安装应用服务器 (这里以 Tomcat 为例):
sudo apt install tomcat9 tomcat9-admin
🛠️ Nginx 配置:
-
📂 创建静态文件的目录:
sudo mkdir -p /var/www/static
将你的静态文件(例如
.jpg, .jpeg, .png, .gif, .ico, .css, .js
)复制到/var/www/static
目录。 -
🔧 配置 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; } } }
保存并关闭文件。
-
🔍 测试 Nginx 配置:
sudo nginx -t
如果一切正常,你会看到
syntax is okay
和test is successful
的消息。 -
🔄 重启 Nginx:
sudo systemctl restart nginx
🧪 最后的测试:
- 在浏览器中访问
http://www.example.com
。确保您可以看到来自 Tomcat 的动态内容。 - 尝试访问静态文件,例如
http://www.example.com/image.jpg
,确保您可以正确加载静态内容。