Wpisy dla "passenger"
Nginx z PHP5 i Rails w Debianie 5.0
Jestem zmuszony do trzymania na jednym z serwerów Debiana w wersji 5, niemniej chciałem tam zainstalować nowego Nginksa z PHP5 oraz Rails. Do tego oczywiście masa przydatnych gemów..
Poniżej kroki jakie wykonałem w tym boju, mam nadzieję że komuś się przyda :)
Notka: wszystkie pokazane poniżej polecenia wykonywałem jako root..
Instalacja wymaganych pakietów
apt-get install bzip2 build-essential
apt-get install ruby ruby-dev ruby1.8 rubygems libopenssl-ruby
apt-get install libfcgi libfcgi-perl libfcgi
apt-get install php5 php5-cgi php5-common php5-dev php5-mysql php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-cgi php5-mcrypt php5-curl php5-gd php5-memcache php5-mhash php5-pspell php5-snmp php5-sqlite libmagick9-dev php5-cli
apt-get install libmysqlclient-dev libxslt-dev
Konfiguracja PHP5 jako FastCGI
Do poprawnej konfiguracji wymagany jest program spawn-fcgi, nie ma go jednak w Debianie 5 jako deb'a więc należy skopiować go z pakietu lighttpd:
# oczywiście można inaczej, ale tak też działa :)
apt-get install lighttpd
cp /usr/bin/spawn-fcgi ~/
apt-get --purge remove lighttpd
mv ~/spawn-fcgi /usr/bin/
Do wystartowania serwera fcgi potrzebujemy:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
Taki wpis najlepiej dodać np. do /etc/rc.local aby startował przy każdym podnoszeniu systemu..
Instalacja nowszego RubyGems, gemów
W Debianie gem update --system jest wyłączone, więc musimy pobrać ręcznie:
wget http://rubyforge.org/frs/download.php/75309/rubygems-1.8.10.tgz
tar xzf rubygems-1.8.10.tgz
cd rubygems-1.8.10
ruby setup.rb
Upewniamy się poprzez gem --version czy nowsza wersja została zainstalowana.. Następnie instalujemy passengera i inne gemy:
gem install --no-rdoc --no-ri passenger
gem install --no-rdoc --no-ri rails --version=3.0.9 # ja akurat potrzebuję konkretnie 3.0.9
gem install --no-rdoc --no-ri mysql2
# gem install ...whatever potrzebujesz :)
Nginx
Nginksa zainstalujemy ze źródeł, ponieważ nie ma on możliwości ładowania modułów, a więc nie da się inaczej wpiąć passengera. Przed instalacją potrzebujemy utworzyć mu kilka katalogów:
mkdir /var/lib/nginx
mkdir /var/lib/nginx/body
mkdir /var/lib/nginx/proxy
mkdir /var/lib/nginx/fastcgi
Pobieramy, rozpakowujemy i kompilujemy Nginksa
cd ~
wget http://nginx.org/download/nginx-1.0.6.tar.gz
tar xzf nginx-1.0.6.tar.gz
passenger-install-nginx-module
Ostatnia linijka wywołuje kompilację oraz instalację nginksa.. Jest to w formie przewodnika krok po kroku prowadzącego nas przez ten proces.. W miejscu gdzie przewodnik pyta nas o metodę instalacji, wybieramy opcję 2 - ekspert. Dzięki temu mamy możliwość zmiany kilku parametrów kompilacji.
Przy pytaniu o lokalizację źródeł nginksa należy podać katalog gdzie przed chwilą go wypakowaliśmy.
Następnie mamy możliwość przekazania opcji do procesu budowania źródeł.. Oto moja sugestia :)
--conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/body --http-proxy-temp-path=/var/lib/nginx/proxy --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --with-http_ssl_module --without-mail_pop3_module --without-mail_smtp_module --without-mail_imap_module --sbin-path=/usr/sbin --user=www-data --group=www-data --with-http_dav_module --with-http_gzip_static_module --with-http_stub_status_module
Skrypt startowy nginksa /etc/init.d/nginx:
#! /bin/sh
# Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and
# run 'sudo update-rc.d nginx defaults', or use the appropriate command on your
# distro.
#
# Author: Ryan Norbauer
# Modified: Geoffrey Grosenbach http://topfunky.com
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/sbin/$NAME
CONFIGFILE=/etc/nginx/nginx.conf
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
d_start() {
$DAEMON -c $CONFIGFILE || echo -n " already running"
}
d_stop() {
kill -QUIT `cat $PIDFILE` || echo -n " not running"
}
d_reload() {
kill -HUP `cat $PIDFILE` || echo -n " can't reload"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
d_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
d_stop
echo "."
;;
reload)
echo -n "Reloading $DESC configuration..."
d_reload
echo "reloaded."
;;
restart)
echo -n "Restarting $DESC: $NAME"
d_stop
# One second might not be time enough for a daemon to stop,
# if this happens, d_start will fail (and dpkg will break if
# the package is being upgraded). Change the timeout if needed
# be, or change d_stop to have start-stop-daemon use --retry.
# Notice that using --retry slows down the shutdown process somewhat.
sleep 5
d_start
echo "."
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac
exit 0
chmod +x /etc/init.d/nginx
update-rc.d nginx defaults
Konfiguracja
Główny plik konfiguracyjny
# /etc/nginx/nginx.conf
user www-data;
worker_processes 5;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 5;
#gzip on;
passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-3.0.9;
passenger_ruby /usr/bin/ruby1.8;
include /etc/nginx/sites-enabled/*;
}
Plik dla vhosta strony głównej, z PHP
# /etc/nginx/sites-available/default
server {
listen 80;
server_name serwer.com;
access_log /var/log/nginx/default.access.log;
location / {
root /var/www/nginx-default;
index index.php index.html index.htm;
}
location /doc {
root /usr/share;
autoindex on;
allow 127.0.0.1;
deny all;
}
location /images {
root /usr/share;
autoindex on;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/nginx-default;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
}
Dodatkowo, 'na przyszłość', szablon pliku dla aplikacji w Rails:
# /etc/nginx/sites-available/_rails_tpl
server {
listen 80;
server_name aplikacja.com;
access_log /var/www/aplikacja.com/log/access.log;
root /var/www/aplikacja.com/public;
passenger_enabled on;
}
Włączenie danego vhosta odbywa się poprzez utworzenie symlinka w katalogu sites-enabled:
ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
Powodzenia!

