Nginx 11月前

Nginx 单页应用配置详解

作者头像 刘宇帅
2003 0

在现代 Web 开发中,单页应用(SPA)架构越来越常见,如 Vue、React、Angular 等前端框架都会生成一套静态资源,用于构建完整的前端页面。而 Nginx 则是部署这类应用最常见、最轻量、最稳定的 Web 服务器之一。

本文将详细讲解如何使用 Nginx 部署和配置单页应用,并解决常见问题如刷新 404、前后端分离跨域、缓存配置等。

目录

一、什么是单页应用(SPA)

单页应用(Single Page Application)指的是前端页面在首次加载后,页面不会整体刷新,所有页面切换都通过前端 JavaScript 动态完成,页面结构由路由管理,数据通过 Ajax 异步加载。

常见的 SPA 构建工具包括:

  • Vue + Vue Router
  • React + React Router
  • Angular

构建完成后通常会输出一套静态文件(如 index.htmlapp.jschunk-vendors.js 等),这些文件需要部署到 Web 服务上供浏览器访问。

二、Nginx 作为静态服务器的作用

Nginx 是一款高性能 Web 服务器,天然适合部署静态内容,特点包括:

  • 支持高并发、资源占用低
  • 配置简单,适配各类路径和 MIME 类型
  • 可配合缓存、Gzip、反向代理等功能增强前端性能
  • 非常适合构建 CDN 或内网部署方案

对于单页应用,我们只需让 Nginx 返回正确的 index.html 和静态资源即可。

三、基本部署配置

假设你的构建目录为 dist/,使用如下基本配置即可部署:

server {
    listen 80;
    server_name example.com;

    root /usr/share/nginx/html/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

说明:

  • root 指向构建产物目录;
  • index 指定默认首页;
  • try_files 是关键,表示“如果找不到文件就回退到 index.html”,适配前端路由跳转。

四、防止刷新 404 的 history 路由兼容

前端框架的 history 模式路由,在直接访问二级路径时如 /user/about,Nginx 会尝试找一个 user/index.html/about.html 文件,导致 404。

因此必须配置:

location / {
    try_files $uri $uri/ /index.html;
}

这样,所有未匹配文件的路径都会自动返回 index.html,由前端框架接管路由。

五、跨域请求处理(前后端分离)

如果你的接口是分离部署的,比如前端跑在 example.com,后端在 api.example.com,则需要配置反向代理 + CORS 头。

示例:

location /api/ {
    proxy_pass http://api.example.com;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}

对于 OPTIONS 预检请求,也可返回 204:

if ($request_method = 'OPTIONS') {
    return 204;
}

六、缓存优化配置

为了加速加载和减少带宽,可以配置缓存头和压缩:

location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff2?)$ {
    expires 30d;
    access_log off;
    add_header Cache-Control "public";
}

开启 Gzip:

gzip on;
gzip_types text/css application/javascript application/json application/xml;
gzip_min_length 1k;

七、完整配置示例

这是一个适用于 Vue/React 应用的 Nginx 全配置示例:

server {
    listen 80;
    server_name www.example.com;

    root /usr/share/nginx/html/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        proxy_pass http://api.example.com;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods GET, POST, OPTIONS;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff2?)$ {
        expires 30d;
        access_log off;
        add_header Cache-Control "public";
    }

    gzip on;
    gzip_types text/plain application/javascript text/css application/json;
    gzip_min_length 1k;
}

总结

部署单页应用时,Nginx 提供了高效、灵活的解决方案。只需配置正确的资源目录、静态路由处理和前后端联调代理,就可以实现一个完整的 SPA 部署环境。

建议同时结合缓存策略与压缩技术,进一步提升访问速度和用户体验。

作者头像

刘宇帅

非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。

提示

功能待开通!


暂无评论~

相关文章

浏览器报错 net::ERR_INCOMPLETE_CHUNKED_ENCODING

nginx服务器返回200但是浏览器报错 net::ERR_INCOMPLETE_CHUNKED_ENCODING 原因是nginx在获得后端服务器返回数据时,数据过大需要存在临时文件中,但是当前运行nginx用户,没有该文件的读写权限 导致的。 如何证实 可以查看nginx的日志,会有以下类似错误 2018/03/22 16:11:35 [crit] 9519#0: *339625 open() "/var/lib/nginx/tmp/fastcgi/5/02/0000000025" failed 很明显,nginx无法写/var/lib/nginx/tmp/fastcgi/5/02/000

Nginx 路由匹配

模式 含义 location = /uri = 表示精确匹配只有完全相等才会匹配成功 location ^~ /uri ^~ 表示对路由进行前缀匹配 location ~ /uri ~ 表示对路由进行正则匹配 location ~* /uri ~* 表示对路由进行不区分大小写的正则匹配 location /uri 不带任何修饰符也表示前缀匹配 location / 默认匹配,任何没有匹配到的uri 多个 location 配置的情况下匹配顺序为(匹配到某一等级就结束,同一规则时匹配长度长的优先): 首先精确匹配 = 其次前缀匹配 ^~ 其次是按文件中顺

Nginx日志配置推荐

推荐日志配置 log_format main 'remote_addr=[$remote_addr] http_x_forward=[$http_x_forwarded_for] time=[$time_local] request=[$request] ' 'status=[$status] byte=[$bytes_sent] elapsed=[$request_time] upstream_connect_time=[$upstream_connect_time] upstream_response_time=[$upstream_response_time] '

Nginx 反向代理常见问题汇总与解决方案

在使用 Nginx 做反向代理时,经常会遇到一些看似莫名其妙的问题,比如返回 502 错误、路径出错、真实 IP 丢失等等。本文总结了开发和部署中最常见的 Nginx 反向代理问题,并给出对应的排查和解决方案,帮助你快速定位和修复问题。 目录 一、502 Bad Gateway 二、路径拼接异常 三、获取不到真实客户端-IP 四、跨域请求失败 五、WebSocket 无法正常工作 六、请求体过大导致-413-错误 七、反向代理跳转失效 八、HTTPS-代理配置问题 九、文件下载异常或中断 十、缓存未生效或生效异常 总结 一、502 Bad Gateway 这个错误意味着 Nginx 无法成

Nginx 四层最佳配置

stream { log_format proxy 'time=[$time_local] remote_addr=[$remote_addr]' ' protocol=[$protocol] status=[$status] byte_send=[$bytes_sent] byte_received=[$bytes_received] ' 'session_time=[$session_time] upstream_addr=[$upstream_addr] ' 'upstream_