Ubuntu服务器权限问题:开放文件夹权限及Apache 403报错排查
这个得分两种情况来看哦——毕竟你说的“所有用户”可能是指服务器上本地登录的用户,也可能是通过网页访问的在线客户端,两者的处理方式不太一样:
给所有系统本地用户开权限
如果是让服务器上所有本地登录的用户都能读写某个文件夹,可以这么操作:
- 先建一个共享用户组,比如叫
sharedgroup:sudo groupadd sharedgroup - 把需要访问的用户都加到这个组里(替换
username为实际用户名,多个用户用空格分开就行):sudo usermod -aG sharedgroup username1 username2 - 把目标文件夹的组改成
sharedgroup,再给组设置读写执行权限:sudo chgrp -R sharedgroup /path/to/your/folder sudo chmod -R g+rwx /path/to/your/folder - 还可以设置
setgid位,这样以后在这个文件夹里新建的文件会自动继承这个组的权限,不用每次都改:sudo chmod g+s /path/to/your/folder
给在线Web客户端(比如Apache/Nginx访问)开权限
如果是让通过网页访问的用户能用到这个文件夹,重点是要让Web服务的用户(Apache默认是www-data)拥有相应权限:
- 先确认下Web服务的用户是谁(Apache的话一般就是
www-data,可以用这个命令验证):ps aux | grep apache - 两种方法选一个就行:
方法1:直接把文件夹的所有者改成www-data:
方法2:把文件夹的组改成sudo chown -R www-data:www-data /path/to/your/folderwww-data,再给组开读写执行权限:sudo chgrp -R www-data /path/to/your/folder sudo chmod -R g+rwx /path/to/your/folder - 提醒一句:别随便用
777权限,这等于给所有用户开了最高权限,非常不安全,尽量用上面的方法精准控制权限。
遇到这种777都解决不了的403错误,大概率不是文件本身的权限问题,而是Apache的配置或者系统层面的限制,我给你列几个最容易遗漏的点:
1. Apache的目录配置没开访问权限
Apache默认可能没允许访问这个websockets目录,你得去配置文件里加规则:
- 打开你的站点配置文件(一般在
/etc/apache2/sites-available/你的站点名.conf),添加或者修改这段配置:<Directory /var/www/html/websockets> Options Indexes FollowSymLinks MultiViews AllowOverride All Require all granted </Directory> - 保存后重启Apache生效:
要是你的Apache版本比较老,可能得把sudo systemctl restart apache2Require all granted换成Allow from all。
2. SELinux在搞事情(如果开启了的话)
Ubuntu默认SELinux是关闭的,但如果你手动开过,它会阻止Apache访问目录。可以先临时关了测试下:
sudo setenforce 0
要是关了之后能访问了,就给这个目录加SELinux规则:
sudo chcon -R -t httpd_sys_content_t /var/www/html/websockets
3. 文件夹里没索引文件,且Apache禁止目录列表
如果你的websockets文件夹里没有index.html、index.php这类索引文件,而Apache又没开目录列表权限,就会返回403。解决方法二选一:
- 要么在文件夹里放一个索引文件;
- 要么在刚才的
Directory配置里加上Indexes(比如Options Indexes FollowSymLinks)。
4. 符号链接的限制
如果websockets是个符号链接(软链接),指向了其他目录,Apache默认可能不让访问链接的目标。你需要在Directory配置里加上FollowSymLinks,或者在全局配置里开启AllowSymLinksIfOwnerMatch。
5. 父目录的权限不够
哪怕websockets文件夹权限是777,如果它的父目录(比如/var/www/html)不让www-data用户读取和执行,Apache照样访问不了。可以用这个命令检查父目录权限:
ls -ld /var/www/html
确保www-data用户对父目录有rx权限(权限至少是755)。
内容的提问来源于stack exchange,提问作者Herbalvegetable

