Wpisy dla "nginx"

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!