手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2015年10月8日的文章

转:Vagrant下共享目录静态文件(js/jpg/png等)“缓存”问题

转一篇Vargrant的相关文章【Vagrant下共享目录静态文件(js/jpg/png等)“缓存”问题】,原文来自:http://blog.smdcn.net/article/1325.html,主要是问题在于使用了sendfile可能会导致部会内容不会刷新。

原文如下:

XML/HTML代码
  1. 之前提到说通过Vagrant部署开发环境,使用目录共享模式,在本地磁盘进行开发,而通过虚拟机环境运行开发的页面。  
  2.   
  3. 是的,一切看起来都是那么的顺利,首先基于VirtualBox安装了Vagrant,接下来,按照以往部署环境的习惯,在VM中安装了nginx作为开发运行环境,并且将本地的共享目录作为nginx的web目录,然后打开页面,看上去似乎都很正常,但接下来,你发现了一个神奇的事情,你修改替换了一个css,一张图片,然后刷新浏览器,发现什么都没有变,然后你有非常猛烈、使劲的F5,依旧还是没有改变,是的,你看看编辑器,似乎替换是正常的,在看看VM上的文件,也都是对的,是的,尝试重启nginx,依旧没有任何变化,你开始怀疑php5-fpm甚至于毫不相干的memcached和mysql,但都无济于事。也不知道是什么让这些文件被“缓存”了呢。  
  4.   
  5. 当你尝试修改一个js,并且用同样的方法更新之后,会遇到类似的问题,是的,就算重启VM上任何服务,甚至重启VM,依旧没有用,当然,比起其他资源文件,浏览器的反应会强烈一些,因为浏览器会提示未知错误,而你通过浏览器查看你修改的JS文件,会看到文件尾巴有下面奇怪的随机字符:  
  6.   
  7. �����������������  
  8.   
  9. 这到底是什么东西呢?编码错误?缓存异常?又或是其他什么?  
  10.   
  11. 是的,你尝试花费很多时间,试验各种各样的方法去解决这个问题,其实对于nginx来说,你只需要修改配置文件(nginx.conf)中的一行重启就能简单的解决这个问题:  
  12.   
  13. sendfile off;  
  14. 找到 nginx.conf ,把里面的 “sendfile on” 修改为 “sendfile off”。  
  15.   
  16. 当然,如果你使用Apache也可能遇到类似的问题,那么同样也有类似的配置需要修改:  
  17.   
  18. EnableSendfile off  
  19. 关于这个问题的参照:  
  20. https://github.com/mitchellh/vagrant/issues/351#issuecomment-1339640  
  21.   
  22. http://stackoverflow.com/questions/9479117/vagrant-virtualbox-apache2-strange-cache-behaviour  

----转载完毕---

关于这个sendfile,还有人做了个测试:记vagrant nginx sendfile问题,然后居然没有人评论。。。

XML/HTML代码
  1. 从今年开始,一直在vagrant虚拟机上做开发  
  2.   
  3. 因前段时间一个项目需要调试静态文件,出现静态文件修改后,浏览器刷新不生效。  
  4.   
  5. 最后追踪到是nginx开启了sendfile这一项。。  
  6.   
  7. 具体sendfile原理可以查下,,网上写的都很详细,这里就不复述了。  
  8.   
  9. 一开始一直认为是nginx某个地方配置有问题。。但后来干脆自己写下,做下测试  
  10.   
  11. 具体代码如下(tcp那几步连接这里就不写了。网上很多):  
  12.   
  13.   
  14. /**  
  15.  * @connect tcp 连接句柄  
  16.  */  
  17. int sendClient(int connect)  
  18. {  
  19.     int fd;  
  20.     struct stat fileStat;  
  21.     off_t offset = 0;  
  22.     fd = open("/data/web/test.com/index.html", O_RDONLY|O_NONBLOCK);  
  23.     if (fd < 0) {  
  24.         perror("open file.");  
  25.         return 0;  
  26.     }  
  27.     //获取文件信息  
  28.     fstat(fd, &fileStat);  
  29.     char buffer[fileStat.st_size];  
  30.     // read(fd, buffer, fileStat.st_size);  
  31.     //write(connect, buffer, fileStat.st_size);  
  32.     sendfile(connect, fd, &offset, fileStat.st_size);  
  33.     close(fd);  
  34.     return 1;  
  35. }  
  36.   
  37. 至些我测了下,得到的还是不生效,由此可以断定,与nginx无关,与系统调度有关  
  38.   
  39. 至于问题,我现在的回答只能是vagrant的一个坑,具体是什么,我也无从得知,  
  40.   
  41. 当然, 这个我也是从表象猜测, 如果有人知道真正的原因, 还请不吝留言指教  

 

 

Tags: vagrant

升到osx EI后,brew不能使用的解决方法

 升级osx 10.11后(即osx EI),brew在使用的时候就会直接报错了。因为从10.11开始,对几个重要目录的权限苹果有了新的限制,特别是/usr目录,所以官方有一个解决方法:https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/El_Capitan_and_Homebrew.md

内容很长,如果你是第一次使用brew 就看上面的内容吧,如果你已经使用过了brew(即是从旧机器 升级上来的),你可以来一句简单的办法:

XML/HTML代码
  1. sudo chown -R $(whoami):admin /usr/local  

当然执行完后,你最好还是先用brew doctor检测一下,按照上面的提示一点点的操作,嗯,有些内容你就忽略吧,比如:

XML/HTML代码
  1. Warning: You are using OS X 10.11.  
  2. We do not provide support for this pre-release version.  
  3. You may encounter build failures or other breakage.  

如果你有自己曾经创建的链接扔在/usr/local下面,你就不用理会这一句:

XML/HTML代码
  1. Warning: You have unlinked kegs in your Cellar  
  2. Leaving kegs unlinked can lead to build-trouble and cause brews that depend on  
  3. those kegs to fail to run properly once built. Run `brew link` on these:  
  4.     make  

最后还有一个重要的,如果你用的是brew 安装的PHP,你可能还要加上这么一句:

XML/HTML代码
  1. Warning: Homebrew's sbin was not found in your PATH but you have installed  
  2. formulae that put executables in /usr/local/sbin.  
  3. Consider setting the PATH for example like so  
  4.     echo 'export PATH="/usr/local/sbin:$PATH">> ~/.bash_profile  

因为brew 将PHP的fpm 软链接到了/usr/local/sbin目录下。所以需要将它加到$PATH里面,加完后运行一下source ~/.bash_profile即可

当然,如果这也不行那也不行,别忘了运行一下:xcode-select --install

Over