1、Nginx中location应用实例
location主要用于对URL进行匹配。 location支持正则表达式匹配,也支持条件判断匹配。
以下这段设置是通过location指令来对网页URL进行分析处理,所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给nginx处理。
location ~ ..(gif|jpg|jpeg|png|bmp|swf)$ { root /data/wwwroot/www.ixdba.net; }
以下这段设置是将upload和html下的所有文件都交给nginx来处理,需要注意的是,upload和html目录是在/data/wwwroot/www.ixdba.net目录下的一个子目录。
location ~ ^/(upload|html)/ { root /data/wwwroot/www.ixdba.net; }
在下面这段设置中,location是对此虚拟主机下动态网页的过滤处理,也就是将所有以.jsp为后缀的文件都交给本机的8080端口处理。
location ~ ..jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}
好的,我来逐条详解你给出的这三个 Nginx location 配置实例,帮你彻底理解每个配置的作用和原理。
实例一:静态文件处理
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /data/wwwroot/www.ixdba.net;
}
1. 匹配规则解析
| 部分 | 含义 |
|---|---|
~ | 表示区分大小写的正则表达式匹配 |
.* | 匹配任意字符任意次数(0次或多次) |
\. | 转义的点号,匹配真正的 . |
(gif|jpg|jpeg|png|bmp|swf) | 分组匹配,匹配括号内列出的任意一种文件后缀 |
$ | 锚定行尾,表示必须以这些后缀结尾 |
实际匹配的 URL 示例:
/images/logo.gif/upload/photo.jpg/static/background.png/flash/banner.swf/image.jpg?size=large(有查询参数,但后缀仍匹配)
不匹配的示例:
/index.html(后缀不在列表中)
2. 处理逻辑
当用户访问一个以这些后缀结尾的文件时,Nginx 会:
- 匹配到这个 location
- 使用
root指定的目录作为根目录 - 将请求的 URI 拼接到 root 后面,查找文件
例如:请求 /images/logo.gif → 实际文件路径 /data/wwwroot/www.ixdba.net/images/logo.gif
3. 作用
静态文件加速。这些图片、Flash 文件不需要后端处理,Nginx 直接读取文件返回,性能极高。这是典型的动静分离配置的一部分。
实例二:特定目录处理
location ~ ^/(upload|html)/ {
root /data/wwwroot/www.ixdba.net;
}
1. 匹配规则解析
| 部分 | 含义 |
|---|---|
~ | 正则匹配 |
^/ | 以 / 开头 |
(upload|html) | 匹配 upload 或 html 这两个目录名 |
/ | 目录后的斜杠 |
实际匹配的 URL 示例:
/upload/avatar.jpg/upload/2023/01/file.pdf/html/index.html/html/css/style.css
不匹配的示例:
/uploadfile.php(不是目录,而是文件)/images/logo.gif(目录不匹配)
2. 处理逻辑
这个配置匹配的是以 /upload/ 或 /html/ 开头的所有请求,不管后面是什么路径。
例如:请求 /html/css/style.css → 实际文件路径 /data/wwwroot/www.ixdba.net/html/css/style.css
3. 作用
指定目录的统一处理。通常用于:
- 用户上传文件目录(
/upload/) - 静态页面目录(
/html/) - 防止这些目录的请求被错误地转发到后端
实例三:动态请求转发
location ~ .*\.jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}
1. 匹配规则解析
| 部分 | 含义 |
|---|---|
~ | 正则匹配 |
.* | 匹配任意字符任意次数 |
\.jsp$ | 以 .jsp 结尾 |
实际匹配的 URL 示例:
/index.jsp/user/login.jsp/admin/index.jsp?action=list
2. 处理逻辑
当用户访问 JSP 文件时,Nginx 知道自己处理不了(它不懂 Java),所以通过 proxy_pass 把请求转发给后端 Tomcat 处理。
流程:
用户请求 /index.jsp
↓
Nginx 匹配到 .jsp$ location
↓
proxy_pass http://localhost:8080
↓
Nginx 将请求转发给本机的 8080 端口(Tomcat)
↓
Tomcat 处理 JSP,返回 HTML
↓
Nginx 把结果返回给用户
3. index index.jsp; 的作用
当用户访问一个目录(如 /user/)且该目录下有 index.jsp 时,Nginx 会自动在后面补上 index.jsp,然后转发给 Tomcat。
4. 作用
动静分离的核心:
- 静态文件(图片、CSS、JS)→ Nginx 直接处理
- 动态请求(JSP、PHP)→ 转发给后端应用服务器
这样既利用了 Nginx 的高性能处理静态文件,又把复杂的动态处理交给专门的服务器。
三个配置的关系
这三个 location 通常出现在同一个 server 块中,共同构成一个完整的站点配置:
server {
listen 80;
server_name www.ixdba.net;
root /data/wwwroot/www.ixdba.net;
# 静态文件(图片、Flash)
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /data/wwwroot/www.ixdba.net;
expires 30d; # 可以加上缓存时间
}
# 特定目录(上传文件、静态HTML)
location ~ ^/(upload|html)/ {
root /data/wwwroot/www.ixdba.net;
}
# JSP 动态请求转发给 Tomcat
location ~ .*\.jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 其他请求(可能也转发给 Tomcat 或者返回 404)
location / {
try_files $uri $uri/ /index.jsp;
}
}
总结
| 配置 | 匹配目标 | 处理方式 | 作用 |
|---|---|---|---|
| 实例一 | 图片、Flash 文件 | Nginx 直接读取文件 | 静态文件加速 |
| 实例二 | /upload/ 和 /html/ 目录 | Nginx 直接读取文件 | 指定目录的静态处理 |
| 实例三 | .jsp 文件 | 转发给 Tomcat | 动态请求处理 |
这就是 Nginx 作为动静分离反向代理服务器的典型配置模式。
发表回复