Я рыщу в Интернете уже несколько дней и думаю, что перепробовал почти все, чтобы настроить виртуальные хосты на моем сервере Ubuntu, но все, кроме chmod 777
на веб-рут не удается.
У меня есть конфигурация 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
. Я работаю на машине с Windows 7, используя самбу для доступа к файлам на сервере. Я добавил project.name.co.uk в свой файл хостов Windows, однако, что бы я ни делал, я получаю 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 завивок, которые мне не нужны, поэтому мне просто интересно, сможет ли кто-нибудь заметить, что я делаю неправильно, или посоветовать что-нибудь, что я могу попытаться заставить это работать
Такое расположение папок немного сбивает с толку. Ваша директива 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, и вы сможете получить доступ к сайту с указанным именем хоста.
Вы можете предоставить 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 (хотя и не намного, если вы не используете жестко ограниченное оборудование), но дает вам дополнительный уровень защиты между пользователями / сайтами, усложняя им (случайно или иначе) влиять друг на друга. или читать друг друга. Каждый сценарий запускается процессом, действующим от имени пользователя, которому он принадлежит, поэтому файл php, принадлежащий пользователю user1, запускается как user1, и ни один другой пользователь (даже www-data или какие-либо сценарии обычно запускаются как) не должен иметь любой доступ к нему. Вы можете столкнуться с другими ошибками разрешений от suphp, пока все не настроите правильно, поскольку по умолчанию он настаивает на прохождении определенных проверок безопасности (например, каталоги и сценарии, не доступные для записи всем) перед запуском любого сценария.
пс. re: require(/home/server/public_html/dirty-briefs/site/protected/config/main.php): failed
- запятнанные кофе, или что-то еще ?!
Вероятно, вам понадобится доступ для выполнения на /home/server
поэтому пользователь Apache может пройти внутри него, чтобы прочитать public_html
папка (которая должна быть доступна для чтения).
# If not already drwx--x--x...
chmod o+x /home/server
Вероятно, это проблема seLinux.
РЕДАКТИРОВАТЬ:
Чтобы убедиться, что вы можете установить seLinux в разрешающий режим и попробовать еще раз. Если бы вы работали над RedHat, я бы рекомендовал использовать system-config-selinux, но я не знаю инструмента для этого в Ubuntu.