nginx + spdy + pagespeed + passenger + ruby2.0 + rails4 + varnish

という構成のログ。

nginxのconfigure –hlepとpassenger-install-nginx-mobule –helpをみるとこんな感じ。

passenger-install-nginx-module --help
Usage: passenger-install-nginx-module [options]

Options:
        --auto                       Automatically confirm 'Press ENTER to
                                     continue' prompts.
        --prefix=DIR                 Use the given Nginx install prefix instead
                                     of asking for it interactively.
        --auto-download              Download and install Nginx automatically,
                                     instead of asking interactively whether to
                                     download+install or to use an existing
                                     Nginx source directory.
        --nginx-source-dir=DIR       Compile and install Nginx using the given
                                     Nginx source directory, instead of
                                     interactively asking to download+install
                                     or to use an existing Nginx source
                                     directory. Conflicts with --auto-download.
        --extra-configure-flags=STRING
                                     Pass these extra flags to Nginx's
                                     'configure' script, instead of asking for
                                     it interactively. Specify 'none' if you
                                     do not want to pass additional flags but do
                                     not want this installer to ask
                                     interactively either.
./configure --help

  --help                             print this message

  --prefix=PATH                      set installation prefix
  --sbin-path=PATH                   set nginx binary pathname
  --conf-path=PATH                   set nginx.conf pathname
  --error-log-path=PATH              set error log pathname
  --pid-path=PATH                    set nginx.pid pathname
  --lock-path=PATH                   set nginx.lock pathname

  --user=USER                        set non-privileged user for
                                     worker processes
  --group=GROUP                      set non-privileged group for
                                     worker processes

  --builddir=DIR                     set build directory

  --with-rtsig_module                enable rtsig module
  --with-select_module               enable select module
  --without-select_module            disable select module
  --with-poll_module                 enable poll module
  --without-poll_module              disable poll module

  --with-file-aio                    enable file AIO support
  --with-ipv6                        enable IPv6 support

  --with-http_ssl_module             enable ngx_http_ssl_module
  --with-http_spdy_module            enable ngx_http_spdy_module
  --with-http_realip_module          enable ngx_http_realip_module
  --with-http_addition_module        enable ngx_http_addition_module
  --with-http_xslt_module            enable ngx_http_xslt_module
  --with-http_image_filter_module    enable ngx_http_image_filter_module
  --with-http_geoip_module           enable ngx_http_geoip_module
  --with-http_sub_module             enable ngx_http_sub_module
  --with-http_dav_module             enable ngx_http_dav_module
  --with-http_flv_module             enable ngx_http_flv_module
  --with-http_mp4_module             enable ngx_http_mp4_module
  --with-http_gunzip_module          enable ngx_http_gunzip_module
  --with-http_gzip_static_module     enable ngx_http_gzip_static_module
  --with-http_random_index_module    enable ngx_http_random_index_module
  --with-http_secure_link_module     enable ngx_http_secure_link_module
  --with-http_degradation_module     enable ngx_http_degradation_module
  --with-http_stub_status_module     enable ngx_http_stub_status_module

  --without-http_charset_module      disable ngx_http_charset_module
  --without-http_gzip_module         disable ngx_http_gzip_module
  --without-http_ssi_module          disable ngx_http_ssi_module
  --without-http_userid_module       disable ngx_http_userid_module
  --without-http_access_module       disable ngx_http_access_module
  --without-http_auth_basic_module   disable ngx_http_auth_basic_module
  --without-http_autoindex_module    disable ngx_http_autoindex_module
  --without-http_geo_module          disable ngx_http_geo_module
  --without-http_map_module          disable ngx_http_map_module
  --without-http_split_clients_module disable ngx_http_split_clients_module
  --without-http_referer_module      disable ngx_http_referer_module
  --without-http_rewrite_module      disable ngx_http_rewrite_module
  --without-http_proxy_module        disable ngx_http_proxy_module
  --without-http_fastcgi_module      disable ngx_http_fastcgi_module
  --without-http_uwsgi_module        disable ngx_http_uwsgi_module
  --without-http_scgi_module         disable ngx_http_scgi_module
  --without-http_memcached_module    disable ngx_http_memcached_module
  --without-http_limit_conn_module   disable ngx_http_limit_conn_module
  --without-http_limit_req_module    disable ngx_http_limit_req_module
  --without-http_empty_gif_module    disable ngx_http_empty_gif_module
  --without-http_browser_module      disable ngx_http_browser_module
  --without-http_upstream_ip_hash_module
                                     disable ngx_http_upstream_ip_hash_module
  --without-http_upstream_least_conn_module
                                     disable ngx_http_upstream_least_conn_module
  --without-http_upstream_keepalive_module
                                     disable ngx_http_upstream_keepalive_module

  --with-http_perl_module            enable ngx_http_perl_module
  --with-perl_modules_path=PATH      set Perl modules path
  --with-perl=PATH                   set perl binary pathname

  --http-log-path=PATH               set http access log pathname
  --http-client-body-temp-path=PATH  set path to store
                                     http client request body temporary files
  --http-proxy-temp-path=PATH        set path to store
                                     http proxy temporary files
  --http-fastcgi-temp-path=PATH      set path to store
                                     http fastcgi temporary files
  --http-uwsgi-temp-path=PATH        set path to store
                                     http uwsgi temporary files
  --http-scgi-temp-path=PATH         set path to store
                                     http scgi temporary files

  --without-http                     disable HTTP server
  --without-http-cache               disable HTTP cache

  --with-mail                        enable POP3/IMAP4/SMTP proxy module
  --with-mail_ssl_module             enable ngx_mail_ssl_module
  --without-mail_pop3_module         disable ngx_mail_pop3_module
  --without-mail_imap_module         disable ngx_mail_imap_module
  --without-mail_smtp_module         disable ngx_mail_smtp_module

  --with-google_perftools_module     enable ngx_google_perftools_module
  --with-cpp_test_module             enable ngx_cpp_test_module

  --add-module=PATH                  enable an external module

  --with-cc=PATH                     set C compiler pathname
  --with-cpp=PATH                    set C preprocessor pathname
  --with-cc-opt=OPTIONS              set additional C compiler options
  --with-ld-opt=OPTIONS              set additional linker options
  --with-cpu-opt=CPU                 build for the specified CPU, valid values:
                                     pentium, pentiumpro, pentium3, pentium4,
                                     athlon, opteron, sparc32, sparc64, ppc64

  --without-pcre                     disable PCRE library usage
  --with-pcre                        force PCRE library usage
  --with-pcre=DIR                    set path to PCRE library sources
  --with-pcre-opt=OPTIONS            set additional build options for PCRE
  --with-pcre-jit                    build PCRE with JIT compilation support

  --with-md5=DIR                     set path to md5 library sources
  --with-md5-opt=OPTIONS             set additional build options for md5
  --with-md5-asm                     use md5 assembler sources

  --with-sha1=DIR                    set path to sha1 library sources
  --with-sha1-opt=OPTIONS            set additional build options for sha1
  --with-sha1-asm                    use sha1 assembler sources

  --with-zlib=DIR                    set path to zlib library sources
  --with-zlib-opt=OPTIONS            set additional build options for zlib
  --with-zlib-asm=CPU                use zlib assembler sources optimized
                                     for the specified CPU, valid values:
                                     pentium, pentiumpro

  --with-libatomic                   force libatomic_ops library usage
  --with-libatomic=DIR               set path to libatomic_ops library sources

  --with-openssl=DIR                 set path to OpenSSL library sources
  --with-openssl-opt=OPTIONS         set additional build options for OpenSSL

  --with-debug                       enable debug logging

で以下ログ。002_pagespeed.shと005_nginx_passenger.shがちょっと詰まりそうなところ。

varnishがちょっと宙ぶらりん。

広告

Nginx, Passenger, Rack, Sinatraで起動してみる

Passengerがnginxで使えるみたい。

nginxモジュールをインストールする際にnginxをダウンロードするかどうか聞かれました。
ソースからnginxをインストールしているなら、そのディレクトリを指定すればよいらしいけど、ちょっと前にnginxをyumからに変えていたので一旦削除。

sudo gem install passenger
passenger-install-nginx-module

(略

Automatically download and install Nginx?

Nginx doesn't support loadable modules such as some other web servers do,
so in order to install Nginx with Passenger support, it must be recompiled.

Do you want this installer to download, compile and install Nginx for you?

 1. Yes: download, compile and install Nginx for me. (recommended)
    The easiest way to get started. A stock Nginx 0.6.37 with Passenger
    support, but with no other additional third party modules, will be
    installed for you to a directory of your choice.

 2. No: I want to customize my Nginx installation. (for advanced users)
    Choose this if you want to compile Nginx with more third party modules
    besides Passenger, or if you need to pass additional options to Nginx's
    'configure' script. This installer will  1) ask you for the location of
    the Nginx source code,  2) run the 'configure' script according to your
    instructions, and  3) run 'make install'.

Whichever you choose, if you already have an existing Nginx configuration file,
then it will be preserved.

Enter your choice (1 or 2) or press Ctrl-C to abort: 1

(略

ほとんどreturnキー押して終了。

/opt/nginx以下にファイルができます。

conf/nginx.confに以下が記述されてます。

http {
    ...
    passenger_root /usr/local/ruby/lib/ruby/gems/1.8/gems/passenger-2.2.4;
    passenger_ruby /usr/local/ruby/bin/ruby;
    ...
}

あとはvirtual.confとか作って、

server {
   listen 80;
   server_name www.yourhost.com;
   root /somewhere/public;   # <--- be sure to point to 'public'!
   passenger_enabled on;
}
&#91;/sourcecode&#93;

こんな風に書けばいいようで。

passengerのモジュールインストール中に説明してくれるので親切。

で、今回はSinatraを使っているのでSinatraアプリ以下にconfig.ruをつくり、publicとtmpディレクトリを用意。

起動ファイルはyumでインストールした時のものを流用します。

&#91;sourcecode language='bash'&#93;
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
&#91; "$NETWORKING" = "no" &#93; && exit 0

nginx="/opt/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"

# &#91; -f /etc/sysconfig/nginx &#93; && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

start() {
    &#91; -x $nginx &#93; || exit 5
    &#91; -f $NGINX_CONF_FILE &#93; || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    &#91; $retval -eq 0 &#93; && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    &#91; $retval -eq 0 &#93; && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

起動したり終了したりが楽。

/etc/init.d/nginx start
/etc/init.d/nginx stop
/etc/init.d/nginx restart

わぁー

やっぱメモリは喰うのね。。

Rack, Sinatra, Thin, Nginx, (Rails)で起動してみる

目標的にはRailsの下にsinatraをミドルウェアとしてrackupするつもり。

現時点では単体で動かせれば良いのでその辺りまでかな。

rack,sinatra,thinはさくっとgem installしておきます。たぶんどれか入れればrackが入るはず。ログとってなかった。

nginxはソースファイルからインストールします。stableです。

# wget http://sysoev.ru/nginx/nginx-0.6.35.tar.gz
# tar zxvf nginx-0.6.35.tar.gz
# cd nginx-0.6.35
# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
# make
# make install
# cd /usr/local/nginx/conf
# vi nginx.conf
pid        /var/run/nginx/nginx.pid;
worker_processes  3;

events {
    worker_connections  1024;
}
http {
    include       mime.types;
    include       proxy_conf;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  0;

    upstream radiant {
        server unix:/var/tmp/thin.0.sock;
        server unix:/var/tmp/thin.1.sock;
        server unix:/var/tmp/thin.2.sock;
    }
    upstream rackup {
        server 127.0.0.1:9292;
    }
    server {
        listen 80;
        server_name example.net;
        access_log /var/log/nginx/radiant.access.log;
        root /var/www/radiant/public;
        index index.html;

        location / {
            proxy_pass http://radiant;
        }
    }

    server {
        listen 80;
        server_name test.com;
        access_log /var/log/nginx/rackup.access.log;
        location / {
            proxy_pass http://rackup;
        }
    }
}

# vi proxy_conf
proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

pidの位置を/var/run以下にしているのはなんとなくまとめておきたいからです。

radiantの設定とか入ってるけど気にしない。

upstreamでソケットとかポートとか書いてあげてproxy_passで指定するだけ。

server{}でapacheのバーチャルホストっぽいことができる。

sslは次回持ち越し。

proxy_confはサンプルコピペなのであんまり精査してない。

とりあえず動かす設定なので内容もあまり吟味してない。

たぶんrootで実行しちゃまずい気がするけどテストだしいいよね。

# /usr/local/nginx/sbin/nginx

これで準備OK。再起動するときは、

# kill -HUP `cat /var/run/nginx/nginx.pid`

こんな感じ。

やっとsinatraへ。ちょっとサイトが更新されててびっくりした。

ばびっと用意。

# cd /var/www
# mkdir app
# cd app
# touch routes.rb config.ru
# mkdir public tmp views log

sinatraコントローラ作成。

目的のrackミドルウェアとするには、Sinatra::Baseを継承したクラスを作り、そのなかに書いておくのがやりかたとしてあるっぽいけど、それは次回ということで。

# vi routes.rb
require 'rubygems'
require 'sinatra'

get '/' do
  erb :home
end

not_found do
  'This is nowhere to be found'
end

error do
  'Sorry there was a nasty error - ' + env['sinatra.error'].name
end

sinatraテンプレート作成

# vi views/home.erb
halt.

rack設定

# vi config.ru
require 'rubygems'
require 'sinatra'

set :run, false
set :environment, :production

require 'routes.rb'
run Sinatra::Application

前回テストしたrackの設定に比べて簡素。

こんどはthinの設定ファイルを作ります。

# thin config -C thin.yml
# vi thin.yml
pid: /var/run/thin/thin.pid
timeout: 30
log: log/thin.log
max_conns: 1024
require: []
max_persistent_conns: 512
environment: production
servers: 1
daemonize: true
chdir: /var/www/html
rackup: /var/www/html/config.ru
port: 9292
address: 127.0.0.1

この変も割と適当。

ここもpidを/var/run/thinとかにしているので、ディレクトリつくってあげないと起動してくれません。

sinatraだけなら、ruby routes.rb -e production とかやるだけですが、thinの設定でrackup: /var/www/html/config.ruとしてます。
これ、rackもsockでやればよかった・・まあいいや。

でthin起動。

# thin start -C thin.yml

nginxは起動しているので、ブラウザからtest.comの80番へアクセスすれば表示されます。

された!