nginx部署发布Vite项目
1 引言
在之前的文章《Ubuntu云服务器上部署发布Vite项目》中笔者使用了Vite提供的预览服务(npm run preview)来在云服务器上发布Web应用。这样做轻量应用是没问题的,不过遇到一些专业的问题就不行了,最好还是使用专业的HTTP服务器。除此之外,笔者还有一些其他的需求:
- 前后端分离的项目,需要将后端的服务转发到前端服务IP相同的端口(443端口)。
- 子域名的项目,需要将服务转发到主域名服务IP相同的端口(443端口)。
这个时候就需要使用nginx,毕竟nginx不仅是一款轻量、高性能的HTTP服务器,还支持转发和代理服务功能。不过上述两个问题后面在讨论,本篇就详细记录一下部署发布单个Vite项目的问题。
2 详述
2.1 操作
首先,还是需要先安装nginx:
sudo apt install nginx
然后,准备Vite项目,需要确保项目已经通过npm run build构建好,并且生成了静态文件目录(通常是dist目录下)。
接下来,在/etc/nginx/sites-available/目录下创建一个新的配置文件,例如笔者这里创建一个charlee44文件。在这个文件中填入如下内容:
server { # 定义服务器
listen 80; # 监听80端口
server_name charlee44.com; # 服务器域名
root /path/to/your/project/dist; # 项目build后的实际路径
index index.html; # 主页
location / { #位置块,定义路由
try_files $uri $uri/ /index.html;
}
}
sites-available目录下创建的配置是可用的配置,要真正启用这个配置需要在sites-enabled目录中,因此创建软链接:
sudo ln -s /etc/nginx/sites-available/charlee44 /etc/nginx/sites-enabled/
最后就是测试Nginx配置并重启服务,在终端输入以下命令:
sudo nginx -t
sudo systemctl restart nginx
2.2 配置
上面的配置很好理解,基本已经注释清楚了,就是位置块部分有点难理解,具体意思是:
- $uri:先看看有没有和请求路径完全一致的文件存在,比如 /about.html
- $uri/:如果没有,再看看是否是一个目录,比如 /about/
- 如果都没有,就返回 /index.html
不太理解也没关系,等以后有需求了再来了解清楚。如果这个配置测试没有问题,在访问主页时页面提示:
500 Internal Server Error
nginx/1.18.0 (Ubuntu)
那么有可能是权限不够,可以检查一下文件/var/log/nginx/error.log是否有类似“Permission denied”的提示。Ubuntu中有些目录是受保护的目录(例如/root目录),可以将build项目移动到nginx可以正常访问的目录,例如/var下目录。
如果想配置HTTPS服务,那么就可以使用如下配置:
# HTTP 跳转 HTTPS
server {
listen 80;
server_name charlee44.com;
return 301 https://$host$request_uri; # 返回301永久重定向,将请求跳转到HTTPS版本
}
# HTTPS 服务
server {
listen 443 ssl;
server_name charlee44.com;
# SSL证书
ssl_certificate /etc/nginx/ssl/charlee44.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/charlee44.com/charlee44.com.key;
ssl_protocols TLSv1.2 TLSv1.3; # 启用安全的加密协议版本
ssl_ciphers HIGH:!aNULL:!MD5; # 设置加密套件,禁用不安全的算法
root /var/www/charlee44.com;
index index.html;
location / {
try_files $uri $uri/ =404; # 尝试查找对应文件或目录,否则返回404页面
}
}
这段配置的意思是如果用户通过HTTP访问网站,那么就将请求转发到HTTPS的443端口上。另外,HTTPS最重要的一点还有需要申请SSL证书(可以参考笔者之前的文章《在Ubuntu上使用Certbot申请Let’s Encrypt SSL证书》来进行申请)。
2.3 优化
上述HTTPS服务的配置,经过笔者的实际测试,性能比不上Vite提供的预览服务(npm run preview)。原因是因为nginx是高度可配,还有很多优化选项可以配置,具体配置如下:
# HTTP 跳转 HTTPS
server {
listen 80;
server_name charlee44.com;
return 301 https://$host$request_uri;
}
# HTTPS 服务
server {
listen 443 ssl http2; # 启用 HTTP/2
server_name charlee44.com;
ssl_certificate /etc/letsencrypt/live/charlee44.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/charlee44.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /var/www/charlee44.com;
index index.html;
# 静态资源缓存 + Cache-Control
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires max;
add_header Cache-Control "public, immutable";
log_not_found off;
}
# HTML 文件缓存短一些(可选)
location ~ \.html$ {
expires 1h;
}
# 默认处理入口
location / {
try_files $uri $uri/ =404;
}
# 启用 Gzip 压缩
gzip on;
gzip_types application/javascript text/css;
gzip_comp_level 6;
# 提升文件传输效率
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
相比之前的配置,在性能上主要优化了以下几点:
2.3.1 启用HTTP/2
使用HTTP/2协议可以实现多路复用、头部压缩等特性,显著提升加载速度:
listen 443 ssl http2; # 启用 HTTP/2
2.3.2 静态资源缓存控制
设置浏览器缓存策略,减少重复请求,加快页面加载速度:
# 静态资源缓存 + Cache-Control
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires max; # 设置些资源永不过期
add_header Cache-Control "public, immutable"; # 设置缓存策略:公开可缓存,内容不变
log_not_found off; # 不记录不存在的文件的404日志
}
# HTML 文件缓存短一些(可选)
location ~ \.html$ {
expires 1h; # HTML文件可能经常更新,设置较短缓存时间
}
2.3.3 Gzip压缩
启用Gzip并指定压缩类型,以减少传输体积,加快网页加载速度(尤其对 JS/CSS):
# 启用 Gzip 压缩
gzip on;
gzip_types application/javascript text/css;
gzip_comp_level 6; # 启用 Gzip 压缩时,使用压缩级别 6(共 1 到 9 级)
2.3.4 文件传输优化
提升网络传输效率,降低延迟,提高吞吐量:
# 提升文件传输效率
sendfile on;
tcp_nopush on; # 合并头部+正文,减少小包数量
tcp_nodelay on; # 对动态请求或 WebSocket 立即发送数据
3 结语
其实HTTP服务器的性能优化远不止这点内容,针对本篇内容的性能优化配置,笔者就可以想到两点:
- 静态资源缓存控制的性能优化是通知客户端缓存文件资源,那么是否可以在服务器上缓存文件资源到内存呢?这样当客户端请求过来,就可以不经过硬盘直接传输内存中的数据,这样可以节省一次磁盘IO。
- 启用Gzip压缩,压缩文件也是算在客户端请求响应时间的,那么是否可以预先将文件按照最高级别进行压缩,然后需要的时候再直接传输出去呢?这样可以节省临时文件的时间,同时也最大程度的减少的文件传输体积。
其实这两个问题,甚至更多的性能优化思路,nginx都有一定程度的解决方案,就留待以后再研究吧。
nginx部署发布Vite项目的更多相关文章
- Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx)
Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx) 一丶集群和Nginx反向代理 ...
- docker + nginx 部署vuejs3.0项目
1:用指令 npm run build 打包vusjs项目(该项目是在github上下载的).打包成功后会生成一个目录dist. 2:把该文件夹拷贝到腾讯云服务器(操作系统 centos7)下的/us ...
- 在eclipse中部署发布web项目 和 更改eclipseweb项目发布的路径
我的工作空间:d:workspaceweb项目名称:xxx在eclipse配置完tomcat后,发布到的路径是 d:\workspace\.metadata\.plugins\org.eclipse. ...
- 从零开始部署发布Java项目到服务器的Docker中
本以为很简单,由于没用过docker和java,本文将会阐述一路遇到的拦路虎. 首先,写好Java项目,本地跑通. 可能会遇到的问题: 1.jar包正常运行,war包404: 如何打包很多教程都有介绍 ...
- linex下部署发布web项目
准备工作:通过Xmanager远程连接linux系统,下载对应的jdk和tomcat. 1.通过Xmanager远程连接linux系统,下载地址请自己网上搜索吧. 2.下载jdk (这里为jdk-7u ...
- nginx部署web.py项目
= =测试环境直接就python index.py就好啦 生产环境nginx + web.py + uwsgi 安装uwsgi... pip install uwsgi 首先把自己的代码小改一下... ...
- Nginx部署vue多项目
server { listen 80; server_name test.hehe.com; location /riskcontrol { root /data; try_files $uri $u ...
- SpringBoot电商项目实战 — 前后端分离后的优雅部署及Nginx部署实现
在如今的SpringBoot微服务项目中,前后端分离已成为业界标准使用方式,通过使用nginx等代理方式有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构.多端化服务(多 ...
- Linux项目部署发布
Linux项目部署发布 1.部署环境准备,准备python3和虚拟环境解释器,virtualenvwrapper pip3 install -i https://pypi.douban.com/sim ...
- 详解Net Core Web Api项目与在NginX下发布
前言 本文将介绍Net Core的一些基础知识和如何NginX下发布Net Core的WebApi项目. 测试环境 操作系统:windows 10 开发工具:visual studio 2019 框架 ...
随机推荐
- Netty源码—10.Netty工具之时间轮
大纲 1.什么是时间轮 2.HashedWheelTimer是什么 3.HashedWheelTimer的使用 4.HashedWheelTimer的运行流程 5.HashedWheelTimer的核 ...
- zk基础—1.一致性原理和算法
大纲 1.分布式系统特点 2.分布式系统的理论 3.两阶段提交Two-Phase Commit(2PC) 4.三阶段提交Three-Phase Commit(3PC) 5.Paxos岛的故事来对应Zo ...
- 探秘 MySQL 索引底层原理,解锁数据库优化的关键密码(下)
上两篇文章<探秘MySQL索引底层原理,解锁数据库优化的关键密码(上)>和<探秘 MySQL 索引底层原理,解锁数据库优化的关键密码(中)>主要讲了MySQL索引的底层原理,且 ...
- 帮客户解决基于surging的物流速运网关内存泄漏问题
一.概述 有surging企业客户找到我,系统已经在线上环境运行,在使用过程中碰到内存不能释放的问题,每次都要和客户打招呼进行重启造成很坏的影响,问能不能彻底解决掉,然后我打包票可以解决,解决不了不收 ...
- Win10在WSL上使用Vivado对ZCU 102 PYNQ进行ILA调试
ZCU 102上有两个USB接口(接口信号均为micro-A),其中靠近角落的接口为jtag端口,另外一个是uart端口 vivado自带的硬件管理器通过jtag端口连接到开发板.启动开发板,连接开发 ...
- day12“函数”进阶学习让你更上一层楼
函数进阶 多函数程序执⾏流程 拆包 递归 可变和不可变类型 多函数程序执⾏流程 共用全局变量 # 1. 定义全局变量 num = 0 def test1(): global num # 修改全局变量 ...
- python读取文件夹内所有图片名称,随机设置为桌面壁纸且把设置后的图片移到其他文件夹内的方法
关键词:读取文件夹.读取文件.操作系统.设置壁纸.移动文件 预期实现如下几个步骤 1.获取指定文件夹内所有图片名 2.随机取一张图片设置为壁纸 3.设置为壁纸的图片移动到另外一个文件夹中 第一步,获取 ...
- MySQL 索引的最左前缀匹配原则是什么?
MySQL 索引的最左前缀匹配原则 最左前缀匹配原则是 MySQL 使用联合索引时的一个重要优化规则.它指的是在查询条件中,只有符合索引最左侧字段开始的连续前缀部分时,索引才能被有效利用. 1. 最左 ...
- symfony框架安全组件(security)防火墙配置
最近改了下之前用symfony做的项目,然后,突然发现防火墙失效了,简单说就是再未登录状态下居然可以访问配置了ROLE_USER.ROLE_ADMIN这些权限的路由,symfony框架很强大,但是文档 ...
- 25年初的cnvd小试
算是一个里程碑吧,第一次尝试获得cnvd证书