ラベル Nginx の投稿を表示しています。 すべての投稿を表示
ラベル Nginx の投稿を表示しています。 すべての投稿を表示

2009/11/20

nginx mongrel_rails

Ubuntu で Rails と思ったわけです
パッケージ使えばいいとは思うのですが
Ruby というか Rails 周りは動きが速かったりするので
追従するには手作りかなと思い Ruby から作りました
で、gem 入れて rails 入れたり他のも入れたり

rails 自体は何で動かそうかなーと思ったのですが
mongrel ってのがスタンダードだと以前聞いていたのでそれで
で、その前に流行りの nginx を置いてみることにしました

ググってみたところ mongrel_cluster ってのを使えと
Ruby on Rails: mongrel_clusterのフロントエンドに nginxを使用する
これは、サービスとして mongrel を使うならば
バックエンドが例え1プロセスだとしても使った方が良いとのことで
素直に従うことに

でも、まぁ、結局 init script はどうにかするしかないかぁ〜
自前で書くような技術も根性も無いので参考が欲しい!
Ubuntu だしパッケージの中のを見ればいいだろうと思って
apt-get には無かったけど aptitude に download ってコマンドがあったので
$ aptitude download mongrel-cluster
$ aptitude download nginx
などして deb ファイル取ってきて
ar -x とか tar xfz で中身とりだして適当にスクリプトを眺めました
そして init script も完成

良く分からなかったのが gem install mongrel_cluster で入れたら
設定ファイルが /etc/mongrel_cluster であることが前提みたいで
できるだけ Ubuntu のものと被らせたくないなと思ってたんですが
設定方法が分からなかったんで symlink で逃げることにしました
もぉ、Ubuntu の mongrel-cluster は入れれません
や、入れないけど

mongrel_cluster によって何か恩恵にあずかれたのかは良く分からず
でも、とりあえず形にする為に一旦そこは放置で

nginx が前にいますが
Rails のとあるアプリ? だけ見えるようにしたかったので
proxy_pass で飛ばすのにルールが必要かなーと思ったんですが
今度は真面目にドキュメントにあたってみたら
NginxHttpProxyModule
rewrite 使って書き換えてから proxy_pass かましてました
や、あたりまえな気が今ではしています
        location / {
root html;
rewrite ^/$ /application break;
proxy_pass http://mongrel_cluster;
}
みたいにしてみました

あと、他のアプリは別途 location 立てて auth_basic しておきました
htpasswd は apache2-utils に入ってたので入れちゃいました
別途 location 立てるのが何か無駄な気がするんだけど仕方ないのかな
auth_basic が if の中では使えないので、まぁ、仕方ないのか?

久しぶりにこの辺の設定したので凄い頭痛くなりました

2009/07/26

nginx msie

別件で検索したりしてて
MSIE ってのは脳味噌腐ってるって話を思い出しました
apache の ssl.conf には
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
って設定がされてたりしますが
その前のところのコメントなんかに理由が説明されています

で、そうだよな、IE が悪いよなきっと、と
nginx ssl の悩みを解決すべく
気をとりなおして検索したら
nginx ssl_prefer_server_ciphers and MSIE 7.x core dump
って bug report を見付けました
あらら
設定を色々試していたはずなんだけどなぁ
何で見付けられなかったんでしょう

ssl_prefer_server_ciphers の on にしなければ
nginx で SSL してても IE と正常に接続できるようになりました
よかったよかった

2009/07/01

nginx ssl

2009/07/26
"ssl_prefer_server_ciphers on" があると core dump する
というレポートがあったので外してみたところ
IE と仲良くできているようです
nginx ssl_prefer_server_ciphers and MSIE 7.x core dump

2009/07/13
以下の方法だと IE と仲良く HTTPS できてませんでした
私の環境が悪いのかもしれないの情報募集中



Web Server を立てないとなってことになりました
  • 2 つの HTTPS サーバを手軽に構築したい
  • 片方は静的コンテンツ表示のみ
  • 片方は単純なリダイレクトのみ
Apache/Lighttpd/Nginx 辺りが候補かなぁと思っていたんですが
twitter で公募したら Nginx に決定

nginx で検索したら official が出てくるんで source を download
CentOS5 で開発環境も入れてない環境だったので
openssl-devel gcc pcre-devel make を rpm で入れて configure
--with-http_ssl_module って option を付ければ HTTPS ready な Makefile のできあがり
make && make install しました

設定ファイルは conf って directory に入ってる conf/nginx.conf
conf/nginx.conf に設定例が沢山書いてあるのでこれだけ見たら設定できてしまいます
http とか server とかのキーワードと {} で範囲指定して特定の設定してます
http の中に server を沢山書けばいいみたい
conf には沢山 file があるけど include で読み込んでいます

Virtual Host の方法ですが、conf/nginx.conf に
    # another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
とあるので
IP-based であれば server 毎に somename:8080 という指定で OK のようです。
log ファイルなんかも server の中で個別設定できます。

SSL の設定ですが、更に下の方に
    # HTTPS server
#
#server {
# listen 443;
# server_name localhost;

# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

# ssl_session_timeout 5m;

# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;

# location / {
# root html;
# index index.html index.htm;
# }
#}
おぉぉ、完璧。
サーバ証明書に中間 CA 証明書が必要な場合、
apache でいうとこの SSLCertificateChainFile を設定したい場合は、
NginxHttpSslModule を見ると
サーバ証明書の後に中間 CA 証明書を連結すれば OK のようでした。

リダイレクトに関しては NginxHttpRewriteModule を見ると
適当に条件分岐した後 rewrite というコマンドで何を何処に飛ばすか設定で OK みたい
apache の mod_rewrite より分かりやすい
今回は無条件に redirect させたかったので
if とか使わずいきなり rewrite 書いてみました

で、関係箇所の抜粋が
http {
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!EXP:!ADH:!LOW:!SSLv2:!MD5;
#ssl_prefer_server_ciphers on;

server {
listen 10.0.0.1:80;
server_name sample1;
access_log logs/sample1_access.log;

rewrite ^(.*)$ https://sample1$1 permanent;
}

server {
listen 10.0.0.2:80;
server_name sample2;
access_log logs/sample2_access.log;

rewrite ^(.*)$ https://sample2$1 permanent;
}

server {
listen 10.0.0.1:443;
server_name sample1;
access_log logs/sample1_ssl.log;

ssl on;
ssl_certificate ssl/sample1.crt;
ssl_certificate_key ssl/sample1.key;

location / {
root html;
index index.html index.htm;
}
}

server {
listen 10.0.0.2:443;
server_name sample2;
access_log logs/sample2_ssl.log;

ssl on;
ssl_certificate ssl/sample2.crt;
ssl_certificate_key ssl/sample2.key;

rewrite ^(.*)$ https://sample3$1 permanent;
}
}
秘密鍵と証明書は ssl ってフォルダ作ってつっこみました
80 番に来たら 443 番に飛ばして
それぞれコンテンツ出すか他サイトに飛ばしています
ssl_ciphers  ALL:!EXP:!ADH:!LOW:!SSLv2:!MD5;
ってのは SSLCipherSuite 参照

あと、起動と終了のスクリプトどうしようかなぁと思いまして
nginx startup-script で検索してみたら
fujishinko 雑記帳 : CentOS nginx の起動スクリプト
何と
pid file は conf/nginx.conf 内で pid という変数で指定できるので
これで何もかんも完璧になってしまいました

Nginx すごい!