Настройка песочницы на основе virtual hosts/phusion passenger для php/rails проектов
Invite pending
В интернетах множество статей на тему настройки окружения для комфортной веб-разработки, но т.к. своего варианта я еще не встречал, постараюсь рассказать о нем. Этот вариант я использую у себя на ноутбуке во время разработки, а также на тестовом сервере. Т.к. давно и крепко сижу на openSUSE, то все команды будут описаны для этого дистрибутива версий 11.3/11.4.
Мы настроим 2 локальных домена — vhost.my и rails.my. Первый будет отвечать за php проекты, второй за Rails. Проекты на php будут лежать в каталоге /srv/www/vhosts, а проекты на Rails — /srv/www/rails. Все проекты будут доступны по ссылкам вида:
phptest1.vhost.my (проект из каталога /srv/www/vhosts/phptest1)
railstest.rails.my (проект из каталога /srv/www/rails/railstest)
Будем ставить и немного настраивать: nginx — фронтенд, apache — php бекенд, phusion passenger — rails бекенд, bind — dns сервер, а также php/rails.
Итак, открываем root-консоль и создадим 2 каталога
дадим им нужные права
Теперь установка, запускаем yast->Управление программным обеспечением. На закладке поиск набираем и отмечаем для установки: apache2, php5, bind, ruby, rubygems, rubygem-rails, nginx.
Устанавливаем phusion passenger из root-консоли:
В конце установки появится 2 параметра вида:
Которые будет предложено скопировать куда-нибудь. Они понадобятся при настройке nginx.
Теперь настроим nginx. Для этого:
Открываем для редактирования файл /opt/nginx/conf/nginx.conf, удалим все и впишем следующее:
Попробуем запустить nginx (все делаем с правами root):
Если в консоли ругается:
Открываем файл на редактирование и вписывем:
Указываем уровни запуска из консоли:
Также можно указать их через yast->Системные службы (уровни запуска)
Теперь от рута можно управлять nginx:
Запускаем nginx:
Указываем уровни запуска:
Включаем mod_rewrite. Для этого нужно зайти в yast->HTTP сервер на закладку модули или открыть файл /
Переносим его на порт 8080. В файле
на
Создаем файл настройки виртуальных хостов
и заполняем:
Сохраняем файл и перезапускаем apache
Вся настройка заключается в создании wildcard-записей DNS. Всё, что нужно — это добавить A-записи, связывающие имена вида
Для начала указываем уровни запуска:
Затем, создаем описание зон в файле
Cоздаем файл vhost.my.zone в каталоге
И вписываем
В том же каталоге создаем файл
И вписываем
Перезпускаем bind
Теперь, в настройках сети указываем локальный DNS сервер в качестве основного, т. е. указываем primary dns 127.0.0.1, secondary dns указываем тот, который используется для интернета.
создадим пару тестовых php-проектов
В первый index.php впишем
Во второй
И проверяем. По адресу
Теперь создаем рельсовое приложение в папке
и проверяем:
Конечно, приведенные конфиги далеко не идеальны (например, можно еще статику nginx-ом отдавать и т.д.), но пока они реализуют все что мне нужно от песочницы. Но я с удовольствием выслушаю советы по их оптимизации в комментариях.
Для чего это нужно (плюсы):
- Быстрое развертывание, для создания нового проекта достаточно создать новую папку.
- Удобные URL для проектов. Никаких
http://localhost/project
- Работает на любом барахле, на котором заводится openSUSE. Например, на тестовом сервере (VIA 800MHz/1Gb RAM/16Gb IDE Flash) спокойно крутится десяток проектов на php, парочка на rails и еще столько же влезет.
Минусы:
- В настройках сети первым должен быть записан локальный DNS сервер 127.0.0.1
- Возможно, в комментариях мне подскажут еще минусов (ну или накидают :) ).
Краткое описание:
Мы настроим 2 локальных домена — vhost.my и rails.my. Первый будет отвечать за php проекты, второй за Rails. Проекты на php будут лежать в каталоге /srv/www/vhosts, а проекты на Rails — /srv/www/rails. Все проекты будут доступны по ссылкам вида:
phptest1.vhost.my (проект из каталога /srv/www/vhosts/phptest1)
railstest.rails.my (проект из каталога /srv/www/rails/railstest)
Будем ставить и немного настраивать: nginx — фронтенд, apache — php бекенд, phusion passenger — rails бекенд, bind — dns сервер, а также php/rails.
Итак, открываем root-консоль и создадим 2 каталога
- mkdir /srv/www/vhosts /srv/www/rails
дадим им нужные права
- chmod 775 /srv/www/vhosts /srv/www/rails
- chown wwwrun:users /srv/www/vhosts /srv/www/rails
Теперь установка, запускаем yast->Управление программным обеспечением. На закладке поиск набираем и отмечаем для установки: apache2, php5, bind, ruby, rubygems, rubygem-rails, nginx.
Установка Phusion Passenger
Устанавливаем phusion passenger из root-консоли:
- gem install passenger
- passenger-install-nginx-module
В конце установки появится 2 параметра вида:
- passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-2.2.15;
- passenger_ruby /usr/bin/ruby;
Которые будет предложено скопировать куда-нибудь. Они понадобятся при настройке nginx.
Настройка Nginx
Теперь настроим nginx. Для этого:
Открываем для редактирования файл /opt/nginx/conf/nginx.conf, удалим все и впишем следующее:
- worker_processes 4; # число процессов, я обычно ставлю равным числу ядер в процессоре
- error_log /var/log/nginx-error.log;
- events {
- worker_connections 1024;
- }
- http {
- passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-3.0.5; # эти 2 строки замените
- passenger_ruby /usr/bin/ruby; # на те, которые получили во время установки passenger
- include mime.types;
- default_type application/octet-stream;
- charset utf-8;
- sendfile on;
- keepalive_timeout 65;
- client_max_body_size 20m;
- proxy_read_timeout 3600;
- proxy_connect_timeout 3600;
- proxy_buffers 8 16k;
- proxy_buffer_size 32k;
- # перенаправлем все запросы с *.vhost.my к apache на порт 8080
- server {
- if ($host ~* www\.(.*))
- {
- set $host_without_www $1;
- rewrite ^(.*)$ http://$host_without_www$1 permanent;
- }
- listen 80;
- server_name *.vhost.my;
- location / {
- proxy_pass http://127.0.0.1:8080/;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header Host $http_host;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
- }
- # обрабатываем все запросы с *.rails.my с помощью passenger
- server {
- if ($host ~* www\.(.*))
- {
- set $host_without_www $1;
- rewrite ^(.*)$ http://$host_without_www$1 permanent;
- }
- listen 80;
- server_name *.rails.my;
- if ($host ~* ^([a-z0-9-\.]+)\.rails.my$)
- {
- set $domain $1;
- }
- root /srv/www/rails/$domain/public;
- passenger_enabled on;
- rails_env development;
- }
- }
Попробуем запустить nginx (все делаем с правами root):
- service nginx start
Если в консоли ругается:
service: no such service nginx
, значит у Вас нет скрипта для управления им. В этом случае создадим Создадим скрипт для запуска nginx
- touch /etc/init.d/nginx
- chmod 755 /etc/init.d/nginx
Открываем файл на редактирование и вписывем:
- #!/bin/sh
- # /etc/init.d/nginx
- ### BEGIN INIT INFO
- # Provides: nginx
- # Default-Start: 3 5
- # Default-Stop: 0 1 2 6
- # Short-Description: Nginx HTTP Server
- # Description: Start the Nginx HTTP daemon
- ### END INIT INFO
- NGINX="/opt/nginx/sbin/nginx"
- prog="ngnix"
- action="$1"
- . /etc/rc.status
- #
- # main part
- #
- case "$action" in
- start*)
- echo -n "Starting nginx "
- startproc $NGINX
- rc_status -v
- ;;
- stop)
- echo -n "Shutting down nginx "
- killproc $NGINX
- rc_status -v
- ;;
- restart)
- $0 stop
- $0 start
- ;;
- *)
- cat >&2 <<-EOF
- Usage: $0 <command>
- where <command> is one of:
- start - start nginx
- stop - stop nginx (sending SIGTERM to parent)
- restart - stop nginx if running; start nginx
- EOF
- exit 1
- esac
- rc_exit
Указываем уровни запуска из консоли:
- chkconfig --level 35 nginx on
Также можно указать их через yast->Системные службы (уровни запуска)
Теперь от рута можно управлять nginx:
service nginx start
service nginx status
service nginx restart
Запускаем nginx:
- service nginx start
Настройка apache.
Указываем уровни запуска:
- chkconfig --level 35 apache2 on
Включаем mod_rewrite. Для этого нужно зайти в yast->HTTP сервер на закладку модули или открыть файл /
/etc/apache2/sysconfig.d/loadmodule.conf
и раскомментировать строкуLoadModule rewrite_module
Переносим его на порт 8080. В файле
/etc/apache2/listen.conf
меняем строку
- Listen 80
на
- Listen 8080
Создаем файл настройки виртуальных хостов
- touch /etc/apache2/vhosts.d/vhosts.conf
и заполняем:
- <VirtualHost *:8080>
- ServerAdmin webmaster@vhost.my
- ServerName vhost.my
- DocumentRoot /srv/www/vhosts/
- ErrorLog /var/log/apache2/vhost.my-error_log
- CustomLog /var/log/apache2/vhost.my-access_log combined
- HostnameLookups Off
- UseCanonicalName Off
- ServerSignature On
- <Directory "/srv/www/vhosts">
- Options Indexes FollowSymLinks +ExecCGI
- AddHandler cgi-script .cgi # эту строка была мне необходима для perl-скриптов, оставил на всякий случай
- AllowOverride All
- Order allow,deny
- Allow from all
- </Directory>
- ServerAlias *.vhost.my
- RewriteEngine On
- # Убираем www
- RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
- RewriteRule ^/?(.*) http://%1/$1 [R=301]
- # Правило для под- поддоменов
- RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.([a-z0-9-]+)\.vhost\.my$ [NC]
- RewriteRule ^/(.*) /%3/$1
- # Правило для поддоменов
- RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.vhost\.my$ [NC]
- RewriteRule ^/(.*) /%2/$1
- </VirtualHost>
Сохраняем файл и перезапускаем apache
- service apache2 restart
Настройка Bind.
Вся настройка заключается в создании wildcard-записей DNS. Всё, что нужно — это добавить A-записи, связывающие имена вида
*.vhost.my и *.rails.my
с IP-aдресом сервера (127.0.0.1).Для начала указываем уровни запуска:
- chkconfig --level 35 named on
Затем, создаем описание зон в файле
/etc/named.conf
(добавляем в конец файла):
- zone "vhost.my" in {
- allow-transfer { any; };
- file "master/vhost.my.zone";
- type master;
- };
- zone "rails.my" in {
- allow-transfer { any; };
- file "master/rails.my.zone";
- type master;
- };
Cоздаем файл vhost.my.zone в каталоге
/var/lib/named/master
- touch /var/lib/named/master/vhost.my.zone
И вписываем
- $TTL 604800
- @ IN SOA localhost. root.localhost. (
- 3 ; Serial
- 604800 ; Refresh
- 86400 ; Retry
- 2419200 ; Expire
- 604800 ) ; Negative Cache TTL
- ;
- @ IN NS localhost.
- @ IN A 127.0.0.1
- *.vhost.my. IN A 127.0.0.1
В том же каталоге создаем файл
rails.my.zone
- touch /var/lib/named/master/rails.my.zone
И вписываем
- $TTL 604800
- @ IN SOA localhost. root.localhost. (
- 3 ; Serial
- 604800 ; Refresh
- 86400 ; Retry
- 2419200 ; Expire
- 604800 ) ; Negative Cache TTL
- ;
- @ IN NS localhost.
- @ IN A 127.0.0.1
- *.rails.my. IN A 127.0.0.1
Перезпускаем bind
- service named restart
Теперь, в настройках сети указываем локальный DNS сервер в качестве основного, т. е. указываем primary dns 127.0.0.1, secondary dns указываем тот, который используется для интернета.
Попробуем посмотреть что получилось:
создадим пару тестовых php-проектов
- mkdir /srv/www/vhosts/phptest1 /srv/www/vhosts/phptest2
- touch /srv/www/vhosts/phptest1/index.php /srv/www/vhosts/phptest2/index.php
- chmod 755 /srv/www/vhosts/phptest1/index.php /srv/www/vhosts/phptest2/index.php
В первый index.php впишем
- <?php
- echo "Test project 1";
- ?>
Во второй
- <?php
- phpinfo();
- ?>
И проверяем. По адресу
http:// phptest1.vhost.my
откроется первый проект, а по http:// phptest2.vhost.my
— второй.Теперь создаем рельсовое приложение в папке
/srv/www/rails:
- rails new railstest
- cd railstest
- rails generate scaffold users name:string password:string
- rake db:migrate
и проверяем:
- должны работать все предыдущие php проекты
- по адресу railstest.rails.my должен быть рельсовый проект
- по адресу railstest.rails.my/users должна быть панель управления пользователями.
Конечно, приведенные конфиги далеко не идеальны (например, можно еще статику nginx-ом отдавать и т.д.), но пока они реализуют все что мне нужно от песочницы. Но я с удовольствием выслушаю советы по их оптимизации в комментариях.