Nginx 动静分离是一种常见性能优化技术,Nginx动静分离架构可以更好的提升性能@mikechen
Nginx动静分离
动静分离是一种优化应用性能、和可伸缩性的架构策略。
Nginx动静分离,核心思想是将 Web 应用中的动态资源、和静态资源分开部署和管理。
并通过 Web 服务器(通常是 Nginx)进行智能的请求分发,如下图所示:
在动静分离架构中,Nginx 作为前置的 反向代理服务器 + 静态资源服务器,具有如下职责:
拦截静态资源请求,直接读取本地文件并响应(高性能、无 I/O 等待);
转发动态请求 到后端应用服务器(如 Tomcat、PHP-FPM、Node.js)处理业务逻辑。
通过动静分离,我们可以将不同类型的请求交给最擅长处理它们的服务器,从而提高整体的效率和可维护性。
Nginx动静分离架构
整体架构,如下图所示:
对于静态资源请求,可以配置 Nginx 直接从本地文件系统(Nginx 服务器所在的磁盘),读取并返回给客户端。
也可以配置 Nginx 将请求,反向代理到专门的静态资源服务器(例如另一台 Nginx 服务器)、或内容分发网络 (CDN)。
对于动态资源请求,Nginx 将请求反向代理到后端的动态应用服务器集群(例如运行 PHP-FPM、Tomcat…等的服务器)。
- ┌────────────┐
- │ 客户端 │
- └────┬───────┘
- │
- ┌─────▼─────┐
- │ Nginx │
- └────┬──────┘
- ┌───────┼────────┐
- │ │
- ┌───────▼──────┐ ┌──────▼──────┐
- │ 静态资源服务器 │ │ 动态应用服务 │
- │ (如OSS/CDN) │ │ (如Tomcat) │
- └──────────────┘ └─────────────┘
Nginx 动静分离核心就三步:
收请求: Nginx 接收用户请求;
分类型: Nginx 根据 URI 判断是静态资源(如图片、CSS、JS)还是动态请求(如 PHP 页面)。
导向处理,静态资源,Nginx 自己处理(读取本地文件)或转发给专门的静态资源服务器/CDN。
动态请求, Nginx 转发给后端的应用服务器(如 Tomcat。。。等等)。
整体配置,如下:
- server {
- listen 80;
- server_name www.example.com;
- # 静态资源处理
- location ~* \.(jpg|jpeg|png|gif|css|js|ico|html|woff|ttf)$ {
- root /var/www/static;
- expires 7d;
- }
- # 动态请求代理后端
- location / {
- proxy_pass http://127.0.0.1:8080;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- }
- }
通常,对于大型高并发的 Web 应用,结合使用 CDN 和专门的静态资源服务器是更优的选择。