Откуда nginx берет главную страницу сайта в моем случае?
Не могу понять, откуда nginx берет контент для отображения сайта. Вот моя конфигурация:
Основной конфиг nginx (/etc/nginx/nginx.conf):
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 20M;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
include /etc/nginx/passenger.conf;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Конфиг моего сайта (/etc/nginx/conf.d/site.conf):
server {
listen 80;
server_name www.site.ru site.ru;
root /home/deploy/projects/site.ru/current/public;
passenger_enabled on;
rails_env production;
location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
}
Содержимое директории с сайтом (/home/deploy/projects/site.ru/current/public):
404.html 500.html favicon.ico robots.txt uploads
422.html assets favicon.png system yandex_54a321xz98c2cb13.html
В директории с сайтом нет явного файла index.html, но сайт все равно отображается. Как nginx определяет, какую страницу показывать в качестве главной? Где я ошибаюсь в понимании работы nginx?
Если в вашей директории /home/deploy/projects/site.ru/current/public нет файла index.html, но сайт все равно отображается, то nginx передает управление Passenger, а Passenger, в свою очередь, передает управление Rails приложению для обработки маршрутов.
Содержание
- Как nginx определяет главную страницу
- Роль Passenger в обработке запросов
- Правильная конфигурация для Rails приложений
- Пошаговая диагностика
- Решение проблемы с отображением
- Бест-практики для Rails + Nginx + Passenger
Как nginx определяет главную страницу
Когда nginx получает запрос на корневой URL (/), он выполняет следующие действия:
- Проверяет наличие статических файлов в директории, указанной в директиве
root(/home/deploy/projects/site.ru/current/public) - Ищет файлы, указанные в директиве
index(по умолчанию:index.html index.htm) - Если находит
index.html- отдает его как статический файл - Если не находит
index.html- передает управление Passenger
В вашем случае, поскольку файла index.html нет в директории public, nginx передает управление Passenger, который и запускает ваше Rails приложение.
Роль Passenger в обработке запросов
Passenger работает как модуль nginx и автоматически обрабатывает Rails приложения:
Once you have obtained the value, open your Nginx configuration file and insert a passenger_root option somewhere with that value. This option enables or disables Passenger for that particular context. source
Когда Passenger получает запрос, он:
- Запускает Rails приложение (если оно еще не запущено)
- Передает запрос Rails маршрутизатору через Rack интерфейс
- Rails определяет маршрут через файл
config/routes.rb - Вызывает соответствующий контроллер и действие
В вашем случае Rails, скорее всего, имеет маршрут вида root 'pages#home' или аналогичный, который указывает, какое действие контроллера должно обрабатывать корневой URL.
Правильная конфигурация для Rails приложений
Ваша конфигурация правильная для Rails приложения:
server {
listen 80;
server_name www.site.ru site.ru;
root /home/deploy/projects/site.ru/current/public;
passenger_enabled on;
rails_env production;
}
Важные моменты:
- Директива
rootдолжна указывать на директориюpublicвашего Rails приложения passenger_enabled on;включает поддержку Passenger для этого сервераrails_env production;устанавливает окружение Rails
In the above app we have created a variable response in pages_controller.rb which has the value "Hello World!. This variable is used to display the Hello World from the file app/views/pages/home.html.erb source
Пошаговая диагностика
Чтобы понять, откуда именно берется контент для главной страницы, выполните следующие шаги:
1. Проверьте файл маршрутов
Откройте файл config/routes.rb вашего Rails проекта. Поищите строку вида:
root 'pages#home'
# или
root 'home#index'
2. Проверьте соответствующий контроллер
Если в маршрутах указан pages#home, проверьте файл app/controllers/pages_controller.rb:
class PagesController < ApplicationController
def home
@response = "Hello World!"
end
end
3. Проверьте представление
Проверьте файл app/views/pages/home.html.erb или соответствующий файл для вашего маршрута.
Решение проблемы с отображением
Если сайт отображает не то, что вы ожидаете, возможные решения:
1. Проверьте журналы Rails
Просмотрите логи Rails для диагностики:
tail -f log/production.log
2. Проверьте конфигурацию Passenger
Убедитесь, что Passenger правильно настроен:
Inside the location block, set passenger_app_root
source
3. Проверьте права доступа
Убедитесь, что у пользователя, от имени которого работает Passenger, есть доступ к директориям приложения.
Бест-практики для Rails + Nginx + Passenger
1. Структура директорий
/home/deploy/projects/site.ru/current/
├── app/
│ ├── controllers/
│ ├── views/
│ └── assets/
├── config/
│ └── routes.rb
└── public/ # сюда указывает nginx root
├── assets/
├── 404.html
├── 500.html
└── robots.txt
2. Оптимальная конфигурация nginx
server {
listen 80;
server_name www.site.ru site.ru;
# Важно: указываем на public директорию
root /home/deploy/projects/site.ru/current/public;
passenger_enabled on;
rails_env production;
# Оптимизация для статических файлов
location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
# Обработка ошибок
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
3. Проверка работоспособности
The settings are explained below. In this file, we enable listening on port 80, set your domain name, enable Passenger, and set the root to the public directory of our new project source
Чтобы проверить, правильно ли настроена главная страница:
- Временно создайте файл
index.htmlв директорииpublic - Проверьте, что nginx отдает его
- Удалите
index.htmlи убедитесь, что Passenger передает управление Rails
Источники
- How to configure nginx with passenger with rails application - Stack Overflow
- Configuration reference - Nginx - Passenger Library
- Deploying a Ruby application - Nginx - Passenger Library
- How To Deploy a Rails App with Passenger and Nginx on Ubuntu 14.04 - DigitalOcean
- Setup Rails with Nginx using Passenger - TO THE NEW Blog
Заключение
Главная страница вашего сайта определяется не статическим файлом index.html, а маршрутизацией Rails. Поскольку у вас нет index.html в директории public, nginx передает управление Passenger, который, в свою очередь, обращается к вашему Rails приложению.
Чтобы проверить, какая страница отображается как главная:
- Посмотрите файл
config/routes.rb- там должен быть маршрут для корневого URL - Проверьте соответствующий контроллер и представление
- Просмотрите логи Rails для диагностики проблем
Ваша конфигурация nginx правильная - она указывает на директорию public и включает Passenger. Если контент отображается не так, как ожидается, проблема скорее всего в коде Rails приложения, а не в настройке nginx.