Nginx + (Apache + Passanger) = ошибка 403 для запроса "/"
У меня есть следующие настройки:
- nginx как обратный прокси
- apache (с пассажиром) для подачи контента
Теперь у меня есть простое приложение Sinatra, и происходит следующее, если я пытаюсь получить доступ к различным вещам:
domain.com/hi
- Синатра говорит мне привет как было закодированоdomain.com/readme.txt
(статический файл) - он правильно выбирается из папки 'public_html' с помощью nginxИ наконец -
domain.com/
или жеdomain.com
- ошибка 403
В последнем случае nginx, вероятно, пытается создать листинг, но это не нужно (я хочу, чтобы он передал запрос '/' в apache). С разрешениями все в порядке.
Сама ошибка (от /var/log/nginx/error.log
):
2012/05/12 23:39:40 [error] 19012#0: *1 directory index of "/home/com_domain/public_html/" is forbidden, client: 66.77.88.99, server: domain.com, request: "GET / HTTP/1.1", host: "domain.com"
И конфигурация:
server {
listen 80;
server_name domain.com;
access_log /var/log/nginx/com_domain.access.log;
charset utf-8;
root /home/com_domain/public_html;
# Include @apache location
include /etc/nginx/sites-available/_apache;
location ~ /\.ht {
deny all;
}
location / {
try_files $uri $uri/ @apache;
}
}
1 ответ
Во-первых, упоминание о настройке - обратный прокси-сервер Apache сначала кажется хорошим выбором - статические файлы обслуживаются Nginx, и вы по-прежнему сохраняете функциональность Apache. Тем не менее, дополнительный сервер добавляет много накладных расходов - вы добавили больше сложности в систему и дополнительный уровень. Поскольку Nginx может взаимодействовать с другими серверами, такими как пассажирский и PHP-FPM, вы можете сопоставить большую часть функциональности Apache с гораздо меньшими издержками. Избавление от Apache снизит сложность и поддержку вашей установки, а, следовательно, улучшит общую производительность и стабильность и упростит дальнейшую отладку.
Nginx пытается отобразить содержимое корневого каталога - вы сказали ему попытаться обслужить указанный файл и указанный каталог перед проксированием в apache. Nginx будет искать файл, соответствующий файлам, указанным в директиве index, если совпадений нет, он попытается отобразить содержимое каталога (т. Е. Список каталогов), в котором происходит сбой.
Если у вас есть индексный файл, который вы хотели бы обслуживать, вам следует обновить index
Директива включить его. Если у вас нет такого файла, и вы хотите, чтобы Apache полностью обработал запрос, вам нужно создать соответствующий блок местоположения и proxy_pass
запросы к апачу.
Согласно вики Nginx, директивы местоположения сопоставляются в определенном порядке:
- Директивы с префиксом "=", которые точно соответствуют запросу (буквальная строка). Если найдено, поиск прекращается.
- Все остальные директивы с обычными строками. Если в этом совпадении использовался префикс "^~", поиск прекращается.
- Регулярные выражения, в порядке их определения в файле конфигурации.
- Если #3 дал совпадение, этот результат используется. В противном случае используется совпадение от #2.
Создание дополнительного location
Таким образом, блок, точно совпадающий (то есть используя знак равенства) с корневым путем, позволит вам указать специальные правила для этого отдельного местоположения. Этот блок местоположения должен прокси-запросы к Apache, если он должен работать правильно.:
location = / {
#proxy_pass ...;
#error 200 = @apache;
#include proxy_info;
#try_files non_existent_file @apache;
}
В зависимости от вашей настройки, может быть несколько способов передачи запроса к прокси, некоторые из которых упоминались выше.
Вы все еще должны держать свой location / {}
блок - он будет соответствовать всем запросам, которые не совпадают с вашими другими блоками местоположения. Обратите внимание, что в то время как try_files
Директива может работать в соответствии с server {}
блок, лучше под location
блок, так как он будет обрабатываться только выборочно.