Linux下Apache使用符号链接及权限问题解决
PHP程序更新是需要保留一些图片文件夹,最近处理@HFLS 2012时更新很频繁,每次都要将图片文件夹移动到新的目录下很麻烦,于是考虑为图片文件夹建立一个符号链接以方便系统更新。
首先要做的是将图片文件夹移动到其他固定位置,在本例,向上移动了两层:
- 程序代码所在文件夹路径:/path/to/program/src/r100(r100是指版本号,Kaijia习惯于在服务器上保留之前的版本,于是按文件夹来命名,当部署新版本是,只需要上传到新的文件夹,在Apache配置文件中修改一下路径即可完成)
- 图片所在文件夹路径:/path/to/program/image(在此例中假定图片文件夹的原始路径为/path/to/program/src/r100/image)
完成移动文件夹后,在代码文件夹/path/to/program/src/r100中图片文件夹的位置使用ln命令建立符号链接:
1 2 |
cd /path/to/program/src/r100 ln -s ../../image/ image |
建立完成之后,在访问图片会遇到403错误,从Apache日志中可以看到一下两种错误:
1 2 |
[error] [client IP] Symbolic link not allowed or link target not accessible: /path/to/program/src/r100/image, referer: http://yoursite.com/ [error] [client IP] (13)Permission denied: exec of '/path/to/program/image/图片名.jpg' failed, referer: http://yoursite.com/ |
这个问题主要是由于Unix权限问题和Apache安全设置造成的,解决方法是在终端中以Root权限运行:
1 |
chown www-data:www-data /path/to/program/image/ |
其中www-data是Debian系统下Apache的帐户和组,需要注意的是在这里必须同时将帐户和组修改为www-data。此步骤完成后若仍不能访问,则需要在Apache配置文件中VirtualHost段增加一句:
1 |
Options +FollowSymLinks -SymLinksIfOwnerMatch |
编辑后的VirtualHost段应该类似于:
1 2 3 4 5 |
<VirtualHost *:80> DocumentRoot /path/to/program/src/r100 ServerName 网站域名.com Options +FollowSymLinks -SymLinksIfOwnerMatch </VirtualHost> |
完成修改后运行重启一下Apache服务器就可以正常显示了,另外别忘了在自己的程序中修改文件上传的位置。
这个方法给自己开发的程序频繁的更新工作提供了很大的便利,类似的你也可以将程序的配置文件config.php符号链接化,当然这个方法只支持Linux系统,不过Windows系统下也有类似的解决方案大家可以自行搜索。
非常感谢,解决了大问题!!!