AI 中文社区(简称 AI 中文社),是国内学习交流AI人工智能技术的中文社区网站,这里可获取及贡献任何AI人工智能技术,我们追求自由、简洁、纯粹、分享的多元化人工智能社区。
在网站应用中 Rust Axum 怎么优雅地处理静态文件
网站应用的静态文件,在生产环境,强烈推荐使用 nignx 来代理处理。如果在开发阶段,采用本地来处理静态文件,是很有必要的,而且要求本地 URL 要和 nginx 代理的 URL 保持一致,上线的时候,无需做大的改动。Rust 开发网站应用目前国内还比较少,很少有 axum 处理静态文件相关的说明,即使有,文档也是有些年月,已经失效不能用了,在 Rust 世界里,众所周知它的 API 不算稳定,造成了第三方库的使用也存在同样的问题。
以下是正题
原来以为 axum 处理静态文件很复杂,经过查阅一些文档之后,原来一行代码就搞定了,以下是 axum 处理静态文件的代码:
use crate::controllers::controller;
use axum::{routing::get, Router};
use tower_http::services::ServeDir;
pub fn new_router() -> Router {
let root_router = Router::new()
.route("/index", post(controller::index))
// 一行代码处理静态文件
.nest_service("/static", ServeDir::new("./static"));
root_router
}
备注:.nest_service("/static", ServeDir::new("./static")) 是关键代码,是不是非常简单,我们把静态文件放在根目录 static 下,static 里面一般有 css js images 相关的几个静态文件夹,以上的代码是路由器构建部分,只需增加一行代码,就可以处理网站应用的静态文件了,访问静态文件如下:
http://localhost:30001/static/images/abc.png
http://localhost:30001/static/css/style.css
http://localhost:30001/static/js/script.js
以下是扩展话题
生产环境不建议使用 axum 来处理,因为考虑到性能和文件负载的问题,我们还是建议通过 nginx 代理来处理,这样性能有保证(可以增加缓存),而且独立扩展性更加符合生成环境的要求(后期可以增加 CDN),以下是 nginx 代理网站应用静态文件的部分配置。
server {
listen 443 ssl http2;
server_name www.domain.com domain.com;
ssl_certificate /var/www/website/ssl/domain.com_bundle.pem;
ssl_certificate_key /var/www/website/ssl/domain.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
# domain.com 跳转到 www.domain.com
if ($host = 'domain.com') {
rewrite ^/(.*)$ https://www.domain.com/$1 permanent;
}
location / {
proxy_pass http://localhost:3005;
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-Proto https;
}
# nginx 处理网站应用的静态文件
location /static {
root /var/www/website/;
expires 30d;
add_header Cache-Control public;
access_log off;
}
}
备注:/var/www/website/ 是网站的根目录,其中 static 静态文件夹在根目录下。生产环境,如果使用 nginx 处理了静态文件,就需要把 axum 项目处理静态文件的那行代码 .nest_service("/static", ServeDir::new("./static"))
去掉。如果想灵活处理,可以设定 dev、test、prod 三种环境配置文件,不同的环境下,决定是否需要 axum 本地处理静态文件。
游客
- 一字一句需斟酌,一言一语显风范。
- 评论消耗5积分,点赞、收藏消耗3积分。