Posterous theme by Cory Watilo

lighttpd and rails

Сделал небольшую пачку оберток на сервере для управления приложениями. Для начала воспользовался кластером mongrel: [cc lang="bash"] gem install mongrel_cluster [/cc] и создал юзеря, от которого все монгрели будут выполняться: [cc lang="bash"] adduser --system --no-create-home --shell /bin/false --group mongrel [/cc] Правда, мне понадобилось сделать vipw и vigr, чтобы подправить ID пользователя и группы - чтоб они совпадали. Теперь, в папке с приложением сделал [cc lang="bash"] mongrel_rails cluster::configure -e production -p 3000 -N 5 -c ./ -a 127.0.0.1 --user mongrel --group mongrel [/cc] и получил в результате в config/mongrel_cluster.yml конфиг для кластера монгрелей. Вот такого вида: [cc lang="ini"] --- user: mongrel cwd: /var/www/lighttpd/www.example.com log_file: log/mongrel.log port: "8000" environment: production group: mongrel address: 127.0.0.1 pid_file: tmp/pids/mongrel.pid servers: 5 [/cc] Запускается оно через mongrel_rails cluster::start. Но надо же что-то сделать, чтоб оно загружалось при старте системы. И вот что я нашел и сделал. [cc lang="bash"] mkdir /etc/mongrel_cluster/ mkdir /etc/mongrel_cluster/available mkdir /etc/mongrel_cluster/enabled mv /var/www/lighttpd/www.example.com/config/mongrel_cluster.yml /etc/mongrel_cluster/available/www.example.com.yml ln -s /etc/mongrel_cluster/available/www.example.com.yml /etc/mongrel_cluster/enabled/www.example.com.yml [/cc] Теперь создадим скрипт /etc/init.d/mongrel_cluster: [cc lang="bash"] #!/bin/bash set -e mongrel_cluster_ctl -v -c /etc/mongrel_cluster/enabled $@ [/cc] и выполняем [cc lang="bash"] chmod +x /etc/init.d/mongrel_cluster update-rc.d -f mongrel_cluster defaults [/cc] Также для удобства запуска-остановки отдельного приложения я сделал мелкий скрипт /etc/mongrel_cluster/operation.sh: [cc lang="bash"] #!/bin/bash set -e CONFIGS=/etc/mongrel_cluster/enabled mongrel_rails cluster::$1 -C $CONFIGS/$2.yml [/cc] Поьзоваться им можно так: /etc/mongrel_cluster/operation.sh start www.example.com Собственно, на этом с монгрелем все. Далее - lighttpd. Почему не nginx? Я не нашел никаких доводов за или против. В конце-концов, оба они работают как reverse-proxy к монгрелю, и несложно сменить демон - никаких переработок приложения не потребуется. Итак, вот конфиг lighttpd: [cc lang="ini"] server.modules = ( "mod_access", "mod_accesslog", "mod_compress", "mod_rewrite", "mod_proxy", "mod_redirect" ) server.document-root = "/var/www/lighttpd/default/" server.errorlog = "/var/log/lighttpd/error.log" server.port = 80 server.bind = "77.120.99.179" server.pid-file = "/var/run/lighttpd.pid" server.username = "www-data" server.groupname = "www-data" server.tag = "lighttpd" index-file.names = ( "index.php", "index.html", "index.htm" ) url.access-deny = ( "~", ".inc" ) static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" ) accesslog.filename = "/var/log/lighttpd/access.log" compress.cache-dir = "/var/cache/lighttpd/compress/" compress.filetype = ("text/plain", "text/html", "application/x-javascript", "text/css", "text/xml" ) include_shell "/usr/share/lighttpd/create-mime.assign.pl" include_shell "/usr/share/lighttpd/include-conf-enabled.pl" var.basedir = "/var/www/lighttpd/" #### SITES #### $HTTP["host"] == "example.com" { url.redirect = ("^/(.*)$" => "http://www.example.com/$1") } $HTTP["host"] == "www.example.com" { server.name = "www.example.com" server.document-root = basedir + server.name + "/public" accesslog.filename = basedir + server.name + "/log/access.log" $HTTP["url"] !~ "^/(stylesheets|javascripts|images|files)/" { proxy.balance = "fair" proxy.server = ( "/" => ( ( "host" => "127.0.0.1", "port" => 8000 ), ( "host" => "127.0.0.1", "port" => 8001 ), ( "host" => "127.0.0.1", "port" => 8002 ), ( "host" => "127.0.0.1", "port" => 8003 ), ( "host" => "127.0.0.1", "port" => 8004 ) ) ) } } [/cc] Я обеспечил прямой доступ к статике посредством lighttpd, не заворачивая статику через mongrel (везде я встречал заворачивание всего на монгрели, что, ИМХО, не есть хорошо). Весьма настоятельно рекомендую в приложении создать файлик log/access.log и обеспечить в него запись пользователю www-data, от которого работает lighttpd. Собственно, все. Ругайте. UPD: в процессе работы проявились особенности Safari & IE. Для них надо в конфиге lighttpd добавить [cc lang="perl"] $HTTP["useragent"] =~ "^(.*MSIE.*)|(.*AppleWebKit.*)$" { server.max-keep-alive-requests = 0 } [/cc]
| Viewed
times
Filed under: