几天来我一直在互联网上搜索,我认为我已经尝试了几乎所有的方法来在我的 Ubuntu 服务器上设置一些虚拟主机,但除了chmod 777
在 webroot 上之外的所有方法都失败了。
我的默认 Apache 配置指向 /home/server/public_html,其设置如下所示
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /home/server/public_html/
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /home/server/public_html/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from all
</Directory>
</VirtualHost>
然后,我为正在进行的项目创建了一个虚拟主机,例如 project.name.co.uk.conf,其中有以下内容
<VirtualHost *:80>
ServerName http://www.local.dirty-briefs.co.uk
ServerAlias local.project-name.co.uk
DocumentRoot /home/server/public_html/project-name/
DirectoryIndex index.php index.html
</VirtualHost>
然后我运行sudo a2ensite project.name.co.uk.conf
。我正在使用 samba 在 Windows 7 机器上工作以访问服务器上的文件。我将 project.name.co.uk 添加到我的 Windows Hosts 文件中,但无论我做什么,我都会收到 403 权限错误。
编辑
我想添加 Apache 错误日志的尾部,以防有用
*==> /var/log/apache2/error.log <==
[Sat Jun 11 13:22:23 2011] [error] [client 192.168.0.3] PHP Warning: require(/home/server/public_html/dirty-briefs/site/protected/config/main.php): failed to open stream: Permission denied in /home/server/public_html/dirty-briefs/framework/base/CApplication.php on line 120
[Sat Jun 11 13:22:23 2011] [error] [client 192.168.0.3] PHP Fatal error: require(): Failed opening required '/home/server/public_html/dirty-briefs/site/protected/config/main.php' (include_path='.:/usr/share/php:/usr/share/pear') in /home/server/public_html/dirty-briefs/framework/base/CApplication.php on line 120*
也许还值得一提的是,我正在使用 Yii PHP 框架,我的站点文件夹中有一个 .htaccess 文件,其中包含以下内容
# Disable directory browsing
Options All -Indexes
# File types
AddType application/x-font-woff .eot .ttf # Font-Face
# URL Rewriting
<IfModule mod_rewrite.c>
RewriteEngine On
# Site Maintenance
# RewriteCond %{REMOTE_ADDR} !^10\.0\.2\.2
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteRule ^(.*)$ /maintenance.html [L]
# LOCAL
RewriteCond %{SERVER_NAME} ^local.project-name.co.uk
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index-local.php/$1
# -----
# PRODUCTION
RewriteCond %{HTTP_HOST} ^project-name.co.uk
RewriteRule ^(.*)$ http://www.project-name.co.uk/$1 [R=301,L]
RewriteCond %{SERVER_NAME} ^www.project-name.co.uk
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /folder/index.php/$1
# -----
</IfModule>
我跟踪了 Apache 错误和访问日志,发现由于权限错误,在 PHP 脚本中导入文件时出现了永久错误。
我已经阅读了有关检查 Apache 在哪个用户和组下运行的信息,它们是 www-data www-data,所以我猜测 Apache 基本上没有权限访问 /home/server/public_html 下的文件,除非我给文件夹 777 权限,而我不想要这个权限,所以我只是想知道是否有人可以发现我做错了什么,或者就我可以尝试让它工作的任何建议
答案1
此文件夹布局有点混乱。您的默认 vhost 指令指定/home/server/public_html/
为DocumentRoot
,但随后您指定了子文件夹将其作为应用程序的根目录。这不是最佳配置。尝试将站点移出public_html
到其自己的文件夹(/home/server/project
或类似文件夹)并进行相应设置DocumentRoot
。
一旦移动,您就不需要777
权限来使其可访问,尽管它确实需要可读www-data
。尝试:
chmod -R 644 /home/server/project
find /home/server/project -type d -exec chmod 755 {} \+
这将使所有内容都可供全世界读取,并且所有文件夹都可遍历(在文件夹上设置执行位可以实现这一点)。
还有一件事:ServerName
不使用http://
前缀。您应该从配置中删除它,只保留域名。
更改后重新启动 apache,您就能够使用给定的主机名访问站点。
答案2
您可以授予 Apache 访问文件的权限,而无需将其设置为 world-can-do-everything(rwxrwxrwx 或 777),您只需授予它读取文件的权限,以便 PHP 可执行文件可以读取它们。如果 PHP 检查执行权限,您可能还需要授予执行权限。更好的方法是使用 更改所有权,然后chown www-data:www-data <file>
您可以授予 Apache 完全权限,而其他任何人(root 除外)则不授予任何权限chmod 700
(或者chmod u+rwx <file>; chmod go-rwx <file>
如果您更喜欢使用助记符代码而不是基于位模式的代码)。
如果你有其他网站从同一个 Apache 安装运行(因此也以 的身份运行www-data
),并且你想将它们分开,以便一个网站在某种程度上受到其他网站的保护,那么请考虑使用suPHP
(Ubuntu 中的这个软件包提供了)。它比标准的 mod_php 效率低(除非您的硬件条件非常有限,否则效率不会低很多),但它为用户/网站之间提供了额外的保护层,使它们(意外或以其他方式)更难相互影响或读取彼此的内容。每个脚本都由充当拥有它的用户的进程运行,因此 user1 拥有的 php 文件以 user1 的身份运行,而其他用户(甚至 www-data 或通常以其他身份运行的脚本)不需要任何访问它。在正确设置之前,您可能会遇到 suphp 的其他权限错误,因为它默认坚持在运行任何脚本之前通过某些安全检查(例如目录和脚本不是全局可写的)。
附言:回复require(/home/server/public_html/dirty-briefs/site/protected/config/main.php): failed
- 沾满咖啡渍的会议简报,还是别的什么?!
答案3
您可能需要执行访问权限,/home/server
以便 Apache 用户可以在其中遍历以读取该public_html
文件夹(该文件夹应该是其他人可读的)。
# If not already drwx--x--x...
chmod o+x /home/server
答案4
这可能是 seLinux 的问题。
编辑:
为确保安全,您可以将 seLinux 设置为宽容模式,然后重试。如果您使用的是 RedHat,我建议您使用 system-config-selinux,但我不知道 Ubuntu 中是否有这样的工具