Search
Write a publication
Pull to refresh

Настройка песочницы на основе virtual hosts/phusion passenger для php/rails проектов

В интернетах множество статей на тему настройки окружения для комфортной веб-разработки, но т.к. своего варианта я еще не встречал, постараюсь рассказать о нем. Этот вариант я использую у себя на ноутбуке во время разработки, а также на тестовом сервере. Т.к. давно и крепко сижу на openSUSE, то все команды будут описаны для этого дистрибутива версий 11.3/11.4.

Для чего это нужно (плюсы):


  1. Быстрое развертывание, для создания нового проекта достаточно создать новую папку.
  2. Удобные URL для проектов. Никаких http://localhost/project
  3. Работает на любом барахле, на котором заводится openSUSE. Например, на тестовом сервере (VIA 800MHz/1Gb RAM/16Gb IDE Flash) спокойно крутится десяток проектов на php, парочка на rails и еще столько же влезет.

Минусы:


  1. В настройках сети первым должен быть записан локальный DNS сервер 127.0.0.1
  2. Возможно, в комментариях мне подскажут еще минусов (ну или накидают :) ).

Краткое описание:


Мы настроим 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 каталога
  1. mkdir /srv/www/vhosts /srv/www/rails

дадим им нужные права
  1. chmod 775 /srv/www/vhosts /srv/www/rails
  2. chown wwwrun:users /srv/www/vhosts /srv/www/rails

Теперь установка, запускаем yast->Управление программным обеспечением. На закладке поиск набираем и отмечаем для установки: apache2, php5, bind, ruby, rubygems, rubygem-rails, nginx.

Установка Phusion Passenger


Устанавливаем phusion passenger из root-консоли:
  1. gem install passenger
  2. passenger-install-nginx-module

В конце установки появится 2 параметра вида:
  1. passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-2.2.15;
  2. passenger_ruby /usr/bin/ruby;

Которые будет предложено скопировать куда-нибудь. Они понадобятся при настройке nginx.

Настройка Nginx


Теперь настроим nginx. Для этого:
Открываем для редактирования файл /opt/nginx/conf/nginx.conf, удалим все и впишем следующее:
  1. worker_processes  4# число процессов, я обычно ставлю равным числу ядер в процессоре
  2. error_log         /var/log/nginx-error.log;
  3.  
  4. events {
  5.     worker_connections  1024;
  6. }
  7.  
  8. http {
  9.     passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-3.0.5; # эти 2 строки замените
  10.     passenger_ruby /usr/bin/ruby; # на те, которые получили во время установки passenger
  11.     include       mime.types;
  12.     default_type  application/octet-stream;
  13.     charset       utf-8;
  14.     sendfile        on;
  15.     keepalive_timeout  65;
  16.     client_max_body_size 20m;
  17.     proxy_read_timeout 3600;
  18.     proxy_connect_timeout 3600;
  19.     proxy_buffers 8 16k;
  20.     proxy_buffer_size 32k;
  21.  
  22.     # перенаправлем все запросы с *.vhost.my к apache на порт 8080
  23.     server {
  24.         if ($host ~* www\.(.*)) 
  25.         {
  26.            set $host_without_www $1;  
  27.            rewrite ^(.*)$ http://$host_without_www$1 permanent; 
  28.         }
  29.         listen       80;
  30.         server_name  *.vhost.my;
  31.         location / {
  32.             proxy_pass http://127.0.0.1:8080/;
  33.             proxy_set_header   X-Real-IP $remote_addr;
  34.             proxy_set_header   Host $http_host;
  35.             proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
  36.         }
  37.     }
  38.  
  39.    # обрабатываем все запросы с *.rails.my с помощью passenger
  40.     server {
  41.         if ($host ~* www\.(.*)) 
  42.         {
  43.            set $host_without_www $1;  
  44.            rewrite ^(.*)$ http://$host_without_www$1 permanent; 
  45.         }
  46.         listen       80;
  47.         server_name  *.rails.my;
  48.         if ($host ~* ^([a-z0-9-\.]+)\.rails.my$)
  49.         {
  50.            set $domain $1;
  51.         }
  52.         root /srv/www/rails/$domain/public;
  53.         passenger_enabled on;
  54.         rails_env development;
  55.     }
  56. }

Попробуем запустить nginx (все делаем с правами root):
  1. service nginx start

Если в консоли ругается: service: no such service nginx, значит у Вас нет скрипта для управления им. В этом случае создадим Создадим скрипт для запуска nginx
  1. touch /etc/init.d/nginx
  2. chmod 755 /etc/init.d/nginx

Открываем файл на редактирование и вписывем:
  1. #!/bin/sh
  2. # /etc/init.d/nginx
  3. ### BEGIN INIT INFO
  4. # Provides:      nginx
  5. # Default-Start: 3 5
  6. # Default-Stop: 0 1 2 6
  7. # Short-Description: Nginx HTTP Server
  8. # Description: Start the Nginx HTTP daemon
  9. ### END INIT INFO
  10. NGINX="/opt/nginx/sbin/nginx"
  11. prog="ngnix"
  12. action="$1"
  13.  
  14. /etc/rc.status
  15. #
  16. # main part
  17. #
  18. case "$action" in
  19.     start*)
  20. echo -n "Starting nginx "
  21. startproc $NGINX
  22. rc_status -v
  23. ;;
  24.     stop)
  25. echo -n "Shutting down nginx "
  26.         killproc $NGINX
  27. rc_status -v
  28. ;;
  29.     restart)
  30. $0 stop
  31. $0 start
  32. ;;
  33.     *)
  34.     cat >&2 <<-EOF
  35. Usage: $0 <command>
  36. where <command> is one of:
  37.         start              - start nginx
  38.         stop               - stop nginx (sending SIGTERM to parent)
  39.         restart            - stop nginx if running; start nginx
  40. EOF
  41.     exit 1
  42. esac
  43. rc_exit

Указываем уровни запуска из консоли:
  1. chkconfig --level 35 nginx on

Также можно указать их через yast->Системные службы (уровни запуска)

Теперь от рута можно управлять nginx:
service nginx start
service nginx status
service nginx restart


Запускаем nginx:
  1. service nginx start

Настройка apache.


Указываем уровни запуска:
  1. chkconfig --level 35 apache2 on

Включаем mod_rewrite. Для этого нужно зайти в yast->HTTP сервер на закладку модули или открыть файл //etc/apache2/sysconfig.d/loadmodule.conf и раскомментировать строку
LoadModule rewrite_module

Переносим его на порт 8080. В файле /etc/apache2/listen.conf меняем строку
  1. Listen 80

на
  1. Listen 8080

Создаем файл настройки виртуальных хостов
  1. touch /etc/apache2/vhosts.d/vhosts.conf

и заполняем:
  1. <VirtualHost *:8080>
  2.  ServerAdmin webmaster@vhost.my
  3.  ServerName vhost.my
  4.  DocumentRoot /srv/www/vhosts/
  5.  ErrorLog /var/log/apache2/vhost.my-error_log
  6.  CustomLog /var/log/apache2/vhost.my-access_log combined
  7.  HostnameLookups Off
  8.  UseCanonicalName Off
  9.  ServerSignature On
  10.  
  11.  <Directory "/srv/www/vhosts">
  12.    Options Indexes FollowSymLinks +ExecCGI
  13.    AddHandler cgi-script .cgi # эту строка была мне необходима для perl-скриптов, оставил на всякий случай
  14.    AllowOverride All
  15.    Order allow,deny
  16.    Allow from all
  17.  </Directory>
  18.  
  19.  ServerAlias *.vhost.my
  20.  RewriteEngine On
  21.  
  22.  # Убираем www
  23.  RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
  24.  RewriteRule ^/?(.*) http://%1/$1 [R=301]
  25.  
  26.  # Правило для под- поддоменов
  27.  RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.([a-z0-9-]+)\.vhost\.my$ [NC]
  28.  RewriteRule ^/(.*) /%3/$1
  29.  
  30.  # Правило для поддоменов
  31.  RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.vhost\.my$ [NC]
  32.  RewriteRule ^/(.*) /%2/$1
  33. </VirtualHost>

Сохраняем файл и перезапускаем apache
  1. service apache2 restart

Настройка Bind.


Вся настройка заключается в создании wildcard-записей DNS. Всё, что нужно — это добавить A-записи, связывающие имена вида *.vhost.my и *.rails.my с IP-aдресом сервера (127.0.0.1).

Для начала указываем уровни запуска:
  1. chkconfig --level 35 named on

Затем, создаем описание зон в файле /etc/named.conf (добавляем в конец файла):
  1. zone "vhost.my" in {
  2. allow-transfer { any; };
  3. file "master/vhost.my.zone";
  4. type master;
  5.      };
  6.      zone "rails.my" in {
  7. allow-transfer { any; };
  8. file "master/rails.my.zone";
  9. type master;
  10.      };

Cоздаем файл vhost.my.zone в каталоге /var/lib/named/master
  1. touch /var/lib/named/master/vhost.my.zone

И вписываем
  1. $TTL 604800
  2. @ IN SOA localhost. root.localhost. (
  3. 3 ; Serial
  4. 604800 ; Refresh
  5. 86400 ; Retry
  6. 2419200 ; Expire
  7. 604800 ) ; Negative Cache TTL
  8. ;
  9. @          IN NS localhost.
  10. @          IN A 127.0.0.1
  11. *.vhost.my. IN A 127.0.0.1

В том же каталоге создаем файл rails.my.zone
  1. touch /var/lib/named/master/rails.my.zone

И вписываем
  1. $TTL 604800
  2. @ IN SOA localhost. root.localhost. (
  3. 3 ; Serial
  4. 604800 ; Refresh
  5. 86400 ; Retry
  6. 2419200 ; Expire
  7. 604800 ) ; Negative Cache TTL
  8. ;
  9. @          IN NS localhost.
  10. @          IN A 127.0.0.1
  11. *.rails.my. IN A 127.0.0.1

Перезпускаем bind
  1. service named restart

Теперь, в настройках сети указываем локальный DNS сервер в качестве основного, т. е. указываем primary dns 127.0.0.1, secondary dns указываем тот, который используется для интернета.

Попробуем посмотреть что получилось:


создадим пару тестовых php-проектов
  1. mkdir /srv/www/vhosts/phptest1 /srv/www/vhosts/phptest2
  2. touch /srv/www/vhosts/phptest1/index.php /srv/www/vhosts/phptest2/index.php
  3. chmod 755 /srv/www/vhosts/phptest1/index.php /srv/www/vhosts/phptest2/index.php

В первый index.php впишем
  1. <?php
  2. echo "Test project 1";
  3. ?>

Во второй
  1. <?php
  2. phpinfo();
  3. ?>

И проверяем. По адресу http:// phptest1.vhost.my откроется первый проект, а по http:// phptest2.vhost.my — второй.

Теперь создаем рельсовое приложение в папке /srv/www/rails:
  1. rails new railstest
  2. cd railstest
  3. rails generate scaffold users name:string password:string
  4. rake db:migrate

и проверяем:
  • должны работать все предыдущие php проекты
  • по адресу railstest.rails.my должен быть рельсовый проект
  • по адресу railstest.rails.my/users должна быть панель управления пользователями.

Конечно, приведенные конфиги далеко не идеальны (например, можно еще статику nginx-ом отдавать и т.д.), но пока они реализуют все что мне нужно от песочницы. Но я с удовольствием выслушаю советы по их оптимизации в комментариях.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.