Вопрос или проблема
Недавно я перешёл на новый компьютер и скопировал все существующие git-репозитории для проектов веб-разработки со своего старого компьютера. На том старом компьютере я установил apache для обслуживания определённых папок в качестве подпапок моего домашнего каталога в качестве сайтов для разработки (либо статических, либо на PHP). Например, личный проект находился по адресу /home/myusername/programming/personal/projectname/
.
Теперь на новом компьютере я попытался настроить nginx, чтобы использовать его похожим образом.
Я следовал этому руководству на DigitalOcean для установки nginx (и MySQL и PHP) на моем ноутбуке, работающем под управлением Linux Mint 18.1 (Serena).
Я настроил nginx следующим образом:
/etc/nginx/sites-available/default
:
##
# Вы должны ознакомиться с следующими URL, чтобы получить хорошее понимание
# конфигурационных файлов Nginx, чтобы полностью раскрыть возможности Nginx.
# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
#
# Как правило, вы захотите переместить этот файл куда-то и начать с чистого
# файла, но оставить его для справки. Или просто отключить в sites-enabled.
#
# Пожалуйста, смотрите /usr/share/doc/nginx-doc/examples/ для более подробных примеров.
##
# Конфигурация сервера по умолчанию
#
server {
listen 80 default_server;
listen [::]:80 default_server;
# Конфигурация SSL
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Примечание: вам следует отключить gzip для SSL-трафика.
# См.: https://bugs.debian.org/773332
#
# Изучите ssl_ciphers, чтобы обеспечить безопасную конфигурацию.
# См.: https://bugs.debian.org/765782
#
# Самоподписанные сертификаты, созданные пакетом ssl-cert
# Не используйте их на производственном сервере!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Добавьте index.php в список, если вы используете PHP
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# Первоначально попытка обслуживать запрос как файл, затем
# как каталог, затем вернуться к отображению 404.
try_files $uri $uri/ =404;
}
# передача PHP-скриптов на сервер FastCGI, слушающий на 127.0.0.1:9000
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# # С php7.0-cgi:
# fastcgi_pass 127.0.0.1:9000;
# # С php7.0-fpm:
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
# запрещает доступ к файлам .htaccess, если корневая папка Apache
# совпадает с папкой nginx
#
location ~ /\.ht {
deny all;
}
}
# Конфигурация виртуального хоста для example.com
#
# Вы можете переместить это в другой файл в sites-available/ и создать символьную ссылку
# на sites-enabled/ для его включения.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
После этого тестирование путем создания /var/www/html/info.php
(как показано в руководстве) прошло успешно.
Теперь я попытался добавить домен для одного из моих проектов.
/etc/nginx/sites-available/projectname.dev
:
server {
listen 80;
listen [::]:80;
server_name projectname.dev;
root /home/myusername/programming/personal/projectname/;
index index.php index.html;
location / {
# Первоначально попытка обслуживать запрос как файл, затем
# как каталог, затем вернуться к отображению 404.
try_files $uri $uri/ =404;
}
# передача PHP-скриптов на сервер FastCGI, слушающий на 127.0.0.1:9000
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# # С php7.0-cgi:
# fastcgi_pass 127.0.0.1:9000;
# # С php7.0-fpm:
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
# запрещает доступ к файлам .htaccess, если корневая папка Apache
# совпадает с папкой nginx
#
location ~ /\.ht {
deny all;
}
}
(Я также добавил символьную ссылку из sites-enabled на это: ln -s /etc/nginx/sites-available/projectname.dev /etc/nginx/sites-enabled/projectname.dev
).
После перезапуска nginx (sudo service nginx restart
) и добавления 127.0.0.1 projectname.dev
в мой файл /etc/hosts
, я получил ошибку 404.
Просматривая /var/log/nginx/error.log
, я узнал, что мои запросы не выполняются по следующей причине:
2017/04/17 21:38:11 [crit] 30176#30176: *3 stat() "/home/myusername/programming/personal/projectname/" failed (13: Permission denied), client: 127.0.0.1, server: projectname.dev, request: "GET / HTTP/1.1", host: "projectname.dev"
Я предполагаю, что это связано с управлением правами доступа к файлам/каталогам в linux/unix. Мой домашний каталог, очевидно, принадлежит myusername, в то время как nginx запускается пользователем www-data. Однако я не уверен, как изменить права этой папки, чтобы www-data/nginx смогли получить к ней доступ (и к файлам внутри).
Как это можно решить? И почему я не столкнулся с этой проблемой, настраивая Apache на моем предыдущем компьютере (также работающем на Linux Mint)?
Я никогда не использовал nginx
, но, следуя вашему совету, который мне кажется правильным, я изменю права доступа соответствующих файлов/папок, изменив групповой владелец на www-data и проверив, чтобы файлы имели как минимум 0644, а папки как минимум 0755 разрешения.
Если вам нужно, чтобы ваше веб-приложение записывало в некоторые файлы или каталоги, либо вы меняете владельца этих файлов/каталогов на www-data, либо добавляете разрешение на запись для группы (0664 для файлов и 0775 для папок).
Ответ или решение
Настройка локальной среды разработки с Nginx на Linux (Ubuntu)
Настройка локальной среды разработки с использованием Nginx на Linux может быть немного сложной, особенно после перехода с Apache, так как конфигурации и права доступа могут различаться. При переходе к Nginx, вы уже выполнили множество действий, таких как установка сервера и создание конфигурационных файлов. Однако, вам требуется решить вопрос с правами доступа, чтобы Nginx мог корректно обслуживать ваши проекты.
1. Проверка и настройка конфигурации Nginx
Ваш файл конфигурации для проекта выглядит в целом правильно, но есть несколько моментов, которые следует проверить:
- Убедитесь, что вы правильно указали путь к папке, которая содержит ваши файлы приложения.
- Проверьте, правильно ли назначены все ключевые директивы, такие как
root
иindex
.
2. Настройка прав доступа
Как вы уже заметили, проблема, с которой вы столкнулись, заключается в недоступности вашего каталога для пользователя www-data
, который используется Nginx. Чтобы разрешить Nginx доступ к вашему проекту, вы можете выполнить следующие шаги:
-
Измените группу каталога вашего проекта:
Используйте команду
chown
, чтобы изменить группу владельца наwww-data
.sudo chown -R myusername:www-data /home/myusername/programming/personal/projectname/
Это назначит группу
www-data
всем файлам и папкам в каталоге вашего проекта. -
Настройте права доступа:
Убедитесь, что у всех каталогов установлены права не менее
0755
, а у файлов —0644
. Вы можете сделать это, выполнив команды:find /home/myusername/programming/personal/projectname/ -type d -exec chmod 755 {} \; find /home/myusername/programming/personal/projectname/ -type f -exec chmod 644 {} \;
Если вашему веб-приложению нужно записывать данные в определенные файлы или каталоги, вы можете предоставить дополнительные разрешения:
sudo chmod -R 775 /home/myusername/programming/personal/projectname/writable-directory
Здесь
writable-directory
— это папка, в которую ваше приложение должно иметь возможность записывать данные. -
Проверьте конфигурацию
hosts
:Убедитесь, что вы правильно добавили строку:
127.0.0.1 projectname.dev
в файл
/etc/hosts
. Это необходимо для того, чтобы ваш компьютер мог корректно разрешать имя домена в IP-адрес.
3. Перезапуск Nginx
Не забудьте перезапустить Nginx после внесения изменений:
sudo service nginx restart
4. Проверка журналов
Если вы все еще сталкиваетесь с проблемами доступа, проверьте журналы Nginx:
tail -f /var/log/nginx/error.log
Проверка этих журналов даст вам более детальную информацию о том, что происходит. Это может помочь идентифицировать другие потенциальные проблемы, которые могут возникнуть.
Заключение
При переходе на Nginx с Apache важно помнить о различиях в управлении правами доступа и конфигурации. Понимание этих различий и корректная настройка прав доступа помогут вам успешно настроить локальную среду разработки. Следуя вышеописанным шагам, вы сможете исправить ошибки доступа и продолжить работу над своим проектом с использованием Nginx на Ubuntu или любом другом дистрибутиве Linux.