新手问题 [网站访问问题][已解决] 到底什么影响一个网站的访问速度呢?

somejump · 2016年06月08日 · 最后由 somejump 回复于 2016年06月12日 · 2678 次阅读

RT 租着一台外国的服务器学习网络技术,但是发现 ROR 建起来的网站访问很慢。。。 就是第一次打开一个页面卡 1min 才打开,但是这明显超过正常人的忍耐极限了。 第二次打开同一个页面就快很多。 1.这是在哪个环节出现了问题呢?图片大小?css?还是 js? 2.如果无法判断,我可以通过什么实用工具进行判断呢? 请大家不要引用术语,我可能看不懂。。。

[解决方法]

若是使用 nginx 服务器的话,需要让 rails 放弃对静态资源的管理

config.serve_static_assets = false

这样会解决很多 js/css 报错的问题

共收到 19 条回复

@somejump 楼主我们游戏的 server 是 rails 写的,服务器都在美国,api 的 resp 时间也才 300ms 左右,所以访问慢跟 ROR 没关系。其次你可以先通通过 chrome 的 debug 工具看看你访问页面的时间耗时,再者最近国内网络比较抽风,访问国外经常会很慢,但是如你所说的 1min 不至于。

#1 楼 @ailen 谢谢,我通过这个 DEBUG 工具看了一下,发现 rails 在获取几个 js 的时候花费时间大于 1s jquery.ui.widget-da1b9b310f5b48a4ef262815b8965d91.js?body=1 GET 404 script (index):41 0 B 4.49 s
jquery.iframe-transport-3d6f14f09aa72eb4e09e47e851ceb0d8.js?body=1 GET 404 script (index):42 0 B 4.57 s
jquery.fileupload-6958164ac1bf6b96d360ed7c52426bb1.js?body=1 GET 404 script (index):43 0 B 4.81 s
basic-499ed96f03a6499972f0e9f358d0a7c0.js?body=1 GET 404 script (index):44 0 B 5.37 s
tmpl-ea45f6b1f117c1f3d1578495b7ca7bca.js?body=1 GET 404 script (index):45 0 B 5.45 s
qiniu_direct_uploader-c5b052baa6c8f49526d2d2f26293f6b9.js?body=1 GET 404 script (index):46 0 B 4.92 s
home-92d23ecf60c9ec6be8cc0fe6c10064e8.js?body=1 GET 304 script (index):47 232 B 5.13 s
但是好像页面上正在运行的 js 并没有受到影响 请问 rails 是怎么处理 js 获取的? 如果有讲这方面的资料,我也乐意自学一下。

#2 楼 @somejump

默认 view 是用的这个布局,就会产生你贴出来的这些代码,如果你不需要的话就在控制器里面的方法前面写个 layout:false 

#2 楼 @somejump 另外你用的到底是啥?Linode? Digital Ocean? Heroku 还是 Amazon EC2? 第二次打开同一个页面快很多是快多少?1 秒之内能打开? 另外 F12 调出来开发者工具可以看到 Network 里载入各个资源是花了多久。

一堆的 404 不慢才怪, 有没有用 sprokect? 贴下你的 assets/javascrits/application.js 文件

可能原因:

  1. 你开启的是 development 开发模式,不是 production 模式
  2. 第一次加载的时候,会拉取这个压缩的 js、css,看你用了 jquery-file-upload 之类的一般都比较大。第二次加载的时候,就不会重新下载这些 js、css
  3. 如果行的话,用 nginx 开启压缩的模式,打开会快一些。

话说,你给的信息太少。至少得给出一页完整的日志、你的配置文件,启动的 server 等有用的信息,不怕多就怕没有啊

谢谢大家的帮助。我现在正在自学 Assets pipeline 我想问一下 rake assets:precompile 和另外一个 gem capistrano 有什么关系?二者可不可以一起用?

前者,是对 js、css 进行压缩预编译,减少 css、js 的大小以及请求 js、css 的数目;后者是 cap,自动打包发版工具,比如说,你要更新代码一般要做的事情:1 拉取分支、 2、 安装 bundle 依赖 3、对 js、css 进行压缩预编译 4、重启服务。因此,cap 是这个基本操作封装起来,有了 capistrano 这个自动化的 gem。 所以二者的关系比较明确了吧。

新加坡服务器(以前是米国),博客一直是 500ms 以内的响应时间,为了打开速度我的做法也是挺极端了

  1. 静态资源全放在国内 OSS 上,在 cap 里用加入任务,assets:precompile 完后上传生成的到文件到 OSS
  2. 使用 assets 的 gz, precompile 的 gz 压缩程度是很高的,动态压缩的话用这种程度的压缩略不现实,太耗 cpu,但是 rails 可以帮你预先压好,为什么不用呢
  3. 写好你的代码,不一定要使用缓存,但是你可以借用一些工具去发现性能到底卡在哪儿
  4. 忽略出过线路大姨妈的时候。。。。。。 每个月总有那么几天是这样的

#7 楼 @somejump assets:precompile 是网站部署前生成生产环境所需的静态资源文件,只要你使用了 Assets,这是必须要做的步骤 capistrano 是可选的,目的是帮你自动去部署网站,rails 每次手动部署的时候你需要去关心 migration 执行了没有,静态文件生成了没有,gem 包安装了没有,sidekiq 启动了没有,等等一系列事件。capistrano 就是把这些任务做成自动执行脚本,帮你去检测,帮你去执行,无论你改了什么,你的部署动作都只有一行命令

明白了,那我目前不打算再用 cap 了。我想问一下: = javascript_include_tag "home", "data-turbolinks-track" => true 这段代码写出来后,为何我再 application require 了 home 依然报错 提示是: Rails.application.config.assets.precompile += %w( home.js ) 必须要这么做么? 还有我有些晕,application.js 的生成不是把所有的 js 合并成 application-指纹.js 了么? 那为何还会有 home-指纹.js jquery-指纹.js 这些东西呢?

12楼 已删除

@somejump Rails.application.config.assets.precompile += %w( home.js ) 上面这个问题你需要在 config/initializers/assets.rb 文件中把 home.js添加进去。

#13 楼 @hww 我知道,我已经加进去了,但是我想问一下为什么要加进去? 因为我已经把 home.js 放在 assets/javascripts/文件夹下了

#4 楼 @1c7 抱歉回的晚了。用的是 linode,第二次 2800ms 即可,第一次卡一分钟

#11 楼 @somejump 你是不是跑在开发环境下,切到生产环境下 precompile 才生效呢

#17 楼 @adamshen 在开发环境下这些 css,js 都不会出现 404 的情况,毕竟我也没有使用 assets pipeline 但是在生产环境下,一些 gem 里配有的 css,js 就算我在 application.js/css 文件中 require 它们,会报错但不会影响网站 js/css 实现 比如: jquery-0ed465fbecf04ae913ca41ffdb083e24.js?body=1 GET 404 script (index):7 0 B 305 ms
jquery_ujs-90e9e71c91e43e7dad56d420bfb0f0c3.js?body=1 GET 404 script (index):8 0 B 829 ms
jquery.turbolinks-bf4145241a1f3c33ca16fcd46ca39409.js?body=1 GET 404 script (index):9 0 B 909 ms
turbolinks-3c4430349c04dd08ce7d3819bb2e7064.js?body=1 GET 404 script (index):10 0 B 909 ms
nprogress-265ad313635e9ccba89a71ddb330936e.js?body=1 GET 404 script (index):11 0 B 973 ms
nprogress-turbolinks-f33e6cee88a5842ce94cdf138ec989f2.js?body=1 GET 404 script (index):12 0 B 995 ms
这些都是 gem 提供的 js,它们能发挥作用,但是会在加载的时候报错 404,使网站访问变慢 我怀疑它们已经进入 application.js 里面了,所以功能可以实现,但是为什么会找不到呢?

#18 楼 @somejump 在生产环境经下有多个 js 说明并没有运行 precompile,你的 assets.rb 里是怎么设置的,又是运行了什么命令来进行 assert precompile 的?

#19 楼 @adamshen 谢谢你,现在我已经知道自己错在哪里了。其实我运行 precompile 了,assets.rb 里面该加的也加了。只是我的服务器是 nginx,需要设置:

config.serve_static_assets = false

因为 jquery 这些 js 理论上是不用单独进行预编译的,我也很奇怪为什么浏览器会报错但是网页 js 加载的好好的......

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册